Search in sources :

Example 71 with Cheese

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

the class MarshallingTest method testSerializeAdd_newRuleNotFiredForNewData.

/*
     *  Here I am inserting data points(e.g. Cheese) with  'stilton' / 'brie' as type value.
     *  Initially I had only 1 rule ('like stilton') for data points(e.g. Cheese) having type as 'stilton'.
     *
     *  Later added new rule ('like brie')  for data points(e.g. Cheese) having type as 'brie'.
     *
     *  Result: new rule is not getting fired for new data points having type as 'brie'.
     *          Only for old data points having type as 'brie' the new rule got fired.
     */
@Test
public void testSerializeAdd_newRuleNotFiredForNewData() throws Exception {
    // Create a rulebase, a session, and test it
    Collection<KiePackage> kpkgs = loadKnowledgePackages("test_Dynamic1_0.drl");
    kpkgs = SerializationHelper.serializeObject(kpkgs);
    InternalKnowledgeBase kBase = (InternalKnowledgeBase) getKnowledgeBase();
    kBase.addPackages(kpkgs);
    List results = new ArrayList();
    KieSession session = kBase.newKieSession();
    session.setGlobal("results", results);
    InternalFactHandle stilton1 = (InternalFactHandle) session.insert(new Cheese("stilton", 10));
    InternalFactHandle brie1 = (InternalFactHandle) session.insert(new Cheese("brie", 10));
    session.fireAllRules();
    // serialize session
    session = getSerialisedStatefulKnowledgeSession(session, kBase, true);
    // dynamically add a new package
    kpkgs = loadKnowledgePackages("test_Dynamic1_1.drl");
    kBase.addPackages(SerializationHelper.serializeObject(kpkgs));
    session = getSerialisedStatefulKnowledgeSession(session, kBase, true);
    InternalFactHandle stilton2 = (InternalFactHandle) session.insert(new Cheese("stilton", 20));
    InternalFactHandle brie2 = (InternalFactHandle) session.insert(new Cheese("brie", 20));
    InternalFactHandle brie3 = (InternalFactHandle) session.insert(new Cheese("brie", 30));
    session.fireAllRules();
    assertEquals(5, results.size());
    assertEquals(stilton2.getObject(), results.get(1));
    assertTrue(results.contains(brie1.getObject()));
    assertTrue(results.contains(brie3.getObject()));
    assertTrue(results.contains(brie3.getObject()));
    session = getSerialisedStatefulKnowledgeSession(session, kBase, true);
    session.dispose();
}
Also used : KiePackage(org.kie.api.definition.KiePackage) ArrayList(java.util.ArrayList) IteratorToList(org.drools.mvel.integrationtests.IteratorToList) List(java.util.List) ArrayList(java.util.ArrayList) KieSession(org.kie.api.runtime.KieSession) Cheese(org.drools.mvel.compiler.Cheese) InternalFactHandle(org.drools.core.common.InternalFactHandle) InternalKnowledgeBase(org.drools.kiesession.rulebase.InternalKnowledgeBase) Test(org.junit.Test)

Example 72 with Cheese

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

the class MarshallingTest method testExists.

@Test
public void testExists() throws Exception {
    String header = "package org.drools.compiler.test;\n" + "import java.util.List;\n" + "import " + Person.class.getCanonicalName() + "\n" + "import " + Cheese.class.getCanonicalName() + "\n" + "global java.util.List list;\n";
    String rule1 = "rule \"not rule test\"\n" + "salience 10\n" + "when\n" + "    Person()\n" + "    exists Cheese( price >= 5 )\n" + "then\n" + "    list.add( new Integer( 5 ) );\n" + "end\n";
    KieBase kBase = loadKnowledgeBaseFromString(header + rule1);
    Environment env = EnvironmentFactory.newEnvironment();
    env.set(EnvironmentName.OBJECT_MARSHALLING_STRATEGIES, new ObjectMarshallingStrategy[] { new IdentityPlaceholderResolverStrategy(ClassObjectMarshallingStrategyAcceptor.DEFAULT) });
    KieSession ksession = kBase.newKieSession(null, env);
    List list = new ArrayList();
    ksession.setGlobal("list", list);
    // add a person, no cheese
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    Person bobba = new Person("bobba fet", 50);
    ksession.insert(bobba);
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    ksession.fireAllRules();
    assertEquals(0, list.size());
    // add another person, no cheese
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    Person darth = new Person("darth vadar", 200);
    ksession.insert(darth);
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    ksession.fireAllRules();
    assertEquals(0, list.size());
    // add cheese
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    Cheese stilton = new Cheese("stilton", 5);
    ksession.insert(stilton);
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    ksession.fireAllRules();
    assertEquals(2, list.size());
    // remove cheese
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    ksession.retract(ksession.getFactHandle(stilton));
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    ksession.fireAllRules();
    assertEquals(2, list.size());
    // put 2 cheeses back in
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    ksession.insert(stilton);
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    Cheese brie = new Cheese("brie", 18);
    ksession.insert(brie);
    ksession.fireAllRules();
    assertEquals(4, list.size());
    // now remove a cheese, should be no change
    ksession.retract(ksession.getFactHandle(stilton));
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    ksession.fireAllRules();
    assertEquals(4, list.size());
    // now remove a person, should be no change
    ksession.retract(ksession.getFactHandle(bobba));
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    ksession.fireAllRules();
    assertEquals(4, list.size());
    // removal remaining cheese, no
    ksession.retract(ksession.getFactHandle(brie));
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    ksession.fireAllRules();
    assertEquals(4, list.size());
    // put one cheese back in, with one person should increase by one
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    ksession.insert(stilton);
    ksession.fireAllRules();
    assertEquals(5, list.size());
}
Also used : IdentityPlaceholderResolverStrategy(org.drools.serialization.protobuf.marshalling.IdentityPlaceholderResolverStrategy) KieBase(org.kie.api.KieBase) ArrayList(java.util.ArrayList) Environment(org.kie.api.runtime.Environment) Cheese(org.drools.mvel.compiler.Cheese) KieSession(org.kie.api.runtime.KieSession) IteratorToList(org.drools.mvel.integrationtests.IteratorToList) List(java.util.List) ArrayList(java.util.ArrayList) Person(org.drools.mvel.compiler.Person) Test(org.junit.Test)

Example 73 with Cheese

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

the class MarshallingTest method testRuleFlowGroups.

@Test
public void testRuleFlowGroups() throws Exception {
    String rule1 = "package org.drools.compiler.test;\n";
    rule1 += "import " + Cheese.class.getCanonicalName() + "\n";
    rule1 += "global java.util.List list\n";
    rule1 += "rule \"Rule 1\"\n";
    rule1 += "    ruleflow-group \"ruleflow-group-1\"\n";
    rule1 += "when\n";
    rule1 += "    $c : Cheese( ) \n";
    rule1 += "then\n";
    rule1 += "    list.add( \"rule1\" );\n";
    rule1 += "    drools.halt();\n";
    rule1 += "end";
    String rule2 = "package org.drools.compiler.test;\n";
    rule2 += "import " + Cheese.class.getCanonicalName() + "\n";
    rule2 += "global java.util.List list\n";
    rule2 += "rule \"Rule 2\"\n";
    rule2 += "    salience 10\n";
    rule2 += "    ruleflow-group \"ruleflow-group-1\"\n";
    rule2 += "when\n";
    rule2 += "    $c : Cheese( ) \n";
    rule2 += "then\n";
    rule2 += "    list.add( \"rule2\" );\n";
    rule2 += "    drools.halt();\n";
    rule2 += "end";
    String rule3 = "package org.drools.compiler.test;\n";
    rule3 += "import " + Cheese.class.getCanonicalName() + "\n";
    rule3 += "global java.util.List list\n";
    rule3 += "rule \"Rule 3\"\n";
    rule3 += "    salience 10\n";
    rule3 += "    ruleflow-group \"ruleflow-group-2\"\n";
    rule3 += "    activation-group \"activation-group-2\"\n";
    rule3 += "when\n";
    rule3 += "    $c : Cheese( ) \n";
    rule3 += "then\n";
    rule3 += "    list.add( \"rule3\" );\n";
    rule3 += "    drools.halt();\n";
    rule3 += "end";
    String rule4 = "package org.drools.compiler.test;\n";
    rule4 += "import " + Cheese.class.getCanonicalName() + "\n";
    rule4 += "global java.util.List list\n";
    rule4 += "rule \"Rule 4\"\n";
    rule4 += "    ruleflow-group \"ruleflow-group-2\"\n";
    rule4 += "    activation-group \"activation-group-2\"\n";
    rule4 += "when\n";
    rule4 += "    $c : Cheese( ) \n";
    rule4 += "then\n";
    rule4 += "    list.add( \"rule4\" );\n";
    rule4 += "    drools.halt();\n";
    rule4 += "end";
    KieBase kbase = loadKnowledgeBaseFromString(rule1, rule2, rule3, rule4);
    KieSession ksession = getSerialisedStatefulKnowledgeSession(kbase.newKieSession(), true);
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    final List list = new ArrayList();
    ksession.setGlobal("list", list);
    final Cheese brie = new Cheese("brie", 12);
    ksession.insert(brie);
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    ((InternalAgenda) ksession.getAgenda()).activateRuleFlowGroup("ruleflow-group-1");
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    ksession.fireAllRules();
    assertEquals("rule2", list.get(0));
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    ((InternalAgenda) ksession.getAgenda()).activateRuleFlowGroup("ruleflow-group-2");
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    ksession.fireAllRules();
    assertEquals("rule3", list.get(1));
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    ksession.fireAllRules();
    assertEquals("rule1", list.get(2));
}
Also used : InternalAgenda(org.drools.core.common.InternalAgenda) KieBase(org.kie.api.KieBase) ArrayList(java.util.ArrayList) Cheese(org.drools.mvel.compiler.Cheese) KieSession(org.kie.api.runtime.KieSession) IteratorToList(org.drools.mvel.integrationtests.IteratorToList) List(java.util.List) ArrayList(java.util.ArrayList) Test(org.junit.Test)

Example 74 with Cheese

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

the class MarshallingTest method testTruthMaintenance.

@Test
public void testTruthMaintenance() throws Exception {
    String header = "package org.drools.compiler.test;\n" + "import java.util.List;\n" + "import " + Person.class.getCanonicalName() + "\n" + "import " + Cheese.class.getCanonicalName() + "\n" + "global Cheese cheese;\n" + "global Person person;\n" + "global java.util.List list;\n";
    String rule1 = "rule \"not person then cheese\"\n" + "when \n" + "    not Person() \n" + "then \n" + "    if (list.size() < 3) { \n" + "        list.add(new Integer(0)); \n" + "        insertLogical( cheese ); \n" + "    }\n" + "    drools.halt();\n" + "end\n";
    String rule2 = "rule \"if cheese then person\"\n" + "when\n" + "    Cheese()\n" + "then\n" + "    if (list.size() < 3) {\n" + "        list.add(new Integer(0));\n" + "        insertLogical( person );\n" + "    }\n" + "    drools.halt();\n" + "end\n";
    KieBase kBase = loadKnowledgeBaseFromString(header + rule1 + rule2);
    KieSession ksession = kBase.newKieSession();
    final List list = new ArrayList();
    final Person person = new Person("person");
    final Cheese cheese = new Cheese("cheese", 0);
    ksession.setGlobal("cheese", cheese);
    ksession.setGlobal("person", person);
    ksession.setGlobal("list", list);
    ksession.fireAllRules();
    assertEquals(1, list.size());
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    ksession.fireAllRules();
    assertEquals(2, list.size());
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    ksession.fireAllRules();
    assertEquals(3, list.size());
    // should not grow any further
    ksession = getSerialisedStatefulKnowledgeSession(ksession, true);
    ksession.fireAllRules();
    assertEquals(3, list.size());
}
Also used : KieBase(org.kie.api.KieBase) ArrayList(java.util.ArrayList) Cheese(org.drools.mvel.compiler.Cheese) KieSession(org.kie.api.runtime.KieSession) IteratorToList(org.drools.mvel.integrationtests.IteratorToList) List(java.util.List) ArrayList(java.util.ArrayList) Person(org.drools.mvel.compiler.Person) Test(org.junit.Test)

Example 75 with Cheese

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

the class MarshallingTest method testSerializeAdd2.

/*
     *  Here I am inserting data points which are not used by any rule (e.g Person).
     *  Later adding rule (e.g. Rule: 'match Person') for those data points.
     *
     *  Result: Pkg/Rule addition is failing with ClassCastException
     */
@Test
public void testSerializeAdd2() throws Exception {
    // Create a rulebase, a session, and test it
    Collection<KiePackage> kpkgs = loadKnowledgePackages("test_Dynamic1_0.drl");
    kpkgs = SerializationHelper.serializeObject(kpkgs);
    InternalKnowledgeBase kBase = (InternalKnowledgeBase) getKnowledgeBase();
    kBase.addPackages(kpkgs);
    List results = new ArrayList();
    KieSession session = kBase.newKieSession();
    session.setGlobal("results", results);
    InternalFactHandle stilton1 = (InternalFactHandle) session.insert(new Cheese("stilton", 10));
    session.insert(new Cheese("brie", 10));
    InternalFactHandle bob = (InternalFactHandle) session.insert(new Person("bob", 10));
    // fire rules
    session.fireAllRules();
    // check the results are correct
    assertEquals(1, results.size());
    assertEquals(stilton1.getObject(), results.get(0));
    // serialize session and rulebase
    session = getSerialisedStatefulKnowledgeSession(session, kBase, true);
    // dynamically add a new package
    kpkgs = loadKnowledgePackages("test_Dynamic3_0.drl");
    kBase.addPackages(SerializationHelper.serializeObject(kpkgs));
    session = getSerialisedStatefulKnowledgeSession(session, kBase, true);
    InternalFactHandle stilton2 = (InternalFactHandle) session.insert(new Cheese("stilton", 20));
    session.insert(new Cheese("brie", 20));
    InternalFactHandle mark = (InternalFactHandle) session.insert(new Person("mark", 20));
    session.fireAllRules();
    results = (List) session.getGlobal("results");
    assertEquals(4, results.size());
    assertEquals(stilton2.getObject(), results.get(1));
    assertEquals(bob.getObject(), results.get(2));
    assertEquals(mark.getObject(), results.get(3));
    session = getSerialisedStatefulKnowledgeSession(session, kBase, true);
    // dispose session
    session.dispose();
}
Also used : KiePackage(org.kie.api.definition.KiePackage) ArrayList(java.util.ArrayList) IteratorToList(org.drools.mvel.integrationtests.IteratorToList) List(java.util.List) ArrayList(java.util.ArrayList) KieSession(org.kie.api.runtime.KieSession) Cheese(org.drools.mvel.compiler.Cheese) InternalFactHandle(org.drools.core.common.InternalFactHandle) Person(org.drools.mvel.compiler.Person) InternalKnowledgeBase(org.drools.kiesession.rulebase.InternalKnowledgeBase) Test(org.junit.Test)

Aggregations

Cheese (org.drools.mvel.compiler.Cheese)136 Test (org.junit.Test)129 KieSession (org.kie.api.runtime.KieSession)112 KieBase (org.kie.api.KieBase)96 ArrayList (java.util.ArrayList)90 List (java.util.List)65 Person (org.drools.mvel.compiler.Person)47 FactHandle (org.kie.api.runtime.rule.FactHandle)29 InternalKnowledgeBase (org.drools.kiesession.rulebase.InternalKnowledgeBase)24 KiePackage (org.kie.api.definition.KiePackage)23 InternalFactHandle (org.drools.core.common.InternalFactHandle)20 StatelessKieSession (org.kie.api.runtime.StatelessKieSession)20 IteratorToList (org.drools.mvel.integrationtests.IteratorToList)14 Command (org.kie.api.command.Command)10 ExecutionResults (org.kie.api.runtime.ExecutionResults)10 PackageDescr (org.drools.drl.ast.descr.PackageDescr)7 KnowledgeBuilderImpl (org.drools.compiler.builder.impl.KnowledgeBuilderImpl)6 Cheesery (org.drools.mvel.compiler.Cheesery)6 ClassObjectFilter (org.drools.core.ClassObjectFilter)5 ClassObjectType (org.drools.core.base.ClassObjectType)5