use of org.drools.core.reteoo.SegmentMemory in project drools by kiegroup.
the class PhreakTimerNode method evaluate.
private static void evaluate(PathMemory pmem, InternalAgenda agenda, LeftTupleSink sink, TimerNodeMemory tm, TupleSets<LeftTuple> trgLeftTuples) {
SegmentMemory[] smems = pmem.getSegmentMemories();
SegmentMemory sm = tm.getSegmentMemory();
int smemIndex = 0;
for (SegmentMemory smem : smems) {
if (smem == sm) {
break;
}
smemIndex++;
}
long bit = 1;
for (NetworkNode node = sm.getRootNode(); node != sink; node = ((LeftTupleSource) node).getSinkPropagator().getFirstLeftTupleSink()) {
// update the bit to the correct node position.
bit = bit << 1;
}
RuleNetworkEvaluator rne = new RuleNetworkEvaluator();
rne.outerEval(pmem, sink, bit, tm, smems, smemIndex, trgLeftTuples, agenda, new LinkedList<>(), true, pmem.getRuleAgendaItem().getRuleExecutor());
}
use of org.drools.core.reteoo.SegmentMemory in project drools by kiegroup.
the class RuleNetworkEvaluator method evalStackEntry.
public void evalStackEntry(StackEntry entry, LinkedList<StackEntry> stack, RuleExecutor executor, InternalAgenda agenda) {
NetworkNode node = entry.getNode();
Memory nodeMem = entry.getNodeMem();
TupleSets<LeftTuple> trgTuples = entry.getTrgTuples();
if (node.getType() == NodeTypeEnums.QueryElementNode) {
// copy across the results, if any from the query node memory
QueryElementNodeMemory qmem = (QueryElementNodeMemory) nodeMem;
qmem.setNodeCleanWithoutNotify();
qmem.getResultLeftTuples().addTo(trgTuples);
}
LeftTupleSinkNode sink = entry.getSink();
PathMemory pmem = entry.getRmem();
SegmentMemory[] smems = entry.getSmems();
int smemIndex = entry.getSmemIndex();
boolean processRian = entry.isProcessRian();
long bit = entry.getBit();
if (entry.isResumeFromNextNode()) {
SegmentMemory smem = smems[smemIndex];
if (node != smem.getTipNode()) {
// get next node and node memory in the segment
LeftTupleSink nextSink = sink.getNextLeftTupleSinkNode();
if (nextSink == null) {
node = sink;
} else {
// there is a nested subnetwork, take out path
node = nextSink;
}
nodeMem = nodeMem.getNext();
// update bit to new node
bit = bit << 1;
} else {
// Reached end of segment, start on new segment.
SegmentPropagator.propagate(smem, trgTuples, agenda.getWorkingMemory());
smem = smems[++smemIndex];
trgTuples = smem.getStagedLeftTuples().takeAll();
node = smem.getRootNode();
nodeMem = smem.getNodeMemories().getFirst();
// update bit to start of new segment
bit = 1;
}
}
if (log.isTraceEnabled()) {
int offset = getOffset(node);
log.trace("{} Resume {} {}", indent(offset), node.toString(), trgTuples.toStringSizes());
}
innerEval(pmem, node, bit, nodeMem, smems, smemIndex, trgTuples, agenda, stack, processRian, executor);
}
use of org.drools.core.reteoo.SegmentMemory in project drools by kiegroup.
the class SegmentUtilities method createSegmentMemory.
/**
* Initialises the NodeSegment memory for all nodes in the segment.
*/
public static void createSegmentMemory(LeftTupleSource tupleSource, InternalWorkingMemory wm) {
Memory mem = wm.getNodeMemory((MemoryFactory) tupleSource);
SegmentMemory smem = mem.getSegmentMemory();
if (smem == null) {
createSegmentMemory(tupleSource, mem, wm);
}
}
use of org.drools.core.reteoo.SegmentMemory in project drools by kiegroup.
the class AddRuleTest method testSplitOneBeforeCreatedSegment.
@Test
public void testSplitOneBeforeCreatedSegment() throws Exception {
InternalKnowledgeBase kbase1 = buildKnowledgeBase("r1", " A(1;) A(2;) B(1;) B(2;) C(1;) C(2;) D(1;) D(2;) E(1;) E(2;)\n");
kbase1.addPackages(buildKnowledgePackage("r2", " A(1;) A(2;) B(1;) B(2;) C(1;) C(2;) D(1;) D(2;) E(1;) E(2;)\n"));
kbase1.addPackages(buildKnowledgePackage("r3", " A(1;) A(2;) B(1;) B(2;) C(1;) C(2;) D(1;) D(2;)\n"));
kbase1.addPackages(buildKnowledgePackage("r4", " A(1;) A(2;) B(1;) B(2;) C(1;) C(2;) \n"));
InternalWorkingMemory wm = ((InternalWorkingMemory) kbase1.newKieSession());
List list = new ArrayList();
wm.setGlobal("list", list);
wm.insert(new D(1));
wm.insert(new D(2));
wm.flushPropagations();
RuleTerminalNode rtn1 = getRtn("org.kie.r1", kbase1);
RuleTerminalNode rtn2 = getRtn("org.kie.r2", kbase1);
RuleTerminalNode rtn3 = getRtn("org.kie.r3", kbase1);
RuleTerminalNode rtn4 = getRtn("org.kie.r4", kbase1);
PathMemory pm1 = (PathMemory) wm.getNodeMemory(rtn1);
SegmentMemory[] smems = pm1.getSegmentMemories();
assertEquals(4, smems.length);
assertNull(smems[0]);
assertNull(smems[2]);
assertNull(smems[3]);
SegmentMemory sm = smems[1];
assertEquals(1, sm.getPos());
assertEquals(2, sm.getSegmentPosMaskBit());
assertEquals(2, pm1.getLinkedSegmentMask());
PathMemory pm3 = (PathMemory) wm.getNodeMemory(rtn3);
SegmentMemory[] smemsP3 = pm3.getSegmentMemories();
assertEquals(3, smemsP3.length);
assertNull(smemsP3[0]);
assertNull(smemsP3[2]);
sm = smems[1];
assertEquals(1, sm.getPos());
assertEquals(2, sm.getSegmentPosMaskBit());
assertEquals(2, pm1.getLinkedSegmentMask());
kbase1.addPackages(buildKnowledgePackage("r5", " A(1;) A(2;) B(1;) B(2;) \n"));
smems = pm1.getSegmentMemories();
assertEquals(5, smems.length);
assertNull(smems[0]);
assertNull(smems[1]);
assertNull(smems[3]);
assertNull(smems[4]);
sm = smems[2];
assertEquals(2, sm.getPos());
assertEquals(4, sm.getSegmentPosMaskBit());
assertEquals(4, pm1.getLinkedSegmentMask());
smems = pm3.getSegmentMemories();
assertEquals(4, smems.length);
assertNull(smems[0]);
assertNull(smems[1]);
assertNull(smems[3]);
sm = smems[2];
assertEquals(2, sm.getPos());
assertEquals(4, sm.getSegmentPosMaskBit());
assertEquals(4, pm1.getLinkedSegmentMask());
RuleTerminalNode rtn5 = getRtn("org.kie.r5", kbase1);
PathMemory pm5 = (PathMemory) wm.getNodeMemory(rtn5);
smems = pm5.getSegmentMemories();
assertEquals(2, smems.length);
assertNull(smems[0]);
assertNull(smems[1]);
}
use of org.drools.core.reteoo.SegmentMemory in project drools by kiegroup.
the class AddRuleTest method testSplitOnCreatedSegment.
@Test
public void testSplitOnCreatedSegment() throws Exception {
// this test splits D1 and D2 on the later add rule
InternalKnowledgeBase kbase1 = buildKnowledgeBase("r1", " A(1;) A(2;) B(1;) B(2;) C(1;) C(2;) D(1;) D(2;) E(1;) E(2;)\n");
kbase1.addPackages(buildKnowledgePackage("r2", " A(1;) A(2;) B(1;) B(2;) C(1;) C(2;) D(1;) D(2;) E(1;) E(2;)\n"));
kbase1.addPackages(buildKnowledgePackage("r3", " A(1;) A(2;) B(1;) B(2;) C(1;) C(2;) D(1;) D(2;)\n"));
kbase1.addPackages(buildKnowledgePackage("r4", " A(1;) A(2;) B(1;) B(2;) C(1;) C(2;) \n"));
InternalWorkingMemory wm = ((InternalWorkingMemory) kbase1.newKieSession());
List list = new ArrayList();
wm.setGlobal("list", list);
wm.insert(new D(1));
wm.insert(new D(2));
wm.insert(new D(3));
wm.flushPropagations();
RuleTerminalNode rtn1 = getRtn("org.kie.r1", kbase1);
PathMemory pm1 = (PathMemory) wm.getNodeMemory(rtn1);
assertEquals(2, pm1.getLinkedSegmentMask());
SegmentMemory[] smems = pm1.getSegmentMemories();
assertEquals(4, smems.length);
assertNull(smems[0]);
assertNull(smems[2]);
assertNull(smems[3]);
SegmentMemory sm = smems[1];
assertEquals(1, sm.getPos());
assertEquals(2, sm.getSegmentPosMaskBit());
kbase1.addPackages(buildKnowledgePackage("r5", " A(1;) A(2;) B(1;) B(2;) C(1;) C(2;) D(1;) D(3;)\n"));
wm.fireAllRules();
assertEquals(6, pm1.getLinkedSegmentMask());
smems = pm1.getSegmentMemories();
assertEquals(5, smems.length);
assertNull(smems[0]);
assertNull(smems[3]);
assertNull(smems[4]);
sm = smems[1];
assertEquals(1, sm.getPos());
assertEquals(2, sm.getSegmentPosMaskBit());
sm = smems[2];
assertEquals(2, sm.getPos());
assertEquals(4, sm.getSegmentPosMaskBit());
RuleTerminalNode rtn5 = getRtn("org.kie.r5", kbase1);
PathMemory pm5 = (PathMemory) wm.getNodeMemory(rtn5);
assertEquals(6, pm5.getLinkedSegmentMask());
smems = pm5.getSegmentMemories();
assertEquals(3, smems.length);
assertNull(smems[0]);
sm = smems[1];
assertEquals(1, sm.getPos());
assertEquals(2, sm.getSegmentPosMaskBit());
sm = smems[2];
assertEquals(2, sm.getPos());
assertEquals(4, sm.getSegmentPosMaskBit());
}
Aggregations