Search in sources :

Example 36 with LeftInputAdapterNode

use of org.drools.core.reteoo.LeftInputAdapterNode in project drools by kiegroup.

the class IndexingTest method testBuildsIndexedMemory.

@Test(timeout = 10000)
public void testBuildsIndexedMemory() {
    // tests indexes are correctly built
    String drl = "";
    drl += "package org.drools.compiler.test\n";
    drl += "import org.drools.compiler.Person\n";
    drl += "global java.util.List list\n";
    drl += "rule test1\n";
    drl += "when\n";
    drl += "   $p1  : Person($name : name )\n";
    // indexed
    drl += "   $p2 : Person(name == $name)\n";
    // indexed
    drl += "   $p3 : Person(name == $p1.name)\n";
    // not indexed
    drl += "   $p4 : Person(address.street == $p1.address.street)\n";
    // indexed
    drl += "   $p5 : Person(address.street == $p1.name)\n";
    // drl += "   $p6 : Person( $name == name)\n"; // not indexed and won't compile
    // indexed
    drl += "   $p7 : Person(addresses[\"key\"].street == $p1.name)\n";
    // indexed
    drl += "   $p8 : Person(addresses[0].street == $p1.name)\n";
    // not indexed
    drl += "   $p9 : Person(name == $p1.address.street)\n";
    // indexed
    drl += "   $p10 : Person(addresses[0].street + 'xx' == $p1.name)\n";
    // not indexed
    drl += "   $p11 : Person(addresses[$p1].street == $p1.name)\n";
    drl += "then\n";
    drl += "end\n";
    KieBase kbase = loadKnowledgeBaseFromString(drl);
    ObjectTypeNode node = getObjectTypeNode(kbase, Person.class);
    InternalWorkingMemory wm = ((StatefulKnowledgeSessionImpl) kbase.newKieSession());
    LeftInputAdapterNode liaNode = (LeftInputAdapterNode) node.getObjectSinkPropagator().getSinks()[0];
    // $p2
    JoinNode j2 = (JoinNode) liaNode.getSinkPropagator().getSinks()[0];
    // $p3
    JoinNode j3 = (JoinNode) j2.getSinkPropagator().getSinks()[0];
    // $p4
    JoinNode j4 = (JoinNode) j3.getSinkPropagator().getSinks()[0];
    // $p5
    JoinNode j5 = (JoinNode) j4.getSinkPropagator().getSinks()[0];
    // JoinNode j6 = ( JoinNode ) j5.getSinkPropagator().getSinks()[0];  // $p6 // won't compile
    // $p7
    JoinNode j7 = (JoinNode) j5.getSinkPropagator().getSinks()[0];
    // $p8
    JoinNode j8 = (JoinNode) j7.getSinkPropagator().getSinks()[0];
    // $p9
    JoinNode j9 = (JoinNode) j8.getSinkPropagator().getSinks()[0];
    // $p10
    JoinNode j10 = (JoinNode) j9.getSinkPropagator().getSinks()[0];
    // $p11
    JoinNode j11 = (JoinNode) j10.getSinkPropagator().getSinks()[0];
    SingleBetaConstraints c = (SingleBetaConstraints) j2.getRawConstraints();
    assertEquals("$name", ((IndexableConstraint) c.getConstraint()).getFieldIndex().getDeclaration().getIdentifier());
    assertTrue(c.isIndexed());
    BetaMemory bm = (BetaMemory) wm.getNodeMemory(j2);
    assertTrue(bm.getLeftTupleMemory() instanceof TupleIndexHashTable);
    assertTrue(bm.getRightTupleMemory() instanceof TupleIndexHashTable);
    c = (SingleBetaConstraints) j3.getRawConstraints();
    assertEquals("name", ((IndexableConstraint) c.getConstraint()).getFieldIndex().getDeclaration().getIdentifier());
    assertTrue(c.isIndexed());
    bm = (BetaMemory) wm.getNodeMemory(j3);
    assertTrue(bm.getLeftTupleMemory() instanceof TupleIndexHashTable);
    assertTrue(bm.getRightTupleMemory() instanceof TupleIndexHashTable);
    c = (SingleBetaConstraints) j4.getRawConstraints();
    assertEquals("$p1", c.getConstraint().getRequiredDeclarations()[0].getIdentifier());
    assertFalse(c.isIndexed());
    bm = (BetaMemory) wm.getNodeMemory(j4);
    assertTrue(bm.getLeftTupleMemory() instanceof TupleList);
    assertTrue(bm.getRightTupleMemory() instanceof TupleList);
    c = (SingleBetaConstraints) j5.getRawConstraints();
    assertEquals("name", ((IndexableConstraint) c.getConstraint()).getFieldIndex().getDeclaration().getIdentifier());
    assertTrue(c.isIndexed());
    bm = (BetaMemory) wm.getNodeMemory(j5);
    assertTrue(bm.getLeftTupleMemory() instanceof TupleIndexHashTable);
    assertTrue(bm.getRightTupleMemory() instanceof TupleIndexHashTable);
    // won't compile
    // c = ( SingleBetaConstraints ) j6.getRawConstraints();
    // assertEquals( "name", ((VariableConstraint)c.getConstraint()).getRequiredDeclarations()[0].getIdentifier() );
    // assertFalse( c.isIndexed() );
    // bm = ( BetaMemory ) wm.getNodeMemory( j6 );
    // assertTrue( bm.getLeftTupleMemory() instanceof LeftTupleList );
    // assertTrue( bm.getRightTupleMemory() instanceof RightTupleList );
    c = (SingleBetaConstraints) j7.getRawConstraints();
    assertEquals("name", ((IndexableConstraint) c.getConstraint()).getFieldIndex().getDeclaration().getIdentifier());
    assertTrue(c.isIndexed());
    bm = (BetaMemory) wm.getNodeMemory(j7);
    assertTrue(bm.getLeftTupleMemory() instanceof TupleIndexHashTable);
    assertTrue(bm.getRightTupleMemory() instanceof TupleIndexHashTable);
    c = (SingleBetaConstraints) j8.getRawConstraints();
    assertEquals("name", ((IndexableConstraint) c.getConstraint()).getFieldIndex().getDeclaration().getIdentifier());
    assertTrue(c.isIndexed());
    bm = (BetaMemory) wm.getNodeMemory(j8);
    assertTrue(bm.getLeftTupleMemory() instanceof TupleIndexHashTable);
    assertTrue(bm.getRightTupleMemory() instanceof TupleIndexHashTable);
    c = (SingleBetaConstraints) j9.getRawConstraints();
    assertEquals("$p1", c.getConstraint().getRequiredDeclarations()[0].getIdentifier());
    assertFalse(c.isIndexed());
    bm = (BetaMemory) wm.getNodeMemory(j9);
    assertTrue(bm.getLeftTupleMemory() instanceof TupleList);
    assertTrue(bm.getRightTupleMemory() instanceof TupleList);
    c = (SingleBetaConstraints) j10.getRawConstraints();
    assertEquals("name", ((IndexableConstraint) c.getConstraint()).getFieldIndex().getDeclaration().getIdentifier());
    assertTrue(c.isIndexed());
    bm = (BetaMemory) wm.getNodeMemory(j10);
    assertTrue(bm.getLeftTupleMemory() instanceof TupleIndexHashTable);
    assertTrue(bm.getRightTupleMemory() instanceof TupleIndexHashTable);
    c = (SingleBetaConstraints) j11.getRawConstraints();
    assertEquals("$p1", c.getConstraint().getRequiredDeclarations()[0].getIdentifier());
    assertFalse(c.isIndexed());
    bm = (BetaMemory) wm.getNodeMemory(j11);
    assertTrue(bm.getLeftTupleMemory() instanceof TupleList);
    assertTrue(bm.getRightTupleMemory() instanceof TupleList);
}
Also used : InternalWorkingMemory(org.drools.core.common.InternalWorkingMemory) TupleList(org.drools.core.util.index.TupleList) SingleBetaConstraints(org.drools.core.common.SingleBetaConstraints) KieBase(org.kie.api.KieBase) JoinNode(org.drools.core.reteoo.JoinNode) ObjectTypeNode(org.drools.core.reteoo.ObjectTypeNode) BetaMemory(org.drools.core.reteoo.BetaMemory) TupleIndexHashTable(org.drools.core.util.index.TupleIndexHashTable) LeftInputAdapterNode(org.drools.core.reteoo.LeftInputAdapterNode) Test(org.junit.Test)

Example 37 with LeftInputAdapterNode

use of org.drools.core.reteoo.LeftInputAdapterNode in project drools by kiegroup.

the class LinkingTest method testNotNodeDoesNotUnlinksWithConstriants.

@Test
public void testNotNodeDoesNotUnlinksWithConstriants() {
    String str = "";
    str += "package org.kie \n";
    str += "import " + A.class.getCanonicalName() + "\n";
    str += "import " + B.class.getCanonicalName() + "\n";
    str += "import " + C.class.getCanonicalName() + "\n";
    str += "import " + D.class.getCanonicalName() + "\n";
    str += "import " + E.class.getCanonicalName() + "\n";
    str += "import " + F.class.getCanonicalName() + "\n";
    str += "import " + G.class.getCanonicalName() + "\n";
    str += "global java.util.List list \n";
    str += "rule rule1 when \n";
    str += "   $a : A() \n";
    str += "   not B( value == $a.value ) \n";
    str += "   $c : C() \n";
    str += "then \n";
    str += "  list.add( 'x' ); \n";
    str += "end \n";
    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newByteArrayResource(str.getBytes()), ResourceType.DRL);
    assertFalse(kbuilder.getErrors().toString(), kbuilder.hasErrors());
    InternalKnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
    kbase.addPackages(kbuilder.getKnowledgePackages());
    ObjectTypeNode aotn = getObjectTypeNode(kbase, A.class);
    InternalWorkingMemory wm = ((StatefulKnowledgeSessionImpl) kbase.newKieSession());
    List list = new ArrayList();
    wm.setGlobal("list", list);
    LeftInputAdapterNode aNode = (LeftInputAdapterNode) aotn.getObjectSinkPropagator().getSinks()[0];
    NotNode bNode = (NotNode) aNode.getSinkPropagator().getSinks()[0];
    JoinNode cNode = (JoinNode) bNode.getSinkPropagator().getSinks()[0];
    SegmentUtilities.createSegmentMemory(cNode, wm);
    LiaNodeMemory amem = (LiaNodeMemory) wm.getNodeMemory(aNode);
    // Only NotNode is linked in
    assertEquals(2, amem.getSegmentMemory().getLinkedNodeMask());
    FactHandle fha = wm.insert(new A());
    FactHandle fhb = wm.insert(new B(1));
    FactHandle fhc = wm.insert(new C());
    wm.flushPropagations();
    // All nodes are linked in
    assertEquals(7, amem.getSegmentMemory().getLinkedNodeMask());
    // NotNode does not unlink, due to variable constraint
    wm.retract(fhb);
    wm.flushPropagations();
    assertEquals(7, amem.getSegmentMemory().getLinkedNodeMask());
}
Also used : NotNode(org.drools.core.reteoo.NotNode) FactHandle(org.kie.api.runtime.rule.FactHandle) JoinNode(org.drools.core.reteoo.JoinNode) ObjectTypeNode(org.drools.core.reteoo.ObjectTypeNode) ArrayList(java.util.ArrayList) LiaNodeMemory(org.drools.core.reteoo.LeftInputAdapterNode.LiaNodeMemory) InternalWorkingMemory(org.drools.core.common.InternalWorkingMemory) KnowledgeBuilder(org.kie.internal.builder.KnowledgeBuilder) ArrayList(java.util.ArrayList) List(java.util.List) InternalKnowledgeBase(org.drools.core.impl.InternalKnowledgeBase) LeftInputAdapterNode(org.drools.core.reteoo.LeftInputAdapterNode) Test(org.junit.Test)

Example 38 with LeftInputAdapterNode

use of org.drools.core.reteoo.LeftInputAdapterNode in project drools by kiegroup.

the class LinkingTest method testJoinNodes.

@Test
public void testJoinNodes() throws Exception {
    String str = "";
    str += "package org.kie \n";
    str += "import " + A.class.getCanonicalName() + "\n";
    str += "import " + B.class.getCanonicalName() + "\n";
    str += "import " + C.class.getCanonicalName() + "\n";
    str += "import " + D.class.getCanonicalName() + "\n";
    str += "import " + E.class.getCanonicalName() + "\n";
    str += "import " + F.class.getCanonicalName() + "\n";
    str += "import " + G.class.getCanonicalName() + "\n";
    str += "global java.util.List list \n";
    str += "rule rule1 when \n";
    str += "   $a : A() \n";
    str += "   $b : B() \n";
    str += "   $c : C() \n";
    str += "then \n";
    str += "  list.add( $a.getValue() + \":\"+ $b.getValue() + \":\" + $c.getValue() ); \n";
    str += "end \n";
    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newByteArrayResource(str.getBytes()), ResourceType.DRL);
    assertFalse(kbuilder.getErrors().toString(), kbuilder.hasErrors());
    InternalKnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
    kbase.addPackages(kbuilder.getKnowledgePackages());
    ObjectTypeNode aotn = getObjectTypeNode(kbase, A.class);
    ObjectTypeNode botn = getObjectTypeNode(kbase, B.class);
    ObjectTypeNode cotn = getObjectTypeNode(kbase, C.class);
    InternalWorkingMemory wm = (InternalWorkingMemory) kbase.newKieSession();
    List list = new ArrayList();
    wm.setGlobal("list", list);
    for (int i = 0; i < 3; i++) {
        wm.insert(new A(i));
    }
    for (int i = 0; i < 3; i++) {
        wm.insert(new B(i));
    }
    for (int i = 0; i < 29; i++) {
        wm.insert(new C(i));
    }
    wm.flushPropagations();
    LeftInputAdapterNode aNode = (LeftInputAdapterNode) aotn.getObjectSinkPropagator().getSinks()[0];
    JoinNode bNode = (JoinNode) aNode.getSinkPropagator().getSinks()[0];
    JoinNode cNode = (JoinNode) bNode.getSinkPropagator().getSinks()[0];
    LiaNodeMemory amem = (LiaNodeMemory) wm.getNodeMemory(aNode);
    BetaMemory bmem = (BetaMemory) wm.getNodeMemory(bNode);
    BetaMemory cmem = (BetaMemory) wm.getNodeMemory(cNode);
    // amem.getSegmentMemory().getStagedLeftTuples().insertSize() == 3
    assertNotNull(amem.getSegmentMemory().getStagedLeftTuples().getInsertFirst());
    assertNotNull(amem.getSegmentMemory().getStagedLeftTuples().getInsertFirst().getStagedNext());
    assertNotNull(amem.getSegmentMemory().getStagedLeftTuples().getInsertFirst().getStagedNext().getStagedNext());
    assertNull(amem.getSegmentMemory().getStagedLeftTuples().getInsertFirst().getStagedNext().getStagedNext().getStagedNext());
    // assertEquals( 3, bmem.getStagedRightTuples().insertSize() );
    assertNotNull(bmem.getStagedRightTuples().getInsertFirst());
    assertNotNull(bmem.getStagedRightTuples().getInsertFirst().getStagedNext());
    assertNotNull(bmem.getStagedRightTuples().getInsertFirst().getStagedNext().getStagedNext());
    assertNull(bmem.getStagedRightTuples().getInsertFirst().getStagedNext().getStagedNext().getStagedNext());
    wm.fireAllRules();
    assertNull(amem.getSegmentMemory().getStagedLeftTuples().getInsertFirst());
    assertNull(bmem.getStagedRightTuples().getInsertFirst());
    assertNull(cmem.getStagedRightTuples().getInsertFirst());
    assertEquals(261, list.size());
    assertTrue(list.contains("2:2:14"));
    assertTrue(list.contains("1:0:6"));
    assertTrue(list.contains("0:1:1"));
    assertTrue(list.contains("2:2:14"));
    assertTrue(list.contains("0:0:25"));
}
Also used : JoinNode(org.drools.core.reteoo.JoinNode) ObjectTypeNode(org.drools.core.reteoo.ObjectTypeNode) ArrayList(java.util.ArrayList) BetaMemory(org.drools.core.reteoo.BetaMemory) LiaNodeMemory(org.drools.core.reteoo.LeftInputAdapterNode.LiaNodeMemory) InternalWorkingMemory(org.drools.core.common.InternalWorkingMemory) KnowledgeBuilder(org.kie.internal.builder.KnowledgeBuilder) ArrayList(java.util.ArrayList) List(java.util.List) InternalKnowledgeBase(org.drools.core.impl.InternalKnowledgeBase) LeftInputAdapterNode(org.drools.core.reteoo.LeftInputAdapterNode) Test(org.junit.Test)

Example 39 with LeftInputAdapterNode

use of org.drools.core.reteoo.LeftInputAdapterNode in project drools by kiegroup.

the class LinkingTest method testSubNetworkSharingMemories.

@Test
public void testSubNetworkSharingMemories() throws Exception {
    // checks the memory sharing works, and linking, uses the already checked network from testSubNetworkSharing
    String str = "";
    str += "package org.kie \n";
    str += "import " + A.class.getCanonicalName() + "\n";
    str += "import " + B.class.getCanonicalName() + "\n";
    str += "import " + C.class.getCanonicalName() + "\n";
    str += "import " + D.class.getCanonicalName() + "\n";
    str += "import " + E.class.getCanonicalName() + "\n";
    str += "global java.util.List list \n";
    str += "rule rule1 when \n";
    str += "   A() \n";
    str += "   B() \n";
    str += "   C() \n";
    str += "   D() \n";
    str += "then \n";
    str += "end \n";
    str += "rule rule2 when \n";
    str += "   A() \n";
    str += "   exists( B() and C() ) \n";
    str += "   D() \n";
    str += "then \n";
    str += "end \n";
    str += "rule rule3 when \n";
    str += "   A() \n";
    str += "   exists( B() and C() and D() ) \n";
    str += "   E() \n";
    str += "then \n";
    str += "end \n";
    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newByteArrayResource(str.getBytes()), ResourceType.DRL);
    assertFalse(kbuilder.getErrors().toString(), kbuilder.hasErrors());
    InternalKnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
    kbase.addPackages(kbuilder.getKnowledgePackages());
    ObjectTypeNode node = getObjectTypeNode(kbase, A.class);
    InternalWorkingMemory wm = ((StatefulKnowledgeSessionImpl) kbase.newKieSession());
    LeftInputAdapterNode liaNodeA = (LeftInputAdapterNode) node.getObjectSinkPropagator().getSinks()[0];
    ExistsNode existsNode2 = (ExistsNode) liaNodeA.getSinkPropagator().getSinks()[1];
    ExistsNode existsNode3 = (ExistsNode) liaNodeA.getSinkPropagator().getSinks()[2];
    JoinNode joinNodeB = (JoinNode) liaNodeA.getSinkPropagator().getSinks()[0];
    JoinNode joinNodeC = (JoinNode) joinNodeB.getSinkPropagator().getSinks()[0];
    JoinNode joinNodeD1 = (JoinNode) joinNodeC.getSinkPropagator().getSinks()[0];
    JoinNode joinNodeD2 = (JoinNode) existsNode2.getSinkPropagator().getSinks()[0];
    JoinNode joinNodeE = (JoinNode) existsNode3.getSinkPropagator().getSinks()[0];
    RuleTerminalNode rtn1 = (RuleTerminalNode) joinNodeD1.getSinkPropagator().getSinks()[0];
    RuleTerminalNode rtn2 = (RuleTerminalNode) joinNodeD2.getSinkPropagator().getSinks()[0];
    RuleTerminalNode rtn3 = (RuleTerminalNode) joinNodeE.getSinkPropagator().getSinks()[0];
    FactHandle fha = wm.insert(new A());
    wm.insert(new B());
    wm.insert(new C());
    wm.insert(new D());
    wm.flushPropagations();
    BetaMemory bm = null;
    LiaNodeMemory liam = (LiaNodeMemory) wm.getNodeMemory(liaNodeA);
    BetaMemory bm1 = (BetaMemory) wm.getNodeMemory(joinNodeB);
    BetaMemory bm2 = (BetaMemory) wm.getNodeMemory(joinNodeC);
    BetaMemory bm3 = (BetaMemory) wm.getNodeMemory(joinNodeD1);
    assertEquals(1, liam.getNodePosMaskBit());
    assertEquals(1, bm1.getNodePosMaskBit());
    assertEquals(2, bm2.getNodePosMaskBit());
    assertEquals(1, bm3.getNodePosMaskBit());
    assertNotSame(liam.getSegmentMemory(), bm1.getSegmentMemory());
    assertSame(bm1.getSegmentMemory(), bm2.getSegmentMemory());
    assertNotSame(bm2.getSegmentMemory(), bm3.getSegmentMemory());
    BetaMemory bm4 = (BetaMemory) wm.getNodeMemory(existsNode2);
    BetaMemory bm5 = (BetaMemory) wm.getNodeMemory(joinNodeD2);
    assertEquals(1, bm4.getNodePosMaskBit());
    assertEquals(2, bm5.getNodePosMaskBit());
    assertSame(bm4.getSegmentMemory(), bm5.getSegmentMemory());
    PathMemory rs1 = (PathMemory) wm.getNodeMemory(rtn1);
    PathMemory rs2 = (PathMemory) wm.getNodeMemory(rtn2);
    PathMemory rs3 = (PathMemory) wm.getNodeMemory(rtn3);
    assertTrue(rs1.isRuleLinked());
    assertTrue(rs2.isRuleLinked());
    // no E yet
    assertFalse(rs3.isRuleLinked());
    wm.insert(new E());
    wm.flushPropagations();
    BetaMemory bm6 = (BetaMemory) wm.getNodeMemory(existsNode3);
    BetaMemory bm7 = (BetaMemory) wm.getNodeMemory(joinNodeE);
    assertEquals(1, bm6.getNodePosMaskBit());
    assertEquals(2, bm7.getNodePosMaskBit());
    assertSame(bm6.getSegmentMemory(), bm7.getSegmentMemory());
    assertTrue(rs1.isRuleLinked());
    assertTrue(rs2.isRuleLinked());
    assertTrue(rs3.isRuleLinked());
    wm.retract(fha);
    // need to have rules evalulated, for unlinking to happen
    wm.fireAllRules();
    assertFalse(rs1.isRuleLinked());
    assertFalse(rs2.isRuleLinked());
    assertFalse(rs3.isRuleLinked());
}
Also used : FactHandle(org.kie.api.runtime.rule.FactHandle) JoinNode(org.drools.core.reteoo.JoinNode) ObjectTypeNode(org.drools.core.reteoo.ObjectTypeNode) BetaMemory(org.drools.core.reteoo.BetaMemory) ExistsNode(org.drools.core.reteoo.ExistsNode) LiaNodeMemory(org.drools.core.reteoo.LeftInputAdapterNode.LiaNodeMemory) InternalWorkingMemory(org.drools.core.common.InternalWorkingMemory) KnowledgeBuilder(org.kie.internal.builder.KnowledgeBuilder) InternalKnowledgeBase(org.drools.core.impl.InternalKnowledgeBase) LeftInputAdapterNode(org.drools.core.reteoo.LeftInputAdapterNode) RuleTerminalNode(org.drools.core.reteoo.RuleTerminalNode) PathMemory(org.drools.core.reteoo.PathMemory) Test(org.junit.Test)

Example 40 with LeftInputAdapterNode

use of org.drools.core.reteoo.LeftInputAdapterNode in project drools by kiegroup.

the class LinkingTest method testNestedSubNetwork.

@Test
public void testNestedSubNetwork() throws Exception {
    String str = "";
    str += "package org.kie \n";
    str += "import " + A.class.getCanonicalName() + "\n";
    str += "import " + B.class.getCanonicalName() + "\n";
    str += "import " + C.class.getCanonicalName() + "\n";
    str += "import " + D.class.getCanonicalName() + "\n";
    str += "import " + E.class.getCanonicalName() + "\n";
    str += "import " + F.class.getCanonicalName() + "\n";
    str += "import " + G.class.getCanonicalName() + "\n";
    str += "global java.util.List list \n";
    str += "rule rule1 when \n";
    str += "   A() \n";
    str += "   B() \n";
    str += "   exists( C() and D() and exists( E() and F() ) ) \n";
    str += "   G() \n";
    str += "then \n";
    str += "end \n";
    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newByteArrayResource(str.getBytes()), ResourceType.DRL);
    assertFalse(kbuilder.getErrors().toString(), kbuilder.hasErrors());
    InternalKnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
    kbase.addPackages(kbuilder.getKnowledgePackages());
    ObjectTypeNode node = getObjectTypeNode(kbase, A.class);
    InternalWorkingMemory wm = ((StatefulKnowledgeSessionImpl) kbase.newKieSession());
    LeftInputAdapterNode liaNode = (LeftInputAdapterNode) node.getObjectSinkPropagator().getSinks()[0];
    assertEquals(1, liaNode.getSinkPropagator().size());
    JoinNode bNode = (JoinNode) liaNode.getSinkPropagator().getSinks()[0];
    assertEquals(2, bNode.getSinkPropagator().size());
    ExistsNode exists1n = (ExistsNode) bNode.getSinkPropagator().getSinks()[1];
    JoinNode cNode = (JoinNode) bNode.getSinkPropagator().getSinks()[0];
    JoinNode dNode = (JoinNode) cNode.getSinkPropagator().getSinks()[0];
    assertEquals(2, dNode.getSinkPropagator().size());
    ExistsNode exists2n = (ExistsNode) dNode.getSinkPropagator().getSinks()[1];
    JoinNode eNode = (JoinNode) dNode.getSinkPropagator().getSinks()[0];
    JoinNode fNode = (JoinNode) eNode.getSinkPropagator().getSinks()[0];
    RightInputAdapterNode riaNode2 = (RightInputAdapterNode) fNode.getSinkPropagator().getSinks()[0];
    assertEquals(exists2n, riaNode2.getObjectSinkPropagator().getSinks()[0]);
    RightInputAdapterNode riaNode1 = (RightInputAdapterNode) exists2n.getSinkPropagator().getSinks()[0];
    assertEquals(exists1n, riaNode1.getObjectSinkPropagator().getSinks()[0]);
    JoinNode gNode = (JoinNode) exists1n.getSinkPropagator().getSinks()[0];
    RuleTerminalNode rtn = (RuleTerminalNode) gNode.getSinkPropagator().getSinks()[0];
    wm.insert(new A());
    wm.insert(new B());
    wm.insert(new C());
    wm.insert(new D());
    wm.insert(new F());
    wm.insert(new G());
    PathMemory rs = (PathMemory) wm.getNodeMemory(rtn);
    assertFalse(rs.isRuleLinked());
    FactHandle fhE1 = wm.insert(new E());
    FactHandle fhE2 = wm.insert(new E());
    wm.flushPropagations();
    assertTrue(rs.isRuleLinked());
    wm.retract(fhE1);
    wm.flushPropagations();
    assertTrue(rs.isRuleLinked());
    wm.retract(fhE2);
    wm.flushPropagations();
    assertFalse(rs.isRuleLinked());
}
Also used : FactHandle(org.kie.api.runtime.rule.FactHandle) JoinNode(org.drools.core.reteoo.JoinNode) ObjectTypeNode(org.drools.core.reteoo.ObjectTypeNode) ExistsNode(org.drools.core.reteoo.ExistsNode) InternalWorkingMemory(org.drools.core.common.InternalWorkingMemory) KnowledgeBuilder(org.kie.internal.builder.KnowledgeBuilder) InternalKnowledgeBase(org.drools.core.impl.InternalKnowledgeBase) RightInputAdapterNode(org.drools.core.reteoo.RightInputAdapterNode) LeftInputAdapterNode(org.drools.core.reteoo.LeftInputAdapterNode) RuleTerminalNode(org.drools.core.reteoo.RuleTerminalNode) PathMemory(org.drools.core.reteoo.PathMemory) Test(org.junit.Test)

Aggregations

LeftInputAdapterNode (org.drools.core.reteoo.LeftInputAdapterNode)72 ObjectTypeNode (org.drools.core.reteoo.ObjectTypeNode)60 Test (org.junit.Test)56 InternalWorkingMemory (org.drools.core.common.InternalWorkingMemory)48 KieBase (org.kie.api.KieBase)35 JoinNode (org.drools.core.reteoo.JoinNode)28 RuleTerminalNode (org.drools.core.reteoo.RuleTerminalNode)28 SegmentMemory (org.drools.core.reteoo.SegmentMemory)28 LiaNodeMemory (org.drools.core.reteoo.LeftInputAdapterNode.LiaNodeMemory)27 InternalKnowledgeBase (org.drools.core.impl.InternalKnowledgeBase)25 BetaMemory (org.drools.core.reteoo.BetaMemory)25 ArrayList (java.util.ArrayList)17 PathMemory (org.drools.core.reteoo.PathMemory)15 List (java.util.List)12 FactHandle (org.kie.api.runtime.rule.FactHandle)12 KnowledgeBuilder (org.kie.internal.builder.KnowledgeBuilder)12 ClassObjectType (org.drools.core.base.ClassObjectType)11 AlphaNode (org.drools.core.reteoo.AlphaNode)11 NotNode (org.drools.core.reteoo.NotNode)11 ExistsNode (org.drools.core.reteoo.ExistsNode)10