Search in sources :

Example 1 with RuleUnitExecutor

use of org.kie.api.runtime.rule.RuleUnitExecutor in project drools by kiegroup.

the class RuleUnitCoordinationTest method testCoordination.

@Test
public void testCoordination() throws Exception {
    String drl1 = "package org.drools.compiler.integrationtests\n" + "unit " + getCanonicalSimpleName(MasterModelUnit.class) + ";\n" + "import " + MasterModel.class.getCanonicalName() + "\n" + "import " + ApplicableModel.class.getCanonicalName() + "\n" + "import " + ApplyMathModel.class.getCanonicalName() + "\n" + "import " + ApplyStringModel.class.getCanonicalName() + "\n" + "import " + ScheduledModelApplicationUnit.class.getCanonicalName() + "\n" + "\n" + "rule FindModelToApply \n" + "when\n" + "   $mm: MasterModel( subModels != null ) from models\n" + "   $am: ApplicableModel( applied == false, $idx: index ) from $mm.subModels\n" + // "   not ApplicableModel( applied == false, index < $idx ) from $mm.subModels\n" +
    "then\n" + "   applicableModels.insert($am);\n" + "   drools.run(new ScheduledModelApplicationUnit(models,applicableModels));\n" + "end\n" + "";
    String drl2 = "package org.drools.compiler.integrationtests\n" + "unit " + getCanonicalSimpleName(ScheduledModelApplicationUnit.class) + ";\n" + "import " + MasterModel.class.getCanonicalName() + "\n" + "import " + ApplicableModel.class.getCanonicalName() + "\n" + "import " + ApplyMathModel.class.getCanonicalName() + "\n" + "import " + ApplyStringModel.class.getCanonicalName() + "\n" + "\n" + "rule Apply_ApplyMathModel_Addition \n" + "when\n" + "    $amm: ApplyMathModel( applied == false, inputValue1 != null, " + "                          inputValue2 != null, operation == \"add\" ) from applicableModels\n" + "    $v1: Integer() from $amm.inputValue1 \n" + "    $v2: Integer() from $amm.inputValue2 \n" + "then\n" + "    modify($amm) { \n" + "       setResult($v1.intValue() + $v2.intValue()), \n" + "       setApplied(true) \n" + "    };\n" + "    System.out.println(\"Result = \"+$amm.getResult());\n" + "end\n" + "\n" + "rule Apply_ApplyStringModel_Concat \n" + "when\n" + "    $asm: ApplyStringModel( applied == false, inputString1 != null, " + "                            inputString2 != null, operation == \"concat\" ) from applicableModels \n" + "    $v1: String() from $asm.inputString1 \n" + "    $v2: String() from $asm.inputString2 \n" + "then\n" + "    String result = $v1+\" \"+$v2; \n" + "    modify($asm) {\n" + "       setResult(result),\n" + "       setApplied(true)\n" + "    };\n" + "    System.out.println(\"Result = \"+$asm.getResult());\n" + "end\n" + "";
    MasterModel master = new MasterModel("TestMaster");
    ApplyMathModel mathModel = new ApplyMathModel(1, "Math1", "add", 10, 10);
    ApplyStringModel stringModel = new ApplyStringModel(2, "String1", "concat", "hello", "world");
    master.addSubModel(mathModel);
    master.addSubModel(stringModel);
    KieBase kbase = new KieHelper().addContent(drl1, ResourceType.DRL).addContent(drl2, ResourceType.DRL).build();
    RuleUnitExecutor executor = RuleUnitExecutor.create().bind(kbase);
    DataSource<MasterModel> masterModels = executor.newDataSource("models");
    DataSource<ApplicableModel> applicableModels = executor.newDataSource("applicableModel");
    FactHandle masterFH = masterModels.insert(master);
    RuleUnit unit = new MasterModelUnit(masterModels, applicableModels);
    // int x = 1;
    // while (x > 0) {
    // x = executor.run( unit );
    // System.out.println( x );
    // // I'm reinserting the master model to reinforce its evaluation, as I said in our call this is necessary because
    // // the second level froms are made on plain lists which are not normally re-evaluated by from nodes (regardless of rule units).
    // // In theory also the update should be more correct and enough to reinforce this re-evaluation, but for some reason
    // // in this case is not working. I suspect we have a bug in our NotNode related to this specific case, but I'm still
    // // evaluating it. For now the insert should be good enough to allow you to make some progress on this.
    // // masterModels.update( masterFH, master, "subModels" );
    // masterModels.insert( master );
    // }
    executor.run(unit);
    assertEquals(20, (int) mathModel.getResult());
    assertEquals("hello world", stringModel.getResult());
}
Also used : FactHandle(org.kie.api.runtime.rule.FactHandle) KieHelper(org.kie.internal.utils.KieHelper) RuleUnitExecutor(org.kie.api.runtime.rule.RuleUnitExecutor) KieBase(org.kie.api.KieBase) RuleUnit(org.kie.api.runtime.rule.RuleUnit) Test(org.junit.Test)

Example 2 with RuleUnitExecutor

use of org.kie.api.runtime.rule.RuleUnitExecutor in project drools by kiegroup.

the class RuleUnitTest method testRuleUnitFromKieContainer.

@Test
public void testRuleUnitFromKieContainer() {
    String drl = "package org.drools.compiler.integrationtests\n" + "unit " + getCanonicalSimpleName(AdultUnitWithSingleItem.class) + "\n" + "import " + Person.class.getCanonicalName() + "\n" + "rule Adult when\n" + "    $p : /person[age >= adultAge]\n" + "then\n" + "    System.out.println($p.getName() + \" is adult\");\n" + "end";
    String kmodule = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<kmodule xmlns=\"http://jboss.org/kie/6.0.0/kmodule\">\n" + "    <kbase name=\"unit\" equalsBehavior=\"equality\" eventProcessingMode=\"stream\">\n" + "        <ksession name=\"unit-rules\" default=\"true\" type=\"stateful\" clockType=\"pseudo\"/>\n" + "    </kbase>\n" + "</kmodule>";
    KieServices ks = KieServices.Factory.get();
    KieFileSystem kfs = ks.newKieFileSystem().write("src/main/resources/r1.drl", drl).writeKModuleXML(kmodule);
    ks.newKieBuilder(kfs).buildAll();
    KieContainer kcontainer = ks.newKieContainer(ks.getRepository().getDefaultReleaseId());
    RuleUnitExecutor executor = kcontainer.newRuleUnitExecutor();
    assertTrue(executor.getKieSession().getSessionClock() instanceof SessionPseudoClock);
    RuleUnit adultUnit = new AdultUnitWithSingleItem(new Person("Mario", 42));
    assertEquals(1, executor.run(adultUnit));
}
Also used : KieFileSystem(org.kie.api.builder.KieFileSystem) InternalRuleUnitExecutor(org.drools.core.impl.InternalRuleUnitExecutor) RuleUnitExecutor(org.kie.api.runtime.rule.RuleUnitExecutor) SessionPseudoClock(org.kie.api.time.SessionPseudoClock) KieServices(org.kie.api.KieServices) RuleUnit(org.kie.api.runtime.rule.RuleUnit) Person(org.drools.compiler.Person) KieContainer(org.kie.api.runtime.KieContainer) Test(org.junit.Test)

Example 3 with RuleUnitExecutor

use of org.kie.api.runtime.rule.RuleUnitExecutor in project drools by kiegroup.

the class RuleUnitTest method testStackedRuleUnitInvocationFromConsequence.

@Test
public void testStackedRuleUnitInvocationFromConsequence() throws Exception {
    String drl1 = "import " + Person.class.getCanonicalName() + "\n" + "import " + AdultUnit.class.getCanonicalName() + "\n" + "import " + NotAdultUnit.class.getCanonicalName() + "\n" + "rule NotAdult @Unit( NotAdultUnit.class ) when\n" + "    $p : Person(age < 18, $name : name) from persons\n" + "then\n" + "    System.out.println($name + \" is NOT adult\");\n" + "    modify($p) { setAge(18); }\n" + "    drools.run( AdultUnit.class );" + "end\n" + "rule Adult @Unit( AdultUnit.class ) when\n" + "    Person(age >= 18, $name : name) from persons\n" + "then\n" + "    System.out.println($name + \" is adult\");\n" + "end\n";
    KieBase kbase = new KieHelper().addContent(drl1, ResourceType.DRL).build();
    RuleUnitExecutor executor = RuleUnitExecutor.create().bind(kbase);
    DataSource<Person> persons = executor.newDataSource("persons", new Person("Mario", 2), new Person("Sofia", 6));
    List<String> log = new ArrayList<>();
    executor.bindVariable("log", log);
    assertEquals(4, executor.run(NotAdultUnit.class));
    List<String> expectedLogs = asList("org.drools.compiler.integrationtests.RuleUnitTest$NotAdultUnit started.", "org.drools.compiler.integrationtests.RuleUnitTest$NotAdultUnit yielded to org.drools.compiler.integrationtests.RuleUnitTest$AdultUnit", "org.drools.compiler.integrationtests.RuleUnitTest$AdultUnit started.", "org.drools.compiler.integrationtests.RuleUnitTest$AdultUnit ended.", "org.drools.compiler.integrationtests.RuleUnitTest$NotAdultUnit started.", "org.drools.compiler.integrationtests.RuleUnitTest$NotAdultUnit yielded to org.drools.compiler.integrationtests.RuleUnitTest$AdultUnit", "org.drools.compiler.integrationtests.RuleUnitTest$AdultUnit started.", "org.drools.compiler.integrationtests.RuleUnitTest$AdultUnit ended.", "org.drools.compiler.integrationtests.RuleUnitTest$NotAdultUnit started.", "org.drools.compiler.integrationtests.RuleUnitTest$NotAdultUnit ended.");
    assertEquals(expectedLogs, log);
}
Also used : InternalRuleUnitExecutor(org.drools.core.impl.InternalRuleUnitExecutor) RuleUnitExecutor(org.kie.api.runtime.rule.RuleUnitExecutor) KieBase(org.kie.api.KieBase) ArrayList(java.util.ArrayList) KieHelper(org.kie.internal.utils.KieHelper) Person(org.drools.compiler.Person) Test(org.junit.Test)

Example 4 with RuleUnitExecutor

use of org.kie.api.runtime.rule.RuleUnitExecutor in project drools by kiegroup.

the class RuleUnitTest method testRunOrder.

@Test
public void testRunOrder() throws Exception {
    // DROOLS-2199
    String drl1 = "import " + Person.class.getCanonicalName() + "\n" + "import " + FlowUnit.class.getCanonicalName() + "\n" + "import " + AdultUnit.class.getCanonicalName() + "\n" + "import " + NotAdultUnit.class.getCanonicalName() + "\n" + "global java.util.List list;\n" + "rule Flow @Unit( FlowUnit.class ) when\n" + "then\n" + "    drools.run( NotAdultUnit.class );\n" + "    drools.run( AdultUnit.class );\n" + "end\n" + "rule Adult @Unit( AdultUnit.class ) when\n" + "    Person(age >= 18, $name : name) from persons\n" + "then\n" + "    list.add($name + \" is adult\");\n" + "end\n" + "rule NotAdult @Unit( NotAdultUnit.class ) when\n" + "    Person(age < 18, $name : name) from persons\n" + "then\n" + "    list.add($name + \" is NOT adult\");\n" + "end";
    KieBase kbase = new KieHelper().addContent(drl1, ResourceType.DRL).build();
    RuleUnitExecutor executor = RuleUnitExecutor.create().bind(kbase);
    List<String> list = new ArrayList<>();
    executor.getKieSession().setGlobal("list", list);
    DataSource<Person> persons = executor.newDataSource("persons", new Person("Mario", 42), new Person("Sofia", 4));
    assertEquals(3, executor.run(FlowUnit.class));
    assertEquals(list, asList("Sofia is NOT adult", "Mario is adult"));
}
Also used : InternalRuleUnitExecutor(org.drools.core.impl.InternalRuleUnitExecutor) RuleUnitExecutor(org.kie.api.runtime.rule.RuleUnitExecutor) KieBase(org.kie.api.KieBase) ArrayList(java.util.ArrayList) KieHelper(org.kie.internal.utils.KieHelper) Person(org.drools.compiler.Person) Test(org.junit.Test)

Example 5 with RuleUnitExecutor

use of org.kie.api.runtime.rule.RuleUnitExecutor in project drools by kiegroup.

the class RuleUnitTest method testModifyGlobalFact.

@Test
public void testModifyGlobalFact() throws Exception {
    String drl1 = "package org.drools.compiler.integrationtests\n" + "unit " + getCanonicalSimpleName(AdultUnit.class) + "\n" + "import " + Person.class.getCanonicalName() + "\n" + "rule Adult when\n" + "    $p : Person(age < 18, $name : name)\n" + "then\n" + "    System.out.println($name + \" is NOT adult\");\n" + "    modify($p) { setAge(18) }\n" + "end";
    KieBase kbase = new KieHelper().addContent(drl1, ResourceType.DRL).build();
    RuleUnitExecutor executor = RuleUnitExecutor.create().bind(kbase);
    executor.getKieSession().insert(new Person("Sofia", 4));
    assertEquals(1, executor.run(AdultUnit.class));
}
Also used : InternalRuleUnitExecutor(org.drools.core.impl.InternalRuleUnitExecutor) RuleUnitExecutor(org.kie.api.runtime.rule.RuleUnitExecutor) KieBase(org.kie.api.KieBase) KieHelper(org.kie.internal.utils.KieHelper) Person(org.drools.compiler.Person) Test(org.junit.Test)

Aggregations

RuleUnitExecutor (org.kie.api.runtime.rule.RuleUnitExecutor)64 Test (org.junit.Test)61 InternalRuleUnitExecutor (org.drools.core.impl.InternalRuleUnitExecutor)53 KieBase (org.kie.api.KieBase)39 KieHelper (org.kie.internal.utils.KieHelper)38 Person (org.drools.compiler.Person)33 PMML4Result (org.kie.api.pmml.PMML4Result)17 PMMLRequestData (org.kie.api.pmml.PMMLRequestData)17 RuleUnit (org.kie.api.runtime.rule.RuleUnit)17 DroolsAbstractPMMLTest (org.kie.pmml.pmml_4_2.DroolsAbstractPMMLTest)16 ArrayList (java.util.ArrayList)14 KieContainer (org.kie.api.runtime.KieContainer)9 KieServices (org.kie.api.KieServices)7 FactHandle (org.kie.api.runtime.rule.FactHandle)6 SegmentExecution (org.kie.pmml.pmml_4_2.model.mining.SegmentExecution)6 DataSource (org.kie.api.runtime.rule.DataSource)5 Arrays.asList (java.util.Arrays.asList)4 LinkedHashMap (java.util.LinkedHashMap)4 List (java.util.List)4 LongAddress (org.drools.compiler.LongAddress)4