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());
}
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());
}
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());
}
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);
}
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"));
}
Aggregations