use of org.drools.compiler.YoungestFather in project drools by kiegroup.
the class TruthMaintenanceTest method testTMSWithLateUpdate.
@Test(timeout = 10000)
public void testTMSWithLateUpdate() {
// JBRULES-3416
String str = "" + "package org.drools.compiler.test;\n" + "\n" + "import org.drools.compiler.Father;\n" + "import org.drools.compiler.YoungestFather;\n" + "\n" + "rule \"findMarriedCouple\"\n" + "when\n" + " $h: Father()\n" + " not Father(father == $h)\n" + "then\n" + " insertLogical(new YoungestFather($h));\n" + "end";
KieBase kbase = loadKnowledgeBaseFromString(str);
KieSession kSession = createKnowledgeSession(kbase);
Father abraham = new Father("abraham");
Father bart = new Father("bart");
Collection<? extends Object> youngestFathers;
bart.setFather(abraham);
FactHandle abrahamHandle = kSession.insert(abraham);
FactHandle bartHandle = kSession.insert(bart);
kSession.fireAllRules();
youngestFathers = kSession.getObjects(new ClassObjectFilter(YoungestFather.class));
assertEquals(1, youngestFathers.size());
assertEquals(bart, ((YoungestFather) youngestFathers.iterator().next()).getMan());
Father homer = new Father("homer");
FactHandle homerHandle = kSession.insert(homer);
homer.setFather(abraham);
// If we do kSession.update(homerHandle, homer) here instead of after bart.setFather(homer) it works
// But in some use cases we cannot do this because fact fields are actually called
// while the facts are in an invalid temporary state
bart.setFather(homer);
// Late update call for homer, after bart has been changed too, but before fireAllRules
kSession.update(homerHandle, homer);
kSession.update(bartHandle, bart);
kSession.fireAllRules();
youngestFathers = kSession.getObjects(new ClassObjectFilter(YoungestFather.class));
assertEquals(1, youngestFathers.size());
assertEquals(bart, ((YoungestFather) youngestFathers.iterator().next()).getMan());
// System.err.println(reportWMObjects(kSession));
}
Aggregations