Search in sources :

Example 1 with Father

use of org.drools.compiler.Father 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));
}
Also used : ClassObjectFilter(org.drools.core.ClassObjectFilter) InternalFactHandle(org.drools.core.common.InternalFactHandle) FactHandle(org.kie.api.runtime.rule.FactHandle) DefaultFactHandle(org.drools.core.common.DefaultFactHandle) KieBase(org.kie.api.KieBase) KieSession(org.kie.api.runtime.KieSession) Father(org.drools.compiler.Father) YoungestFather(org.drools.compiler.YoungestFather) Test(org.junit.Test)

Aggregations

Father (org.drools.compiler.Father)1 YoungestFather (org.drools.compiler.YoungestFather)1 ClassObjectFilter (org.drools.core.ClassObjectFilter)1 DefaultFactHandle (org.drools.core.common.DefaultFactHandle)1 InternalFactHandle (org.drools.core.common.InternalFactHandle)1 Test (org.junit.Test)1 KieBase (org.kie.api.KieBase)1 KieSession (org.kie.api.runtime.KieSession)1 FactHandle (org.kie.api.runtime.rule.FactHandle)1