@Test public void testIntSorting2() { // DROOLS-15 String str = "global java.util.List list\n" + "rule R\n" + "dialect \"mvel\"\n" + "when\n" + " $number : Number()\n" + " not Number(intValue > $number.intValue)\n" + "then\n" + " list.add($number);\n" + " retract($number);\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString(str); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); List<Integer> list = new ArrayList<Integer>(); ksession.setGlobal("list", list); ksession.insert(3); ksession.insert(7); ksession.insert(4); ksession.insert(5); ksession.insert(2); ksession.insert(1); ksession.insert(6); ksession.fireAllRules(); assertEquals(Arrays.asList(7, 6, 5, 4, 3, 2, 1), list); }
@Test public void testJitConstraintWithOperationOnBigDecimal() { // DROOLS-32 String str = "import org.drools.integrationtests.MiscTest2.Model;\n" + "import java.math.BigDecimal;\n" + "\n" + "rule \"minCost\" dialect \"mvel\" \n" + "when\n" + " $product : Model(price < (cost + 0.10B))\n" + "then\n" + " modify ($product) { price = $product.cost + 0.10B }\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString(str); final Model model = new Model(); model.setCost(new BigDecimal("2.43")); model.setPrice(new BigDecimal("2.43")); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.insert(model); int fired = ksession.fireAllRules(2); if (fired > 1) throw new RuntimeException("loop"); }
@Test public void testUpdateWithNonEffectiveActivations() throws Exception { // JBRULES-3604 String str = "package inheritance\n" + "\n" + "import org.drools.Address\n" + "\n" + "rule \"Parent\"\n" + " enabled false\n" + " when \n" + " $a : Address(suburb == \"xyz\")\n" + " then \n" + " System.out.println( $a ); \n" + "end \n" + "rule \"Child\" extends \"Parent\" \n" + " when \n" + " $b : Address( this == $a, street == \"123\")\n" + " then \n" + " System.out.println( $b ); \n" + "end"; KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder(); builder.add(ResourceFactory.newByteArrayResource(str.getBytes()), ResourceType.DRL); if (builder.hasErrors()) { throw new RuntimeException(builder.getErrors().toString()); } KieBaseConfiguration kconf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(); kconf.setOption(LRUnlinkingOption.ENABLED); KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase(kconf); knowledgeBase.addKnowledgePackages(builder.getKnowledgePackages()); StatefulKnowledgeSession ksession = knowledgeBase.newStatefulKnowledgeSession(); Address address = new Address(); address.setSuburb("xyz"); org.kie.runtime.rule.FactHandle addressHandle = ksession.insert(address); int rulesFired = ksession.fireAllRules(); assertEquals(0, rulesFired); address.setStreet("123"); ksession.update(addressHandle, address); rulesFired = ksession.fireAllRules(); System.out.println(rulesFired); assertEquals(1, rulesFired); ksession.dispose(); }
public static void main(final String[] args) { final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newClassPathResource( "WorkItemConsequence1.drl", WorkItemConsequenceExample1.class), ResourceType.DRL); final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); if (kbuilder.hasErrors()) { throw new RuntimeException("Compilation error.\n" + kbuilder.getErrors().toString()); } final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession .getWorkItemManager() .registerWorkItemHandler("EmailWorkItemHandler", new EmailWorkItemHandler()); // KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, // "log/WorkItemConsequence.log"); // Brains does not cause concern PersonLocation brains = new PersonLocation("Brains", 5); ksession.insert(brains); ksession.fireAllRules(); // Gargamel is too far away to care PersonLocation gargamel = new PersonLocation("Gargamel", 10); FactHandle gargamelFactHandle = ksession.insert(gargamel); ksession.fireAllRules(); // Uh oh, Gargamel moves closer gargamel.setDistance(5); ksession.update(gargamelFactHandle, gargamel); ksession.fireAllRules(); // logger.close(); ksession.dispose(); // Stateful rule session must always be disposed when finished }
@Test public void testPropertyReactivityWithNestedAccessorsInModify() { // JBRULES-3691 String str = "package com.ilesteban.rulenotbeingfired;\n" + "\n" + "import java.util.Map;\n" + "import java.util.EnumMap;\n" + "import org.drools.integrationtests.MiscTest2.Parameter\n" + "import org.drools.integrationtests.MiscTest2.DataSample\n" + "\n" + "declare Recommendation\n" + " parameter : Parameter\n" + " value : double\n" + "end\n" + "\n" + "rule \"Init\" salience 100\n" + "when\n" + "then\n" + " insert(new Recommendation(Parameter.PARAM_A, 1.0));" + "end\n" + "rule \"Rule 1\"\n" + "when\n" + " $d: DataSample()\n" + " $re: Recommendation ($p: parameter, $v: value)\n" + "then\n" + " System.out.println(drools.getRule().getName());\n" + " modify($d){\n" + " addValue($re.getParameter(), $re.getValue())\n" + " }\n" + "end\n" + "\n" + "rule \"Data with messages\"\n" + "salience -100\n" + "when\n" + " $d: DataSample(notEmpty == true)\n" + "then\n" + " System.out.println(drools.getRule().getName());\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(str); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.insert(new DataSample()); assertEquals(3, ksession.fireAllRules()); }
@Test public void testNumberCoercionOnNonGenericMap() { // JBRULES-3708 String str = "package com.ilesteban.jit;\n" + "\n" + "import java.util.Map;\n" + "import java.util.EnumMap;\n" + "import org.drools.integrationtests.MiscTest2.Parameter\n" + "import org.drools.integrationtests.MiscTest2.DataSample\n" + "\n" + "declare TestObject\n" + " data : java.util.Map\n" + "end\n" + "\n" + "rule \"Rule 1\"\n" + "when\n" + " $d: DataSample()\n" + "then\n" + " //create a new object copying the Map<Parameter, Double> to a Map<Object, Object>\n" + " insert( new TestObject($d.getValues()));\n" + "end\n" + "\n" + "rule \"Rule 2\"\n" + "when\n" + " TestObject(data[Parameter.PARAM_A] > 3)\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(str); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Map<Parameter, Double> values = new EnumMap<Parameter, Double>(Parameter.class); values.put(Parameter.PARAM_A, 4.0); DataSample data = new DataSample(); data.setValues(values); ksession.insert(data); assertEquals(2, ksession.fireAllRules()); }
@Test public void testBigDecimalComparison() throws Exception { // JBRULES-3715 String str = "import org.drools.Person;\n" + "rule \"Big Decimal Comparison\"\n" + " dialect \"mvel\"\n" + "when\n" + " Person( bigDecimal == 0.0B )\n" + "then\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString(str); final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Person p = new Person("Mario", 38); p.setBigDecimal(new BigDecimal("0")); ksession.insert(p); assertEquals(1, ksession.fireAllRules()); ksession.dispose(); }
@Test public void testMvelAssignmentToPublicField() { String str = "import org.drools.integrationtests.MiscTest2.Foo\n" + "rule R\n" + "dialect \"mvel\"\n" + "when\n" + " $foo : Foo()\n" + "then\n" + " $foo.x = 1;\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString(str); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Foo foo1 = new Foo(); Foo foo2 = new Foo(); ksession.insert(foo1); ksession.insert(foo2); ksession.fireAllRules(); assertEquals(1, foo1.x); assertEquals(1, foo2.x); }
private String insertMessageAndFire(String message, boolean stateful) throws IllegalAccessException, InstantiationException { System.out.println("********** Firing rules"); String result = null; FactType testFactType = kagent.getKnowledgeBase().getFactType("test", "TestFact"); Object fact = testFactType.newInstance(); testFactType.set(fact, "message", message); if (stateful) { StatefulKnowledgeSession session = kagent.getKnowledgeBase().newStatefulKnowledgeSession(); session.insert(fact); session.fireAllRules(); result = (String) testFactType.get(fact, "message"); session.dispose(); } else { StatelessKnowledgeSession session = kagent.getKnowledgeBase().newStatelessKnowledgeSession(); session.execute(fact); result = (String) testFactType.get(fact, "message"); } return result; }
@Test public void testDynamicAddRule() { // DROOLS-17 String str = "import org.drools.integrationtests.MiscTest2.A\n" + "rule r1 when\n" + " $a : A( f1 == 1 )\n" + "then\n" + "end\n" + "\n" + "rule r2 when\n" + " $a : A( f2 == 1 )\n" + "then\n" + "end\n" + "\n" + "rule r3 when\n" + " $a : A( f3 == 1 )" + "then\n" + "end"; String str2 = "import org.drools.integrationtests.MiscTest2.A\n" + "rule r4 when\n" + " $a : A( f2 == 1, f4 == 1 )" + "then\n" + "end"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(ResourceFactory.newByteArrayResource(str.getBytes()), ResourceType.DRL); if (kbuilder.hasErrors()) { fail(kbuilder.getErrors().toString()); } KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); FactHandle fh = ksession.insert(new A(1, 1, 1, 1)); ksession.fireAllRules(); kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(ResourceFactory.newByteArrayResource(str2.getBytes()), ResourceType.DRL); if (kbuilder.hasErrors()) { fail(kbuilder.getErrors().toString()); } kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); ksession.fireAllRules(); // this second insert forces the regeneration of the otnIds ksession.insert(new A(2, 2, 2, 2)); LeftTuple leftTuple = ((DefaultFactHandle) fh).getFirstLeftTuple(); ObjectTypeNode.Id letTupleOtnId = leftTuple.getLeftTupleSink().getLeftInputOtnId(); leftTuple = leftTuple.getLeftParentNext(); while (leftTuple != null) { assertTrue(letTupleOtnId.before(leftTuple.getLeftTupleSink().getLeftInputOtnId())); letTupleOtnId = leftTuple.getLeftTupleSink().getLeftInputOtnId(); leftTuple = leftTuple.getLeftParentNext(); } }
@Test @Ignore public void testReuseAgendaAfterException() throws Exception { // JBRULES-3677 String str = "import org.drools.Person;\n" + "global java.util.List results;" + "rule R1\n" + "ruleflow-group \"test\"\n" + "when\n" + " Person( $age : age ) \n" + "then\n" + " if ($age > 40) throw new RuntimeException(\"Too old\");\n" + " results.add(\"OK\");" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString(str); final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); List<String> res = new ArrayList<String>(); ksession.setGlobal("results", res); AgendaEventListener agendaEventListener = new AgendaEventListener() { public void matchCreated(org.kie.event.rule.MatchCreatedEvent event) {} public void matchCancelled(org.kie.event.rule.MatchCancelledEvent event) {} public void beforeMatchFired(org.kie.event.rule.BeforeMatchFiredEvent event) {} public void afterMatchFired(org.kie.event.rule.AfterMatchFiredEvent event) {} public void agendaGroupPopped(org.kie.event.rule.AgendaGroupPoppedEvent event) {} public void agendaGroupPushed(org.kie.event.rule.AgendaGroupPushedEvent event) {} public void beforeRuleFlowGroupActivated( org.kie.event.rule.RuleFlowGroupActivatedEvent event) {} public void afterRuleFlowGroupActivated( org.kie.event.rule.RuleFlowGroupActivatedEvent event) { ksession.fireAllRules(); } public void beforeRuleFlowGroupDeactivated( org.kie.event.rule.RuleFlowGroupDeactivatedEvent event) {} public void afterRuleFlowGroupDeactivated( org.kie.event.rule.RuleFlowGroupDeactivatedEvent event) {} }; ksession.addEventListener(agendaEventListener); FactHandle fact1 = ksession.insert(new Person("Mario", 38)); ((AgendaImpl) ksession.getAgenda()).activateRuleFlowGroup("test"); assertEquals(1, res.size()); res.clear(); ksession.retract(fact1); FactHandle fact2 = ksession.insert(new Person("Mario", 48)); try { ((AgendaImpl) ksession.getAgenda()).activateRuleFlowGroup("test"); fail("should throw an Exception"); } catch (Exception e) { } ksession.retract(fact2); assertEquals(0, res.size()); // try to reuse the ksession after the Exception FactHandle fact3 = ksession.insert(new Person("Mario", 38)); ((AgendaImpl) ksession.getAgenda()).activateRuleFlowGroup("test"); assertEquals(1, res.size()); ksession.retract(fact3); ksession.dispose(); }