/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.compiler.common; import org.drools.compiler.CommonTestMethodBase; import org.drools.core.common.ActivationIterator; import org.drools.core.common.AgendaItem; import org.drools.core.common.InternalAgenda; import org.drools.core.common.InternalWorkingMemory; import org.drools.core.util.Iterator; import org.junit.Test; import org.kie.api.definition.rule.Rule; import org.kie.api.event.rule.AgendaEventListener; import org.kie.api.event.rule.DefaultAgendaEventListener; import org.kie.api.io.ResourceType; import org.kie.api.runtime.KieSession; import org.kie.api.runtime.KieSessionConfiguration; import org.kie.internal.KnowledgeBase; import org.kie.internal.KnowledgeBaseFactory; import org.kie.internal.runtime.conf.ForceEagerActivationFilter; import org.kie.internal.runtime.conf.ForceEagerActivationOption; import org.kie.internal.utils.KieHelper; import java.util.ArrayList; import java.util.List; public class ActivationIteratorTest extends CommonTestMethodBase { @Test public void testSingleLian() { String str = "package org.kie.test \n" + "\n" + "rule rule1 @Propagation(EAGER) when\n" + " $s : String( this != 'xx' )\n" + "then\n" + "end\n" + "rule rule6 @Propagation(EAGER) when\n" + " java.util.Map()\n" + "then\n" + "end\n" + "\n"; KieSession ksession = new KieHelper().addContent(str, ResourceType.DRL) .build() .newKieSession(); for ( int i = 0; i < 5; i++ ) { ksession.insert( new String( "" + i ) ); } evaluateEagerList(ksession); Iterator it = ActivationIterator.iterator( ksession ); List list = new ArrayList(); for ( AgendaItem act = (AgendaItem) it.next(); act != null; act = (AgendaItem) it.next() ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s" ) + ":" + act.isQueued() ); } assertContains( new String[]{"rule1:0:true", "rule1:1:true", "rule1:2:true", "rule1:3:true", "rule1:4:true"}, list ); ksession.fireAllRules(); it = ActivationIterator.iterator( ksession ); list = new ArrayList(); for ( AgendaItem act = (AgendaItem) it.next(); act != null; act = (AgendaItem) it.next() ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s" ) + ":" + act.isQueued() ); } assertContains( new String[]{"rule1:0:false", "rule1:1:false", "rule1:2:false", "rule1:3:false", "rule1:4:false"}, list ); } private void evaluateEagerList(KieSession ksession) { ((InternalWorkingMemory) ksession).flushPropagations(); ((InternalAgenda) ksession.getAgenda()).evaluateEagerList(); } @Test public void testLianPlusEvaln() { String str = "package org.kie.test \n" + "\n" + "rule rule1 @Propagation(EAGER) when\n" + " $s : String( this != 'xx' )\n" + " eval( 1 == 1 ) \n" + "then\n" + "end\n" + "rule rule6 @Propagation(EAGER) when\n" + " java.util.Map()\n" + "then\n" + "end\n" + "\n"; KieSession ksession = new KieHelper().addContent(str, ResourceType.DRL) .build() .newKieSession(); for ( int i = 0; i < 5; i++ ) { ksession.insert( new String( "" + i ) ); } evaluateEagerList(ksession); Iterator it = ActivationIterator.iterator( ksession ); List list = new ArrayList(); for ( AgendaItem act = (AgendaItem) it.next(); act != null; act = (AgendaItem) it.next() ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s" ) + ":" + act.isQueued() ); } assertContains( new String[]{"rule1:0:true", "rule1:1:true", "rule1:2:true", "rule1:3:true", "rule1:4:true"}, list ); ksession.fireAllRules(); it = ActivationIterator.iterator( ksession ); list = new ArrayList(); for ( AgendaItem act = (AgendaItem) it.next(); act != null; act = (AgendaItem) it.next() ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s" ) + ":" + act.isQueued() ); } assertContains( new String[]{"rule1:0:false", "rule1:1:false", "rule1:2:false", "rule1:3:false", "rule1:4:false"}, list ); } @Test public void testLianPlusEvalnWithSharing() { // Rule 0 single LiaNode // Rule 1 and 2 are shared // Rule 3 shares the LIANode with 1 and 2 // Rule 4 Shares the eval with 3 String str = "package org.kie.test \n" + "\n" + "rule rule0 @Propagation(EAGER) when\n" + " $s : String( this != 'xx' )\n" + "then\n" + "end\n" + "rule rule1 @Propagation(EAGER) when\n" + " $s : String( this != 'xx' )\n" + " eval( Integer.parseInt( $s ) <= 2 ) \n" + "then\n" + "end\n" + "rule rule2 @Propagation(EAGER) when\n" + " $s : String( this != 'xx' )\n" + " eval( Integer.parseInt( $s ) <= 2 ) \n" + "then\n" + "end\n" + "rule rule3 @Propagation(EAGER) when\n" + " $s : String( this != 'xx' )\n" + " eval( Integer.parseInt( $s ) > 2 ) \n" + "then\n" + "end\n" + "rule rule4 @Propagation(EAGER) when\n" + " $s : String( this != 'xx' )\n" + " eval( Integer.parseInt( $s ) > 2 ) \n" + " eval( Integer.parseInt( $s ) > 3 ) \n" + "then\n" + "end\n" + "rule rule5 @Propagation(EAGER) when\n" + " $s : String( this != 'xx' )\n" + " eval( Integer.parseInt( $s ) > 2 ) \n" + " eval( Integer.parseInt( $s ) > 3 ) \n" + "then\n" + "end\n" + "rule rule6 @Propagation(EAGER) when\n" + " java.util.Map()\n" + "then\n" + "end\n" + "\n"; KieSession ksession = new KieHelper().addContent(str, ResourceType.DRL) .build() .newKieSession(); for ( int i = 0; i < 5; i++ ) { ksession.insert( new String( "" + i ) ); } evaluateEagerList(ksession); Iterator it = ActivationIterator.iterator( ksession ); List list = new ArrayList(); for ( AgendaItem act = (AgendaItem) it.next(); act != null; act = (AgendaItem) it.next() ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s" ) + ":" + act.isQueued() ); } assertContains( new String[]{"rule0:0:true", "rule0:1:true", "rule0:2:true", "rule0:3:true", "rule0:4:true", "rule1:0:true", "rule1:1:true", "rule1:2:true", "rule2:0:true", "rule2:1:true", "rule2:2:true", "rule3:3:true", "rule3:4:true", "rule4:4:true", "rule5:4:true"}, list ); ksession.fireAllRules(); it = ActivationIterator.iterator( ksession ); list = new ArrayList(); for ( AgendaItem act = (AgendaItem) it.next(); act != null; act = (AgendaItem) it.next() ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s" ) + ":" + act.isQueued() ); } assertContains( new String[]{"rule0:0:false", "rule0:1:false", "rule0:2:false", "rule0:3:false", "rule0:4:false", "rule1:0:false", "rule1:1:false", "rule1:2:false", "rule2:0:false", "rule2:1:false", "rule2:2:false", "rule3:3:false", "rule3:4:false", "rule4:4:false", "rule5:4:false"}, list ); } @Test public void testLianPlusEvalnWithSharingWithMixedDormantAndActive() { // Rule 0 single LiaNode // Rule 1 and 2 are shared // Rule 3 shares the LIANode with 1 and 2 // Rule 4 Shares the eval with 3 String str = "package org.kie.test \n" + "\n" + "rule rule2 salience ( Integer.parseInt('1'+$s)) when\n" + " $s : String( this != 'xx' )\n" + " eval( Integer.parseInt( $s ) <= 2 ) \n" + "then\n" + " kcontext.getKieRuntime().halt();\n" + "end\n" + "rule rule0 salience ( Integer.parseInt('1'+$s) ) when\n" + " $s : String( this != 'xx' )\n" + "then\n" + "end\n" + "rule rule1 salience ( Integer.parseInt('1'+$s)) when\n" + " $s : String( this != 'xx' )\n" + " eval( Integer.parseInt( $s ) <= 2 ) \n" + "then\n" + "end\n" + "rule rule3 salience ( Integer.parseInt('1'+$s)) when\n" + " $s : String( this != 'xx' )\n" + " eval( Integer.parseInt( $s ) > 2 ) \n" + "then\n" + "end\n" + "rule rule4 salience ( Integer.parseInt('1'+$s) ) when\n" + " $s : String( this != 'xx' )\n" + " eval( Integer.parseInt( $s ) > 2 ) \n" + " eval( Integer.parseInt( $s ) > 3 ) \n" + "then\n" + "end\n" + "\n" + "rule rule6 when\n" + " java.util.Map()\n" + "then\n" + "end\n" + "\n"; KieSession ksession = new KieHelper().addContent(str, ResourceType.DRL) .build() .newKieSession(); for ( int i = 0; i < 5; i++ ) { ksession.insert( new String( "" + i ) ); } ksession.fireAllRules(); Iterator it = ActivationIterator.iterator( ksession ); List list = new ArrayList(); for ( AgendaItem act = (AgendaItem) it.next(); act != null; act = (AgendaItem) it.next() ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s" ) + ":" + act.isQueued() ); } assertContains( new String[]{"rule0:0:true", "rule0:1:true", "rule0:2:true", "rule0:3:false", "rule0:4:false", "rule1:0:true", "rule1:1:true", "rule1:2:true", "rule2:0:true", "rule2:1:true", "rule2:2:false", "rule3:3:false", "rule3:4:false", "rule3:4:false"}, list ); } @Test public void testSingleJoinNode() { String str = "package org.kie.test \n" + "\n" + "rule rule1 @Propagation(EAGER) when\n" + " $s1 : String( )\n" + " $s2 : String( )\n" + "then\n" + "end\n"; KieSession ksession = new KieHelper().addContent(str, ResourceType.DRL) .build() .newKieSession(); for ( int i = 0; i < 2; i++ ) { ksession.insert( new String( "" + i ) ); } evaluateEagerList(ksession); Iterator it = ActivationIterator.iterator( ksession ); List list = new ArrayList(); for ( AgendaItem act = (AgendaItem) it.next(); act != null; act = (AgendaItem) it.next() ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s1" ) + ":" + act.getDeclarationValue( "$s2" ) + ":" + act.isQueued() ); } assertContains( new String[]{"rule1:0:1:true", "rule1:1:0:true", "rule1:1:1:true", "rule1:0:0:true"}, list ); ksession.fireAllRules(); it = ActivationIterator.iterator( ksession ); list = new ArrayList(); for ( AgendaItem act = (AgendaItem) it.next(); act != null; act = (AgendaItem) it.next() ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s1" ) + ":" + act.getDeclarationValue( "$s2" ) + ":" + act.isQueued() ); } assertContains( new String[]{"rule1:0:1:false", "rule1:1:0:false", "rule1:1:1:false", "rule1:0:0:false"}, list ); } @Test public void testSingleJoinNodePlusEvaln() { String str = "package org.kie.test \n" + "\n" + "rule rule1 @Propagation(EAGER) when\n" + " $s1 : String( )\n" + " $s2 : String( )\n" + " eval( 1 == 1 ) \n" + "then\n" + "end\n" + "\n"; KieSession ksession = new KieHelper().addContent(str, ResourceType.DRL) .build() .newKieSession(); for ( int i = 0; i < 2; i++ ) { ksession.insert( new String( "" + i ) ); } evaluateEagerList(ksession); Iterator it = ActivationIterator.iterator( ksession ); List list = new ArrayList(); for ( AgendaItem act = (AgendaItem) it.next(); act != null; act = (AgendaItem) it.next() ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s1" ) + ":" + act.getDeclarationValue( "$s2" ) + ":" + act.isQueued() ); } assertContains( new String[]{"rule1:0:1:true", "rule1:1:0:true", "rule1:1:1:true", "rule1:0:0:true"}, list ); ksession.fireAllRules(); it = ActivationIterator.iterator( ksession ); list = new ArrayList(); for ( AgendaItem act = (AgendaItem) it.next(); act != null; act = (AgendaItem) it.next() ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s1" ) + ":" + act.getDeclarationValue( "$s2" ) + ":" + act.isQueued() ); } assertContains( new String[]{"rule1:0:1:false", "rule1:1:0:false", "rule1:1:1:false", "rule1:0:0:false"}, list ); } @Test public void testSingleJoinNodePlusEvalnWithSharing() { String str = "package org.kie.test \n" + "\n" + "rule rule1 @Propagation(EAGER) when\n" + " $s1 : String( )\n" + " $s2 : String( )\n" + " eval( 1 == 1 ) \n" + "then\n" + "end\n" + "rule rule2 @Propagation(EAGER) when\n" + " $s1 : String( )\n" + "then\n" + "end\n" + "rule rule3 @Propagation(EAGER) when\n" + " $s1 : String( )\n" + " $s2 : String( )\n" + " $s3 : String( )\n" + " eval( 1 == 1 ) \n" + "then\n" + "end\n" + "\n"; KieSession ksession = new KieHelper().addContent(str, ResourceType.DRL) .build() .newKieSession(); for ( int i = 0; i < 2; i++ ) { ksession.insert( new String( "" + i ) ); } evaluateEagerList(ksession); Iterator it = ActivationIterator.iterator( ksession ); List list = new ArrayList(); for ( AgendaItem act = (AgendaItem) it.next(); act != null; act = (AgendaItem) it.next() ) { if ( act.getRule().getName().equals( "rule3" ) ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s1" ) + ":" + act.getDeclarationValue( "$s2" ) + ":" + act.getDeclarationValue( "$s3" ) + ":" + act.isQueued() ); } else if ( act.getRule().getName().equals( "rule1" ) ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s1" ) + ":" + act.getDeclarationValue( "$s2" ) + ":" + act.isQueued() ); } else if ( act.getRule().getName().equals( "rule2" ) ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s1" ) + ":" + act.isQueued() ); } } assertContains( new String[]{"rule1:0:0:true", "rule1:0:1:true", "rule1:1:0:true", "rule1:1:1:true", "rule2:1:true", "rule2:0:true", "rule3:0:0:0:true", "rule3:0:0:1:true", "rule3:1:0:0:true", "rule3:1:0:1:true", "rule3:0:1:0:true", "rule3:0:1:1:true", "rule3:1:1:0:true", "rule3:1:1:1:true"}, list ); ksession.fireAllRules(); it = ActivationIterator.iterator( ksession ); list = new ArrayList(); for ( AgendaItem act = (AgendaItem) it.next(); act != null; act = (AgendaItem) it.next() ) { if ( act.getRule().getName().equals( "rule3" ) ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s1" ) + ":" + act.getDeclarationValue( "$s2" ) + ":" + act.getDeclarationValue( "$s3" ) + ":" + act.isQueued() ); } else if ( act.getRule().getName().equals( "rule1" ) ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s1" ) + ":" + act.getDeclarationValue( "$s2" ) + ":" + act.isQueued() ); } else if ( act.getRule().getName().equals( "rule2" ) ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s1" ) + ":" + act.isQueued() ); } } assertContains( new String[]{"rule1:0:0:false", "rule1:0:1:false", "rule1:1:0:false", "rule1:1:1:false", "rule2:1:false", "rule2:0:false", "rule3:0:0:0:false", "rule3:0:0:1:false", "rule3:1:0:0:false", "rule3:1:0:1:false", "rule3:0:1:0:false", "rule3:0:1:1:false", "rule3:1:1:0:false", "rule3:1:1:1:false"}, list ); } @Test public void testSingleJoinNodePlusEvalnWithSharingWithMixedDormantAndActive() { String str = "package org.kie.test \n" + "\n" + "rule rule1 salience ( Integer.parseInt( '1'+$s1+'0'+$s2 ) ) when\n" + " $s1 : String( )\n" + " $s2 : String( )\n" + " eval( 1 == 1 ) \n" + "then\n" + "end\n" + "rule rule2 salience (1020 + Integer.parseInt( $s1 ) ) when\n" + " $s1 : String( )\n" + "then\n" + " kcontext.getKieRuntime().halt();\n" + "end\n" + "rule rule3 salience ( Integer.parseInt( '1'+$s1+'1'+$s2 ) ) when\n" + " $s1 : String( )\n" + " $s2 : String( )\n" + " $s3 : String( )\n" + " eval( 1 == 1 ) \n" + "then\n" + "end\n" + "\n"; KieSession ksession = new KieHelper().addContent(str, ResourceType.DRL) .build() .newKieSession(); for ( int i = 0; i < 2; i++ ) { ksession.insert( new String( "" + i ) ); } ksession.fireAllRules(); Iterator it = ActivationIterator.iterator( ksession ); List list = new ArrayList(); for ( AgendaItem act = (AgendaItem) it.next(); act != null; act = (AgendaItem) it.next() ) { if ( act.getRule().getName().equals( "rule3" ) ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s1" ) + ":" + act.getDeclarationValue( "$s2" ) + ":" + act.getDeclarationValue( "$s3" ) + ":" + act.isQueued() ); } else if ( act.getRule().getName().equals( "rule1" ) ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s1" ) + ":" + act.getDeclarationValue( "$s2" ) + ":" + act.isQueued() ); } else if ( act.getRule().getName().equals( "rule2" ) ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s1" ) + ":" + act.isQueued() ); } } assertContains( new String[]{"rule1:0:0:true", "rule1:0:1:true", "rule1:1:0:false", "rule1:1:1:false", "rule2:1:false", "rule2:0:true", "rule3:0:0:0:true", "rule3:0:0:1:true", "rule3:1:0:0:false", "rule3:1:0:1:false", "rule3:0:1:0:true", "rule3:0:1:1:true", "rule3:1:1:0:false", "rule3:1:1:1:false"}, list ); } @Test public void testNotSharingWithMixedDormantAndActive() { String str = "package org.kie.test \n" + "\n" + "rule rule1 @Propagation(EAGER) salience 10 when\n" + " not String( this == '1' )\n" + "then\n" + "end\n" + "rule rule2 @Propagation(EAGER) salience ( Integer.parseInt( $s1+'1' ) ) when\n" + " not String( this == '1' )\n" + " $s1 : String( )\n" + " eval( 1 == 1 ) \n" + "then\n" + "end\n" + "rule rule3 @Propagation(EAGER) salience ( Integer.parseInt( $s1+'2' ) ) when\n" + " $s1 : String( )\n" + " not String( this == '1' )\n" + " eval( 1 == 1 ) \n" + " eval( 1 == 1 ) \n" + "then\n" + " kcontext.getKieRuntime().halt();\n" + "end\n" + "\n"; KieSession ksession = new KieHelper().addContent(str, ResourceType.DRL) .build() .newKieSession(); ksession.insert( "0" ); ksession.insert( "2" ); ksession.fireAllRules(); Iterator it = ActivationIterator.iterator( ksession ); List list = new ArrayList(); for ( AgendaItem act = (AgendaItem) it.next(); act != null; act = (AgendaItem) it.next() ) { if ( act.getRule().getName().equals( "rule3" ) ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s1" ) + ":" + act.isQueued() ); } else if ( act.getRule().getName().equals( "rule1" ) ) { list.add( act.getRule().getName() + ":" + act.isQueued() ); } else if ( act.getRule().getName().equals( "rule2" ) ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s1" ) + ":" + act.isQueued() ); } } assertContains( new String[]{"rule1:true", "rule2:0:true", "rule2:2:true", "rule3:0:true", "rule3:2:false"}, list ); } @Test public void testExistsSharingWithMixedDormantAndActive() { String str = "package org.kie.test \n" + "\n" + "rule rule3 @Propagation(EAGER) salience ( Integer.parseInt( $s1+'1' ) ) when\n" + " $s1 : String( )\n" + " exists String( this == '1' )\n" + " eval( 1 == 1 ) \n" + " eval( 1 == 1 ) \n" + "then\n" + " kcontext.getKieRuntime().halt();\n" + "end\n" + "rule rule1 @Propagation(EAGER) salience 100 when\n" + " exists String( this == '1' )\n" + "then\n" + "end\n" + "rule rule2 @Propagation(EAGER) salience ( Integer.parseInt( $s1+'1' ) ) when\n" + " exists String( this == '1' )\n" + " $s1 : String( )\n" + " eval( 1 == 1 ) \n" + "then\n" + "end\n" + "\n"; KieSession ksession = new KieHelper().addContent(str, ResourceType.DRL) .build() .newKieSession(); ksession.insert( "0" ); ksession.insert( "1" ); ksession.insert( "2" ); ksession.fireAllRules(); Iterator it = ActivationIterator.iterator( ksession ); List list = new ArrayList(); for ( AgendaItem act = (AgendaItem) it.next(); act != null; act = (AgendaItem) it.next() ) { if ( act.getRule().getName().equals( "rule3" ) ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s1" ) + ":" + act.isQueued() ); } else if ( act.getRule().getName().equals( "rule1" ) ) { list.add( act.getRule().getName() + ":" + act.isQueued() ); } else if ( act.getRule().getName().equals( "rule2" ) ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s1" ) + ":" + act.isQueued() ); } } assertContains( new String[]{"rule1:false", "rule2:0:true", "rule2:1:true", "rule2:2:true", "rule3:2:false"}, list ); } @Test public void testFromnSharingWithMixedDormantAndActive() { String str = "package org.kie.test \n" + "global java.util.List list \n" + "\n" + "rule rule3 salience ( Integer.parseInt( $s1+'1' ) ) when\n" + " $s1 : String( ) from list \n" + " eval( 1 == 1 ) \n" + " eval( 1 == 1 ) \n" + "then\n" + " kcontext.getKieRuntime().halt();\n" + "end\n" + "rule rule1 salience ( Integer.parseInt( $s1+'1' ) ) when\n" + " $s1 : String( this == '1' ) from list\n" + "then\n" + "end\n" + "rule rule2 salience ( Integer.parseInt( $s1+'1' ) ) when\n" + " $s1 : String( ) from list \n" + " eval( 1 == 1 ) \n" + "then\n" + "end\n" + "\n"; KieSession ksession = new KieHelper().addContent(str, ResourceType.DRL) .build() .newKieSession(); List list = new ArrayList(); list.add( "0" ); list.add( "1" ); list.add( "2" ); ksession.setGlobal( "list", list ); ksession.fireAllRules(); Iterator it = ActivationIterator.iterator( ksession ); list = new ArrayList(); for ( AgendaItem act = (AgendaItem) it.next(); act != null; act = (AgendaItem) it.next() ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s1" ) + ":" + act.isQueued() ); } assertContains(new String[]{"rule1:1:true", "rule2:0:true", "rule2:1:true", "rule2:2:true", "rule3:0:true", "rule3:1:true", "rule3:2:false"}, list); } @Test public void testAccnSharingWithMixedDormantAndActive() { String str = "package org.kie.test \n" + "\n" + "rule rule1 @Propagation(EAGER) when\n" + " $s1 : Integer() from accumulate( $i : Integer(), sum ( $i ) ) " + "then\n" + "end\n" + "rule rule2 @Propagation(EAGER) when\n" + " $s1 : Integer() from accumulate( $i : Integer(), sum ( $i ) ) " + " eval( 1 == 1 ) \n" + "then\n" + "end\n" + "rule rule3 salience 10 when\n" + " eval( 1 == 1 ) \n" + " $s1 : Integer() from accumulate( $i : Integer(), sum ( $i ) ) " + " eval( 1 == 1 ) \n" + "then\n" + " kcontext.getKieRuntime().halt();\n" + "end\n" + "\n"; KieSession ksession = new KieHelper().addContent(str, ResourceType.DRL) .build() .newKieSession(); ksession.insert( new Integer( 1 ) ); ksession.insert( new Integer( 2 ) ); ksession.insert( new Integer( 3 ) ); ksession.fireAllRules(); Iterator it = ActivationIterator.iterator( ksession ); List list = new ArrayList(); list = new ArrayList(); for ( AgendaItem act = (AgendaItem) it.next(); act != null; act = (AgendaItem) it.next() ) { list.add( act.getRule().getName() + ":" + act.getDeclarationValue( "$s1" ) + ":" + act.isQueued() ); } assertContains( new String[]{"rule1:6:true", "rule2:6:true", "rule3:6:false"}, list ); } public void assertContains(Object[] objects, List list) { for ( Object object : objects ) { if ( !list.contains( object ) ) { fail( "does not contain:" + object ); } } } @Test(timeout=10000) public void testEagerEvaluation() throws Exception { String str = "package org.simple \n" + "rule xxx @Propagation(EAGER) \n" + "when \n" + " $s : String()\n" + "then \n" + "end \n" + "rule yyy @Propagation(EAGER) \n" + "when \n" + " $s : String()\n" + "then \n" + "end \n"; KieSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration(); conf.setOption( ForceEagerActivationOption.YES ); KnowledgeBase kbase = loadKnowledgeBaseFromString(str); KieSession ksession = createKnowledgeSession(kbase, conf); final List list = new ArrayList(); AgendaEventListener agendaEventListener = new DefaultAgendaEventListener() { public void matchCreated(org.kie.api.event.rule.MatchCreatedEvent event) { list.add("activated"); } }; ksession.addEventListener(agendaEventListener); ksession.insert("test"); assertEquals(2, list.size()); } @Test(timeout=10000) public void testFilteredEagerEvaluation() throws Exception { String str = "package org.simple \n" + "rule xxx @Propagation(EAGER) \n" + "when \n" + " $s : String()\n" + "then \n" + "end \n" + "rule yyy @Propagation(EAGER) \n" + "when \n" + " $s : String()\n" + "then \n" + "end \n"; KieSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration(); conf.setOption( new ForceEagerActivationOption.FILTERED( new ForceEagerActivationFilter() { @Override public boolean accept(Rule rule) { return rule.getName().equals("xxx"); } })); KnowledgeBase kbase = loadKnowledgeBaseFromString(str); KieSession ksession = createKnowledgeSession(kbase, conf); final List list = new ArrayList(); AgendaEventListener agendaEventListener = new DefaultAgendaEventListener() { public void matchCreated(org.kie.api.event.rule.MatchCreatedEvent event) { list.add("activated"); } }; ksession.addEventListener(agendaEventListener); ksession.insert("test"); ((InternalWorkingMemory) ksession).flushPropagations(); assertEquals(1, list.size()); } }