Search in sources :

Example 1 with Cheese

use of org.drools.compiler.Cheese in project drools by kiegroup.

the class TruthMaintenanceTest method testLogicalInsertions.

@Test(timeout = 10000)
public void testLogicalInsertions() throws Exception {
    final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newClassPathResource("test_LogicalInsertions.drl", getClass()), ResourceType.DRL);
    Collection<KiePackage> kpkgs = kbuilder.getKnowledgePackages();
    InternalKnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
    kbase.addPackages(kpkgs);
    kbase = SerializationHelper.serializeObject(kbase);
    KieSession session = createKnowledgeSession(kbase);
    final List list = new ArrayList();
    session.setGlobal("list", list);
    final Cheese brie = new Cheese("brie", 12);
    FactHandle brieHandle = session.insert(brie);
    final Cheese provolone = new Cheese("provolone", 12);
    FactHandle provoloneHandle = session.insert(provolone);
    session.fireAllRules();
    session = getSerialisedStatefulKnowledgeSession(session, true);
    System.out.println(list);
    assertEquals(3, list.size());
    assertEquals(3, session.getObjects().size());
    brieHandle = getFactHandle(brieHandle, session);
    session.retract(brieHandle);
    session = getSerialisedStatefulKnowledgeSession(session, true);
    assertEquals(2, session.getObjects().size());
    provoloneHandle = getFactHandle(provoloneHandle, session);
    session.retract(provoloneHandle);
    session.fireAllRules();
    assertEquals(0, session.getObjects().size());
}
Also used : KnowledgeBuilder(org.kie.internal.builder.KnowledgeBuilder) KiePackage(org.kie.api.definition.KiePackage) InternalFactHandle(org.drools.core.common.InternalFactHandle) FactHandle(org.kie.api.runtime.rule.FactHandle) DefaultFactHandle(org.drools.core.common.DefaultFactHandle) ArrayList(java.util.ArrayList) KieSession(org.kie.api.runtime.KieSession) List(java.util.List) ArrayList(java.util.ArrayList) Cheese(org.drools.compiler.Cheese) InternalKnowledgeBase(org.drools.core.impl.InternalKnowledgeBase) Test(org.junit.Test)

Example 2 with Cheese

use of org.drools.compiler.Cheese in project drools by kiegroup.

the class TruthMaintenanceTest method testLogicalInsertionsNot.

@Test(timeout = 10000)
public // @Ignore("in Java 8, the byte[] generated by serialization are not the same and requires investigation")
void testLogicalInsertionsNot() throws Exception {
    KieBase kbase = loadKnowledgeBase("test_LogicalInsertionsNot.drl");
    KieSession ksession = kbase.newKieSession();
    final Person a = new Person("a");
    final Cheese cheese = new Cheese("brie", 1);
    ksession.setGlobal("cheese", cheese);
    ksession.fireAllRules();
    ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession(ksession, true);
    Collection list = ksession.getObjects();
    assertEquals("i was not asserted by not a => i.", 1, list.size());
    assertEquals("i was not asserted by not a => i.", cheese, list.iterator().next());
    FactHandle h = ksession.insert(a);
    ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession(ksession, true);
    // no need to fire rules, assertion alone removes justification for i,
    // so it should be deleted.
    // workingMemory.fireAllRules();
    ksession.fireAllRules();
    list = ksession.getObjects();
    assertEquals("a was not asserted or i not deleted.", 1, list.size());
    assertEquals("a was asserted.", a, list.iterator().next());
    assertFalse("i was not rectracted.", list.contains(cheese));
    // no rules should fire, but nevertheless...
    // workingMemory.fireAllRules();
    assertEquals("agenda should be empty.", 0, ((InternalAgenda) ((StatefulKnowledgeSessionImpl) ksession).getAgenda()).agendaSize());
    h = getFactHandle(h, ksession);
    ksession.retract(h);
    ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession(ksession, true);
    ksession.fireAllRules();
    ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession(ksession, true);
    list = ksession.getObjects();
    assertEquals("i was not asserted by not a => i.", 1, list.size());
    assertEquals("i was not asserted by not a => i.", cheese, list.iterator().next());
}
Also used : InternalFactHandle(org.drools.core.common.InternalFactHandle) FactHandle(org.kie.api.runtime.rule.FactHandle) DefaultFactHandle(org.drools.core.common.DefaultFactHandle) KieBase(org.kie.api.KieBase) StatefulKnowledgeSessionImpl(org.drools.core.impl.StatefulKnowledgeSessionImpl) Collection(java.util.Collection) KieSession(org.kie.api.runtime.KieSession) Cheese(org.drools.compiler.Cheese) Person(org.drools.compiler.Person) Test(org.junit.Test)

Example 3 with Cheese

use of org.drools.compiler.Cheese in project drools by kiegroup.

the class TruthMaintenanceTest method testLogicalInsertionsWithExists.

@Test(timeout = 10000)
public // @Ignore("in Java 8, the byte[] generated by serialization are not the same and requires investigation")
void testLogicalInsertionsWithExists() throws Exception {
    KieBase kbase = loadKnowledgeBase("test_LogicalInsertionWithExists.drl");
    KieSession ksession = kbase.newKieSession();
    final Person p1 = new Person("p1", "stilton", 20);
    p1.setStatus("europe");
    FactHandle c1FactHandle = ksession.insert(p1);
    final Person p2 = new Person("p2", "stilton", 30);
    p2.setStatus("europe");
    FactHandle c2FactHandle = ksession.insert(p2);
    final Person p3 = new Person("p3", "stilton", 40);
    p3.setStatus("europe");
    FactHandle c3FactHandle = ksession.insert(p3);
    ksession.fireAllRules();
    ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession(ksession, true);
    // all 3 in europe, so, 2 cheese
    Collection cheeseList = ksession.getObjects(new ClassObjectFilter(Cheese.class));
    assertEquals(2, cheeseList.size());
    // europe=[ 1, 2 ], america=[ 3 ]
    p3.setStatus("america");
    c3FactHandle = getFactHandle(c3FactHandle, ksession);
    ksession.update(c3FactHandle, p3);
    ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession(ksession, true);
    ksession.fireAllRules();
    ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession(ksession, true);
    cheeseList = ksession.getObjects(new ClassObjectFilter(Cheese.class));
    assertEquals(1, cheeseList.size());
    // europe=[ 1 ], america=[ 2, 3 ]
    p2.setStatus("america");
    c2FactHandle = getFactHandle(c2FactHandle, ksession);
    ksession.update(c2FactHandle, p2);
    ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession(ksession, true);
    ksession.fireAllRules();
    ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession(ksession, true);
    cheeseList = ksession.getObjects(new ClassObjectFilter(Cheese.class));
    assertEquals(1, cheeseList.size());
    // europe=[ ], america=[ 1, 2, 3 ]
    p1.setStatus("america");
    c1FactHandle = getFactHandle(c1FactHandle, ksession);
    ksession.update(c1FactHandle, p1);
    ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession(ksession, true);
    ksession.fireAllRules();
    ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession(ksession, true);
    cheeseList = ksession.getObjects(new ClassObjectFilter(Cheese.class));
    assertEquals(2, cheeseList.size());
    // europe=[ 2 ], america=[ 1, 3 ]
    p2.setStatus("europe");
    c2FactHandle = getFactHandle(c2FactHandle, ksession);
    ksession.update(c2FactHandle, p2);
    ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession(ksession, true);
    ksession.fireAllRules();
    ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession(ksession, true);
    cheeseList = ksession.getObjects(new ClassObjectFilter(Cheese.class));
    assertEquals(1, cheeseList.size());
    // europe=[ 1, 2 ], america=[ 3 ]
    p1.setStatus("europe");
    c1FactHandle = getFactHandle(c1FactHandle, ksession);
    ksession.update(c1FactHandle, p1);
    ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession(ksession, true);
    ksession.fireAllRules();
    ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession(ksession, true);
    cheeseList = ksession.getObjects(new ClassObjectFilter(Cheese.class));
    assertEquals(1, cheeseList.size());
    // europe=[ 1, 2, 3 ], america=[ ]
    p3.setStatus("europe");
    c3FactHandle = getFactHandle(c3FactHandle, ksession);
    ksession.update(c3FactHandle, p3);
    ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession(ksession, true);
    ksession.fireAllRules();
    ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession(ksession, true);
    cheeseList = ksession.getObjects(new ClassObjectFilter(Cheese.class));
    assertEquals(2, cheeseList.size());
}
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) Collection(java.util.Collection) KieSession(org.kie.api.runtime.KieSession) Cheese(org.drools.compiler.Cheese) Person(org.drools.compiler.Person) Test(org.junit.Test)

Example 4 with Cheese

use of org.drools.compiler.Cheese in project drools by kiegroup.

the class TruthMaintenanceTest method testLogicalInsertionsDynamicRule.

// timeout=10000)
@Test()
public void testLogicalInsertionsDynamicRule() throws Exception {
    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newClassPathResource("test_LogicalInsertionsDynamicRule.drl", getClass()), ResourceType.DRL);
    if (kbuilder.hasErrors()) {
        fail(kbuilder.getErrors().toString());
    }
    Collection<KiePackage> kpkgs = kbuilder.getKnowledgePackages();
    InternalKnowledgeBase kbase = (InternalKnowledgeBase) getKnowledgeBase();
    kbase.addPackages(kpkgs);
    KieSession ksession = createKnowledgeSession(kbase);
    final Cheese c1 = new Cheese("a", 1);
    final Cheese c2 = new Cheese("b", 2);
    final Cheese c3 = new Cheese("c", 3);
    List list;
    ksession.insert(c1);
    FactHandle h = ksession.insert(c2);
    ksession.insert(c3);
    ksession.fireAllRules();
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    // Check logical Insertions where made for c2 and c3
    list = new ArrayList(ksession.getObjects(new ClassObjectFilter(Person.class)));
    assertEquals(2, list.size());
    assertFalse(list.contains(new Person(c1.getType())));
    assertTrue(list.contains(new Person(c2.getType())));
    assertTrue(list.contains(new Person(c3.getType())));
    // this rule will make a logical assertion for c1 too
    kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newClassPathResource("test_LogicalInsertionsDynamicRule2.drl", getClass()), ResourceType.DRL);
    if (kbuilder.hasErrors()) {
        fail(kbuilder.getErrors().toString());
    }
    Collection<KiePackage> kpkgs2 = kbuilder.getKnowledgePackages();
    kbase.addPackages(kpkgs2);
    kbase = SerializationHelper.serializeObject(kbase);
    ksession.fireAllRules();
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    kbase = (InternalKnowledgeBase) ksession.getKieBase();
    // check all now have just one logical assertion each
    list = new ArrayList(ksession.getObjects(new ClassObjectFilter(Person.class)));
    assertEquals(3, list.size());
    assertTrue(list.contains(new Person(c1.getType())));
    assertTrue(list.contains(new Person(c2.getType())));
    assertTrue(list.contains(new Person(c3.getType())));
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    // check the packages are correctly populated
    assertEquals(3, kbase.getKiePackages().size());
    KiePackage test = null, test2 = null;
    // different JVMs return the package list in different order
    for (KiePackage kpkg : kbase.getKiePackages()) {
        if (kpkg.getName().equals("org.drools.compiler.test")) {
            test = kpkg;
        } else if (kpkg.getName().equals("org.drools.compiler.test2")) {
            test2 = kpkg;
        }
    }
    assertNotNull(test);
    assertNotNull(test2);
    assertEquals("rule1", test.getRules().iterator().next().getName());
    assertEquals("rule2", test2.getRules().iterator().next().getName());
    // now remove the first rule
    kbase.removeRule(test.getName(), test.getRules().iterator().next().getName());
    // different JVMs return the package list in different order
    for (KiePackage kpkg : kbase.getKiePackages()) {
        if (kpkg.getName().equals("org.drools.compiler.test")) {
            test = kpkg;
        } else if (kpkg.getName().equals("org.drools.compiler.test2")) {
            test2 = kpkg;
        }
    }
    assertNotNull(test);
    assertNotNull(test2);
    // Check the rule was correctly remove
    assertEquals(0, test.getRules().size());
    assertEquals(1, test2.getRules().size());
    assertEquals("rule2", test2.getRules().iterator().next().getName());
    list = new ArrayList(ksession.getObjects(new ClassObjectFilter(Person.class)));
    assertEquals("removal of the rule should result in retraction of c3's logical assertion", 2, list.size());
    assertTrue("c1's logical assertion should not be deleted", list.contains(new Person(c1.getType())));
    assertTrue("c2's logical assertion should  not be deleted", list.contains(new Person(c2.getType())));
    assertFalse("c3's logical assertion should be  deleted", list.contains(new Person(c3.getType())));
    c2.setPrice(3);
    h = getFactHandle(h, ksession);
    ksession.update(h, c2);
    ksession.fireAllRules();
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    list = new ArrayList(ksession.getObjects(new ClassObjectFilter(Person.class)));
    assertEquals("c2 now has a higher price, its logical assertion should  be cancelled", 1, list.size());
    assertFalse("The logical assertion cor c2 should have been deleted", list.contains(new Person(c2.getType())));
    assertTrue("The logical assertion  for c1 should exist", list.contains(new Person(c1.getType())));
    // different JVMs return the package list in different order
    for (KiePackage kpkg : kbase.getKiePackages()) {
        if (kpkg.getName().equals("org.drools.compiler.test")) {
            test = kpkg;
        } else if (kpkg.getName().equals("org.drools.compiler.test2")) {
            test2 = kpkg;
        }
    }
    assertNotNull(test);
    assertNotNull(test2);
    kbase.removeRule(test2.getName(), test2.getRules().iterator().next().getName());
    kbase = SerializationHelper.serializeObject(kbase);
    // different JVMs return the package list in different order
    for (KiePackage kpkg : kbase.getKiePackages()) {
        if (kpkg.getName().equals("org.drools.compiler.test")) {
            test = kpkg;
        } else if (kpkg.getName().equals("org.drools.compiler.test2")) {
            test2 = kpkg;
        }
    }
    assertNotNull(test);
    assertNotNull(test2);
    assertEquals(0, test.getRules().size());
    assertEquals(0, test2.getRules().size());
    list = new ArrayList(ksession.getObjects(new ClassObjectFilter(Person.class)));
    assertEquals(0, list.size());
}
Also used : KnowledgeBuilder(org.kie.internal.builder.KnowledgeBuilder) ClassObjectFilter(org.drools.core.ClassObjectFilter) KiePackage(org.kie.api.definition.KiePackage) InternalFactHandle(org.drools.core.common.InternalFactHandle) FactHandle(org.kie.api.runtime.rule.FactHandle) DefaultFactHandle(org.drools.core.common.DefaultFactHandle) ArrayList(java.util.ArrayList) KieSession(org.kie.api.runtime.KieSession) Cheese(org.drools.compiler.Cheese) List(java.util.List) ArrayList(java.util.ArrayList) Person(org.drools.compiler.Person) InternalKnowledgeBase(org.drools.core.impl.InternalKnowledgeBase) Test(org.junit.Test)

Example 5 with Cheese

use of org.drools.compiler.Cheese in project drools by kiegroup.

the class ImportsTest method testImportFunctions.

@Test
public void testImportFunctions() throws Exception {
    final KieBase kbase = SerializationHelper.serializeObject(loadKnowledgeBase("test_ImportFunctions.drl"));
    KieSession session = createKnowledgeSession(kbase);
    final Cheese cheese = new Cheese("stilton", 15);
    session.insert(cheese);
    List list = new ArrayList();
    session.setGlobal("list", list);
    session = SerializationHelper.getSerialisedStatefulKnowledgeSession(session, true);
    final int fired = session.fireAllRules();
    list = (List) session.getGlobal("list");
    assertEquals(4, fired);
    assertEquals(4, list.size());
    assertEquals("rule1", list.get(0));
    assertEquals("rule2", list.get(1));
    assertEquals("rule3", list.get(2));
    assertEquals("rule4", list.get(3));
}
Also used : KieBase(org.kie.api.KieBase) ArrayList(java.util.ArrayList) KieSession(org.kie.api.runtime.KieSession) Cheese(org.drools.compiler.Cheese) ArrayList(java.util.ArrayList) List(java.util.List) Test(org.junit.Test)

Aggregations

Cheese (org.drools.compiler.Cheese)147 Test (org.junit.Test)140 KieSession (org.kie.api.runtime.KieSession)121 ArrayList (java.util.ArrayList)102 KieBase (org.kie.api.KieBase)87 List (java.util.List)73 Person (org.drools.compiler.Person)52 InternalKnowledgeBase (org.drools.core.impl.InternalKnowledgeBase)36 FactHandle (org.kie.api.runtime.rule.FactHandle)32 KiePackage (org.kie.api.definition.KiePackage)22 StatelessKieSession (org.kie.api.runtime.StatelessKieSession)20 InternalFactHandle (org.drools.core.common.InternalFactHandle)19 IteratorToList (org.drools.compiler.integrationtests.IteratorToList)14 KnowledgeBuilder (org.kie.internal.builder.KnowledgeBuilder)13 Command (org.kie.api.command.Command)10 HashMap (java.util.HashMap)9 ExecutionResults (org.kie.api.runtime.ExecutionResults)8 KnowledgeBuilderImpl (org.drools.compiler.builder.impl.KnowledgeBuilderImpl)7 PackageDescr (org.drools.compiler.lang.descr.PackageDescr)7 DefaultFactHandle (org.drools.core.common.DefaultFactHandle)7