@Test public void testRtnNoConstraintsNoWatches() { String rule1 = "A()"; KieBase kbase = getKnowledgeBase(rule1); InternalWorkingMemory wm = ((InternalWorkingMemory)kbase.newKieSession()); ObjectTypeNode otn = getObjectTypeNode(kbase, "A" ); assertNotNull( otn ); LeftInputAdapterNode liaNode = ( LeftInputAdapterNode ) otn.getObjectSinkPropagator().getSinks()[0]; RuleTerminalNode rtNode = ( RuleTerminalNode ) liaNode.getSinkPropagator().getSinks()[0]; assertEquals( EmptyBitMask.get(), rtNode.getDeclaredMask() ); assertEquals( EmptyBitMask.get(), rtNode.getInferredMask() ); }
@Test public void testRTNodeEmptyLHS() { String rule = "package org.drools.compiler.integrationtests\n" + "rule r1\n" + "when\n" + "then\n" + "end\n"; KieBase kbase = loadKnowledgeBaseFromString( rule ); InternalWorkingMemory wm = ((InternalWorkingMemory)kbase.newKieSession()); ObjectTypeNode otn = getObjectTypeNode(kbase, "InitialFactImpl" ); assertNotNull( otn ); LeftInputAdapterNode liaNode = ( LeftInputAdapterNode ) otn.getObjectSinkPropagator().getSinks()[0]; RuleTerminalNode rtNode = ( RuleTerminalNode ) liaNode.getSinkPropagator().getSinks()[0]; assertEquals( AllSetBitMask.get(), rtNode.getDeclaredMask() ); assertEquals( AllSetBitMask.get(), rtNode.getInferredMask() ); }
@Test public void testRTNodeNoConstraintsNoPropertySpecific() { String rule = "package org.drools.compiler.integrationtests\n" + "import " + Person.class.getCanonicalName() + "\n" + "rule r1\n" + "when\n" + " Person()\n" + "then\n" + "end\n"; KieBase kbase = new KieHelper(PropertySpecificOption.ALLOWED).addContent(rule, ResourceType.DRL).build(); ObjectTypeNode otn = getObjectTypeNode(kbase, "Person" ); assertNotNull( otn ); LeftInputAdapterNode liaNode = ( LeftInputAdapterNode ) otn.getObjectSinkPropagator().getSinks()[0]; RuleTerminalNode rtNode = ( RuleTerminalNode ) liaNode.getSinkPropagator().getSinks()[0]; assertEquals( AllSetBitMask.get(), rtNode.getDeclaredMask() ); assertEquals( AllSetBitMask.get(), rtNode.getInferredMask() ); }
@Test public void testInitialFactBetaNodeWithRightInputAdapter() { String rule = "package org.drools.compiler.integrationtests\n" + "import " + Person.class.getCanonicalName() + "\n" + "import " + Cheese.class.getCanonicalName() + "\n" + "rule r1\n" + "when\n" + " exists(eval(1==1))\n" + "then\n" + "end\n"; KieBase kbase = loadKnowledgeBaseFromString( rule ); InternalWorkingMemory wm = ((InternalWorkingMemory)kbase.newKieSession()); ObjectTypeNode otn = getObjectTypeNode(kbase, "InitialFactImpl" ); assertNotNull( otn ); LeftInputAdapterNode liaNode = ( LeftInputAdapterNode ) otn.getObjectSinkPropagator().getSinks()[0]; BetaNode betaNode = ( BetaNode ) liaNode.getSinkPropagator().getSinks()[1]; assertEquals( AllSetBitMask.get(), betaNode.getLeftDeclaredMask() ); assertEquals( AllSetBitMask.get(), betaNode.getLeftInferredMask() ); assertEquals( AllSetBitMask.get(), betaNode.getRightDeclaredMask() ); assertEquals( AllSetBitMask.get(), betaNode.getRightInferredMask() ); }
@Test public void testSingleSharedEmptyLhs() throws Exception { KieBase kbase = buildKnowledgeBase( " ", " "); InternalWorkingMemory wm = ((InternalWorkingMemory)kbase.newKieSession()); ObjectTypeNode aotn = getObjectTypeNode(kbase, InitialFactImpl.class ); LeftInputAdapterNode liaNode = (LeftInputAdapterNode) aotn.getObjectSinkPropagator().getSinks()[0]; RuleTerminalNode rtn1 = ( RuleTerminalNode) liaNode.getSinkPropagator().getSinks()[0]; RuleTerminalNode rtn2 = ( RuleTerminalNode) liaNode.getSinkPropagator().getSinks()[1]; wm.insert( new LinkingTest.A() ); wm.flushPropagations(); // LiaNode is in it's own segment LiaNodeMemory liaMem = ( LiaNodeMemory ) wm.getNodeMemory( liaNode ); SegmentMemory smem = liaMem.getSegmentMemory(); assertEquals( liaNode, smem.getRootNode() ); assertEquals( liaNode, smem.getTipNode() ); // each RTN is in it's own segment SegmentMemory rtnSmem1 = smem.getFirst(); assertEquals( rtn1, rtnSmem1.getRootNode() ); assertEquals( rtn1, rtnSmem1.getTipNode() ); SegmentMemory rtnSmem2 = rtnSmem1.getNext(); assertEquals( rtn2, rtnSmem2.getRootNode() ); assertEquals( rtn2, rtnSmem2.getTipNode() ); }
@Test public void testSingleSharedPattern() throws Exception { KieBase kbase = buildKnowledgeBase( " A() \n", " A() \n"); InternalWorkingMemory wm = ((InternalWorkingMemory)kbase.newKieSession()); ObjectTypeNode aotn = getObjectTypeNode(kbase, LinkingTest.A.class ); LeftInputAdapterNode liaNode = (LeftInputAdapterNode) aotn.getObjectSinkPropagator().getSinks()[0]; RuleTerminalNode rtn1 = ( RuleTerminalNode) liaNode.getSinkPropagator().getSinks()[0]; RuleTerminalNode rtn2 = ( RuleTerminalNode) liaNode.getSinkPropagator().getSinks()[1]; wm.insert(new LinkingTest.A()); wm.flushPropagations(); // LiaNode is in it's own segment LiaNodeMemory liaMem = ( LiaNodeMemory ) wm.getNodeMemory( liaNode ); SegmentMemory smem = liaMem.getSegmentMemory(); assertEquals( liaNode, smem.getRootNode() ); assertEquals( liaNode, smem.getTipNode() ); // each RTN is in it's own segment SegmentMemory rtnSmem1 = smem.getFirst(); assertEquals( rtn1, rtnSmem1.getRootNode() ); assertEquals( rtn1, rtnSmem1.getTipNode() ); SegmentMemory rtnSmem2 = rtnSmem1.getNext(); assertEquals( rtn2, rtnSmem2.getRootNode() ); assertEquals( rtn2, rtnSmem2.getTipNode() ); }
@Test public void testPersonFactBetaNodeWithRightInputAdapter() { String rule = "package org.drools.compiler.integrationtests\n" + "import " + Person.class.getCanonicalName() + "\n" + "import " + Cheese.class.getCanonicalName() + "\n" + "rule r1\n" + "when\n" + " Person()\n" + " exists(eval(1==1))\n" + "then\n" + "end\n"; // assumption is this test was intended to be for the case // property reactivity is NOT enabled by default. KieBase kbase = new KieHelper(PropertySpecificOption.ALLOWED).addContent(rule, ResourceType.DRL).build(); ObjectTypeNode otn = getObjectTypeNode(kbase, "Person" ); assertNotNull( otn ); LeftInputAdapterNode liaNode = ( LeftInputAdapterNode ) otn.getObjectSinkPropagator().getSinks()[0]; BetaNode betaNode = ( BetaNode ) liaNode.getSinkPropagator().getSinks()[1]; assertEquals( AllSetBitMask.get(), betaNode.getLeftDeclaredMask() ); assertEquals( AllSetBitMask.get(), betaNode.getLeftInferredMask() ); assertEquals( AllSetBitMask.get(), betaNode.getRightDeclaredMask() ); assertEquals( AllSetBitMask.get(), betaNode.getRightInferredMask() ); }
@Test public void testRTNodeWithConstraintsNoPropertySpecific() { String rule = "package org.drools.compiler.integrationtests\n" + "import " + Person.class.getCanonicalName() + "\n" + "rule r1\n" + "when\n" + " Person( name == 'bobba')\n" + "then\n" + "end\n"; KieBase kbase = new KieHelper(PropertySpecificOption.ALLOWED).addContent(rule, ResourceType.DRL).build(); ObjectTypeNode otn = getObjectTypeNode(kbase, "Person" ); assertNotNull( otn ); AlphaNode alphaNode = ( AlphaNode ) otn.getObjectSinkPropagator().getSinks()[0]; assertEquals( AllSetBitMask.get(), alphaNode.getDeclaredMask() ); assertEquals( AllSetBitMask.get(), alphaNode.getInferredMask() ); LeftInputAdapterNode liaNode = ( LeftInputAdapterNode ) alphaNode.getObjectSinkPropagator().getSinks()[0]; RuleTerminalNode rtNode = ( RuleTerminalNode ) liaNode.getSinkPropagator().getSinks()[0]; assertEquals( AllSetBitMask.get(), rtNode.getDeclaredMask() ); assertEquals( AllSetBitMask.get(), rtNode.getInferredMask() ); }
@Test public void testRtnNoConstraintsWithWatches() { String rule1 = "A() @watch(a)"; KieBase kbase = getKnowledgeBase(rule1); InternalWorkingMemory wm = ((InternalWorkingMemory)kbase.newKieSession()); ObjectTypeNode otn = getObjectTypeNode(kbase, "A" ); assertNotNull( otn ); Class classType = ((ClassObjectType) otn.getObjectType()).getClassType(); LeftInputAdapterNode liaNode = ( LeftInputAdapterNode ) otn.getObjectSinkPropagator().getSinks()[0]; List<String> sp = getSettableProperties(wm, otn); RuleTerminalNode rtNode = ( RuleTerminalNode ) liaNode.getSinkPropagator().getSinks()[0]; assertEquals( calculatePositiveMask(classType, list("a"), sp), rtNode.getDeclaredMask() ); assertEquals( calculatePositiveMask(classType, list("a"), sp), rtNode.getInferredMask() ); }
@Test public void testSingleEmptyLhs() throws Exception { KieBase kbase = buildKnowledgeBase(" "); InternalWorkingMemory wm = ((InternalWorkingMemory)kbase.newKieSession()); ObjectTypeNode aotn = getObjectTypeNode(kbase, InitialFactImpl.class ); LeftInputAdapterNode liaNode = (LeftInputAdapterNode) aotn.getObjectSinkPropagator().getSinks()[0]; RuleTerminalNode rtn = ( RuleTerminalNode) liaNode.getSinkPropagator().getSinks()[0]; wm.insert( new LinkingTest.A() ); wm.flushPropagations(); // LiaNode and Rule are in same segment LiaNodeMemory liaMem = ( LiaNodeMemory ) wm.getNodeMemory( liaNode ); SegmentMemory smem = liaMem.getSegmentMemory(); assertEquals( liaNode, smem.getRootNode() ); assertEquals( rtn, smem.getTipNode() ); assertNull( smem.getNext() ); assertNull( smem.getFirst() ); }
@Test public void testSinglePattern() throws Exception { KieBase kbase = buildKnowledgeBase(" A() \n"); InternalWorkingMemory wm = ((InternalWorkingMemory)kbase.newKieSession()); ObjectTypeNode aotn = getObjectTypeNode(kbase, LinkingTest.A.class ); LeftInputAdapterNode liaNode = (LeftInputAdapterNode) aotn.getObjectSinkPropagator().getSinks()[0]; RuleTerminalNode rtn = ( RuleTerminalNode) liaNode.getSinkPropagator().getSinks()[0]; wm.insert(new LinkingTest.A()); wm.flushPropagations(); // LiaNode and Rule are in same segment LiaNodeMemory liaMem = ( LiaNodeMemory ) wm.getNodeMemory( liaNode ); SegmentMemory smem = liaMem.getSegmentMemory(); assertEquals( liaNode, smem.getRootNode() ); assertEquals( rtn, smem.getTipNode() ); assertNull( smem.getNext() ); assertNull( smem.getFirst() ); }
@Test public void testNonReactiveSubNetworkInShareMasks() throws Exception { String str = ""; InternalWorkingMemory wm = ((StatefulKnowledgeSessionImpl)kbase.newKieSession()); LeftInputAdapterNode liaNode = (LeftInputAdapterNode) node.getObjectSinkPropagator().getSinks()[0]; assertEquals( 2, liaNode.getSinkPropagator().size() ); JoinNode bNode = ( JoinNode) liaNode.getSinkPropagator().getSinks()[0]; JoinNode cNode = ( JoinNode) bNode.getSinkPropagator().getSinks()[0]; ExistsNode exists1n = ( ExistsNode) liaNode.getSinkPropagator().getSinks()[1]; EvalConditionNode evalNode = ( EvalConditionNode) exists1n.getSinkPropagator().getSinks()[0]; ExistsNode exists2n = ( ExistsNode) exists1n.getSinkPropagator().getSinks()[1]; assertEquals( 3, pmem.getSegmentMemories().length ); assertEquals( 7, pmem.getAllLinkedMaskTest() ); // D is in the exists segment
@Test public void tesSubnetworkAfterShare() throws Exception { KieBase kbase = buildKnowledgeBase( " A() \n", LeftInputAdapterNode liaNode = (LeftInputAdapterNode) aotn.getObjectSinkPropagator().getSinks()[0]; RuleTerminalNode rtn1 = ( RuleTerminalNode) liaNode.getSinkPropagator().getSinks()[0]; JoinNode bNode = ( JoinNode ) liaNode.getSinkPropagator().getSinks()[1]; JoinNode cNode = ( JoinNode ) bNode.getSinkPropagator().getSinks()[0]; RightInputAdapterNode riaNode = ( RightInputAdapterNode ) cNode.getSinkPropagator().getSinks()[0]; NotNode notNode = ( NotNode ) liaNode.getSinkPropagator().getSinks()[2]; RuleTerminalNode rtn2 = ( RuleTerminalNode) notNode.getSinkPropagator().getSinks()[0]; assertEquals( liaNode, smem.getRootNode() ); assertEquals( liaNode, smem.getTipNode() ); assertEquals( rtn1, rtnSmem1.getRootNode() ); assertEquals( rtn1, rtnSmem1.getTipNode() );
@Test public void testRtnWithConstraintsNoWatches() { String rule1 = "A( a == 10 )"; KieBase kbase = getKnowledgeBase(rule1); InternalWorkingMemory wm = ((InternalWorkingMemory)kbase.newKieSession()); ObjectTypeNode otn = getObjectTypeNode(kbase, "A" ); assertNotNull( otn ); Class classType = ((ClassObjectType) otn.getObjectType()).getClassType(); List<String> sp = getSettableProperties(wm, otn); AlphaNode alphaNode = ( AlphaNode ) otn.getObjectSinkPropagator().getSinks()[0]; assertEquals( calculatePositiveMask(classType, list("a"), sp), alphaNode.getDeclaredMask( ) ); assertEquals( calculatePositiveMask(classType, list("a"), sp), alphaNode.getInferredMask()); LeftInputAdapterNode liaNode = ( LeftInputAdapterNode ) alphaNode.getObjectSinkPropagator().getSinks()[0]; RuleTerminalNode rtNode = ( RuleTerminalNode ) liaNode.getSinkPropagator().getSinks()[0]; assertEquals( EmptyBitMask.get(), rtNode.getDeclaredMask() ); // rtn declares nothing assertEquals( calculatePositiveMask(classType, list("a"), sp), rtNode.getInferredMask() ); // rtn infers from alpha }
@Test public void testRtnWithConstraintsWithWatches() { String rule1 = "A( a == 10 ) @watch(b)"; KieBase kbase = getKnowledgeBase(rule1); InternalWorkingMemory wm = ((InternalWorkingMemory)kbase.newKieSession()); ObjectTypeNode otn = getObjectTypeNode(kbase, "A" ); assertNotNull( otn ); Class classType = ((ClassObjectType) otn.getObjectType()).getClassType(); List<String> sp = getSettableProperties(wm, otn); AlphaNode alphaNode = ( AlphaNode ) otn.getObjectSinkPropagator().getSinks()[0]; assertEquals( calculatePositiveMask(classType, list("a"), sp), alphaNode.getDeclaredMask( ) ); assertEquals( calculatePositiveMask(classType, list("a", "b"), sp), alphaNode.getInferredMask() ); LeftInputAdapterNode liaNode = ( LeftInputAdapterNode ) alphaNode.getObjectSinkPropagator().getSinks()[0]; RuleTerminalNode rtNode = ( RuleTerminalNode ) liaNode.getSinkPropagator().getSinks()[0]; assertEquals( calculatePositiveMask(classType, list("b"), sp), rtNode.getDeclaredMask() ); assertEquals( calculatePositiveMask(classType, list("a", "b"), sp), rtNode.getInferredMask() ); }
@Test public void testSubnetworkNoSharing() throws Exception { KieBase kbase = buildKnowledgeBase( " A() not ( B() and C() ) \n" ); LeftInputAdapterNode liaNode = (LeftInputAdapterNode) aotn.getObjectSinkPropagator().getSinks()[0]; JoinNode bNode = ( JoinNode ) liaNode.getSinkPropagator().getSinks()[0]; JoinNode cNode = ( JoinNode ) bNode.getSinkPropagator().getSinks()[0]; RightInputAdapterNode riaNode = ( RightInputAdapterNode ) cNode.getSinkPropagator().getSinks()[0]; NotNode notNode = ( NotNode ) liaNode.getSinkPropagator().getSinks()[1]; RuleTerminalNode rtn1 = ( RuleTerminalNode) notNode.getSinkPropagator().getSinks()[0]; assertEquals( liaNode, smem.getRootNode() ); assertEquals( liaNode, smem.getTipNode() ); assertNull( smem.getNext() ); smem = smem.getFirst(); assertEquals( smem, bSmem ); assertEquals( bNode, bSmem.getRootNode() ); assertEquals( riaNode, bSmem.getTipNode() );
@Test public void testNonReactiveSubNetworkOwnSegmentMasks() throws Exception { String str = ""; InternalWorkingMemory wm = ((StatefulKnowledgeSessionImpl)kbase.newKieSession()); LeftInputAdapterNode liaNode = (LeftInputAdapterNode) node.getObjectSinkPropagator().getSinks()[0]; assertEquals( 2, liaNode.getSinkPropagator().size() ); JoinNode bNode = ( JoinNode) liaNode.getSinkPropagator().getSinks()[0]; JoinNode cNode = ( JoinNode) bNode.getSinkPropagator().getSinks()[0]; ExistsNode exists1n = ( ExistsNode) liaNode.getSinkPropagator().getSinks()[1]; EvalConditionNode evalNode = ( EvalConditionNode) exists1n.getSinkPropagator().getSinks()[0]; ExistsNode exists2n = ( ExistsNode) exists1n.getSinkPropagator().getSinks()[1]; assertEquals( 4, pmem.getSegmentMemories().length ); assertEquals( 11, pmem.getAllLinkedMaskTest() ); // the exists eval segment does not need to be linked in
@Test public void tesShareInSubnetwork() throws Exception { KieBase kbase = buildKnowledgeBase( " A() \n", LeftInputAdapterNode liaNode = (LeftInputAdapterNode) aotn.getObjectSinkPropagator().getSinks()[0]; RuleTerminalNode rtn1 = ( RuleTerminalNode) liaNode.getSinkPropagator().getSinks()[0]; JoinNode bNode = ( JoinNode ) liaNode.getSinkPropagator().getSinks()[1]; JoinNode cNode = ( JoinNode ) bNode.getSinkPropagator().getSinks()[0]; RuleTerminalNode rtn2 = ( RuleTerminalNode ) cNode.getSinkPropagator().getSinks()[0]; RightInputAdapterNode riaNode = ( RightInputAdapterNode ) cNode.getSinkPropagator().getSinks()[1]; NotNode notNode = ( NotNode ) liaNode.getSinkPropagator().getSinks()[2]; RuleTerminalNode rtn3 = ( RuleTerminalNode) notNode.getSinkPropagator().getSinks()[0]; assertEquals( liaNode, smem.getRootNode() ); assertEquals( liaNode, smem.getTipNode() ); assertEquals( rtn1, rtnSmem1.getRootNode() ); assertEquals( rtn1, rtnSmem1.getTipNode() );
@Test public void testSubNetworkSharing() throws Exception { InternalWorkingMemory wm = ((StatefulKnowledgeSessionImpl)kbase.newKieSession()); LeftInputAdapterNode liaNode = (LeftInputAdapterNode) node.getObjectSinkPropagator().getSinks()[0]; assertEquals( 3, liaNode.getSinkPropagator().size() ); ExistsNode existsNode2 = ( ExistsNode) liaNode.getSinkPropagator().getSinks()[1]; ExistsNode existsNode3 = ( ExistsNode) liaNode.getSinkPropagator().getSinks()[2]; JoinNode joinNodeB = ( JoinNode) liaNode.getSinkPropagator().getSinks()[0]; assertSame( joinNodeB.getRightInput(), getObjectTypeNode(kbase, B.class ) ); JoinNode joinNodeC = ( JoinNode) joinNodeB.getSinkPropagator().getSinks()[0]; assertSame( joinNodeC.getRightInput(), getObjectTypeNode(kbase, C.class ) ); assertEquals( 2, joinNodeC.getSinkPropagator().size() ); JoinNode joinNodeD = ( JoinNode) joinNodeC.getSinkPropagator().getSinks()[0]; assertSame( joinNodeD.getRightInput(), getObjectTypeNode(kbase, D.class ) ); assertEquals( 2, joinNodeD.getSinkPropagator().size() ); assertSame( existsNode2, (( RightInputAdapterNode) joinNodeC.getSinkPropagator().getSinks()[1]).getObjectSinkPropagator().getSinks()[0] ); assertSame( existsNode3, (( RightInputAdapterNode) joinNodeD.getSinkPropagator().getSinks()[1]).getObjectSinkPropagator().getSinks()[0] );
@Test public void testNotNodeMasksWithoutConstraints() throws Exception { String str = ""; InternalWorkingMemory wm = ((StatefulKnowledgeSessionImpl)kbase.newKieSession()); LeftInputAdapterNode liaNode = (LeftInputAdapterNode) node.getObjectSinkPropagator().getSinks()[0]; assertEquals( 1, liaNode.getSinkPropagator().size() ); NotNode notNode = ( NotNode) liaNode.getSinkPropagator().getSinks()[0]; JoinNode cNode = ( JoinNode) notNode.getSinkPropagator().getSinks()[0]; RuleTerminalNode rtn = ( RuleTerminalNode ) cNode.getSinkPropagator().getSinks()[0]; assertEquals( 1, pmem.getSegmentMemories().length ); assertEquals( 1, pmem.getAllLinkedMaskTest() );