Search in sources :

Example 51 with FactHandle

use of org.kie.api.runtime.rule.FactHandle in project drools by kiegroup.

the class FromTest method testFromSharing.

@Test
public void testFromSharing() {
    // Keeping original test as non-property reactive by default, just allowed.
    String drl = "import " + ListsContainer.class.getCanonicalName() + "\n" + "global java.util.List output1;\n" + "global java.util.List output2;\n" + "rule R1 when\n" + "    ListsContainer( $list : list1 )\n" + "    $s : String( length == 2 ) from $list\n" + "then\n" + "    output1.add($s);\n" + "end\n" + "rule R2 when\n" + "    ListsContainer( $list : list2 )\n" + "    $s : String( length == 2 ) from $list\n" + "then\n" + "    output2.add($s);\n" + "end\n" + "rule R3 when\n" + "    ListsContainer( $list : list2 )\n" + "    $s : String( length == 2 ) from $list\n" + "then\n" + "    output2.add($s);\n" + "end\n";
    KieBase kbase = new KieHelper(PropertySpecificOption.ALLOWED).addContent(drl, ResourceType.DRL).build();
    KieSession ksession = kbase.newKieSession();
    ReteDumper.dumpRete(kbase);
    List<String> output1 = new ArrayList<String>();
    ksession.setGlobal("output1", output1);
    List<String> output2 = new ArrayList<String>();
    ksession.setGlobal("output2", output2);
    FactHandle fh = ksession.insert(new ListsContainer());
    ksession.fireAllRules();
    assertEquals("bb", output1.get(0));
    assertEquals("22", output2.get(0));
    assertEquals("22", output2.get(1));
    EntryPointNode epn = ((InternalKnowledgeBase) kbase).getRete().getEntryPointNodes().values().iterator().next();
    ObjectTypeNode otn = epn.getObjectTypeNodes().get(new ClassObjectType(ListsContainer.class));
    // There is only 1 LIA
    assertEquals(1, otn.getObjectSinkPropagator().size());
    LeftInputAdapterNode lian = (LeftInputAdapterNode) otn.getObjectSinkPropagator().getSinks()[0];
    // There are only 2 FromNodes since R2 and R3 are sharing the second From
    LeftTupleSink[] sinks = lian.getSinkPropagator().getSinks();
    assertEquals(2, sinks.length);
    // The first from has R1 has sink
    assertEquals(1, sinks[0].getSinkPropagator().size());
    // The second from has both R2 and R3 as sinks
    assertEquals(2, sinks[1].getSinkPropagator().size());
}
Also used : ClassObjectType(org.drools.core.base.ClassObjectType) FactHandle(org.kie.api.runtime.rule.FactHandle) ArrayList(java.util.ArrayList) ObjectTypeNode(org.drools.core.reteoo.ObjectTypeNode) LeftTupleSink(org.drools.core.reteoo.LeftTupleSink) KieHelper(org.kie.internal.utils.KieHelper) EntryPointNode(org.drools.core.reteoo.EntryPointNode) KieBase(org.kie.api.KieBase) KieSession(org.kie.api.runtime.KieSession) InternalKnowledgeBase(org.drools.core.impl.InternalKnowledgeBase) LeftInputAdapterNode(org.drools.core.reteoo.LeftInputAdapterNode) Test(org.junit.Test)

Example 52 with FactHandle

use of org.kie.api.runtime.rule.FactHandle in project drools by kiegroup.

the class QueryTest method testQuery.

@Test
public void testQuery() throws Exception {
    KieBase kbase = SerializationHelper.serializeObject(loadKnowledgeBase("simple_query_test.drl"));
    KieSession session = createKieSession(kbase);
    final Cheese stilton = new Cheese("stinky", 5);
    FactHandle factHandle = session.insert(stilton);
    session = SerializationHelper.getSerialisedStatefulKnowledgeSession(session, true);
    String queryName = "simple query";
    org.kie.api.runtime.rule.QueryResults results = getQueryResults(session, queryName);
    assertEquals(1, results.size());
    QueryResultsRow row = results.iterator().next();
    if (row instanceof FlatQueryResultRow) {
        FlatQueryResultRow flatRow = (FlatQueryResultRow) row;
        assertEquals(0, flatRow.getIdentifiers().size());
    } else if (row instanceof QueryResultsRowImpl) {
        QueryResultsRowImpl rowImpl = (QueryResultsRowImpl) row;
        assertEquals(0, rowImpl.getDeclarations().size());
    }
}
Also used : FlatQueryResultRow(org.drools.core.runtime.rule.impl.FlatQueryResultRow) InternalFactHandle(org.drools.core.common.InternalFactHandle) FactHandle(org.kie.api.runtime.rule.FactHandle) QueryResults(org.kie.api.runtime.rule.QueryResults) QueryResultsRow(org.kie.api.runtime.rule.QueryResultsRow) KieBase(org.kie.api.KieBase) KieSession(org.kie.api.runtime.KieSession) Cheese(org.drools.compiler.Cheese) QueryResultsRowImpl(org.drools.core.QueryResultsRowImpl) Test(org.junit.Test)

Example 53 with FactHandle

use of org.kie.api.runtime.rule.FactHandle in project drools by kiegroup.

the class QueryTest method testDoubleQueryWithExists.

@Test
public void testDoubleQueryWithExists() throws Exception {
    KieBase kbase = SerializationHelper.serializeObject(loadKnowledgeBase("test_DoubleQueryWithExists.drl"));
    KieSession session = createKieSession(kbase);
    final Person p1 = new Person("p1", "stilton", 20);
    p1.setStatus("europe");
    final FactHandle c1FactHandle = session.insert(p1);
    final Person p2 = new Person("p2", "stilton", 30);
    p2.setStatus("europe");
    final FactHandle c2FactHandle = session.insert(p2);
    final Person p3 = new Person("p3", "stilton", 40);
    p3.setStatus("europe");
    final FactHandle c3FactHandle = session.insert(p3);
    session.fireAllRules();
    QueryResults results = session.getQueryResults("2 persons with the same status");
    assertEquals(2, results.size());
    // europe=[ 1, 2 ], america=[ 3 ]
    p3.setStatus("america");
    session.update(c3FactHandle, p3);
    session.fireAllRules();
    results = session.getQueryResults("2 persons with the same status");
    assertEquals(1, results.size());
    // europe=[ 1 ], america=[ 2, 3 ]
    p2.setStatus("america");
    session.update(c2FactHandle, p2);
    session.fireAllRules();
    results = session.getQueryResults("2 persons with the same status");
    assertEquals(1, results.size());
    // europe=[ ], america=[ 1, 2, 3 ]
    p1.setStatus("america");
    session.update(c1FactHandle, p1);
    session.fireAllRules();
    results = getQueryResults(session, "2 persons with the same status");
    assertEquals(2, results.size());
    // europe=[ 2 ], america=[ 1, 3 ]
    p2.setStatus("europe");
    session.update(c2FactHandle, p2);
    session.fireAllRules();
    results = getQueryResults(session, "2 persons with the same status");
    assertEquals(1, results.size());
    // europe=[ 1, 2 ], america=[ 3 ]
    p1.setStatus("europe");
    session.update(c1FactHandle, p1);
    session.fireAllRules();
    results = session.getQueryResults("2 persons with the same status");
    assertEquals(1, results.size());
    // europe=[ 1, 2, 3 ], america=[ ]
    p3.setStatus("europe");
    session.update(c3FactHandle, p3);
    session.fireAllRules();
    results = session.getQueryResults("2 persons with the same status");
    assertEquals(2, results.size());
}
Also used : InternalFactHandle(org.drools.core.common.InternalFactHandle) FactHandle(org.kie.api.runtime.rule.FactHandle) KieBase(org.kie.api.KieBase) KieSession(org.kie.api.runtime.KieSession) Person(org.drools.compiler.Person) QueryResults(org.kie.api.runtime.rule.QueryResults) FlatQueryResults(org.drools.core.runtime.rule.impl.FlatQueryResults) Test(org.junit.Test)

Example 54 with FactHandle

use of org.kie.api.runtime.rule.FactHandle in project drools by kiegroup.

the class QueryTest3 method doIt.

private void doIt(Object o1, Object o2, String query, int expected, boolean doUpdate, boolean doRetract) {
    KieSession knowledgeSession = knowledgeBase.newKieSession();
    try {
        knowledgeSession.insert(o1);
        FactHandle handle2 = knowledgeSession.insert(o2);
        if (doUpdate) {
            knowledgeSession.update(handle2, o2);
        } else if (doRetract) {
            knowledgeSession.retract(handle2);
            handle2 = knowledgeSession.insert(o2);
        }
        QueryResults queryResults = knowledgeSession.getQueryResults(query);
        assertEquals(expected, queryResults.size());
    } finally {
        knowledgeSession.dispose();
    }
}
Also used : FactHandle(org.kie.api.runtime.rule.FactHandle) KieSession(org.kie.api.runtime.KieSession) QueryResults(org.kie.api.runtime.rule.QueryResults)

Example 55 with FactHandle

use of org.kie.api.runtime.rule.FactHandle in project drools by kiegroup.

the class RuleExecutionTest method testOnDeleteMatchConsequence.

@Test
public void testOnDeleteMatchConsequence() throws Exception {
    String str = "import " + Person.class.getCanonicalName() + ";\n" + "rule R1 when\n" + "    $p : Person( age > 30 )\n" + "then\n" + "    $p.setStatus(\"in\");\n" + "then[$onDeleteMatch$]\n" + "    $p.setStatus(\"out\");\n" + "end\n";
    KieSession ksession = new KieHelper().addContent(str, ResourceType.DRL).build().newKieSession();
    Person mario = new Person("Mario", 40);
    FactHandle fact = ksession.insert(mario);
    ksession.fireAllRules();
    assertEquals("in", mario.getStatus());
    ksession.delete(fact);
    ksession.fireAllRules();
    assertEquals("out", mario.getStatus());
}
Also used : FactHandle(org.kie.api.runtime.rule.FactHandle) KieHelper(org.kie.internal.utils.KieHelper) KieSession(org.kie.api.runtime.KieSession) Person(org.drools.compiler.Person) Test(org.junit.Test)

Aggregations

FactHandle (org.kie.api.runtime.rule.FactHandle)650 Test (org.junit.Test)547 KieSession (org.kie.api.runtime.KieSession)506 KieBase (org.kie.api.KieBase)304 ArrayList (java.util.ArrayList)298 InternalFactHandle (org.drools.core.common.InternalFactHandle)192 List (java.util.List)165 DefaultFactHandle (org.drools.core.common.DefaultFactHandle)119 StatelessKieSession (org.kie.api.runtime.StatelessKieSession)66 KieHelper (org.kie.internal.utils.KieHelper)50 Person (org.drools.modelcompiler.domain.Person)46 KnowledgeBuilder (org.kie.internal.builder.KnowledgeBuilder)43 HashMap (java.util.HashMap)41 Person (org.drools.compiler.Person)41 InternalWorkingMemory (org.drools.core.common.InternalWorkingMemory)39 InternalKnowledgeBase (org.drools.core.impl.InternalKnowledgeBase)39 Person (org.drools.mvel.compiler.Person)38 Ignore (org.junit.Ignore)36 Match (org.kie.api.runtime.rule.Match)36 Collection (java.util.Collection)34