/* * 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.integrationtests.incrementalcompilation; import org.drools.core.common.InternalFactHandle; import org.drools.core.reteoo.LeftTuple; import org.drools.core.reteoo.RightTuple; import org.drools.core.reteoo.SubnetworkTuple; import org.junit.Test; import org.kie.api.KieBase; import org.kie.api.definition.rule.Rule; import org.kie.api.io.ResourceType; import org.kie.api.runtime.KieSession; import org.kie.api.runtime.StatelessKieSession; import org.kie.api.runtime.rule.FactHandle; import org.kie.internal.KnowledgeBase; import org.kie.internal.KnowledgeBaseFactory; import org.kie.internal.builder.KnowledgeBuilder; import org.kie.internal.builder.KnowledgeBuilderFactory; import org.kie.internal.definition.KnowledgePackage; import org.kie.internal.io.ResourceFactory; import org.kie.internal.runtime.StatefulKnowledgeSession; import org.kie.internal.runtime.StatelessKnowledgeSession; import org.kie.internal.utils.KieHelper; import java.io.StringReader; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import static org.drools.core.util.DroolsTestUtil.rulestoMap; import static org.junit.Assert.*; public class AddRemoveRulesTest extends AbstractAddRemoveRulesTest { public String ruleNormal1 = "rule 'rn1' "+ "when "+ "$c : Counter(id==1)"+ "then "+ "System.out.println('RN1 fired!!!'); \n"+ " end "; public String ruleNormal2 = "rule 'rn2' "+ "when "+ "$c : Counter(id==1)"+ "then "+ "System.out.println('RN2 fired!!!'); \n"+ " end "; public String ruleNormal3 = "rule 'rn3' "+ "when "+ "$c : Counter(id==1)"+ "then "+ "System.out.println('RN3 + fired!!!'); \n"+ " end "; String rule = "rule 'test' "+ "when "+ "$c : Counter(id==1)"+ "eval(Integer.parseInt(\"5\")==$c.getId()) \n"+ "eval(Integer.parseInt(\"10\")>5) "+ "then "+ "System.out.println('TEST 1 fired!!!');"+ "end "; public String rule2 = "rule 'test2' "+ "when "+ "$c : Counter(id==2)"+ "eval(Integer.parseInt(\"10\")==$c.getId()) \n"+ "eval(Integer.parseInt(\"20\")>10) "+ "then "+ "System.out.println('TEST 2 fired!!!'); \n"+ " end "; public String rule3 = "rule 'test3' "+ "when "+ "$c : Counter(id==3)"+ "eval(Integer.parseInt(\"15\")==$c.getId()) \n"+ "eval(Integer.parseInt(\"30\")>20) "+ "then "+ "System.out.println('TEST 2 fired!!!'); \n"+ " end "; public String rule4 = "rule 'test4' "+ "when "+ "$c : Counter(id==4)"+ "eval(Integer.parseInt(\"20\")==$c.getId()) \n"+ "eval(Integer.parseInt(\"40\")>30) "+ "then "+ "System.out.println('TEST 2 fired!!!'); \n"+ " end "; public String rule5 = "rule 'test5' "+ "when "+ "$c : Counter(id==5)"+ "eval(Integer.parseInt(\"25\")==$c.getId()) \n"+ "eval(Integer.parseInt(\"50\")>40) "+ "then "+ "System.out.println('TEST 2 fired!!!'); \n"+ " end "; public String rule6 = "rule 'test6' "+ "when "+ "$c : Counter(id==6)"+ "eval(Integer.parseInt(\"30\")==$c.getId()) \n"+ "eval(Integer.parseInt(\"60\")>50) "+ "then "+ "System.out.println('TEST 2 fired!!!'); \n"+ " end "; private KnowledgeBase base = KnowledgeBaseFactory.newKnowledgeBase(); public String getPrefix() { return "package " + PKG_NAME_TEST + " \n"+ "import java.util.Map;\n"+ "import java.util.HashMap;\n"+ "import org.slf4j.Logger;\n"+ "import java.util.Date;\n"+ "declare Counter \n"+ "@role(event)\n"+ " id : int \n"+ "\n"+ "end\n\n"; } private boolean loadRule(final String rule) { String prefix = getPrefix(); prefix += rule; final KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder(); builder.add( ResourceFactory.newReaderResource( new StringReader( prefix ) ), ResourceType.DRL); final Collection<KnowledgePackage> pkgs = this.buildKnowledge(builder); this.addKnowledgeToBase(pkgs); return true; } public boolean addRuleToEngine(final String rule) { this.loadRule(rule); return true; } public boolean deleteRule(final String name) { this.base.removeRule(PKG_NAME_TEST, name); return true; } private Collection<KnowledgePackage> buildKnowledge(final KnowledgeBuilder builder) { if ( builder.hasErrors() ) { fail( builder.getErrors().toString() ); } return builder.getKnowledgePackages(); } private void addKnowledgeToBase(final Collection<KnowledgePackage> pkgs) { this.base.addKnowledgePackages( pkgs ); } @Test public void test() throws Exception { final KieSession knowledgeSession = base.newKieSession(); knowledgeSession.fireAllRules(); addRuleToEngine(ruleNormal1); addRuleToEngine(ruleNormal2); addRuleToEngine(ruleNormal3); addRuleToEngine(rule); addRuleToEngine(rule2); addRuleToEngine(rule3); addRuleToEngine(rule4); addRuleToEngine(rule5); addRuleToEngine(rule6); assertTrue(getRulesCount(base) == 9); System.out.println("Primary remove"); deleteRule("test6"); assertTrue(getRulesCount(base) == 8); addRuleToEngine(rule6); assertTrue(getRulesCount(base) == 9); System.out.println("Secondary remove"); deleteRule("test6"); assertTrue(getRulesCount(base) == 8); } @Test public void testAddRemoveFromKB() { // DROOLS-328 final String drl = "\n" + "rule A\n" + " when\n" + " Double() from entry-point \"AAA\"\n" + " then\n" + " end\n" + "\n" + "rule B\n" + " when\n" + " Boolean()\n" + " Float()\n" + " then\n" + " end\n" + "\n" + "\n" + "rule C\n" + " when\n" + " then\n" + " insertLogical( new Float( 0.0f ) );\n" + " end\n" + "\n" + "\n" + "rule D\n" + " when\n" + " Byte( )\n" + " String( )\n" + " then\n" + " end\n" + "\n" + "\n" + "rule E\n" + " when\n" + " Float()\n" + " then\n" + " insertLogical( \"foo\" );\n" + " end\n" + ""; final KnowledgeBuilder kbuilder = createKnowledgeBuilder(null, drl); final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); // Create kSession and initialize it final StatefulKnowledgeSession kSession = kbase.newStatefulKnowledgeSession(); kSession.fireAllRules(); kSession.getKieBase().addKnowledgePackages( kbuilder.getKnowledgePackages() ); } @Test public void testAddRemoveDeletingFact() { // DROOLS-328 final String drl = "\n" + "rule B\n" + " when\n" + " Boolean()\n" + " Float()\n" + " then\n" + " end\n" + "\n" + ""; final KnowledgeBuilder kbuilder = createKnowledgeBuilder(null, drl); final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() ); // Create kSession and initialize it final StatefulKnowledgeSession kSession = kbase.newStatefulKnowledgeSession(); final FactHandle fh = kSession.insert(new Float( 0.0f ) ); kSession.fireAllRules(); kSession.getKieBase().addKnowledgePackages( kbuilder.getKnowledgePackages() ); kSession.delete(fh); } @Test public void testAddRemoveWithPartialSharing() { final String drl = "package org.drools.test; \n" + "\n" + "declare A end \n" + "declare B end \n" + "declare C end \n" + "declare D end \n" + "" + "rule Init \n" + " when\n" + " then\n" + " insert( new A() ); \n" + " insert( new B() ); \n" + " end\n" + "" + "rule One\n" + " when\n" + " A()\n" + " B()\n" + " C()\n" + " then\n" + " end\n" + "\n" + "rule Two\n" + " when\n" + " A()\n" + " B()\n" + " D()\n" + " then\n" + " end\n" + "\n" + ""; final KnowledgeBuilder kbuilder = createKnowledgeBuilder(null, drl); final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() ); // Create kSession and initialize it final StatefulKnowledgeSession kSession = kbase.newStatefulKnowledgeSession(); kSession.fireAllRules(); kSession.getKieBase().removeRule( "org.drools.test", "Two" ); kSession.fireAllRules(); } private String simpleRuleInTestPackage = "package org.drools.test; \n" + "global java.util.List list; \n" + "rule \"Later\" " + "when " + " $s : String( ) " + "then " + " System.out.println( \"ok\" ); " + " list.add( \"ok\" ); \n" + "end "; @Test public void testAddRemoveWithReloadInSamePackage_4Rules() { final String drl = "package org.drools.test;\n" + "declare Fakt enabled : boolean end \n" + "rule Build1\n" + "when\n" + " Fakt( enabled == true )\n" + "then\n" + "end\n" + "rule Build2\n" + "when\n" + " Fakt( enabled == true )\n" + "then\n" + "end\n" + "rule Mark \n" + "salience 9999\n" + "when\n" + "then\n" + " insertLogical( new Fakt( true ) );\n" + "end\n" + "rule Build3 \n" + "when\n" + " Fakt( enabled == true ) \n" + "then\n" + "end\n" + "rule Build4 \n" + "when\n" + " Fakt( enabled == true )\n" + "then\n" + "end\n" + ""; testAddRemoveWithReloadInSamePackage(drl); } @Test public void testAddRemoveWithReloadInSamePackage_3Rules() { final String drl = "package org.drools.test;\n" + "declare Fakt enabled : boolean end \n" + "rule Build1\n" + "when\n" + " Fakt( enabled == true )\n" + "then\n" + "end\n" + "rule Build2\n" + "when\n" + " Fakt( enabled == true )\n" + "then\n" + "end\n" + "rule Mark \n" + "salience 9999\n" + "when\n" + "then\n" + " insertLogical( new Fakt( true ) );\n" + "end\n" + "rule Build3 \n" + "when\n" + " Fakt( enabled == true ) \n" + "then\n" + "end\n" + ""; testAddRemoveWithReloadInSamePackage(drl); } @Test public void testAddRemoveWithReloadInSamePackage_EntryPoints() { final String drl = "package org.drools.test; \n" + "rule \"Input_X\"\n" + "when\n" + " Double() from entry-point \"A\"\n" + " not String( )\n" + "then\n" + "end\n" + "rule \"Input_Y\"\n" + "when\n" + " Double() from entry-point \"A\"\n" + " not Float( )\n" + "then\n" + "end\n" + "rule \"OverrideInput_Temp\"\n" + "when\n" + " Double() from entry-point \"A\"\n" + " Float( )\n" + "then\n" + "end\n" + "rule \"Zero\"\n" + "when\n" + "then\n" + "end\n" + ""; testAddRemoveWithReloadInSamePackage(drl); } @Test public void testAddRemoveWithReloadInSamePackage_EntryPointsVariety() { final String drl = "package org.drools.test; \n" + "rule \"Input_X\"\n" + "when\n" + " Double() \n" + " not String( )\n" + "then\n" + "end\n" + "rule \"Input_Y\"\n" + "when\n" + " Double() from entry-point \"A\"\n" + " not Float( )\n" + "then\n" + "end\n" + "rule \"OverrideInput_Temp\"\n" + "when\n" + " Double() from entry-point \"A\"\n" + " Float( )\n" + "then\n" + "end\n" + "rule \"Zero\"\n" + "when\n" + "then\n" + "end\n" + ""; testAddRemoveWithReloadInSamePackage(drl); } private void testAddRemoveWithReloadInSamePackage(final String drl) { final StatefulKnowledgeSession knowledgeSession = buildSessionInSteps(drl, simpleRuleInTestPackage); final List list = new ArrayList(); knowledgeSession.setGlobal("list", list); knowledgeSession.insert("go"); knowledgeSession.fireAllRules(); assertEquals(Arrays.asList("ok"), list); } @Test public void testRemoveWithDuplicatedCondition() { final String packageName = "test_same_condition_pk" ; final String rule = "package " + packageName + ";" + "rule 'test_same_condition' \n" + "when \n" + " String(this == \"1\") \n" + " String(this == \"1\") \n" + "then \n" + "System.out.println('test same condition rule'); \n"+ "end"; final KnowledgeBuilder kbuilder = createKnowledgeBuilder(null, rule); final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() ); kbase.removeKnowledgePackage(packageName); } @Test public void testFireAfterRemoveDuplicatedConditionInDifferentPackages() { final String packageName = "test_same_condition_pk" ; final String packageName2 = "test_same_condition_pk_2" ; final String rule1 = "package " + packageName + ";" + "import java.util.Map; \n" + "rule 'test_same_condition' \n" + "when \n" + " Map(this['name'] == 'Michael') \n" + "then \n" + "System.out.println('test same condition rule'); \n"+ "end"; final String rule2 = "package " + packageName2 + ";" + "import java.util.Map; \n" + "rule 'test_same_condition_2' \n" + "when \n" + " Map(this['name'] == 'Michael') \n" + " Map(this['test'] == '1') \n" + "then \n" + "System.out.println('test same condition rule 2'); \n"+ "end"; final StatefulKnowledgeSession session = buildSessionInSteps( rule1, rule2 ); session.getKieBase().removeKnowledgePackage(packageName); session.fireAllRules(); final Map<String, Object> fact = new HashMap<String, Object>(); fact.put("name", "Michael"); session.insert(fact); session.fireAllRules(); } @Test public void testAddRemoveWithExtends() { final String packageName = "test_same_condition_pk" ; final String rule1 = "package " + packageName + ";" + "import java.util.Map; \n" + "rule \"parentRule\" \n" + "when \n" + " Map(this['name'] == 'Michael') \n" + "then \n" + "System.out.println('Parent rule!'); \n"+ "end"; final String rule2 = "package " + packageName + ";" + "import java.util.Map; \n" + "rule \"childRule\" \n" + " extends \"parentRule\"\n" + "when \n" + " Map(this['test'] == '1') \n" + "then \n" + "System.out.println('Child rule!'); \n"+ "end"; final StatefulKnowledgeSession session = buildSessionInSteps( rule1, rule2); session.fireAllRules(); final Map<String, Object> fact = new HashMap<String, Object>(); fact.put("name", "Michael"); fact.put("test", 1); session.insert(fact); try { session.getKieBase().removeRule(packageName, "parentRule"); fail("A parent rule cannot be removed if one of its children is still there"); } catch (Exception e) { // OK } } @Test public void testRemoveHasSameConElement() { // DROOLS-891 final String packageName = "test"; final String rule1 = "package " + packageName + ";" + "import java.util.Map; \n" + "rule 'rule1' \n" + "when \n" + " Map(this['type'] == 'Goods' && this['brand'] == 'a') \n" + " Map(this['type'] == 'Goods' && this['category'] == 'b') \n" + "then \n" + "System.out.println('test rule 1'); \n"+ "end"; final KnowledgeBuilder kbuilder = createKnowledgeBuilder(null, rule1); final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() ); kbase.removeKnowledgePackage(packageName); final StatelessKnowledgeSession session = kbase.newStatelessKnowledgeSession(); session.execute(new HashMap()); } @Test public void testFireAfterRemoveWithSameCondition() { // DROOLS-893 final String packageName = "pk1"; final String packageName2 = "pk2"; final String rule1 = "package " + packageName + ";" + "import java.util.Map; \n" + "rule 'rule1' \n" + "when \n" + " Map(this['type'] == 'Goods' ) \n" + " Map(this['x'] == 'y' ) \n" + " Map(this['type'] == 'Juice' ) \n" + " Map(this['kind'] == 'Stuff' ) \n" + "then \n" + "System.out.println('test rule 1'); \n"+ "end"; final String rule2 = "package " + packageName2 + ";" + "import java.util.Map; \n" + "rule 'rule2' \n" + "when \n" + " Map(this['type'] == 'Goods' ) \n" + " Map(this['x'] == 'y' ) \n" + " Map(this['type'] == 'Juice' ) \n" + "then \n" + "System.out.println('test rule 2'); \n"+ "end"; final Map<String, Object> map = new HashMap<String, Object>(); map.put("type", "Goods"); map.put("kind", "Stuff"); map.put("x", "y"); final KieBase kbase = new KieHelper() .addContent(rule1, ResourceType.DRL) .addContent(rule2, ResourceType.DRL) .build(); KieSession ksession = kbase.newKieSession(); ksession.insert( map ); ksession.fireAllRules(); kbase.removeKiePackage( packageName2); ksession = kbase.newKieSession(); ksession.insert(map); ksession.fireAllRules(); } @Test public void testSameEval() { // DROOLS-893 final String rule1Name = "rule1"; final String rule2Name = "rule2"; final String rule1 = "rule " + rule1Name + " \n " + "when \n" + " eval(true) \n" + "then \n" + "System.out.println('test rule 1'); \n"+ "end"; final String rule2 = "rule " + rule2Name + " \n " + "when \n" + " eval(true) \n" + "then \n" + "System.out.println('test rule 2'); \n"+ "end"; final StatelessKnowledgeSession statelessSession = base.newStatelessKnowledgeSession(); this.addRuleToEngine(rule1); statelessSession.execute(new Object()); this.addRuleToEngine(rule2); statelessSession.execute(new Object()); } @Test public void testFireAfterRemoveRule() { // DROOLS-893 final String rule1Name = "rule1"; final String rule2Name = "rule2"; final String rule1 = "rule " + rule1Name + " \n" + "when \n" + " Map( this['type'] == 'Goods' )" + " and " + " Map( this['type'] == 'Cinema' )" + "then \n" + " System.out.println('test in rule1'); \n"+ "end"; final String rule2 = "rule " + rule2Name + " \n" + "when \n" + " Map( this['type'] == 'Goods' )" + " and " + " Map( this['type'] == 'Cinema' )" + "then \n" + " System.out.println('test in rule2'); \n"+ "end"; final Map<String, Object> fact = new HashMap<String, Object>(); fact.put("type", "Cinema"); final StatelessKieSession session = base.newStatelessKieSession(); this.addRuleToEngine(rule1); session.execute(fact); this.addRuleToEngine(rule2); session.execute(fact); this.deleteRule(rule1Name); session.execute(fact); } @Test public void testRemoveWithSameRuleNameInDiffPackage() { final String packageName = "pk1"; final String packageName2 = "pk2"; final String rule1Name = "rule1"; final String rule2Name = rule1Name; final String rule1 = "package " + packageName + ";" + "rule " + rule1Name + " \n" + "when \n" + " String( ) \n" + "then \n" + " System.out.println('test in rule1'); \n"+ "end"; final String rule2 = "package " + packageName2 + ";" + "rule " + rule2Name + " \n" + "when \n" + " Long( ) \n" + "then \n" + " System.out.println('test in rule2'); \n"+ "end"; final StatefulKnowledgeSession session = buildSessionInSteps( rule1, rule2 ); session.getKieBase().removeKnowledgePackage(packageName); session.getKieBase().removeKnowledgePackage(packageName2); session.insert(new String()); session.fireAllRules(); } @Test public void testRemoveWithSplitStartAtLianAndFollowedBySubNetworkNoSharing() { final String packageName = "pk1"; final String rule1 = "package " + packageName + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "rule R1 when\n" + " $s : String()\n" + " Integer()\n" + " exists Integer() from globalInt.get()\n" + "then\n" + "end\n"; final StatefulKnowledgeSession session = buildSessionInSteps( rule1 ); session.setGlobal( "globalInt", new AtomicInteger(0) ); session.insert( 1 ); session.insert( "1" ); session.fireAllRules(); session.getKieBase().removeKnowledgePackage(packageName); } @Test public void testRemoveExistsPopulatedByInitialFact() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule R1 when\n" + " exists( Integer() and Integer() )\n" + "then\n" + " list.add('R1'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule R2 \n" + "when \n" + " exists( Integer() and Integer() )\n" + " String()" + "then \n" + " list.add('R2'); \n" + "end"; final List<TestOperation> testPlan = AddRemoveTestBuilder.createInsertFactsRemoveFireTestPlan( rule1, rule2, AddRemoveTestBuilder.getDefaultFacts()); runAddRemoveTest(testPlan, null); } @Test public void testAddSplitInSubnetwork() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule R1 when\n" + " exists( Integer() and Integer() )\n" + "then\n" + " list.add('R1'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule R2 \n" + "when \n" + " exists( Integer() and String() )\n" + " String()" + "then \n" + " list.add('R2'); \n" + "end"; final List<TestOperation> testPlan = AddRemoveTestBuilder.createInsertFactsRemoveFireTestPlan( rule1, rule2, AddRemoveTestBuilder.getDefaultFacts()); runAddRemoveTest(testPlan, null); } @Test public void testRemoveWithSplitStartAtLianAndFollowedBySubNetworkWithSharing() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " $s : String()\n" + " Integer()\n" + " exists Integer() from globalInt.get()\n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " $s1 : String()\n" + " $s2 : String()\n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; testRemoveWithSplitStartBasicTestSet(rule1, rule2, RULE1_NAME, RULE2_NAME); } @Test public void testRemoveWithSplitStartBeforeJoinAndFollowedBySubNetworkWithSharing() { // moved the split start to after the Integer final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " $s : String()\n" + " Integer()\n" + " exists Integer() from globalInt.get()\n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " $s : String()\n" + " exists Integer() from globalInt.get()\n" + " Integer()\n" + " String()\n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; testRemoveWithSplitStartBasicTestSet(rule1, rule2, RULE1_NAME, RULE2_NAME); } @Test public void testRemoveWithSplitStartAtJoinAndFollowedBySubNetworkWithSharing() { // moved the split start to after the Integer final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " $s : String()\n" + " Integer()\n" + " exists Integer() from globalInt.get()\n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " $s : String()\n" + " Integer()\n" + " String()\n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; testRemoveWithSplitStartBasicTestSet(rule1, rule2, RULE1_NAME, RULE2_NAME); } @Test public void testRemoveWithSplitStartSameRules() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " $s : String()\n" + " Integer()\n" + " exists( Integer() and Integer() )\n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " $s : String()\n" + " Integer()\n" + " exists( Integer() and Integer() )\n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; testRemoveWithSplitStartBasicTestSet(rule1, rule2, RULE1_NAME, RULE2_NAME); } @Test public void testRemoveWithSplitStartDoubledExistsConstraint() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " $s : String()\n" + " Integer()\n" + " exists( Integer() and Integer() )\n" + " exists( Integer() and Integer() )\n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " $s : String()\n" + " Integer()\n" + " exists( Integer() and Integer() )\n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; testRemoveWithSplitStartBasicTestSet(rule1, rule2, RULE1_NAME, RULE2_NAME); } @Test public void testRemoveWithSplitStartDoubledIntegerConstraint() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " $s : String()\n" + " Integer()\n" + " exists( Integer() and Integer() )\n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " $s : String()\n" + " Integer()\n" + " Integer()\n" + " exists( Integer() and Integer() )\n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; testRemoveWithSplitStartBasicTestSet(rule1, rule2, RULE1_NAME, RULE2_NAME); } @Test public void testRemoveWithSplitStartAfterSubnetwork() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " $s : String()\n" + " Integer()\n" + " exists( Integer() and Integer() )\n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " $s : String()\n" + " Integer()\n" + " exists( Integer() and Integer() )\n" + " String()\n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; testRemoveWithSplitStartBasicTestSet(rule1, rule2, RULE1_NAME, RULE2_NAME); } @Test public void testRemoveWithSplitStartAfterSubnetwork3Rules() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " $s : String()\n" + " Integer()\n" + " exists( Integer() and Integer() )\n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " $s : String()\n" + " Integer()\n" + " exists( Integer() and Integer() )\n" + " String()\n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; final String rule3 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE3_NAME + " \n" + "when \n" + " $s : String()\n" + " Integer()\n" + " exists( Integer() and exists(Integer() and Integer()))\n" + " String()\n" + "then \n" + " list.add('" + RULE3_NAME + "'); \n" + "end"; AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2, rule3}) .addOperation(TestOperationType.INSERT_FACTS, new Object[] {1, 2, "1"}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME, RULE2_NAME, RULE3_NAME}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE1_NAME, RULE2_NAME, RULE3_NAME}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{}); final Map<String, Object> additionalGlobals = new HashMap<String, Object>(); additionalGlobals.put("globalInt", new AtomicInteger(0)); runAddRemoveTest(builder.build(), additionalGlobals); } @Test public void testRemoveWithSplitStartAfterSubnetwork3RulesAddOneAfterAnother() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " $s : String()\n" + " Integer()\n" + " exists( Integer() and Integer() )\n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " $s : String()\n" + " Integer()\n" + " exists( Integer() and Integer() )\n" + " String()\n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; final String rule3 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE3_NAME + " \n" + "when \n" + " $s : String()\n" + " Integer()\n" + " exists( Integer() and exists(Integer() and Integer()))\n" + " String()\n" + "then \n" + " list.add('" + RULE3_NAME + "'); \n" + "end"; AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1}) .addOperation(TestOperationType.INSERT_FACTS, new Object[] {1, 1, "1"}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME}) .addOperation(TestOperationType.ADD_RULES, new String[]{rule2}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE2_NAME}) .addOperation(TestOperationType.ADD_RULES, new String[]{rule3}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE3_NAME}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE1_NAME, RULE2_NAME, RULE3_NAME}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{}); final Map<String, Object> additionalGlobals = new HashMap<String, Object>(); additionalGlobals.put("globalInt", new AtomicInteger(0)); runAddRemoveTest(builder.build(), additionalGlobals); } @Test public void testRemoveWithSplitStartAfterSubnetwork3RulesReaddRule() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " $s : String()\n" + " Integer()\n" + " exists( Integer() and Integer() )\n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " $s : String()\n" + " Integer()\n" + " exists( Integer() and Integer() )\n" + " String()\n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; final String rule3 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE3_NAME + " \n" + "when \n" + " $s : String()\n" + " Integer()\n" + " exists( Integer() and exists(Integer() and Integer()))\n" + " String()\n" + "then \n" + " list.add('" + RULE3_NAME + "'); \n" + "end"; AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2, rule3}) .addOperation(TestOperationType.INSERT_FACTS, new Object[] {1, 2, "1"}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE2_NAME}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME, RULE3_NAME}) .addOperation(TestOperationType.ADD_RULES, new String[]{rule2}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE2_NAME}); runAddRemoveTest(builder.build(), new HashMap<String, Object>()); } String[] getRules1Pattern() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " $i : Integer(this>1)\n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " $i : Integer(this>2)\n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; return new String[] { rule1, rule2 }; } String[] getRules2Pattern() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " $i1 : Integer(this>1)\n" + " $i2 : Integer(this>1)\n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " $i1 : Integer(this>1)\n" + " $i2 : Integer(this>2)\n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; return new String[] { rule1, rule2 }; } @Test public void testRemoveRuleChangeFHFirstLeftTuple() { String[] rules = getRules1Pattern(); AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rules[0], rules[1]}) .addOperation(TestOperationType.INSERT_FACTS, new Object[] {3}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME, RULE2_NAME}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE1_NAME}) .addOperation(TestOperationType.FIRE_RULES); final Map<String, Object> additionalGlobals = new HashMap<String, Object>(); StatefulKnowledgeSession ksession = runAddRemoveTest(builder.build(), additionalGlobals); InternalFactHandle fh1 = (InternalFactHandle) ksession.getFactHandle(3); assertNotNull( fh1.getFirstLeftTuple() ); } @Test public void testRemoveRuleChangeFHLastLeftTuple() { String[] rules = getRules1Pattern(); AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rules[0], rules[1]}) .addOperation(TestOperationType.INSERT_FACTS, new Object[] {3}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME, RULE2_NAME}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE2_NAME}) .addOperation(TestOperationType.FIRE_RULES); final Map<String, Object> additionalGlobals = new HashMap<String, Object>(); StatefulKnowledgeSession ksession = runAddRemoveTest(builder.build(), additionalGlobals); InternalFactHandle fh1 = (InternalFactHandle) ksession.getFactHandle(3); } @Test public void testRemoveRightTupleThatWasFirst() { String[] rules = getRules2Pattern(); AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rules[0], rules[1]}) .addOperation(TestOperationType.INSERT_FACTS, new Object[] {3}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME, RULE2_NAME}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE1_NAME}) .addOperation(TestOperationType.FIRE_RULES); final Map<String, Object> additionalGlobals = new HashMap<String, Object>(); StatefulKnowledgeSession ksession = runAddRemoveTest(builder.build(), additionalGlobals); Map<String, Rule> rulesMap = rulestoMap(ksession.getKieBase()); InternalFactHandle fh1 = (InternalFactHandle) ksession.getFactHandle(3); assertNotNull( fh1.getFirstRightTuple() ); assertEquals( 1, fh1.getFirstRightTuple().getTupleSink().getAssociatedRuleSize() ); assertTrue( fh1.getFirstRightTuple().getTupleSink().isAssociatedWith(rulesMap.get(RULE2_NAME))); } @Test public void testRemoveRightTupleThatWasLast() { String[] rules = getRules2Pattern(); AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rules[0], rules[1]}) .addOperation(TestOperationType.INSERT_FACTS, new Object[] {3}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME, RULE2_NAME}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE2_NAME}) .addOperation(TestOperationType.FIRE_RULES); final Map<String, Object> additionalGlobals = new HashMap<String, Object>(); StatefulKnowledgeSession ksession = runAddRemoveTest(builder.build(), additionalGlobals); Map<String, Rule> rulesMap = rulestoMap(ksession.getKieBase()); InternalFactHandle fh1 = (InternalFactHandle) ksession.getFactHandle(3); assertNotNull( fh1.getFirstRightTuple() ); assertEquals( 1, fh1.getFirstRightTuple().getTupleSink().getAssociatedRuleSize() ); assertTrue( fh1.getFirstRightTuple().getTupleSink().isAssociatedWith(rulesMap.get(RULE1_NAME))); } String[] getRules3Pattern() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " $i1 : Integer(this>1)\n" + " $i2 : Integer(this>1)\n" + " $i3 : Integer(this>0)\n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " $i1 : Integer(this>1)\n" + " $i2 : Integer(this>1)\n" + " $i3 : Integer(this>1)\n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; final String rule3 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE3_NAME + " \n" + "when \n" + " $i1 : Integer(this>1)\n" + " $i2 : Integer(this>1)\n" + " $i3 : Integer(this>2)\n" + "then \n" + " list.add('" + RULE3_NAME + "'); \n" + "end"; return new String[] { rule1, rule2, rule3 }; } @Test public void testRemoveChildLeftTupleThatWasFirst() { String[] rules = getRules3Pattern(); AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rules[0], rules[1]}) .addOperation(TestOperationType.INSERT_FACTS, new Object[] {3}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME, RULE2_NAME}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE1_NAME}) .addOperation(TestOperationType.FIRE_RULES); final Map<String, Object> additionalGlobals = new HashMap<String, Object>(); StatefulKnowledgeSession ksession = runAddRemoveTest(builder.build(), additionalGlobals); Map<String, Rule> rulesMap = rulestoMap(ksession.getKieBase()); InternalFactHandle fh1 = (InternalFactHandle) ksession.getFactHandle(3); LeftTuple lt = fh1.getFirstLeftTuple().getFirstChild().getFirstChild(); assertSame(lt, fh1.getFirstLeftTuple().getFirstChild().getLastChild()); assertNull( lt.getPeer() ); assertEquals( 1, lt.getTupleSink().getAssociatedRuleSize() ); assertTrue( lt.getTupleSink().isAssociatedWith(rulesMap.get(RULE2_NAME))); } @Test public void testRemoveChildLeftTupleThatWasLast() { String[] rules = getRules3Pattern(); AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rules[0], rules[1]}) .addOperation(TestOperationType.INSERT_FACTS, new Object[] {3}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME, RULE2_NAME}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE2_NAME}) .addOperation(TestOperationType.FIRE_RULES); final Map<String, Object> additionalGlobals = new HashMap<String, Object>(); StatefulKnowledgeSession ksession = runAddRemoveTest(builder.build(), additionalGlobals); Map<String, Rule> rulesMap = rulestoMap(ksession.getKieBase()); InternalFactHandle fh1 = (InternalFactHandle) ksession.getFactHandle(3); LeftTuple lt = fh1.getFirstLeftTuple().getFirstChild().getFirstChild(); assertSame(lt, fh1.getFirstLeftTuple().getFirstChild().getLastChild()); assertNull( lt.getPeer() ); assertEquals( 1, lt.getTupleSink().getAssociatedRuleSize() ); assertTrue( lt.getTupleSink().isAssociatedWith(rulesMap.get(RULE1_NAME))); } @Test public void testRemoveChildLeftTupleThatWasMiddle() { String[] rules = getRules3Pattern(); AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rules[0], rules[1], rules[2]}) .addOperation(TestOperationType.INSERT_FACTS, new Object[] {3}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME, RULE2_NAME, RULE3_NAME}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE2_NAME}) .addOperation(TestOperationType.FIRE_RULES); final Map<String, Object> additionalGlobals = new HashMap<String, Object>(); StatefulKnowledgeSession ksession = runAddRemoveTest(builder.build(), additionalGlobals); Map<String, Rule> rulesMap = rulestoMap(ksession.getKieBase()); InternalFactHandle fh1 = (InternalFactHandle) ksession.getFactHandle(3); LeftTuple lt = fh1.getFirstLeftTuple().getFirstChild(); assertSame(lt, fh1.getFirstLeftTuple().getLastChild()); assertEquals( 1, lt.getTupleSink().getAssociatedRuleSize() ); assertTrue( lt.getTupleSink().isAssociatedWith(rulesMap.get(RULE1_NAME))); LeftTuple peer = lt.getPeer(); assertEquals( 1, peer.getTupleSink().getAssociatedRuleSize() ); assertTrue( peer.getTupleSink().isAssociatedWith(rulesMap.get(RULE3_NAME))); } @Test public void testRemoveChildLeftTupleThatWasFirstWithMultipleData() { String[] rules = getRules3Pattern(); AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rules[0], rules[1]}) .addOperation(TestOperationType.INSERT_FACTS, new Object[] {3, 4, 5}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME, RULE2_NAME}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE1_NAME}) .addOperation(TestOperationType.FIRE_RULES); final Map<String, Object> additionalGlobals = new HashMap<String, Object>(); StatefulKnowledgeSession ksession = runAddRemoveTest(builder.build(), additionalGlobals); Map<String, Rule> rulesMap = rulestoMap(ksession.getKieBase()); InternalFactHandle fh1 = (InternalFactHandle) ksession.getFactHandle(3); InternalFactHandle fh2 = (InternalFactHandle) ksession.getFactHandle(4); InternalFactHandle fh3 = (InternalFactHandle) ksession.getFactHandle(5); LeftTuple lt1 = fh1.getFirstLeftTuple(); LeftTuple lt1_1 = lt1.getFirstChild(); LeftTuple lt1_2 = lt1_1.getHandleNext(); LeftTuple lt1_3= lt1_2.getHandleNext(); assertNotNull( lt1_1 ); assertNotNull( lt1_2 ); assertNotNull( lt1_3 ); assertSame(lt1_3, lt1.getLastChild()); assertSame(lt1_2, lt1_3.getHandlePrevious() ); assertSame(lt1_1, lt1_2.getHandlePrevious() ); assertEquals( 1, lt1_1.getTupleSink().getAssociatedRuleSize() ); assertTrue( lt1_1.getTupleSink().isAssociatedWith(rulesMap.get(RULE2_NAME))); assertNull( lt1_1.getPeer() ); assertEquals( 1, lt1_2.getTupleSink().getAssociatedRuleSize() ); assertTrue( lt1_2.getTupleSink().isAssociatedWith(rulesMap.get(RULE2_NAME))); assertNull( lt1_2.getPeer() ); assertEquals( 1, lt1_3.getTupleSink().getAssociatedRuleSize() ); assertTrue( lt1_3.getTupleSink().isAssociatedWith(rulesMap.get(RULE2_NAME))); assertNull( lt1_3.getPeer() ); RightTuple rt1 = fh3.getFirstRightTuple(); LeftTuple rt1_1 = rt1.getLastChild(); assertSame( lt1_1, rt1_1); LeftTuple rt1_2 = rt1_1.getRightParentPrevious(); LeftTuple rt1_3 = rt1_2.getRightParentPrevious(); assertNotNull( rt1_1 ); assertNotNull( rt1_2 ); assertNotNull( rt1_3 ); assertSame(rt1_2, rt1_3.getRightParentNext() ); assertSame(rt1_1, rt1_2.getRightParentNext() ); assertEquals( 1, rt1_1.getTupleSink().getAssociatedRuleSize() ); assertTrue( rt1_1.getTupleSink().isAssociatedWith(rulesMap.get(RULE2_NAME))); assertNull( rt1_1.getPeer() ); assertEquals( 1, rt1_2.getTupleSink().getAssociatedRuleSize() ); assertTrue( rt1_2.getTupleSink().isAssociatedWith(rulesMap.get(RULE2_NAME))); assertNull( rt1_2.getPeer() ); assertEquals( 1, rt1_3.getTupleSink().getAssociatedRuleSize() ); assertTrue( rt1_3.getTupleSink().isAssociatedWith(rulesMap.get(RULE2_NAME))); assertNull( rt1_3.getPeer() ); } @Test public void testRemoveChildLeftTupleThatWasLastWithMultipleData() { String[] rules = getRules3Pattern(); AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rules[0], rules[1]}) .addOperation(TestOperationType.INSERT_FACTS, new Object[] {3, 4, 5}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME, RULE2_NAME}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE2_NAME}) .addOperation(TestOperationType.FIRE_RULES); final Map<String, Object> additionalGlobals = new HashMap<String, Object>(); StatefulKnowledgeSession ksession = runAddRemoveTest(builder.build(), additionalGlobals); Map<String, Rule> rulesMap = rulestoMap(ksession.getKieBase()); InternalFactHandle fh1 = (InternalFactHandle) ksession.getFactHandle(3); InternalFactHandle fh2 = (InternalFactHandle) ksession.getFactHandle(4); InternalFactHandle fh3 = (InternalFactHandle) ksession.getFactHandle(5); LeftTuple lt1 = fh1.getFirstLeftTuple(); LeftTuple lt1_1 = lt1.getFirstChild(); LeftTuple lt1_2 = lt1_1.getHandleNext(); LeftTuple lt1_3= lt1_2.getHandleNext(); assertNotNull( lt1_1 ); assertNotNull( lt1_2 ); assertNotNull( lt1_3 ); assertSame(lt1_3, lt1.getLastChild()); assertSame(lt1_2, lt1_3.getHandlePrevious() ); assertSame(lt1_1, lt1_2.getHandlePrevious() ); assertEquals( 1, lt1_1.getTupleSink().getAssociatedRuleSize() ); assertTrue( lt1_1.getTupleSink().isAssociatedWith(rulesMap.get(RULE1_NAME))); assertNull( lt1_1.getPeer() ); assertEquals( 1, lt1_2.getTupleSink().getAssociatedRuleSize() ); assertTrue( lt1_2.getTupleSink().isAssociatedWith(rulesMap.get(RULE1_NAME))); assertNull( lt1_2.getPeer() ); assertEquals( 1, lt1_3.getTupleSink().getAssociatedRuleSize() ); assertTrue( lt1_3.getTupleSink().isAssociatedWith(rulesMap.get(RULE1_NAME))); assertNull( lt1_3.getPeer() ); RightTuple rt1 = fh3.getFirstRightTuple(); LeftTuple rt1_1 = rt1.getLastChild(); assertSame( lt1_1, rt1_1); LeftTuple rt1_2 = rt1_1.getRightParentPrevious(); LeftTuple rt1_3 = rt1_2.getRightParentPrevious(); assertNotNull( rt1_1 ); assertNotNull( rt1_2 ); assertNotNull( rt1_3 ); assertSame(rt1_2, rt1_3.getRightParentNext() ); assertSame(rt1_1, rt1_2.getRightParentNext() ); assertEquals( 1, rt1_1.getTupleSink().getAssociatedRuleSize() ); assertTrue( rt1_1.getTupleSink().isAssociatedWith(rulesMap.get(RULE1_NAME))); assertNull( rt1_1.getPeer() ); assertEquals( 1, rt1_2.getTupleSink().getAssociatedRuleSize() ); assertTrue( rt1_2.getTupleSink().isAssociatedWith(rulesMap.get(RULE1_NAME))); assertNull( rt1_2.getPeer() ); assertEquals( 1, rt1_3.getTupleSink().getAssociatedRuleSize() ); assertTrue( rt1_3.getTupleSink().isAssociatedWith(rulesMap.get(RULE1_NAME))); assertNull( rt1_3.getPeer() ); } private void testRemoveWithSplitStartBasicTestSet(final String rule1, final String rule2, final String rule1Name, final String rule2Name) { final Map<String, Object> additionalGlobals = new HashMap<String, Object>(); additionalGlobals.put("globalInt", new AtomicInteger(0)); runAddRemoveTests(rule1, rule2, rule1Name, rule2Name, new Object[] {1, 2, "1"}, additionalGlobals); } @Test public void testMergeRTN() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " Integer()\n" + " Integer()\n" + " Integer()\n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " Integer()\n" + " exists( Integer() and Integer() )\n" + " Integer()\n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2}) .addOperation(TestOperationType.INSERT_FACTS, new Object[] {1, 2, 3}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE2_NAME}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE1_NAME}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{}); runAddRemoveTest(builder.build(), new HashMap<String, Object>()); } @Test public void testSubSubNetwork() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " Integer()\n" + " Integer()\n" + " Integer()\n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " Integer()\n" + " exists( Integer() and Integer() )\n" + " exists(Integer() and exists(Integer() and Integer()))\n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2}) .addOperation(TestOperationType.INSERT_FACTS, new Object[] {1}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE2_NAME}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE1_NAME}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{}) ; runAddRemoveTest(builder.build(), new HashMap<String, Object>()); } @Test public void testSubSubNetwork2() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " Integer()\n" + " Integer()\n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " Integer()\n" + " exists( Integer() and Integer() )\n" + " exists(Integer() and exists(Integer() and Integer()))\n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2}) .addOperation(TestOperationType.INSERT_FACTS, new Object[] {1}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE1_NAME, RULE2_NAME}) .addOperation(TestOperationType.ADD_RULES, new String[]{rule1}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME}) ; runAddRemoveTest(builder.build(), new HashMap<String, Object>()); } @Test public void testSubSubNetwork3() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " exists(Integer() and Integer()) \n" + " exists(Integer() and Integer()) \n" + " Integer() \n\n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " exists(Integer() and Integer()) \n" + " Integer() \n" + " exists(Integer() and exists(Integer() and Integer())) \n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2}) .addOperation(TestOperationType.INSERT_FACTS, new Object[] {1}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME, RULE2_NAME}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE1_NAME, RULE2_NAME}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{}) ; runAddRemoveTest(builder.build(), new HashMap<String, Object>()); } @Test public void testSubSubNetwork4() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " exists(Integer() and Integer()) \n" + " Integer() \n" + " Integer() \n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " exists(Integer() and Integer()) \n" + " Integer() \n" + " exists(Integer() and exists(Integer() and Integer())) \n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2}) .addOperation(TestOperationType.INSERT_FACTS, new Object[] {1}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE1_NAME}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE2_NAME}) ; runAddRemoveTest(builder.build(), new HashMap<String, Object>()); } @Test public void testSubNetworkWithNot() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " exists(Integer() and Integer()) \n" + " not(Double() and Double()) \n" + " Integer() \n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " exists(Integer() and Integer()) \n" + " not(Double() and Double()) \n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2}) .addOperation(TestOperationType.INSERT_FACTS, new Object[] {1}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE2_NAME}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME}) ; runAddRemoveTest(builder.build(), new HashMap<String, Object>()); } @Test public void testSubNetworkWithNot2() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " exists(Integer() and Integer()) \n" + " not(Double() and Double()) \n" + " Integer() \n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " exists(Integer() and Integer()) \n" + " not(Double() and Double()) \n" + " exists(Integer() and Integer()) \n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2}) .addOperation(TestOperationType.INSERT_FACTS, new Object[] {1}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE2_NAME}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME}) ; runAddRemoveTest(builder.build(), new HashMap<String, Object>()); } @Test public void testSubNetworkWithNot3() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " exists(Integer()) \n" + " not(Double() and Double()) \n" + " Integer() \n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " exists(Integer()) \n" + " not(Double() and Double()) \n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2}) .addOperation(TestOperationType.INSERT_FACTS, new Object[] {1}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME, RULE2_NAME}) ; runAddRemoveTest(builder.build(), new HashMap<String, Object>()); } @Test public void testSubNetworkWithNot4() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " exists(Integer() and Integer()) \n" + " exists(Integer() and exists(Integer() and Integer())) \n" + " Integer() \n" + " not(Double() and Double()) \n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " exists(Integer() and Integer()) \n" + " Integer() \n" + " not(Double() and Double()) \n" + " exists(Integer() and Integer()) \n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2}) .addOperation(TestOperationType.INSERT_FACTS, new Object[] {1}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE1_NAME}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE2_NAME}) ; runAddRemoveTest(builder.build(), new HashMap<String, Object>()); } @Test public void testInsertFireRemoveWith2Nots() { final String rule1 = " package " + PKG_NAME_TEST + ";\n" + " global java.util.List list\n" + " rule " + RULE1_NAME + " \n" + " when \n" + " Integer() \n" + " Integer() \n" + " then\n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = " package " + PKG_NAME_TEST + ";\n" + " global java.util.List list\n" + " rule " + RULE2_NAME + " \n" + " when \n" + " Integer() \n" + " Integer() \n" + " not(not(Integer() and Integer())) \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; final AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule2, rule1}) .addOperation(TestOperationType.INSERT_FACTS, new Object[] {1}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE2_NAME}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE1_NAME}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{}); runAddRemoveTest(builder.build(), new HashMap<String, Object>()); } @Test public void testSubSubNetwork5() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " Integer() \n" + " Integer() \n" + " exists(Integer() and Integer()) \n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " Integer() \n" + " exists(Integer() and Integer()) \n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2}) .addOperation(TestOperationType.INSERT_FACTS, new Object[] {1}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE1_NAME}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE2_NAME}) ; runAddRemoveTest(builder.build(), new HashMap<String, Object>()); } @Test public void testInsertRemoveFireWith2Nots() { final String rule1 = " package " + PKG_NAME_TEST + ";\n" + " global java.util.List list\n" + " rule " + RULE1_NAME + " \n" + " when \n" + " exists(Integer() and Integer()) \n" + " Integer() \n" + " not(exists(Integer() and Integer())) \n" + " then\n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = " package " + PKG_NAME_TEST + ";\n" + " global java.util.List list\n" + " rule " + RULE2_NAME + " \n" + " when \n" + " exists(Integer() and Integer()) \n" + " not(exists(Integer() and Integer())) \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; final AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2}); runAddRemoveTest(builder.build(), new HashMap<String, Object>()); } @Test public void testSharedRian() { final String rule1 = " package " + PKG_NAME_TEST + ";\n" + " global java.util.List list\n" + " rule " + RULE1_NAME + " \n" + " when \n" + " Integer() \n" + " not(Integer() and Integer()) \n" + " then\n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = " package " + PKG_NAME_TEST + ";\n" + " global java.util.List list\n" + " rule " + RULE2_NAME + " \n" + " when \n" + " Integer() \n" + " exists(Integer() and Integer()) \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; final AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1}) .addOperation(TestOperationType.INSERT_FACTS, new Object[]{1}) .addOperation(TestOperationType.ADD_RULES, new String[]{rule2}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE2_NAME}); runAddRemoveTest(builder.build(), new HashMap<String, Object>()); } @Test public void testSharedRianWithFire() { final String rule1 = " package " + PKG_NAME_TEST + ";\n" + " global java.util.List list\n" + " rule " + RULE1_NAME + " \n" + " when \n" + " Integer() \n" + " not(Integer() and Integer()) \n" + " then\n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = " package " + PKG_NAME_TEST + ";\n" + " global java.util.List list\n" + " rule " + RULE2_NAME + " \n" + " when \n" + " Integer() \n" + " exists(Integer() and Integer()) \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; final AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1}) .addOperation(TestOperationType.INSERT_FACTS, new Object[]{1}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.ADD_RULES, new String[]{rule2}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE2_NAME}); runAddRemoveTest(builder.build(), new HashMap<String, Object>()); } @Test public void testSharedRian2() { final String rule1 = " package " + PKG_NAME_TEST + ";\n" + " global java.util.List list\n" + " rule " + RULE1_NAME + " \n" + " when \n" + " Integer() \n" + " Integer() \n" + " not(not(Integer() and Integer())) \n" + " then\n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = " package " + PKG_NAME_TEST + ";\n" + " global java.util.List list\n" + " rule " + RULE2_NAME + " \n" + " when \n" + " Integer() \n" + " exists(Integer() and exists(Integer() and Integer())) \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; final AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1}) .addOperation(TestOperationType.INSERT_FACTS, new Object[]{1}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME}) .addOperation(TestOperationType.ADD_RULES, new String[]{rule2}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE2_NAME}); runAddRemoveTest(builder.build(), new HashMap<String, Object>()); } @Test public void testRemoveRuleWithSharedRia() { final String rule1Name = "rule1"; final String rule2Name = "rule2"; final String rule1 = "rule " + rule1Name + " \n" + "when \n" + " Integer() \n" + " not(Integer() and Integer()) \n" + "then \n" + "System.out.println('test rule 1'); \n"+ "end"; final String rule2 = "rule " + rule2Name + " \n" + "when \n" + " Integer() \n" + " exists(Integer() and Integer()) \n" + "then \n" + "System.out.println('test rule 2'); \n"+ "end"; KieSession session = base.newKieSession(); this.addRuleToEngine(rule1); InternalFactHandle fh = (InternalFactHandle)session.insert( 1 ); session.fireAllRules(); this.addRuleToEngine(rule2); SubnetworkTuple tuple = (SubnetworkTuple)fh.getFirstLeftTuple().getFirstChild().getFirstChild(); assertNotNull( tuple.getPeer() ); this.deleteRule(rule2Name); assertNull( tuple.getPeer() ); } @Test public void testAddRemoveFacts() { final String rule1 = " package " + PKG_NAME_TEST + ";\n" + " global java.util.List list\n" + " rule " + RULE1_NAME + " \n" + " when \n" + " Integer() \n" + " not(not(Integer() and Integer())) \n" + " then\n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = " package " + PKG_NAME_TEST + ";\n" + " global java.util.List list\n" + " rule " + RULE2_NAME + " \n" + " when \n" + " Integer() \n" + " exists(Integer() and Integer()) \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; final List resultsList = new ArrayList(); final Map<String, Object> globals = new HashMap<String, Object>(); globals.put("list", resultsList); final TestContext context = new TestContext(PKG_NAME_TEST, globals, resultsList); final AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2}) .addOperation(TestOperationType.INSERT_FACTS, new Object[]{1}); context.executeTestOperations(builder.build()); builder.clear(); final Set<FactHandle> sessionFacts = context.getActualSessionFactHandles(); builder.addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE2_NAME, RULE1_NAME}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{}) .addOperation(TestOperationType.REMOVE_FACTS, sessionFacts.toArray(new FactHandle[]{})) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{}); context.executeTestOperations(builder.build()); } @Test public void testReaddRulesSharedRianDoubleNots() { final String rule1 = " package " + PKG_NAME_TEST + ";\n" + " global java.util.List list\n" + " rule " + RULE1_NAME + " \n" + " when \n" + " exists(Integer() and Integer()) \n" + " then\n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = " package " + PKG_NAME_TEST + ";\n" + " global java.util.List list\n" + " rule " + RULE2_NAME + " \n" + " when \n" + " not(not(exists(Integer() and Integer()))) \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; final AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2}) .addOperation(TestOperationType.INSERT_FACTS, new Object[]{1}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME, RULE2_NAME}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE1_NAME, RULE2_NAME}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{}) .addOperation(TestOperationType.ADD_RULES, new String[]{rule1, rule2}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME, RULE2_NAME}); runAddRemoveTest(builder.build(), new HashMap<String, Object>()); } @Test public void testOr() { final String rule1 = " package " + PKG_NAME_TEST + ";\n" + " global java.util.List list\n" + " rule " + RULE1_NAME + " \n" + " when \n" + " $k: Integer()\n" + " ( Integer(this != 1) or Integer(this == 1) )\n" + " then\n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = " package " + PKG_NAME_TEST + ";\n" + " global java.util.List list\n" + " rule " + RULE2_NAME + " \n" + " when \n" + " Integer()\n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; final AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule2}) .addOperation(TestOperationType.INSERT_FACTS, new Object[]{1}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE2_NAME}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE2_NAME}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{}) .addOperation(TestOperationType.ADD_RULES, new String[]{rule1, rule2}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME, RULE2_NAME}); runAddRemoveTest(builder.build(), new HashMap<String, Object>()); } @Test public void testOr2() { final String rule1 = " package " + PKG_NAME_TEST + ";\n" + " global java.util.List list\n" + " rule " + RULE1_NAME + " \n" + " when \n" + " Integer()\n" + " then\n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = " package " + PKG_NAME_TEST + ";\n" + " global java.util.List list\n" + " rule " + RULE2_NAME + " \n" + " when \n" + " $k: Integer()\n" + " ( Integer(this != 1) or Integer(this == 1) )\n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; final AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2}) .addOperation(TestOperationType.INSERT_FACTS, new Object[]{1}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME, RULE2_NAME}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE2_NAME}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE1_NAME}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{}) .addOperation(TestOperationType.ADD_RULES, new String[]{rule2}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE2_NAME}) .addOperation(TestOperationType.ADD_RULES, new String[]{rule1}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE2_NAME, RULE1_NAME}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{}) ; runAddRemoveTest(builder.build(), new HashMap<String, Object>()); } @Test public void testEvals() { final String rule1 = " package " + PKG_NAME_TEST + ";\n" + " global java.util.List list\n" + " rule " + RULE1_NAME + " \n" + " when \n" + " Integer()\n" + " then\n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = " package " + PKG_NAME_TEST + ";\n" + " global java.util.List list\n" + " rule " + RULE2_NAME + " \n" + " when \n" + " $j: Integer() \n" + " eval($j == 1) \n" + " (eval(true) or eval($j == 1) ) \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; final AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2}) .addOperation(TestOperationType.INSERT_FACTS, new Object[]{1}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE2_NAME}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE1_NAME}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{}) ; runAddRemoveTest(builder.build(), new HashMap<String, Object>()); } }