Search in sources :

Example 56 with KieBase

use of org.kie.api.KieBase in project drools by kiegroup.

the class RuleMetadataTest method testModify.

@Test
public void testModify() {
    String rule1 = "modify( $a ) { setA( 20 ), setB( $bb ) }";
    KieBase kbase = getKnowledgeBase(rule1);
    RuleImpl rule = getRule(kbase, "R0");
    ConsequenceMetaData consequenceMetaData = rule.getConsequenceMetaData();
    assertEquals(1, consequenceMetaData.getStatements().size());
    ConsequenceMetaData.Statement statment = consequenceMetaData.getStatements().get(0);
    assertEquals(ConsequenceMetaData.Statement.Type.MODIFY, statment.getType());
    assertEquals("org.drools.A", statment.getFactClassName());
    assertEquals(2, statment.getFields().size());
    ConsequenceMetaData.Field field1 = statment.getFields().get(0);
    assertEquals("a", field1.getName());
    assertEquals("20", field1.getValue());
    assertTrue(field1.isLiteral());
    ConsequenceMetaData.Field field2 = statment.getFields().get(1);
    assertEquals("b", field2.getName());
    assertEquals("$bb", field2.getValue());
    assertFalse(field2.isLiteral());
}
Also used : ConsequenceMetaData(org.drools.core.rule.ConsequenceMetaData) KieBase(org.kie.api.KieBase) RuleImpl(org.drools.core.definitions.rule.impl.RuleImpl) Test(org.junit.Test)

Example 57 with KieBase

use of org.kie.api.KieBase in project drools by kiegroup.

the class RuleMetadataTest method testRetractWithFunction.

@Test
public void testRetractWithFunction() {
    String rule1 = "retract( getA($a) );";
    KieBase kbase = getKnowledgeBase(rule1);
    RuleImpl rule = getRule(kbase, "R0");
    ConsequenceMetaData consequenceMetaData = rule.getConsequenceMetaData();
    assertEquals(1, consequenceMetaData.getStatements().size());
    ConsequenceMetaData.Statement statment = consequenceMetaData.getStatements().get(0);
    assertEquals(ConsequenceMetaData.Statement.Type.RETRACT, statment.getType());
    assertEquals("org.drools.A", statment.getFactClassName());
}
Also used : ConsequenceMetaData(org.drools.core.rule.ConsequenceMetaData) KieBase(org.kie.api.KieBase) RuleImpl(org.drools.core.definitions.rule.impl.RuleImpl) Test(org.junit.Test)

Example 58 with KieBase

use of org.kie.api.KieBase 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 59 with KieBase

use of org.kie.api.KieBase 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 60 with KieBase

use of org.kie.api.KieBase 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)

Aggregations

KieBase (org.kie.api.KieBase)1272 Test (org.junit.Test)1191 KieSession (org.kie.api.runtime.KieSession)1011 ArrayList (java.util.ArrayList)592 List (java.util.List)392 Person (org.drools.compiler.Person)214 FactHandle (org.kie.api.runtime.rule.FactHandle)176 KieSessionConfiguration (org.kie.api.runtime.KieSessionConfiguration)168 KieHelper (org.kie.internal.utils.KieHelper)156 StatelessKieSession (org.kie.api.runtime.StatelessKieSession)154 Cheese (org.drools.compiler.Cheese)139 KieBaseConfiguration (org.kie.api.KieBaseConfiguration)99 Arrays.asList (java.util.Arrays.asList)87 SessionPseudoClock (org.kie.api.time.SessionPseudoClock)86 QueryResults (org.kie.api.runtime.rule.QueryResults)78 KieServices (org.kie.api.KieServices)74 ObjectTypeNode (org.drools.core.reteoo.ObjectTypeNode)67 Model (org.drools.model.Model)64 Rule (org.drools.model.Rule)64 ModelImpl (org.drools.model.impl.ModelImpl)64