@Test public void testPopulatedSingleRuleNoSharing() throws Exception { KieBaseConfiguration kconf = (KieBaseConfiguration) KnowledgeBaseFactory.newKnowledgeBaseConfiguration(); kconf.setOption(RuleEngineOption.PHREAK); KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kconf); InternalWorkingMemory wm = ((InternalWorkingMemory) kbase.newStatefulKnowledgeSession()); wm.insert(new A(1)); wm.insert(new B(1)); wm.insert(new C(1)); wm.insert(new C(2)); wm.insert(new D(1)); wm.insert(new E(1)); wm.fireAllRules(); kbase.addKnowledgePackages(buildKnowledgePackage("r1", " A() B() C(object == 2) D() E()\n")); List list = new ArrayList(); wm.setGlobal("list", list); ObjectTypeNode aotn = getObjectTypeNode(kbase, A.class); LeftInputAdapterNode liaNode = (LeftInputAdapterNode) aotn.getSinkPropagator().getSinks()[0]; LiaNodeMemory lm = (LiaNodeMemory) wm.getNodeMemory(liaNode); SegmentMemory sm = lm.getSegmentMemory(); assertNotNull(sm.getStagedLeftTuples().getInsertFirst()); wm.fireAllRules(); assertNull(sm.getStagedLeftTuples().getInsertFirst()); assertEquals(1, list.size()); assertEquals("r1", ((Match) list.get(0)).getRule().getName()); }
@Test public void testNewConstructor() { String str = "" + "package org.drools.compiler.test \n" + "import " + Person.class.getCanonicalName() + "\n" + "import " + Address.class.getCanonicalName() + "\n" + "global java.util.List list \n" + "rule \"show\" \n" + "when \n" + " $m : Person( address == new Address('s1')) \n" + "then \n" + " list.add('r1'); \n" + "end \n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(ResourceFactory.newByteArrayResource(str.getBytes()), ResourceType.DRL); if (kbuilder.hasErrors()) { fail(kbuilder.getErrors().toString()); } KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); StatefulKnowledgeSession ksession = createKnowledgeSession(kbase); List list = new ArrayList(); ksession.setGlobal("list", list); Person p = new Person("yoda"); p.setAddress(new Address("s1")); ksession.insert(p); ksession.fireAllRules(); assertEquals("r1", list.get(0)); // Check it was built with MVELReturnValueExpression constraint List<ObjectTypeNode> nodes = ((InternalKnowledgeBase) kbase).getRete().getObjectTypeNodes(); ObjectTypeNode node = null; for (ObjectTypeNode n : nodes) { if (((ClassObjectType) n.getObjectType()).getClassType() == Person.class) { node = n; break; } } AlphaNode alphanode = (AlphaNode) node.getSinkPropagator().getSinks()[0]; AlphaNodeFieldConstraint constraint = alphanode.getConstraint(); if (constraint instanceof MvelConstraint) { assertTrue(((MvelConstraint) constraint).getFieldExtractor() instanceof ClassFieldReader); FieldValue r = ((MvelConstraint) constraint).getField(); assertEquals(p.getAddress(), r.getValue()); } }
public ObjectTypeNode getObjectTypeNode(KnowledgeBase kbase, Class<?> nodeClass) { List<ObjectTypeNode> nodes = ((KnowledgeBaseImpl) kbase).getRete().getObjectTypeNodes(); for (ObjectTypeNode n : nodes) { if (((ClassObjectType) n.getObjectType()).getClassType() == nodeClass) { return n; } } return null; }
public ObjectTypeNode getObjectTypeNode(KnowledgeBase kbase, String nodeName) { List<ObjectTypeNode> nodes = ((InternalRuleBase) ((KnowledgeBaseImpl) kbase).ruleBase).getRete().getObjectTypeNodes(); for (ObjectTypeNode n : nodes) { if (((ClassObjectType) n.getObjectType()).getClassType().getSimpleName().equals(nodeName)) { return n; } } return null; }
@Test public void testPopulatedSharedLiaNode() throws Exception { KnowledgeBase kbase1 = buildKnowledgeBase("r1", " A() B(1;) C() D() E()\n"); InternalWorkingMemory wm = ((InternalWorkingMemory) kbase1.newStatefulKnowledgeSession()); List list = new ArrayList(); wm.setGlobal("list", list); wm.insert(new A(1)); wm.insert(new A(2)); wm.insert(new A(3)); wm.insert(new B(1)); wm.insert(new B(2)); wm.insert(new C(1)); wm.insert(new D(1)); wm.insert(new E(1)); wm.fireAllRules(); assertEquals(3, list.size()); kbase1.addKnowledgePackages(buildKnowledgePackage("r2", " a : A() B(2;) C() D() E()\n")); ObjectTypeNode aotn = getObjectTypeNode(kbase1, A.class); LeftInputAdapterNode liaNode = (LeftInputAdapterNode) aotn.getSinkPropagator().getSinks()[0]; JoinNode bNode1 = (JoinNode) liaNode.getSinkPropagator().getFirstLeftTupleSink(); JoinNode bNode2 = (JoinNode) liaNode.getSinkPropagator().getLastLeftTupleSink(); BetaMemory bm = (BetaMemory) wm.getNodeMemory(bNode2); SegmentMemory sm = bm.getSegmentMemory(); assertNotNull(sm.getStagedLeftTuples().getInsertFirst()); assertNotNull(sm.getStagedLeftTuples().getInsertFirst().getStagedNext()); assertNotNull(sm.getStagedLeftTuples().getInsertFirst().getStagedNext().getStagedNext()); assertNull( sm.getStagedLeftTuples().getInsertFirst().getStagedNext().getStagedNext().getStagedNext()); wm.fireAllRules(); assertNull(sm.getStagedLeftTuples().getInsertFirst()); assertEquals(6, list.size()); assertEquals("r1", ((Match) list.get(0)).getRule().getName()); assertEquals("r1", ((Match) list.get(1)).getRule().getName()); assertEquals("r1", ((Match) list.get(2)).getRule().getName()); assertEquals("r2", ((Match) list.get(3)).getRule().getName()); assertEquals("r2", ((Match) list.get(4)).getRule().getName()); assertEquals("r2", ((Match) list.get(5)).getRule().getName()); List results = new ArrayList(); results.add(((A) ((Match) list.get(3)).getDeclarationValue("a")).getObject()); results.add(((A) ((Match) list.get(4)).getDeclarationValue("a")).getObject()); results.add(((A) ((Match) list.get(5)).getDeclarationValue("a")).getObject()); assertTrue(results.containsAll(asList(1, 2, 3))); }
@Test public void testModifyWithLiaToFrom() { // technically you can't have a modify with InitialFactImpl // But added test for completeness String str = ""; str += "package org.simple \n"; str += "import " + Person.class.getCanonicalName() + "\n"; str += "import " + Cheese.class.getCanonicalName() + "\n"; str += "import " + Cat.class.getCanonicalName() + "\n"; str += "global java.util.List list \n"; str += "rule x1 \n"; str += "when \n"; str += " $pe : Person() from list\n"; str += "then \n"; str += "end \n"; str += "rule x2 \n"; str += "when \n"; str += " $ch : Cheese() from list\n"; str += "then \n"; str += "end \n"; str += "rule x3 \n"; str += "when \n"; str += " $ch : Cheese() from list\n"; str += "then \n"; str += "end \n"; str += "rule x4 \n"; str += "when \n"; str += " $ch : Cheese() from list\n"; str += " eval( $ch != null ) \n"; str += "then \n"; str += "end \n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(str); ReteooWorkingMemoryInterface wm = ((StatefulKnowledgeSessionImpl) kbase.newStatefulKnowledgeSession()).session; wm.fireAllRules(); ObjectTypeNode otnInit = getObjectTypeNode(kbase, "InitialFactImpl"); LeftInputAdapterNode liaNode = (LeftInputAdapterNode) otnInit.getSinkPropagator().getSinks()[0]; LeftTupleSink[] sinks = liaNode.getSinkPropagator().getSinks(); assertEquals(0, sinks[0].getLeftInputOtnId().getId()); assertEquals(1, sinks[1].getLeftInputOtnId().getId()); assertEquals(2, sinks[2].getLeftInputOtnId().getId()); assertEquals(3, sinks[3].getLeftInputOtnId().getId()); }
@Test public void testModifyWithLiaToEval() { String str = ""; str += "package org.simple \n"; str += "import " + Person.class.getCanonicalName() + "\n"; str += "import " + Cheese.class.getCanonicalName() + "\n"; str += "import " + Cat.class.getCanonicalName() + "\n"; str += "global java.util.List list \n"; str += "rule x1 \n"; str += "when \n"; str += " $pe : Person() \n"; str += " $ch : Cheese() \n"; str += " $ca : Cat() \n"; str += "then \n"; str += "end \n"; str += "rule x2 \n"; str += "when \n"; str += " $ch : Cheese() \n"; str += " $ca : Cat() \n"; str += " $pe : Person() \n"; str += "then \n"; str += "end \n"; str += "rule x3 \n"; str += "when \n"; str += " $ch : Cheese() \n"; str += "then \n"; str += "end \n"; str += "rule x4 \n"; str += "when \n"; str += " $ch : Cheese() \n"; str += " eval( $ch != null ) \n"; str += "then \n"; str += "end \n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(str); ReteooWorkingMemoryInterface wm = ((StatefulKnowledgeSessionImpl) kbase.newStatefulKnowledgeSession()).session; ObjectTypeNode otnPerson = getObjectTypeNode(kbase, "Person"); ObjectTypeNode otnCheese = getObjectTypeNode(kbase, "Cheese"); ObjectTypeNode otnCat = getObjectTypeNode(kbase, "Cat"); assertEquals(0, otnPerson.getOtnIdCounter()); assertEquals(0, otnCheese.getOtnIdCounter()); assertEquals(0, otnCat.getOtnIdCounter()); wm.insert(new Person()); wm.insert(new Cat("yyy")); wm.insert(new Cheese()); assertEquals(2, otnPerson.getOtnIdCounter()); assertEquals(4, otnCheese.getOtnIdCounter()); assertEquals(2, otnCat.getOtnIdCounter()); }
private void initPathMemories() { pathMemories = new PathMemory[3]; NamedEntryPoint ep = (NamedEntryPoint) epManipulators[8].getEntryPoiny(); InternalWorkingMemory wm = ((NamedEntryPoint) ep).getInternalWorkingMemory(); ObjectTypeNode otn = ((NamedEntryPoint) ep) .getEntryPointNode() .getObjectTypeNodes() .values() .iterator() .next(); AlphaNode alpha = (AlphaNode) otn.getSinkPropagator().getSinks()[0]; ObjectSink[] sinks = alpha.getSinkPropagator().getSinks(); for (int i = 0; i < sinks.length; i++) { BetaNode beta = (BetaNode) sinks[i]; RuleTerminalNode rtn = (RuleTerminalNode) beta.getSinkPropagator().getSinks()[0]; pathMemories[i] = (PathMemory) wm.getNodeMemory(rtn); } }
public Boolean call() throws Exception { EntryPoint ep = ksession.getEntryPoint("EP" + index); InternalWorkingMemory wm = ((NamedEntryPoint) ep).getInternalWorkingMemory(); ObjectTypeNode otn = ((NamedEntryPoint) ep) .getEntryPointNode() .getObjectTypeNodes() .values() .iterator() .next(); AlphaNode alpha = (AlphaNode) otn.getSinkPropagator().getSinks()[0]; BetaNode beta = (BetaNode) alpha.getSinkPropagator().getSinks()[0]; BetaMemory memory = (BetaMemory) wm.getNodeMemory(beta); memory.getSegmentMemory(); for (int i = 0; i < 100; i++) { Thread.sleep(RANDOM.nextInt(100)); if (fh == null) { fh = ep.insert("" + index); } else { if (RANDOM.nextInt(100) < 70) { ep.delete(fh); fh = null; } else { ep.update(fh, "" + index); } } } if (index == deleteIndex) { if (fh != null) { ep.delete(fh); fh = null; } } else if (fh == null) { fh = ep.insert("" + index); } return true; }
@Test public void testPopulatedSharedToRtn() throws Exception { KnowledgeBase kbase1 = buildKnowledgeBase("r1", " A() B() C() D() E()\n"); InternalWorkingMemory wm = ((InternalWorkingMemory) kbase1.newStatefulKnowledgeSession()); List list = new ArrayList(); wm.setGlobal("list", list); wm.insert(new A(1)); wm.insert(new A(2)); wm.insert(new B(1)); wm.insert(new C(1)); wm.insert(new D(1)); wm.insert(new E(1)); wm.fireAllRules(); assertEquals(2, list.size()); kbase1.addKnowledgePackages(buildKnowledgePackage("r2", " A() B() C() D() E()\n")); ObjectTypeNode eotn = getObjectTypeNode(kbase1, E.class); JoinNode eNode = (JoinNode) eotn.getSinkPropagator().getSinks()[0]; RuleTerminalNode rtn = (RuleTerminalNode) eNode.getSinkPropagator().getLastLeftTupleSink(); PathMemory pm = (PathMemory) wm.getNodeMemory(rtn); SegmentMemory sm = pm.getSegmentMemory(); assertNotNull(sm.getStagedLeftTuples().getInsertFirst()); assertNotNull(sm.getStagedLeftTuples().getInsertFirst().getStagedNext()); assertNull(sm.getStagedLeftTuples().getInsertFirst().getStagedNext().getStagedNext()); wm.fireAllRules(); assertNull(sm.getStagedLeftTuples().getInsertFirst()); assertEquals(4, list.size()); System.out.println(list); assertEquals("r1", ((Match) list.get(0)).getRule().getName()); assertEquals("r1", ((Match) list.get(1)).getRule().getName()); assertEquals("r2", ((Match) list.get(2)).getRule().getName()); assertEquals("r2", ((Match) list.get(3)).getRule().getName()); }
@Test public void testPopulatedRuleWithEvals() throws Exception { KnowledgeBase kbase1 = buildKnowledgeBase("r1", " a:A() B() eval(1==1) eval(1==1) C(1;) \n"); InternalWorkingMemory wm = ((InternalWorkingMemory) kbase1.newStatefulKnowledgeSession()); List list = new ArrayList(); wm.setGlobal("list", list); wm.insert(new A(1)); wm.insert(new A(2)); wm.insert(new A(3)); wm.insert(new B(1)); wm.insert(new C(1)); wm.insert(new C(2)); wm.fireAllRules(); assertEquals(3, list.size()); kbase1.addKnowledgePackages( buildKnowledgePackage("r2", " a:A() B() eval(1==1) eval(1==1) C(2;) \n")); ObjectTypeNode aotn = getObjectTypeNode(kbase1, A.class); LeftInputAdapterNode liaNode = (LeftInputAdapterNode) aotn.getSinkPropagator().getSinks()[0]; JoinNode bNode = (JoinNode) liaNode.getSinkPropagator().getFirstLeftTupleSink(); EvalConditionNode e1 = (EvalConditionNode) bNode.getSinkPropagator().getFirstLeftTupleSink(); EvalConditionNode e2 = (EvalConditionNode) e1.getSinkPropagator().getFirstLeftTupleSink(); JoinNode c1Node = (JoinNode) e2.getSinkPropagator().getFirstLeftTupleSink(); JoinNode c2Node = (JoinNode) e2.getSinkPropagator().getLastLeftTupleSink(); LiaNodeMemory lm = (LiaNodeMemory) wm.getNodeMemory(liaNode); SegmentMemory sm = lm.getSegmentMemory(); BetaMemory c1Mem = (BetaMemory) wm.getNodeMemory(c1Node); assertSame(sm.getFirst(), c1Mem.getSegmentMemory()); assertEquals(3, c1Mem.getLeftTupleMemory().size()); assertEquals(1, c1Mem.getRightTupleMemory().size()); BetaMemory c2Mem = (BetaMemory) wm.getNodeMemory(c2Node); SegmentMemory c2Smem = sm.getFirst().getNext(); assertSame(c2Smem, c2Mem.getSegmentMemory()); assertEquals(0, c2Mem.getLeftTupleMemory().size()); assertEquals(0, c2Mem.getRightTupleMemory().size()); assertNotNull(c2Smem.getStagedLeftTuples().getInsertFirst()); assertNotNull(c2Smem.getStagedLeftTuples().getInsertFirst().getStagedNext()); assertNotNull(c2Smem.getStagedLeftTuples().getInsertFirst().getStagedNext().getStagedNext()); assertNull( c2Smem .getStagedLeftTuples() .getInsertFirst() .getStagedNext() .getStagedNext() .getStagedNext()); wm.fireAllRules(); assertEquals(3, c2Mem.getLeftTupleMemory().size()); assertEquals(1, c2Mem.getRightTupleMemory().size()); assertNull(c2Smem.getStagedLeftTuples().getInsertFirst()); assertEquals(6, list.size()); assertEquals("r1", ((Match) list.get(0)).getRule().getName()); assertEquals("r1", ((Match) list.get(1)).getRule().getName()); assertEquals("r1", ((Match) list.get(2)).getRule().getName()); assertEquals("r2", ((Match) list.get(3)).getRule().getName()); assertEquals(3, ((A) ((Match) list.get(3)).getDeclarationValue("a")).getObject()); assertEquals("r2", ((Match) list.get(4)).getRule().getName()); assertEquals(2, ((A) ((Match) list.get(4)).getDeclarationValue("a")).getObject()); assertEquals("r2", ((Match) list.get(5)).getRule().getName()); assertEquals(1, ((A) ((Match) list.get(5)).getDeclarationValue("a")).getObject()); }