This is an automated email from the ASF dual-hosted git repository.
mariofusco pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git
The following commit(s) were added to refs/heads/main by this push:
new 1bd1053018 [incubator-kie-issues #203] Cleanup Phreak code - Create
segment memory factory (#6495)
1bd1053018 is described below
commit 1bd10530186d8fca312db73d539b8631712e32ec
Author: Paolo Bizzarri <[email protected]>
AuthorDate: Wed Oct 22 08:29:14 2025 +0200
[incubator-kie-issues #203] Cleanup Phreak code - Create segment memory
factory (#6495)
* Making PathMemory use ActivationsManager as instance variable
* Removed unnecessary stuff
* More code to fix, more depenencies to remove
* Created a proper support for segments
* Moved segment creation to single place
* Reduced visibility for methods that can stay private
* Minor cleanups
* Fixes and cleanups
* Removed files added by mistake
* Removed any dependency of ReteEvaluator from code
---
.../main/java/org/drools/core/common/Memory.java | 3 +-
.../java/org/drools/core/common/ReteEvaluator.java | 2 +
.../drools/core/common/SegmentMemorySupport.java | 48 ++
.../org/drools/core/impl/KnowledgeBaseImpl.java | 4 +-
.../org/drools/core/phreak/EagerPhreakBuilder.java | 14 +-
.../org/drools/core/phreak/LazyPhreakBuilder.java | 451 +-------------
.../org/drools/core/phreak/PropagationEntry.java | 2 +-
.../drools/core/phreak/RuleNetworkEvaluator.java | 4 +-
.../core/phreak/RuntimeSegmentUtilities.java | 229 -------
.../core/phreak/SegmentMemorySupportImpl.java | 658 +++++++++++++++++++++
.../org/drools/core/phreak/SegmentPropagator.java | 2 +-
.../drools/core/reteoo/LeftInputAdapterNode.java | 13 +-
.../java/org/drools/core/reteoo/PathMemory.java | 8 +
.../java/org/drools/core/reteoo/SegmentMemory.java | 61 +-
.../core/reteoo/SegmentPrototypeRegistry.java | 7 +-
.../core/reteoo/SegmentPrototypeRegistryImpl.java | 11 +-
.../StatefulKnowledgeSessionForRHS.java | 5 +
.../session/StatefulKnowledgeSessionImpl.java | 11 +
.../kiesession/NodeSegmentUnlinkingTest.java | 7 +-
.../org/drools/kiesession/RuleUnlinkingTest.java | 5 +-
.../RuleUnlinkingWithSegmentMemoryTest.java | 9 +-
.../impl/sessions/RuleUnitExecutorImpl.java | 11 +
.../drools/mvel/integrationtests/LinkingTest.java | 7 +-
.../phreak/PhreakJoinNodeTest.java | 4 +-
.../integrationtests/phreak/PhreakNotNodeTest.java | 4 +-
.../mvel/integrationtests/phreak/ScenarioTest.java | 4 +-
.../phreak/SegmentPropagationTest.java | 8 +-
27 files changed, 827 insertions(+), 765 deletions(-)
diff --git a/drools-core/src/main/java/org/drools/core/common/Memory.java
b/drools-core/src/main/java/org/drools/core/common/Memory.java
index 6bdbcddbff..14ce187dbb 100644
--- a/drools-core/src/main/java/org/drools/core/common/Memory.java
+++ b/drools-core/src/main/java/org/drools/core/common/Memory.java
@@ -18,7 +18,6 @@
*/
package org.drools.core.common;
-import org.drools.core.phreak.RuntimeSegmentUtilities;
import org.drools.core.reteoo.LeftTupleSource;
import org.drools.core.reteoo.SegmentMemory;
import org.drools.core.util.DoubleLinkedEntry;
@@ -35,7 +34,7 @@ public interface Memory extends DoubleLinkedEntry<Memory> {
default SegmentMemory getOrCreateSegmentMemory( LeftTupleSource
tupleSource, ReteEvaluator reteEvaluator ) {
SegmentMemory smem = getSegmentMemory();
if (smem == null) {
- smem =
RuntimeSegmentUtilities.getOrCreateSegmentMemory(reteEvaluator, tupleSource,
this);
+ smem =
reteEvaluator.getSegmentMemorySupport().getOrCreateSegmentMemory(tupleSource,
this);
}
return smem;
}
diff --git
a/drools-core/src/main/java/org/drools/core/common/ReteEvaluator.java
b/drools-core/src/main/java/org/drools/core/common/ReteEvaluator.java
index e74f0610a4..cbd066613e 100644
--- a/drools-core/src/main/java/org/drools/core/common/ReteEvaluator.java
+++ b/drools-core/src/main/java/org/drools/core/common/ReteEvaluator.java
@@ -68,6 +68,8 @@ public interface ReteEvaluator extends ValueResolver {
<T extends Memory> T getNodeMemory(MemoryFactory<T> node);
NodeMemories getNodeMemories();
+
+ SegmentMemorySupport getSegmentMemorySupport();
default Object getGlobal(String identifier) {
return getGlobalResolver().resolveGlobal( identifier );
diff --git
a/drools-core/src/main/java/org/drools/core/common/SegmentMemorySupport.java
b/drools-core/src/main/java/org/drools/core/common/SegmentMemorySupport.java
new file mode 100644
index 0000000000..2c86767f0a
--- /dev/null
+++ b/drools-core/src/main/java/org/drools/core/common/SegmentMemorySupport.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.drools.core.common;
+
+import org.drools.core.reteoo.LeftTupleNode;
+import org.drools.core.reteoo.LeftTupleSinkPropagator;
+import org.drools.core.reteoo.LeftTupleSource;
+import org.drools.core.reteoo.PathEndNode;
+import org.drools.core.reteoo.PathMemory;
+import org.drools.core.reteoo.QueryElementNode;
+import org.drools.core.reteoo.SegmentMemory;
+
+public interface SegmentMemorySupport {
+
+ public SegmentMemory getOrCreateSegmentMemory(LeftTupleNode node);
+
+ public SegmentMemory getOrCreateSegmentMemory(LeftTupleNode node, Memory
memory);
+
+ public SegmentMemory createSegmentMemoryLazily(LeftTupleSource
segmentRoot);
+
+ public SegmentMemory getQuerySegmentMemory(QueryElementNode queryNode);
+
+ public void createChildSegments(LeftTupleSinkPropagator sinkProp,
SegmentMemory smem);
+
+ public SegmentMemory createChildSegment(LeftTupleNode node);
+
+ public SegmentMemory createChildSegmentLazily(LeftTupleNode node);
+
+ public PathMemory initializePathMemory(PathEndNode pathEndNode);
+
+ public void checkEagerSegmentCreation(LeftTupleSource lt, int
nodeTypesInSegment);
+}
diff --git
a/drools-core/src/main/java/org/drools/core/impl/KnowledgeBaseImpl.java
b/drools-core/src/main/java/org/drools/core/impl/KnowledgeBaseImpl.java
index 98f6f1b146..e05105a896 100644
--- a/drools-core/src/main/java/org/drools/core/impl/KnowledgeBaseImpl.java
+++ b/drools-core/src/main/java/org/drools/core/impl/KnowledgeBaseImpl.java
@@ -944,11 +944,11 @@ public class KnowledgeBaseImpl implements
InternalRuleBase {
@Override
public SegmentMemory createSegmentFromPrototype(ReteEvaluator
reteEvaluator, LeftTupleSource tupleSource) {
- return
segmentPrototypeRegistry.createSegmentFromPrototype(reteEvaluator, tupleSource);
+ return
segmentPrototypeRegistry.createSegmentFromPrototype(reteEvaluator.getNodeMemories(),
reteEvaluator.getSegmentMemorySupport(), tupleSource);
}
public SegmentMemory createSegmentFromPrototype(ReteEvaluator
reteEvaluator, SegmentPrototype proto) {
- return
segmentPrototypeRegistry.createSegmentFromPrototype(reteEvaluator, proto);
+ return segmentPrototypeRegistry.createSegmentFromPrototype(proto,
reteEvaluator.getNodeMemories(), reteEvaluator.getSegmentMemorySupport());
}
public SegmentPrototype getSegmentPrototype(SegmentMemory segment) {
diff --git
a/drools-core/src/main/java/org/drools/core/phreak/EagerPhreakBuilder.java
b/drools-core/src/main/java/org/drools/core/phreak/EagerPhreakBuilder.java
index 20184a38c4..07b76940af 100644
--- a/drools-core/src/main/java/org/drools/core/phreak/EagerPhreakBuilder.java
+++ b/drools-core/src/main/java/org/drools/core/phreak/EagerPhreakBuilder.java
@@ -329,11 +329,11 @@ public class EagerPhreakBuilder implements PhreakBuilder {
PathMemory pmem = (PathMemory)
wm.getNodeMemories().peekNodeMemory(endNode);
if (pmem == null) {
- pmem =
RuntimeSegmentUtilities.initializePathMemory(wm, endNode);
+ pmem =
wm.getSegmentMemorySupport().initializePathMemory(endNode);
}
if (pmem.getSegmentMemories()[proto.getPos()] == null) {
// we check null, as this might have been fixed due to
eager initialisation
- RuntimeSegmentUtilities.addSegmentToPathMemory(pmem,
smem);
+ pmem.addSegmentToPathMemory(smem);
}
}
}));
@@ -520,7 +520,7 @@ public class EagerPhreakBuilder implements PhreakBuilder {
Memory mem =
wm.getNodeMemories().peekNodeMemory(sproto.getRootNode());
if (mem != null && mem.getSegmentMemory() != null)
{
if (pmem == null) {
- pmem =
RuntimeSegmentUtilities.initializePathMemory(wm, endNode);
+ pmem =
wm.getSegmentMemorySupport().initializePathMemory(endNode);
}
SegmentMemory sm = mem.getSegmentMemory();
pmem.getSegmentMemories()[sproto.getPos()] =
sm;
@@ -532,7 +532,7 @@ public class EagerPhreakBuilder implements PhreakBuilder {
SegmentMemory sm =
sproto.shallowNewSegmentMemory();
sm.setNodeMemories(new Memory[]{pmem});
pmem.setSegmentMemory(sm);
-
RuntimeSegmentUtilities.addSegmentToPathMemory(pmem, sm);
+ pmem.addSegmentToPathMemory(sm);
notifyImpactedSegments(wm, sm, smemsToNotify);
}
}
@@ -552,7 +552,7 @@ public class EagerPhreakBuilder implements PhreakBuilder {
if (parentMem != null && parentMem.getSegmentMemory() !=
null &&
!parentMem.getSegmentMemory().isEmpty()) {
SegmentMemory sm = parentMem.getSegmentMemory();
- SegmentMemory childSmem =
RuntimeSegmentUtilities.createChildSegment(wm, child);
+ SegmentMemory childSmem =
wm.getSegmentMemorySupport().createChildSegment(child);
sm.add(childSmem);
sm.notifyRuleLinkSegment();
notifyImpactedSegments(wm, sm, smemsToNotify);
@@ -769,12 +769,12 @@ public class EagerPhreakBuilder implements PhreakBuilder {
if (sm1 == null) {
// To be able to merge sm1 must exist
- sm1 = RuntimeSegmentUtilities.getOrCreateSegmentMemory(wm,
proto1.getRootNode());
+ sm1 =
wm.getSegmentMemorySupport().getOrCreateSegmentMemory(proto1.getRootNode());
}
if (sm2 == null) {
// To be able to merge sm2 must exist
- sm2 = RuntimeSegmentUtilities.getOrCreateSegmentMemory(wm,
proto2.getRootNode());
+ sm2 =
wm.getSegmentMemorySupport().getOrCreateSegmentMemory(proto2.getRootNode());
}
// merge the memories and reassign back to sm1
diff --git
a/drools-core/src/main/java/org/drools/core/phreak/LazyPhreakBuilder.java
b/drools-core/src/main/java/org/drools/core/phreak/LazyPhreakBuilder.java
index f377941299..1c2098dbad 100644
--- a/drools-core/src/main/java/org/drools/core/phreak/LazyPhreakBuilder.java
+++ b/drools-core/src/main/java/org/drools/core/phreak/LazyPhreakBuilder.java
@@ -38,22 +38,15 @@ import org.drools.core.common.Memory;
import org.drools.core.common.MemoryFactory;
import org.drools.core.common.PropagationContext;
import org.drools.core.common.PropagationContextFactory;
-import org.drools.core.common.ReteEvaluator;
import org.drools.core.common.SuperCacheFixer;
import org.drools.core.common.TupleSets;
import org.drools.core.impl.InternalRuleBase;
import org.drools.core.reteoo.AbstractTerminalNode;
-import org.drools.core.reteoo.AccumulateNode;
import org.drools.core.reteoo.AccumulateNode.AccumulateContext;
import org.drools.core.reteoo.AccumulateNode.AccumulateMemory;
import org.drools.core.reteoo.AlphaTerminalNode;
-import org.drools.core.reteoo.AsyncReceiveNode;
-import org.drools.core.reteoo.AsyncSendNode;
import org.drools.core.reteoo.BetaMemory;
import org.drools.core.reteoo.BetaNode;
-import org.drools.core.reteoo.ConditionalBranchNode;
-import org.drools.core.reteoo.EvalConditionNode;
-import org.drools.core.reteoo.FromNode;
import org.drools.core.reteoo.FromNode.FromMemory;
import org.drools.core.reteoo.LeftInputAdapterNode;
import org.drools.core.reteoo.LeftTuple;
@@ -73,7 +66,6 @@ import org.drools.core.reteoo.RuntimeComponentFactory;
import org.drools.core.reteoo.SegmentMemory;
import org.drools.core.reteoo.SegmentPrototypeRegistry;
import org.drools.core.reteoo.TerminalNode;
-import org.drools.core.reteoo.TimerNode;
import org.drools.core.reteoo.Tuple;
import org.drools.core.reteoo.TupleFactory;
import org.drools.core.reteoo.TupleImpl;
@@ -86,20 +78,9 @@ import org.kie.api.definition.rule.Rule;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import static org.drools.core.phreak.BuildtimeSegmentUtilities.JOIN_NODE_BIT;
-import static org.drools.core.phreak.BuildtimeSegmentUtilities.NOT_NODE_BIT;
-import static
org.drools.core.phreak.BuildtimeSegmentUtilities.REACTIVE_EXISTS_NODE_BIT;
-import static org.drools.core.phreak.BuildtimeSegmentUtilities.canBeDisabled;
-import static
org.drools.core.phreak.BuildtimeSegmentUtilities.isNonTerminalTipNode;
import static org.drools.core.phreak.BuildtimeSegmentUtilities.isRootNode;
-import static org.drools.core.phreak.BuildtimeSegmentUtilities.isSet;
-import static org.drools.core.phreak.BuildtimeSegmentUtilities.nextNodePosMask;
-import static
org.drools.core.phreak.BuildtimeSegmentUtilities.updateNodeTypesMask;
import static org.drools.core.phreak.EagerPhreakBuilder.deleteLeftTuple;
import static
org.drools.core.phreak.EagerPhreakBuilder.Add.attachAdapterAndPropagate;
-import static
org.drools.core.phreak.RuntimeSegmentUtilities.createSubnetworkSegmentMemory;
-import static
org.drools.core.phreak.RuntimeSegmentUtilities.getOrCreateSegmentMemory;
-import static
org.drools.core.phreak.RuntimeSegmentUtilities.getQuerySegmentMemory;
import static org.drools.core.phreak.TupleEvaluationUtil.forceFlushLeftTuple;
class LazyPhreakBuilder implements PhreakBuilder {
@@ -386,11 +367,11 @@ class LazyPhreakBuilder implements PhreakBuilder {
removedTerminalSource.removeTupleSink(tn);
if (sm1 == null) {
- sm1 = createChildSegment(wm, parentNode);
+ sm1 =
wm.getSegmentMemorySupport().createChildSegmentLazily(parentNode);
smems[smemIndex] = sm1;
sm1.add(sm2);
} else if (sm2 == null) {
- sm2 = createChildSegment(wm, node);
+ sm2 =
wm.getSegmentMemorySupport().createChildSegmentLazily(node);
prevSmems[prevSmemIndex] = sm2;
sm1.add(sm2);
}
@@ -485,7 +466,7 @@ class LazyPhreakBuilder implements PhreakBuilder {
visitedNodes, smemsToNotify, nodeToSegmentMap);
smemSplitAdjustAmount++;
}
- checkEagerSegmentCreation(wm, parentNode,
nodeTypesInSegment);
+
wm.getSegmentMemorySupport().checkEagerSegmentCreation(parentNode,
nodeTypesInSegment);
nodeTypesInSegment = 0;
}
} while (!NodeTypeEnums.isEndNode(node));
@@ -520,7 +501,7 @@ class LazyPhreakBuilder implements PhreakBuilder {
if (sm.getFirst() != null && sm.size() <
parent.getSinkPropagator().size()) {
LeftTupleSink[] sinks =
parent.getSinkPropagator().getSinks();
for (int i = sm.size(); i < sinks.length; i++)
{
- SegmentMemory childSmem =
createChildSegment(wm, sinks[i]);
+ SegmentMemory childSmem =
wm.getSegmentMemorySupport().createChildSegmentLazily(sinks[i]);
sm.add(childSmem);
pmem.setSegmentMemory(childSmem.getPos(),
childSmem);
smemsToNotify.add(childSmem);
@@ -534,7 +515,7 @@ class LazyPhreakBuilder implements PhreakBuilder {
if (mem != null) {
SegmentMemory sm = mem.getSegmentMemory();
if (sm != null &&
!sm.getPathMemories().contains(pmem)) {
-
RuntimeSegmentUtilities.addSegmentToPathMemory(pmem, sm);
+ pmem.addSegmentToPathMemory(sm);
sm.notifyRuleLinkSegment(pmem);
}
}
@@ -1240,426 +1221,4 @@ class LazyPhreakBuilder implements PhreakBuilder {
List<LeftTupleNode> subjectSplits = new ArrayList<>();
List<PathEndNode> otherEndNodes = new ArrayList<>();
}
-
- static SegmentMemory createChildSegment(ReteEvaluator reteEvaluator,
LeftTupleNode node) {
- Memory memory = reteEvaluator.getNodeMemory((MemoryFactory) node);
- if (memory.getSegmentMemory() == null) {
- if (NodeTypeEnums.isEndNode(node)) {
- // RTNS and TupleToObjectNode's have their own segment, if
they are the child of a split.
- createChildSegmentForTerminalNode(node, memory);
- } else {
- createSegmentMemory(reteEvaluator, (LeftTupleSource) node);
- }
- }
- return memory.getSegmentMemory();
- }
-
- static SegmentMemory createSegmentMemory(ReteEvaluator reteEvaluator,
LeftTupleNode segmentRoot) {
- if (NodeTypeEnums.isTerminalNode(segmentRoot)) {
- Memory memory = reteEvaluator.getNodeMemory((MemoryFactory)
segmentRoot);
- return createChildSegmentForTerminalNode(segmentRoot, memory);
- }
- return createSegmentMemory(reteEvaluator, (LeftTupleSource)
segmentRoot);
- }
-
- private static SegmentMemory
createChildSegmentForTerminalNode(LeftTupleNode node, Memory memory) {
- SegmentMemory childSmem = new SegmentMemory(node); // rtns or
TupleToObjectNodes don't need a queue
- PathMemory pmem = (PathMemory) memory;
-
- childSmem.setPos(pmem.getSegmentMemories().length - 1);
- pmem.setSegmentMemory(childSmem);
- RuntimeSegmentUtilities.addSegmentToPathMemory(pmem, childSmem);
-
- childSmem.setTipNode(node);
- childSmem.setNodeMemories(new Memory[]{memory});
- return childSmem;
- }
-
- private static SegmentMemory createSegmentMemory(ReteEvaluator
reteEvaluator, LeftTupleSource segmentRoot) {
- LeftTupleSource tupleSource = segmentRoot;
- SegmentMemory smem = new SegmentMemory(segmentRoot);
-
- // Iterate all nodes on the same segment, assigning their position as
a bit mask value
- // allLinkedTestMask is the resulting mask used to test if all nodes
are linked in
- long nodePosMask = 1;
- long allLinkedTestMask = 0;
- boolean updateNodeBit = true; // nodes after a branch CE can notify,
but they cannot impact linking
-
- int nodeTypesInSegment = 0;
- List<Memory> memories = new ArrayList<>();
- while (true) {
- nodeTypesInSegment = updateNodeTypesMask(tupleSource,
nodeTypesInSegment);
- if (NodeTypeEnums.isBetaNode(tupleSource)) {
- allLinkedTestMask = processBetaNode(reteEvaluator, (BetaNode)
tupleSource, smem, memories, nodePosMask,
- allLinkedTestMask, updateNodeBit);
- } else {
- switch (tupleSource.getType()) {
- case NodeTypeEnums.LeftInputAdapterNode:
- case NodeTypeEnums.AlphaTerminalNode:
- allLinkedTestMask = processLiaNode(reteEvaluator,
(LeftInputAdapterNode) tupleSource, smem,
- memories, nodePosMask, allLinkedTestMask);
- break;
- case NodeTypeEnums.EvalConditionNode:
- processEvalNode(reteEvaluator, (EvalConditionNode)
tupleSource, smem, memories);
- break;
- case NodeTypeEnums.ConditionalBranchNode:
- updateNodeBit = processBranchNode(reteEvaluator,
(ConditionalBranchNode) tupleSource, smem,
- memories);
- break;
- case NodeTypeEnums.FromNode:
- processFromNode(reteEvaluator, (FromNode) tupleSource,
smem, memories);
- break;
- case NodeTypeEnums.ReactiveFromNode:
- processReactiveFromNode(reteEvaluator, (MemoryFactory)
tupleSource, smem, memories,
- nodePosMask);
- break;
- case NodeTypeEnums.TimerConditionNode:
- processTimerNode(reteEvaluator, (TimerNode)
tupleSource, smem, memories, nodePosMask);
- break;
- case NodeTypeEnums.AsyncSendNode:
- processAsyncSendNode(reteEvaluator, (AsyncSendNode)
tupleSource, smem, memories);
- break;
- case NodeTypeEnums.AsyncReceiveNode:
- processAsyncReceiveNode(reteEvaluator,
(AsyncReceiveNode) tupleSource, smem, memories,
- nodePosMask);
- break;
- case NodeTypeEnums.QueryElementNode:
- updateNodeBit = processQueryNode(reteEvaluator,
(QueryElementNode) tupleSource, segmentRoot,
- smem, memories, nodePosMask);
- break;
- }
- }
-
- nodePosMask = nextNodePosMask(nodePosMask);
-
- if (tupleSource.getSinkPropagator().size() == 1) {
- LeftTupleSinkNode sink =
tupleSource.getSinkPropagator().getFirstLeftTupleSink();
- if (NodeTypeEnums.isLeftTupleSource(sink)) {
- tupleSource = (LeftTupleSource) sink;
- } else {
- // rtn or TupleToObjectNode
- // While not technically in a segment, we want to be able
to iterate easily from the last node memory to the TupleToObjectNode/rtn memory
- // we don't use createNodeMemory, as these may already
have been created by, but not added, by the method
updateTupleToObjectAndTerminalMemory
- Memory memory =
reteEvaluator.getNodeMemory((MemoryFactory) sink);
- if (sink.getType() == NodeTypeEnums.TupleToObjectNode) {
- PathMemory subnMem = (SubnetworkPathMemory) memory;
- memories.add(subnMem);
-
- TupleToObjectNode tton = (TupleToObjectNode) sink;
- ObjectSink[] nodes =
tton.getObjectSinkPropagator().getSinks();
- for (ObjectSink node : nodes) {
- if (NodeTypeEnums.isLeftTupleSource(node)) {
- getOrCreateSegmentMemory(reteEvaluator,
(LeftTupleSource) node);
- }
- }
- } else if (NodeTypeEnums.isTerminalNode(sink)) {
- memories.add(memory);
- }
- memory.setSegmentMemory(smem);
- smem.setTipNode(sink);
- break;
- }
- } else {
- // not in same segment
- smem.setTipNode(tupleSource);
- break;
- }
- }
- smem.setAllLinkedMaskTest(allLinkedTestMask);
- smem.setNodeMemories(memories.toArray(new Memory[memories.size()]));
-
- // Update the memory linked references
- Memory lastMem = null;
- for (Memory mem : memories) {
- if (lastMem != null) {
- mem.setPrevious(lastMem);
- lastMem.setNext(mem);
- }
- lastMem = mem;
- }
-
- // iterate to find root and determine the SegmentNodes position in the
RuleSegment
- LeftTupleSource pathRoot = segmentRoot;
- int ruleSegmentPosMask = 1;
- int counter = 0;
- while (!NodeTypeEnums.isLeftInputAdapterNode(pathRoot)) {
- LeftTupleSource leftTupleSource = pathRoot.getLeftTupleSource();
- if (isNonTerminalTipNode(leftTupleSource, null)) {
- // for each new found segment, increase the mask bit position
- ruleSegmentPosMask = ruleSegmentPosMask << 1;
- counter++;
- }
- pathRoot = leftTupleSource;
- }
- smem.setSegmentPosMaskBit(ruleSegmentPosMask);
- smem.setPos(counter);
-
- updateSubnetworkAndTerminalMemory(reteEvaluator, tupleSource,
tupleSource, smem, false, nodeTypesInSegment);
-
-
reteEvaluator.getKnowledgeBase().getSegmentPrototypeRegistry().registerSegmentPrototype(segmentRoot,
smem.getSegmentPrototype()
- .initFromSegmentMemory(smem));
-
- return smem;
- }
-
- private static boolean processQueryNode(ReteEvaluator reteEvaluator,
- QueryElementNode queryNode,
- LeftTupleSource segmentRoot,
- SegmentMemory smem,
- List<Memory> memories,
- long nodePosMask) {
- // Initialize the QueryElementNode and have it's memory reference the
actual query SegmentMemory
- SegmentMemory querySmem = getQuerySegmentMemory(reteEvaluator,
queryNode);
- QueryElementNode.QueryElementNodeMemory queryNodeMem =
reteEvaluator.getNodeMemory(queryNode);
- queryNodeMem.setNodePosMaskBit(nodePosMask);
- queryNodeMem.setQuerySegmentMemory(querySmem);
- queryNodeMem.setSegmentMemory(smem);
- memories.add(queryNodeMem);
- return !queryNode.getQueryElement().isAbductive();
- }
-
- private static void processFromNode(ReteEvaluator reteEvaluator,
- MemoryFactory tupleSource,
- SegmentMemory smem,
- List<Memory> memories) {
- Memory mem = reteEvaluator.getNodeMemory(tupleSource);
- memories.add(mem);
- mem.setSegmentMemory(smem);
- }
-
- private static void processAsyncSendNode(ReteEvaluator reteEvaluator,
- MemoryFactory tupleSource,
- SegmentMemory smem,
- List<Memory> memories) {
- Memory mem = reteEvaluator.getNodeMemory(tupleSource);
- mem.setSegmentMemory(smem);
- memories.add(mem);
- }
-
- private static void processAsyncReceiveNode(ReteEvaluator reteEvaluator,
- AsyncReceiveNode tupleSource,
- SegmentMemory smem,
- List<Memory> memories,
- long nodePosMask) {
- AsyncReceiveNode.AsyncReceiveMemory tnMem =
reteEvaluator.getNodeMemory(tupleSource);
- memories.add(tnMem);
- tnMem.setNodePosMaskBit(nodePosMask);
- tnMem.setSegmentMemory(smem);
- }
-
- private static void processReactiveFromNode(ReteEvaluator reteEvaluator,
- MemoryFactory tupleSource,
- SegmentMemory smem,
- List<Memory> memories,
- long nodePosMask) {
- FromNode.FromMemory mem = ((FromNode.FromMemory)
reteEvaluator.getNodeMemory(tupleSource));
- memories.add(mem);
- mem.setSegmentMemory(smem);
- mem.setNodePosMaskBit(nodePosMask);
- }
-
- private static boolean processBranchNode(ReteEvaluator reteEvaluator,
- ConditionalBranchNode tupleSource,
- SegmentMemory smem,
- List<Memory> memories) {
- ConditionalBranchNode.ConditionalBranchMemory branchMem =
reteEvaluator.getNodeMemory(tupleSource);
- memories.add(branchMem);
- branchMem.setSegmentMemory(smem);
- // nodes after a branch CE can notify, but they cannot impact linking
- return false;
- }
-
- private static void processEvalNode(ReteEvaluator reteEvaluator,
- EvalConditionNode tupleSource,
- SegmentMemory smem,
- List<Memory> memories) {
- EvalConditionNode.EvalMemory evalMem =
reteEvaluator.getNodeMemory(tupleSource);
- memories.add(evalMem);
- evalMem.setSegmentMemory(smem);
- }
-
- private static void processTimerNode(ReteEvaluator reteEvaluator,
- TimerNode tupleSource,
- SegmentMemory smem,
- List<Memory> memories,
- long nodePosMask) {
- TimerNode.TimerNodeMemory tnMem =
reteEvaluator.getNodeMemory(tupleSource);
- memories.add(tnMem);
- tnMem.setNodePosMaskBit(nodePosMask);
- tnMem.setSegmentMemory(smem);
- }
-
- private static long processLiaNode(ReteEvaluator reteEvaluator,
- LeftInputAdapterNode tupleSource,
- SegmentMemory smem,
- List<Memory> memories,
- long nodePosMask,
- long allLinkedTestMask) {
- LeftInputAdapterNode.LiaNodeMemory liaMemory =
reteEvaluator.getNodeMemory(tupleSource);
- memories.add(liaMemory);
- liaMemory.setSegmentMemory(smem);
- liaMemory.setNodePosMaskBit(nodePosMask);
- allLinkedTestMask = allLinkedTestMask | nodePosMask;
- return allLinkedTestMask;
- }
-
- private static long processBetaNode(ReteEvaluator reteEvaluator,
- BetaNode betaNode,
- SegmentMemory smem,
- List<Memory> memories,
- long nodePosMask,
- long allLinkedTestMask,
- boolean updateNodeBit) {
- BetaMemory bm;
- if (NodeTypeEnums.AccumulateNode == betaNode.getType()) {
- AccumulateNode.AccumulateMemory accMemory =
((AccumulateNode.AccumulateMemory) reteEvaluator.getNodeMemory(betaNode));
- memories.add(accMemory);
- accMemory.setSegmentMemory(smem);
-
- bm = accMemory.getBetaMemory();
- } else {
- bm = (BetaMemory) reteEvaluator.getNodeMemory(betaNode);
- memories.add(bm);
- }
-
- bm.setSegmentMemory(smem);
-
- // this must be set first, to avoid recursion as sub networks can be
initialised multiple ways
- // and bm.getSegmentMemory == null check can be used to avoid
recursion.
- bm.setSegmentMemory(smem);
-
- if (betaNode.getRightInput().inputIsTupleToObjectNode()) {
- TupleToObjectNode tton =
createSubnetworkSegmentMemory(reteEvaluator, betaNode);
-
- PathMemory subnetworkPathMemory =
reteEvaluator.getNodeMemory(tton);
- bm.setSubnetworkPathMemory((SubnetworkPathMemory)
subnetworkPathMemory);
- if (updateNodeBit && canBeDisabled(betaNode) &&
subnetworkPathMemory.getAllLinkedMaskTest() > 0) {
- // only TupleToObjectNode's with reactive subnetworks can be
disabled and thus need checking
- allLinkedTestMask = allLinkedTestMask | nodePosMask;
- }
- } else if (updateNodeBit && canBeDisabled(betaNode)) {
- allLinkedTestMask = allLinkedTestMask | nodePosMask;
-
- }
- bm.setNodePosMaskBit(nodePosMask);
- if (NodeTypeEnums.NotNode == betaNode.getType()) {
- // not nodes start up linked in
- smem.linkNodeWithoutRuleNotify(bm.getNodePosMaskBit());
- }
- return allLinkedTestMask;
- }
-
- /**
- * This adds the segment memory to the terminal node or TupleToObjectNode
node's list of memories.
- * In the case of the terminal node this allows it to know that all
segments from
- * the tip to root are linked.
- * In the case of the ria node its all the segments up to the start of the
subnetwork.
- * This is because the TupleToObjectNode only cares if all of it's
segments are linked, then
- * it sets the bit of node it is the right input for.
- */
- private static int updateSubnetworkAndTerminalMemory(ReteEvaluator
reteEvaluator,
- LeftTupleSource lt,
- LeftTupleSource
originalLt,
- SegmentMemory smem,
- boolean fromPrototype,
- int
nodeTypesInSegment) {
-
- nodeTypesInSegment = checkSegmentBoundary(reteEvaluator, lt,
nodeTypesInSegment);
-
- PathMemory pmem = null;
- for (LeftTupleSink sink : lt.getSinkPropagator().getSinks()) {
- if (NodeTypeEnums.isLeftTupleSource(sink)) {
- nodeTypesInSegment =
updateSubnetworkAndTerminalMemory(reteEvaluator, (LeftTupleSource) sink,
- originalLt, smem, fromPrototype, nodeTypesInSegment);
- } else if (sink.getType() == NodeTypeEnums.TupleToObjectNode) {
- // Even though we don't add the pmem and smem together, all
pmem's for all pathend nodes must be initialized
- SubnetworkPathMemory subnMem = (SubnetworkPathMemory)
reteEvaluator.getNodeMemory((MemoryFactory) sink);
- // Only add the TupleToObjectNode, if the LeftTupleSource is
part of the TupleToObjectNode subnetwork
- if (inSubNetwork((TupleToObjectNode) sink, originalLt)) {
- pmem = subnMem;
-
- if (fromPrototype) {
- ObjectSink[] nodes = ((TupleToObjectNode)
sink).getObjectSinkPropagator().getSinks();
- for (ObjectSink node : nodes) {
- // check if the SegmentMemory has been already
created by the BetaNode and if so avoid to build it twice
- if (NodeTypeEnums.isLeftTupleSource(node) &&
reteEvaluator.getNodeMemory(
- (MemoryFactory) node).getSegmentMemory()
== null) {
- restoreSegmentFromPrototype(reteEvaluator,
(LeftTupleSource) node, nodeTypesInSegment);
- }
- }
- } else if ((pmem.getAllLinkedMaskTest() & (1L <<
pmem.getSegmentMemories().length)) == 0) {
- // must eagerly initialize child segment memories
- ObjectSink[] nodes = ((TupleToObjectNode)
sink).getObjectSinkPropagator().getSinks();
- for (ObjectSink node : nodes) {
- if (NodeTypeEnums.isLeftTupleSource(node)) {
- getOrCreateSegmentMemory(reteEvaluator,
(LeftTupleSource) node);
- }
- }
- }
- }
-
- } else if (NodeTypeEnums.isTerminalNode(sink)) {
- pmem = reteEvaluator.getNodeMemory((AbstractTerminalNode)
sink);
- }
-
- if (pmem != null && smem.getPos() <
pmem.getSegmentMemories().length) {
- RuntimeSegmentUtilities.addSegmentToPathMemory(pmem, smem);
- if (smem.isSegmentLinked()) {
- // not's can cause segments to be linked, and the rules
need to be notified for evaluation
- smem.notifyRuleLinkSegment();
- }
- checkEagerSegmentCreation(reteEvaluator,
sink.getLeftTupleSource(), nodeTypesInSegment);
- pmem = null;
- }
- }
- return nodeTypesInSegment;
- }
-
- private static void restoreSegmentFromPrototype(ReteEvaluator
reteEvaluator,
- LeftTupleSource
segmentRoot,
- int nodeTypesInSegment) {
- SegmentMemory smem =
reteEvaluator.getKnowledgeBase().getSegmentPrototypeRegistry().createSegmentFromPrototype(reteEvaluator,
segmentRoot);
- if (smem != null) {
- updateSubnetworkAndTerminalMemory(reteEvaluator, segmentRoot,
segmentRoot, smem, true, nodeTypesInSegment);
- }
- }
-
- private static int checkSegmentBoundary(ReteEvaluator reteEvaluator,
LeftTupleSource lt, int nodeTypesInSegment) {
- if (isRootNode(lt, null)) {
- // we are in a new child segment
- checkEagerSegmentCreation(reteEvaluator, lt.getLeftTupleSource(),
nodeTypesInSegment);
- nodeTypesInSegment = 0;
- }
- return updateNodeTypesMask(lt, nodeTypesInSegment);
- }
-
- /**
- * Is the LeftTupleSource a node in the sub network for the
RightInputAdapterNode
- * To be in the same network, it must be a node is after the two output of
the parent
- * and before the TupleToObjectNode.
- */
- private static boolean inSubNetwork(TupleToObjectNode tton,
LeftTupleSource leftTupleSource) {
- LeftTupleSource startTupleSource =
tton.getStartTupleSource().getLeftTupleSource();
- LeftTupleSource current = tton.getLeftTupleSource();
-
- while (current != startTupleSource) {
- if (current == leftTupleSource) {
- return true;
- }
- current = current.getLeftTupleSource();
- }
-
- return false;
- }
-
- public static void checkEagerSegmentCreation(ReteEvaluator reteEvaluator,
- LeftTupleSource lt,
- int nodeTypesInSegment) {
- // A Not node has to be eagerly initialized unless in its segment
there is at least a join node
- if (isSet(nodeTypesInSegment, NOT_NODE_BIT) &&
- !isSet(nodeTypesInSegment, JOIN_NODE_BIT) &&
- !isSet(nodeTypesInSegment, REACTIVE_EXISTS_NODE_BIT)) {
- getOrCreateSegmentMemory(reteEvaluator, lt);
- }
- }
}
diff --git
a/drools-core/src/main/java/org/drools/core/phreak/PropagationEntry.java
b/drools-core/src/main/java/org/drools/core/phreak/PropagationEntry.java
index 2e2772fcdb..da5dba2050 100644
--- a/drools-core/src/main/java/org/drools/core/phreak/PropagationEntry.java
+++ b/drools-core/src/main/java/org/drools/core/phreak/PropagationEntry.java
@@ -189,7 +189,7 @@ public interface PropagationEntry {
LeftInputAdapterNode lian = (LeftInputAdapterNode) lts;
LeftInputAdapterNode.LiaNodeMemory lmem =
reteEvaluator.getNodeMemory( lian );
if ( lmem.getSegmentMemory() == null ) {
-
RuntimeSegmentUtilities.getOrCreateSegmentMemory(reteEvaluator, lts, lmem);
+
reteEvaluator.getSegmentMemorySupport().getOrCreateSegmentMemory(lts, lmem);
}
LeftInputAdapterNode.doInsertObject( handle, pCtx, lian,
reteEvaluator, lmem, false, queryObject.isOpen() );
diff --git
a/drools-core/src/main/java/org/drools/core/phreak/RuleNetworkEvaluator.java
b/drools-core/src/main/java/org/drools/core/phreak/RuleNetworkEvaluator.java
index 75a9a6a07b..7f27978925 100644
--- a/drools-core/src/main/java/org/drools/core/phreak/RuleNetworkEvaluator.java
+++ b/drools-core/src/main/java/org/drools/core/phreak/RuleNetworkEvaluator.java
@@ -259,7 +259,7 @@ public class RuleNetworkEvaluator {
// this is needed for subnetworks that feed into a
parent network that has no right inputs,
// and may not yet be initialized
if (smem.isEmpty() &&
!NodeTypeEnums.isTerminalNode(smem.getTipNode())) {
-
RuntimeSegmentUtilities.createChildSegments(activationsManager.getReteEvaluator(),
smem.getTipNode().getSinkPropagator(), smem);
+
activationsManager.getReteEvaluator().getSegmentMemorySupport().createChildSegments(smem.getTipNode().getSinkPropagator(),
smem);
}
smem = smems[i];
@@ -430,7 +430,7 @@ public class RuleNetworkEvaluator {
if (node == smem.getTipNode()) {
// we are about to process the segment tip, allow it to merge
insert/update/delete clashes
if (smem.isEmpty()) {
- RuntimeSegmentUtilities.createChildSegments(reteEvaluator,
((LeftTupleSource) node).getSinkPropagator(), smem);
+
reteEvaluator.getSegmentMemorySupport().createChildSegments(((LeftTupleSource)
node).getSinkPropagator(), smem);
}
return smem.getFirst().getStagedLeftTuples().takeAll();
} else {
diff --git
a/drools-core/src/main/java/org/drools/core/phreak/RuntimeSegmentUtilities.java
b/drools-core/src/main/java/org/drools/core/phreak/RuntimeSegmentUtilities.java
deleted file mode 100644
index 8baff7d0c2..0000000000
---
a/drools-core/src/main/java/org/drools/core/phreak/RuntimeSegmentUtilities.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.drools.core.phreak;
-
-import org.drools.base.reteoo.NodeTypeEnums;
-import org.drools.base.rule.constraint.QueryNameConstraint;
-import org.drools.core.common.Memory;
-import org.drools.core.common.MemoryFactory;
-import org.drools.core.common.ReteEvaluator;
-import org.drools.core.reteoo.AlphaNode;
-import org.drools.core.reteoo.BetaNode;
-import org.drools.core.reteoo.LeftInputAdapterNode;
-import org.drools.core.reteoo.LeftInputAdapterNode.LiaNodeMemory;
-import org.drools.core.reteoo.LeftTupleNode;
-import org.drools.core.reteoo.LeftTupleSinkNode;
-import org.drools.core.reteoo.LeftTupleSinkPropagator;
-import org.drools.core.reteoo.LeftTupleSource;
-import org.drools.core.reteoo.ObjectSink;
-import org.drools.core.reteoo.ObjectTypeNode;
-import org.drools.core.reteoo.PathEndNode;
-import org.drools.core.reteoo.PathMemory;
-import org.drools.core.reteoo.QueryElementNode;
-import org.drools.core.reteoo.TupleToObjectNode;
-import org.drools.core.reteoo.SegmentMemory;
-import org.drools.core.reteoo.SegmentMemory.SegmentPrototype;
-import org.drools.core.reteoo.SegmentPrototypeRegistry;
-
-import static org.drools.core.phreak.EagerPhreakBuilder.isInsideSubnetwork;
-
-public class RuntimeSegmentUtilities {
-
- /**
- * Initialises the NodeSegment memory for all nodes in the segment.
- */
- public static SegmentMemory getOrCreateSegmentMemory(ReteEvaluator
reteEvaluator, LeftTupleNode node) {
- return getOrCreateSegmentMemory(reteEvaluator, node,
reteEvaluator.getNodeMemory(
- (MemoryFactory<? extends Memory>) node));
- }
-
- /**
- * Initialises the NodeSegment memory for all nodes in the segment.
- */
- public static SegmentMemory getOrCreateSegmentMemory(ReteEvaluator
reteEvaluator,
- LeftTupleNode node,
- Memory memory) {
- SegmentMemory smem = memory.getSegmentMemory();
- if (smem != null) {
- return smem;
- }
-
- // find segment root
- LeftTupleNode segmentRoot =
BuildtimeSegmentUtilities.findSegmentRoot(node);
-
- smem = restoreSegmentFromPrototype(reteEvaluator, segmentRoot);
- if (smem != null) {
- if (NodeTypeEnums.isBetaNode(segmentRoot) &&
segmentRoot.inputIsTupleToObjectNode()) {
- createSubnetworkSegmentMemory(reteEvaluator, (BetaNode)
segmentRoot);
- }
- return smem;
- }
-
- // it should not be possible to reach here, for BuildTimeSegmentProtos
- return LazyPhreakBuilder.createSegmentMemory(reteEvaluator,
segmentRoot);
- }
-
- private static SegmentMemory restoreSegmentFromPrototype(ReteEvaluator
reteEvaluator, LeftTupleNode segmentRoot) {
- SegmentPrototypeRegistry segmentPrototypeRegistry =
reteEvaluator.getKnowledgeBase().getSegmentPrototypeRegistry();
- SegmentPrototype proto =
segmentPrototypeRegistry.getSegmentPrototype(segmentRoot);
- if (proto == null || proto.getNodesInSegment() == null) {
- return null;
- }
-
- LeftTupleNode lastNode =
proto.getNodesInSegment()[proto.getNodesInSegment().length - 1];
-
- if (NodeTypeEnums.isTerminalNode(lastNode)) {
- // If the last node is a tn and it's pmem does not exist,
instantiate it separately to avoid a recursive smem/pmem creation.
- // As the smem will create the pmem and thus peek will no longer
work.
- PathMemory pmem = (PathMemory)
reteEvaluator.getNodeMemories().peekNodeMemory(lastNode);
- if (pmem == null) {
- pmem = initializePathMemory(reteEvaluator, (PathEndNode)
lastNode);
- }
-
- SegmentMemory smem = pmem.getSegmentMemories()[proto.getPos()];
- if (smem != null) {
- return smem;
- }
- }
-
- SegmentMemory smem =
segmentPrototypeRegistry.createSegmentFromPrototype(reteEvaluator, proto);
-
- updateSubnetworkAndTerminalMemory(reteEvaluator, smem, proto);
-
- return smem;
- }
-
- public static SegmentMemory getQuerySegmentMemory(ReteEvaluator
reteEvaluator, QueryElementNode queryNode) {
- ObjectTypeNode queryOtn =
reteEvaluator.getDefaultEntryPoint().getEntryPointNode().getQueryNode();
- LeftInputAdapterNode liaNode = getQueryLiaNode(queryOtn,
queryNode.getQueryElement().getQueryName());
- LiaNodeMemory liam = reteEvaluator.getNodeMemory(liaNode);
- SegmentMemory querySmem = liam.getSegmentMemory();
- if (querySmem == null) {
- querySmem = getOrCreateSegmentMemory(reteEvaluator, liaNode, liam);
- }
- return querySmem;
- }
-
- static TupleToObjectNode createSubnetworkSegmentMemory(ReteEvaluator
reteEvaluator, BetaNode betaNode) {
- TupleToObjectNode tton = (TupleToObjectNode)
betaNode.getRightInput().getParent();
-
- LeftTupleSource subnetworkLts = tton.getStartTupleSource();
-
- Memory rootSubNetwokrMem = reteEvaluator.getNodeMemory((MemoryFactory)
subnetworkLts);
- SegmentMemory subNetworkSegmentMemory =
rootSubNetwokrMem.getSegmentMemory();
- if (subNetworkSegmentMemory == null) {
- // we need to stop recursion here
- getOrCreateSegmentMemory(reteEvaluator, subnetworkLts,
rootSubNetwokrMem);
- }
- return tton;
- }
-
- public static void createChildSegments(ReteEvaluator reteEvaluator,
- LeftTupleSinkPropagator sinkProp,
- SegmentMemory smem) {
- if (!smem.isEmpty()) {
- return; // this can happen when multiple threads are trying to
initialize the segment
- }
- for (LeftTupleSinkNode sink = sinkProp.getFirstLeftTupleSink(); sink
!= null; sink = sink
- .getNextLeftTupleSinkNode()) {
- SegmentMemory childSmem = PhreakBuilder.isEagerSegmentCreation() ?
createChildSegment(reteEvaluator, sink)
- : LazyPhreakBuilder.createChildSegment(reteEvaluator,
sink);
- smem.add(childSmem);
- }
- }
-
- public static SegmentMemory createChildSegment(ReteEvaluator
reteEvaluator, LeftTupleNode node) {
- Memory memory = reteEvaluator.getNodeMemory((MemoryFactory) node);
- if (memory.getSegmentMemory() == null) {
- getOrCreateSegmentMemory(reteEvaluator, node, memory);
- }
- return memory.getSegmentMemory();
- }
-
- /**
- * This adds the segment memory to the terminal node or TupleToObjectNode
node's list of memories.
- * In the case of the terminal node this allows it to know that all
segments from
- * the tip to root are linked.
- * In the case of the TupleToObjectNode node its all the segments up to
the start of the subnetwork.
- * This is because the TupleToObjectNode only cares if all of it's
segments are linked, then
- * it sets the bit of node it is the right input for.
- */
- private static void updateSubnetworkAndTerminalMemory(ReteEvaluator
reteEvaluator,
- SegmentMemory smem,
- SegmentPrototype
proto) {
- for (PathEndNode endNode : proto.getPathEndNodes()) {
- if (!isInsideSubnetwork(endNode, proto)) {
- // While SegmentPrototypes are added for entire path, for
traversal reasons.
- // SegmenrMemory's themselves are only added to the PathMemory
for path or subpath the are part of.
- continue;
- }
-
- PathMemory pmem = (PathMemory)
reteEvaluator.getNodeMemories().peekNodeMemory(endNode);
- if (pmem != null) {
- RuntimeSegmentUtilities.addSegmentToPathMemory(pmem, smem);
- } else {
- pmem =
reteEvaluator.getNodeMemories().getNodeMemory((MemoryFactory<? extends
PathMemory>) endNode);
- RuntimeSegmentUtilities.addSegmentToPathMemory(pmem, smem); //
this needs to be set before init, to avoid recursion during eager segment
initialisation
- pmem.setSegmentMemory(smem.getPos(), smem);
- initializePathMemory(reteEvaluator, endNode, pmem);
- }
-
- if (smem.getAllLinkedMaskTest() > 0 && smem.isSegmentLinked()) {
- // not's can cause segments to be linked, and the rules need
to be notified for evaluation
- smem.notifyRuleLinkSegment();
- }
- }
- }
-
- public static void addSegmentToPathMemory(PathMemory pmem, SegmentMemory
smem) {
- if (smem.getRootNode().getPathIndex() >=
pmem.getPathEndNode().getStartTupleSource().getPathIndex()) {
- smem.addPathMemory(pmem);
- pmem.setSegmentMemory(smem.getPos(), smem);
- }
-
- }
-
- public static PathMemory initializePathMemory(ReteEvaluator reteEvaluator,
PathEndNode pathEndNode) {
- PathMemory pmem =
reteEvaluator.getNodeMemories().getNodeMemory(pathEndNode);
- initializePathMemory(reteEvaluator, pathEndNode, pmem);
- return pmem;
- }
-
- private static void initializePathMemory(ReteEvaluator reteEvaluator,
PathEndNode pathEndNode, PathMemory pmem) {
- if (pathEndNode.getEagerSegmentPrototypes() != null) {
- for (SegmentPrototype eager :
pathEndNode.getEagerSegmentPrototypes()) {
- if (pmem.getSegmentMemories()[eager.getPos()] == null) {
- getOrCreateSegmentMemory(reteEvaluator,
eager.getRootNode());
- }
- }
- }
- }
-
- private static LeftInputAdapterNode getQueryLiaNode(ObjectTypeNode
queryOtn, String queryName) {
- for (ObjectSink sink : queryOtn.getObjectSinkPropagator().getSinks()) {
- AlphaNode alphaNode = (AlphaNode) sink;
- QueryNameConstraint nameConstraint = (QueryNameConstraint)
alphaNode.getConstraint();
- if (queryName.equals(nameConstraint.getQueryName())) {
- return (LeftInputAdapterNode)
alphaNode.getObjectSinkPropagator().getSinks()[0];
- }
- }
-
- throw new RuntimeException("Unable to find query '" + queryName + "'");
- }
-}
diff --git
a/drools-core/src/main/java/org/drools/core/phreak/SegmentMemorySupportImpl.java
b/drools-core/src/main/java/org/drools/core/phreak/SegmentMemorySupportImpl.java
new file mode 100644
index 0000000000..d7b277af20
--- /dev/null
+++
b/drools-core/src/main/java/org/drools/core/phreak/SegmentMemorySupportImpl.java
@@ -0,0 +1,658 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.drools.core.phreak;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.base.reteoo.NodeTypeEnums;
+import org.drools.base.rule.constraint.QueryNameConstraint;
+import org.drools.core.WorkingMemoryEntryPoint;
+import org.drools.core.common.Memory;
+import org.drools.core.common.MemoryFactory;
+import org.drools.core.common.NodeMemories;
+import org.drools.core.common.SegmentMemorySupport;
+import org.drools.core.reteoo.AbstractTerminalNode;
+import org.drools.core.reteoo.AccumulateNode;
+import org.drools.core.reteoo.AlphaNode;
+import org.drools.core.reteoo.AsyncReceiveNode;
+import org.drools.core.reteoo.AsyncSendNode;
+import org.drools.core.reteoo.BetaMemory;
+import org.drools.core.reteoo.BetaNode;
+import org.drools.core.reteoo.ConditionalBranchNode;
+import org.drools.core.reteoo.EvalConditionNode;
+import org.drools.core.reteoo.FromNode;
+import org.drools.core.reteoo.LeftInputAdapterNode;
+import org.drools.core.reteoo.LeftTupleNode;
+import org.drools.core.reteoo.LeftTupleSink;
+import org.drools.core.reteoo.LeftTupleSinkNode;
+import org.drools.core.reteoo.LeftTupleSinkPropagator;
+import org.drools.core.reteoo.LeftTupleSource;
+import org.drools.core.reteoo.ObjectSink;
+import org.drools.core.reteoo.ObjectTypeNode;
+import org.drools.core.reteoo.PathEndNode;
+import org.drools.core.reteoo.PathMemory;
+import org.drools.core.reteoo.QueryElementNode;
+import org.drools.core.reteoo.SegmentMemory;
+import org.drools.core.reteoo.SegmentPrototypeRegistry;
+import org.drools.core.reteoo.TimerNode;
+import org.drools.core.reteoo.TupleToObjectNode;
+import org.drools.core.reteoo.LeftInputAdapterNode.LiaNodeMemory;
+import org.drools.core.reteoo.SegmentMemory.SegmentPrototype;
+import org.drools.core.reteoo.TupleToObjectNode.SubnetworkPathMemory;
+
+import static org.drools.core.phreak.BuildtimeSegmentUtilities.JOIN_NODE_BIT;
+import static org.drools.core.phreak.BuildtimeSegmentUtilities.NOT_NODE_BIT;
+import static
org.drools.core.phreak.BuildtimeSegmentUtilities.REACTIVE_EXISTS_NODE_BIT;
+import static org.drools.core.phreak.BuildtimeSegmentUtilities.canBeDisabled;
+import static
org.drools.core.phreak.BuildtimeSegmentUtilities.isNonTerminalTipNode;
+import static org.drools.core.phreak.BuildtimeSegmentUtilities.isRootNode;
+import static org.drools.core.phreak.BuildtimeSegmentUtilities.isSet;
+import static org.drools.core.phreak.BuildtimeSegmentUtilities.nextNodePosMask;
+import static
org.drools.core.phreak.BuildtimeSegmentUtilities.updateNodeTypesMask;
+import static org.drools.core.phreak.EagerPhreakBuilder.isInsideSubnetwork;
+
+public class SegmentMemorySupportImpl implements SegmentMemorySupport {
+
+ private final NodeMemories nodeMemories;
+ private final SegmentPrototypeRegistry segmentPrototypeRegistry;
+ private final WorkingMemoryEntryPoint defaultEntryPoint;
+
+ public SegmentMemorySupportImpl(NodeMemories nodeMemories,
+ SegmentPrototypeRegistry
segmentPrototypeRegistry,
+ WorkingMemoryEntryPoint defaultEntryPoint)
{
+ this.nodeMemories = nodeMemories;
+ this.segmentPrototypeRegistry = segmentPrototypeRegistry;
+ this.defaultEntryPoint = defaultEntryPoint;
+ }
+
+ /**
+ * Initialises the NodeSegment memory for all nodes in the segment.
+ */
+ public SegmentMemory getOrCreateSegmentMemory(LeftTupleNode node) {
+ return getOrCreateSegmentMemory(node, nodeMemories.getNodeMemory(
+ (MemoryFactory<? extends Memory>) node));
+ }
+
+ /**
+ * Initialises the NodeSegment memory for all nodes in the segment.
+ */
+ public SegmentMemory getOrCreateSegmentMemory(LeftTupleNode node, Memory
memory) {
+ SegmentMemory smem = memory.getSegmentMemory();
+ if (smem != null) {
+ return smem;
+ }
+
+ // find segment root
+ LeftTupleNode segmentRoot =
BuildtimeSegmentUtilities.findSegmentRoot(node);
+
+ smem = restoreSegmentFromPrototype(segmentRoot);
+ if (smem != null) {
+ if (NodeTypeEnums.isBetaNode(segmentRoot) &&
segmentRoot.inputIsTupleToObjectNode()) {
+ createSubnetworkSegmentMemory((BetaNode) segmentRoot);
+ }
+ return smem;
+ }
+
+ // it should not be possible to reach here, for BuildTimeSegmentProtos
+ return createSegmentMemoryLazily(segmentRoot);
+ }
+
+ private SegmentMemory createSegmentMemoryLazily(LeftTupleNode segmentRoot)
{
+ if (NodeTypeEnums.isTerminalNode(segmentRoot)) {
+ Memory memory = nodeMemories.getNodeMemory((MemoryFactory)
segmentRoot);
+ return createChildSegmentForTerminalNode(segmentRoot, memory);
+ }
+ return createSegmentMemoryLazily((LeftTupleSource) segmentRoot);
+ }
+
+ private static SegmentMemory
createChildSegmentForTerminalNode(LeftTupleNode node, Memory memory) {
+ SegmentMemory childSmem = new SegmentMemory(node); // rtns or
TupleToObjectNodes don't need a queue
+ PathMemory pmem = (PathMemory) memory;
+
+ childSmem.setPos(pmem.getSegmentMemories().length - 1);
+ pmem.setSegmentMemory(childSmem);
+ pmem.addSegmentToPathMemory(childSmem);
+
+ childSmem.setTipNode(node);
+ childSmem.setNodeMemories(new Memory[]{memory});
+ return childSmem;
+ }
+
+ private SegmentMemory restoreSegmentFromPrototype(LeftTupleNode
segmentRoot) {
+ SegmentPrototype proto =
segmentPrototypeRegistry.getSegmentPrototype(segmentRoot);
+ if (proto == null || proto.getNodesInSegment() == null) {
+ return null;
+ }
+
+ LeftTupleNode lastNode =
proto.getNodesInSegment()[proto.getNodesInSegment().length - 1];
+
+ if (NodeTypeEnums.isTerminalNode(lastNode)) {
+ // If the last node is a tn and it's pmem does not exist,
instantiate it separately to avoid a recursive smem/pmem creation.
+ // As the smem will create the pmem and thus peek will no longer
work.
+ PathMemory pmem = (PathMemory)
nodeMemories.peekNodeMemory(lastNode);
+ if (pmem == null) {
+ pmem = initializePathMemory((PathEndNode) lastNode);
+ }
+
+ SegmentMemory smem = pmem.getSegmentMemories()[proto.getPos()];
+ if (smem != null) {
+ return smem;
+ }
+ }
+
+ SegmentMemory smem =
segmentPrototypeRegistry.createSegmentFromPrototype(proto, nodeMemories, this);
+
+ updateSubnetworkAndTerminalMemory(smem, proto);
+
+ return smem;
+ }
+
+ private void restoreSegmentFromPrototypeLazily(LeftTupleSource segmentRoot,
+ int nodeTypesInSegment) {
+ SegmentMemory smem =
segmentPrototypeRegistry.createSegmentFromPrototype(nodeMemories, this,
segmentRoot);
+ if (smem != null) {
+ updateSubnetworkAndTerminalMemoryLazily(segmentRoot, segmentRoot,
smem, true, nodeTypesInSegment);
+ }
+ }
+
+ public SegmentMemory getQuerySegmentMemory(QueryElementNode queryNode) {
+ ObjectTypeNode queryOtn =
defaultEntryPoint.getEntryPointNode().getQueryNode();
+ LeftInputAdapterNode liaNode = getQueryLiaNode(queryOtn,
queryNode.getQueryElement().getQueryName());
+ LiaNodeMemory liam = nodeMemories.getNodeMemory(liaNode);
+ SegmentMemory querySmem = liam.getSegmentMemory();
+ if (querySmem == null) {
+ querySmem = getOrCreateSegmentMemory(liaNode, liam);
+ }
+ return querySmem;
+ }
+
+ private TupleToObjectNode createSubnetworkSegmentMemory(BetaNode betaNode)
{
+ TupleToObjectNode tton = (TupleToObjectNode)
betaNode.getRightInput().getParent();
+
+ LeftTupleSource subnetworkLts = tton.getStartTupleSource();
+
+ Memory rootSubNetwokrMem = nodeMemories.getNodeMemory((MemoryFactory)
subnetworkLts);
+ SegmentMemory subNetworkSegmentMemory =
rootSubNetwokrMem.getSegmentMemory();
+ if (subNetworkSegmentMemory == null) {
+ // we need to stop recursion here
+ getOrCreateSegmentMemory(subnetworkLts, rootSubNetwokrMem);
+ }
+ return tton;
+ }
+
+ public SegmentMemory createChildSegmentLazily(LeftTupleNode node) {
+ Memory memory = nodeMemories.getNodeMemory((MemoryFactory) node);
+ if (memory.getSegmentMemory() == null) {
+ if (NodeTypeEnums.isEndNode(node)) {
+ // RTNS and TupleToObjectNode's have their own segment, if
they are the child of a split.
+ createChildSegmentForTerminalNode(node, memory);
+ } else {
+ createSegmentMemoryLazily((LeftTupleSource) node);
+ }
+ }
+ return memory.getSegmentMemory();
+ }
+
+ public void createChildSegments(LeftTupleSinkPropagator sinkProp,
SegmentMemory smem) {
+ if (!smem.isEmpty()) {
+ return; // this can happen when multiple threads are trying to
initialize the segment
+ }
+ for (LeftTupleSinkNode sink = sinkProp.getFirstLeftTupleSink(); sink
!= null; sink = sink
+ .getNextLeftTupleSinkNode()) {
+ SegmentMemory childSmem = PhreakBuilder.isEagerSegmentCreation() ?
createChildSegment(sink)
+ : createChildSegmentLazily(sink);
+ smem.add(childSmem);
+ }
+ }
+
+ public SegmentMemory createChildSegment(LeftTupleNode node) {
+ Memory memory = nodeMemories.getNodeMemory((MemoryFactory) node);
+ if (memory.getSegmentMemory() == null) {
+ getOrCreateSegmentMemory(node, memory);
+ }
+ return memory.getSegmentMemory();
+ }
+
+ /**
+ * This adds the segment memory to the terminal node or TupleToObjectNode
node's list of memories.
+ * In the case of the terminal node this allows it to know that all
segments from
+ * the tip to root are linked.
+ * In the case of the TupleToObjectNode node its all the segments up to
the start of the subnetwork.
+ * This is because the TupleToObjectNode only cares if all of it's
segments are linked, then
+ * it sets the bit of node it is the right input for.
+ */
+ private void updateSubnetworkAndTerminalMemory(SegmentMemory smem,
SegmentPrototype proto) {
+ for (PathEndNode endNode : proto.getPathEndNodes()) {
+ if (!isInsideSubnetwork(endNode, proto)) {
+ // While SegmentPrototypes are added for entire path, for
traversal reasons.
+ // SegmenrMemory's themselves are only added to the PathMemory
for path or subpath the are part of.
+ continue;
+ }
+
+ PathMemory pmem = (PathMemory)
nodeMemories.peekNodeMemory(endNode);
+ if (pmem != null) {
+ pmem.addSegmentToPathMemory(smem);
+ } else {
+ pmem = nodeMemories.getNodeMemory((MemoryFactory<? extends
PathMemory>) endNode);
+ pmem.addSegmentToPathMemory(smem); // this needs to be set
before init, to avoid recursion during eager segment initialisation
+ pmem.setSegmentMemory(smem.getPos(), smem);
+ initializePathMemory(endNode, pmem);
+ }
+
+ if (smem.getAllLinkedMaskTest() > 0 && smem.isSegmentLinked()) {
+ // not's can cause segments to be linked, and the rules need
to be notified for evaluation
+ smem.notifyRuleLinkSegment();
+ }
+ }
+ }
+
+ public PathMemory initializePathMemory(PathEndNode pathEndNode) {
+ PathMemory pmem = nodeMemories.getNodeMemory(pathEndNode);
+ initializePathMemory(pathEndNode, pmem);
+ return pmem;
+ }
+
+ private void initializePathMemory(PathEndNode pathEndNode, PathMemory
pmem) {
+ if (pathEndNode.getEagerSegmentPrototypes() != null) {
+ for (SegmentPrototype eager :
pathEndNode.getEagerSegmentPrototypes()) {
+ if (pmem.getSegmentMemories()[eager.getPos()] == null) {
+ getOrCreateSegmentMemory(eager.getRootNode());
+ }
+ }
+ }
+ }
+
+ private LeftInputAdapterNode getQueryLiaNode(ObjectTypeNode queryOtn,
String queryName) {
+ for (ObjectSink sink : queryOtn.getObjectSinkPropagator().getSinks()) {
+ AlphaNode alphaNode = (AlphaNode) sink;
+ QueryNameConstraint nameConstraint = (QueryNameConstraint)
alphaNode.getConstraint();
+ if (queryName.equals(nameConstraint.getQueryName())) {
+ return (LeftInputAdapterNode)
alphaNode.getObjectSinkPropagator().getSinks()[0];
+ }
+ }
+
+ throw new RuntimeException("Unable to find query '" + queryName + "'");
+ }
+
+ public void checkEagerSegmentCreation(LeftTupleSource lt, int
nodeTypesInSegment) {
+ // A Not node has to be eagerly initialized unless in its segment
there is at least a join node
+ if (isSet(nodeTypesInSegment, NOT_NODE_BIT) &&
+ !isSet(nodeTypesInSegment, JOIN_NODE_BIT) &&
+ !isSet(nodeTypesInSegment, REACTIVE_EXISTS_NODE_BIT)) {
+ getOrCreateSegmentMemory(lt);
+ }
+ }
+
+ private int checkSegmentBoundary(LeftTupleSource lt, int
nodeTypesInSegment) {
+ if (isRootNode(lt, null)) {
+ // we are in a new child segment
+ checkEagerSegmentCreation(lt.getLeftTupleSource(),
nodeTypesInSegment);
+ nodeTypesInSegment = 0;
+ }
+ return updateNodeTypesMask(lt, nodeTypesInSegment);
+ }
+
+ /**
+ * This adds the segment memory to the terminal node or TupleToObjectNode
node's list of memories.
+ * In the case of the terminal node this allows it to know that all
segments from
+ * the tip to root are linked.
+ * In the case of the ria node its all the segments up to the start of the
subnetwork.
+ * This is because the TupleToObjectNode only cares if all of it's
segments are linked, then
+ * it sets the bit of node it is the right input for.
+ */
+ private int updateSubnetworkAndTerminalMemoryLazily(LeftTupleSource lt,
+ LeftTupleSource
originalLt,
+ SegmentMemory smem,
+ boolean fromPrototype,
+ int
nodeTypesInSegment) {
+
+ nodeTypesInSegment = checkSegmentBoundary(lt, nodeTypesInSegment);
+
+ PathMemory pmem = null;
+ for (LeftTupleSink sink : lt.getSinkPropagator().getSinks()) {
+ if (NodeTypeEnums.isLeftTupleSource(sink)) {
+ nodeTypesInSegment =
updateSubnetworkAndTerminalMemoryLazily((LeftTupleSource) sink,
+ originalLt, smem, fromPrototype, nodeTypesInSegment);
+ } else if (sink.getType() == NodeTypeEnums.TupleToObjectNode) {
+ // Even though we don't add the pmem and smem together, all
pmem's for all pathend nodes must be initialized
+ SubnetworkPathMemory subnMem = (SubnetworkPathMemory)
nodeMemories.getNodeMemory((MemoryFactory) sink);
+ // Only add the TupleToObjectNode, if the LeftTupleSource is
part of the TupleToObjectNode subnetwork
+ if (inSubNetwork((TupleToObjectNode) sink, originalLt)) {
+ pmem = subnMem;
+
+ if (fromPrototype) {
+ ObjectSink[] nodes = ((TupleToObjectNode)
sink).getObjectSinkPropagator().getSinks();
+ for (ObjectSink node : nodes) {
+ // check if the SegmentMemory has been already
created by the BetaNode and if so avoid to build it twice
+ if (NodeTypeEnums.isLeftTupleSource(node) &&
nodeMemories.getNodeMemory(
+ (MemoryFactory) node).getSegmentMemory()
== null) {
+
restoreSegmentFromPrototypeLazily((LeftTupleSource) node, nodeTypesInSegment);
+ }
+ }
+ } else if ((pmem.getAllLinkedMaskTest() & (1L <<
pmem.getSegmentMemories().length)) == 0) {
+ // must eagerly initialize child segment memories
+ ObjectSink[] nodes = ((TupleToObjectNode)
sink).getObjectSinkPropagator().getSinks();
+ for (ObjectSink node : nodes) {
+ if (NodeTypeEnums.isLeftTupleSource(node)) {
+ getOrCreateSegmentMemory((LeftTupleSource)
node);
+ }
+ }
+ }
+ }
+
+ } else if (NodeTypeEnums.isTerminalNode(sink)) {
+ pmem = nodeMemories.getNodeMemory((AbstractTerminalNode) sink);
+ }
+
+ if (pmem != null && smem.getPos() <
pmem.getSegmentMemories().length) {
+ pmem.addSegmentToPathMemory(smem);
+ if (smem.isSegmentLinked()) {
+ // not's can cause segments to be linked, and the rules
need to be notified for evaluation
+ smem.notifyRuleLinkSegment();
+ }
+ checkEagerSegmentCreation(sink.getLeftTupleSource(),
nodeTypesInSegment);
+ pmem = null;
+ }
+ }
+ return nodeTypesInSegment;
+ }
+
+ /**
+ * Is the LeftTupleSource a node in the sub network for the
RightInputAdapterNode
+ * To be in the same network, it must be a node is after the two output of
the parent
+ * and before the TupleToObjectNode.
+ */
+ private static boolean inSubNetwork(TupleToObjectNode tton,
LeftTupleSource leftTupleSource) {
+ LeftTupleSource startTupleSource =
tton.getStartTupleSource().getLeftTupleSource();
+ LeftTupleSource current = tton.getLeftTupleSource();
+
+ while (current != startTupleSource) {
+ if (current == leftTupleSource) {
+ return true;
+ }
+ current = current.getLeftTupleSource();
+ }
+
+ return false;
+ }
+
+ public SegmentMemory createSegmentMemoryLazily(LeftTupleSource
segmentRoot) {
+ LeftTupleSource tupleSource = segmentRoot;
+ SegmentMemory smem = new SegmentMemory(segmentRoot);
+
+ // Iterate all nodes on the same segment, assigning their position as
a bit mask value
+ // allLinkedTestMask is the resulting mask used to test if all nodes
are linked in
+ long nodePosMask = 1;
+ long allLinkedTestMask = 0;
+ boolean updateNodeBit = true; // nodes after a branch CE can notify,
but they cannot impact linking
+
+ int nodeTypesInSegment = 0;
+ List<Memory> memories = new ArrayList<>();
+ while (true) {
+ nodeTypesInSegment = updateNodeTypesMask(tupleSource,
nodeTypesInSegment);
+ if (NodeTypeEnums.isBetaNode(tupleSource)) {
+ allLinkedTestMask = processBetaNode((BetaNode) tupleSource,
smem, memories, nodePosMask,
+ allLinkedTestMask,
+ updateNodeBit);
+ } else {
+ switch (tupleSource.getType()) {
+ case NodeTypeEnums.LeftInputAdapterNode:
+ case NodeTypeEnums.AlphaTerminalNode:
+ allLinkedTestMask =
processLiaNode((LeftInputAdapterNode) tupleSource, smem, memories,
+ nodePosMask, allLinkedTestMask);
+ break;
+ case NodeTypeEnums.EvalConditionNode:
+ processEvalNode((EvalConditionNode) tupleSource, smem,
memories);
+ break;
+ case NodeTypeEnums.ConditionalBranchNode:
+ updateNodeBit =
processBranchNode((ConditionalBranchNode) tupleSource, smem, memories);
+ break;
+ case NodeTypeEnums.FromNode:
+ processFromNode((FromNode) tupleSource, smem,
memories);
+ break;
+ case NodeTypeEnums.ReactiveFromNode:
+ processReactiveFromNode((MemoryFactory) tupleSource,
smem, memories, nodePosMask);
+ break;
+ case NodeTypeEnums.TimerConditionNode:
+ processTimerNode((TimerNode) tupleSource, smem,
memories, nodePosMask);
+ break;
+ case NodeTypeEnums.AsyncSendNode:
+ processAsyncSendNode((AsyncSendNode) tupleSource,
smem, memories);
+ break;
+ case NodeTypeEnums.AsyncReceiveNode:
+ processAsyncReceiveNode((AsyncReceiveNode)
tupleSource, smem, memories, nodePosMask);
+ break;
+ case NodeTypeEnums.QueryElementNode:
+ updateNodeBit = processQueryNode((QueryElementNode)
tupleSource, smem, memories,
+ nodePosMask);
+ break;
+ }
+ }
+
+ nodePosMask = nextNodePosMask(nodePosMask);
+
+ if (tupleSource.getSinkPropagator().size() == 1) {
+ LeftTupleSinkNode sink =
tupleSource.getSinkPropagator().getFirstLeftTupleSink();
+ if (NodeTypeEnums.isLeftTupleSource(sink)) {
+ tupleSource = (LeftTupleSource) sink;
+ } else {
+ // rtn or TupleToObjectNode
+ // While not technically in a segment, we want to be able
to iterate easily from the last node memory to the TupleToObjectNode/rtn memory
+ // we don't use createNodeMemory, as these may already
have been created by, but not added, by the method
updateTupleToObjectAndTerminalMemory
+ Memory memory = nodeMemories.getNodeMemory((MemoryFactory)
sink);
+ if (sink.getType() == NodeTypeEnums.TupleToObjectNode) {
+ PathMemory subnMem = (SubnetworkPathMemory) memory;
+ memories.add(subnMem);
+
+ TupleToObjectNode tton = (TupleToObjectNode) sink;
+ ObjectSink[] nodes =
tton.getObjectSinkPropagator().getSinks();
+ for (ObjectSink node : nodes) {
+ if (NodeTypeEnums.isLeftTupleSource(node)) {
+ getOrCreateSegmentMemory((LeftTupleSource)
node);
+ }
+ }
+ } else if (NodeTypeEnums.isTerminalNode(sink)) {
+ memories.add(memory);
+ }
+ memory.setSegmentMemory(smem);
+ smem.setTipNode(sink);
+ break;
+ }
+ } else {
+ // not in same segment
+ smem.setTipNode(tupleSource);
+ break;
+ }
+ }
+ smem.setAllLinkedMaskTest(allLinkedTestMask);
+ smem.setNodeMemories(memories.toArray(new Memory[memories.size()]));
+
+ // Update the memory linked references
+ Memory lastMem = null;
+ for (Memory mem : memories) {
+ if (lastMem != null) {
+ mem.setPrevious(lastMem);
+ lastMem.setNext(mem);
+ }
+ lastMem = mem;
+ }
+
+ // iterate to find root and determine the SegmentNodes position in the
RuleSegment
+ LeftTupleSource pathRoot = segmentRoot;
+ int ruleSegmentPosMask = 1;
+ int counter = 0;
+ while (!NodeTypeEnums.isLeftInputAdapterNode(pathRoot)) {
+ LeftTupleSource leftTupleSource = pathRoot.getLeftTupleSource();
+ if (isNonTerminalTipNode(leftTupleSource, null)) {
+ // for each new found segment, increase the mask bit position
+ ruleSegmentPosMask = ruleSegmentPosMask << 1;
+ counter++;
+ }
+ pathRoot = leftTupleSource;
+ }
+ smem.setSegmentPosMaskBit(ruleSegmentPosMask);
+ smem.setPos(counter);
+
+ updateSubnetworkAndTerminalMemoryLazily(tupleSource, tupleSource,
smem, false, nodeTypesInSegment);
+
+ segmentPrototypeRegistry.registerSegmentPrototype(segmentRoot,
smem.getSegmentPrototype().initFromSegmentMemory(
+ smem));
+
+ return smem;
+ }
+
+ private boolean processQueryNode(QueryElementNode queryNode,
+ SegmentMemory smem,
+ List<Memory> memories,
+ long nodePosMask) {
+ // Initialize the QueryElementNode and have it's memory reference the
actual query SegmentMemory
+ SegmentMemory querySmem = getQuerySegmentMemory(queryNode);
+ QueryElementNode.QueryElementNodeMemory queryNodeMem =
nodeMemories.getNodeMemory(queryNode);
+ queryNodeMem.setNodePosMaskBit(nodePosMask);
+ queryNodeMem.setQuerySegmentMemory(querySmem);
+ queryNodeMem.setSegmentMemory(smem);
+ memories.add(queryNodeMem);
+ return !queryNode.getQueryElement().isAbductive();
+ }
+
+ private void processFromNode(MemoryFactory tupleSource,
+ SegmentMemory smem,
+ List<Memory> memories) {
+ Memory mem = nodeMemories.getNodeMemory(tupleSource);
+ memories.add(mem);
+ mem.setSegmentMemory(smem);
+ }
+
+ private void processAsyncSendNode(MemoryFactory tupleSource,
+ SegmentMemory smem,
+ List<Memory> memories) {
+ Memory mem = nodeMemories.getNodeMemory(tupleSource);
+ mem.setSegmentMemory(smem);
+ memories.add(mem);
+ }
+
+ private void processAsyncReceiveNode(AsyncReceiveNode tupleSource,
+ SegmentMemory smem,
+ List<Memory> memories,
+ long nodePosMask) {
+ AsyncReceiveNode.AsyncReceiveMemory tnMem =
nodeMemories.getNodeMemory(tupleSource);
+ memories.add(tnMem);
+ tnMem.setNodePosMaskBit(nodePosMask);
+ tnMem.setSegmentMemory(smem);
+ }
+
+ private void processReactiveFromNode(MemoryFactory tupleSource,
+ SegmentMemory smem,
+ List<Memory> memories,
+ long nodePosMask) {
+ FromNode.FromMemory mem = ((FromNode.FromMemory)
nodeMemories.getNodeMemory(tupleSource));
+ memories.add(mem);
+ mem.setSegmentMemory(smem);
+ mem.setNodePosMaskBit(nodePosMask);
+ }
+
+ private boolean processBranchNode(ConditionalBranchNode tupleSource,
+ SegmentMemory smem,
+ List<Memory> memories) {
+ ConditionalBranchNode.ConditionalBranchMemory branchMem =
nodeMemories.getNodeMemory(tupleSource);
+ memories.add(branchMem);
+ branchMem.setSegmentMemory(smem);
+ // nodes after a branch CE can notify, but they cannot impact linking
+ return false;
+ }
+
+ private void processEvalNode(EvalConditionNode tupleSource,
+ SegmentMemory smem,
+ List<Memory> memories) {
+ EvalConditionNode.EvalMemory evalMem =
nodeMemories.getNodeMemory(tupleSource);
+ memories.add(evalMem);
+ evalMem.setSegmentMemory(smem);
+ }
+
+ private void processTimerNode(TimerNode tupleSource,
+ SegmentMemory smem,
+ List<Memory> memories,
+ long nodePosMask) {
+ TimerNode.TimerNodeMemory tnMem =
nodeMemories.getNodeMemory(tupleSource);
+ memories.add(tnMem);
+ tnMem.setNodePosMaskBit(nodePosMask);
+ tnMem.setSegmentMemory(smem);
+ }
+
+ private long processLiaNode(LeftInputAdapterNode tupleSource,
+ SegmentMemory smem,
+ List<Memory> memories,
+ long nodePosMask,
+ long allLinkedTestMask) {
+ LeftInputAdapterNode.LiaNodeMemory liaMemory =
nodeMemories.getNodeMemory(tupleSource);
+ memories.add(liaMemory);
+ liaMemory.setSegmentMemory(smem);
+ liaMemory.setNodePosMaskBit(nodePosMask);
+ allLinkedTestMask = allLinkedTestMask | nodePosMask;
+ return allLinkedTestMask;
+ }
+
+ private long processBetaNode(BetaNode betaNode,
+ SegmentMemory smem,
+ List<Memory> memories,
+ long nodePosMask,
+ long allLinkedTestMask,
+ boolean updateNodeBit) {
+ BetaMemory bm;
+ if (NodeTypeEnums.AccumulateNode == betaNode.getType()) {
+ AccumulateNode.AccumulateMemory accMemory =
((AccumulateNode.AccumulateMemory) nodeMemories.getNodeMemory(
+ betaNode));
+ memories.add(accMemory);
+ accMemory.setSegmentMemory(smem);
+
+ bm = accMemory.getBetaMemory();
+ } else {
+ bm = (BetaMemory) nodeMemories.getNodeMemory(betaNode);
+ memories.add(bm);
+ }
+
+ bm.setSegmentMemory(smem);
+
+ // this must be set first, to avoid recursion as sub networks can be
initialised multiple ways
+ // and bm.getSegmentMemory == null check can be used to avoid
recursion.
+ bm.setSegmentMemory(smem);
+
+ if (betaNode.getRightInput().inputIsTupleToObjectNode()) {
+ TupleToObjectNode tton = createSubnetworkSegmentMemory(betaNode);
+
+ PathMemory subnetworkPathMemory = nodeMemories.getNodeMemory(tton);
+ bm.setSubnetworkPathMemory((SubnetworkPathMemory)
subnetworkPathMemory);
+ if (updateNodeBit && canBeDisabled(betaNode) &&
subnetworkPathMemory.getAllLinkedMaskTest() > 0) {
+ // only TupleToObjectNode's with reactive subnetworks can be
disabled and thus need checking
+ allLinkedTestMask = allLinkedTestMask | nodePosMask;
+ }
+ } else if (updateNodeBit && canBeDisabled(betaNode)) {
+ allLinkedTestMask = allLinkedTestMask | nodePosMask;
+
+ }
+ bm.setNodePosMaskBit(nodePosMask);
+ if (NodeTypeEnums.NotNode == betaNode.getType()) {
+ // not nodes start up linked in
+ smem.linkNodeWithoutRuleNotify(bm.getNodePosMaskBit());
+ }
+ return allLinkedTestMask;
+ }
+
+}
diff --git
a/drools-core/src/main/java/org/drools/core/phreak/SegmentPropagator.java
b/drools-core/src/main/java/org/drools/core/phreak/SegmentPropagator.java
index 94347a74c4..5c116cb0cb 100644
--- a/drools-core/src/main/java/org/drools/core/phreak/SegmentPropagator.java
+++ b/drools-core/src/main/java/org/drools/core/phreak/SegmentPropagator.java
@@ -44,7 +44,7 @@ public class SegmentPropagator {
LeftTupleSource source = ( LeftTupleSource )
sourceSegment.getTipNode();
if ( sourceSegment.isEmpty() ) {
- RuntimeSegmentUtilities.createChildSegments(reteEvaluator,
source.getSinkPropagator(), sourceSegment);
+
reteEvaluator.getSegmentMemorySupport().createChildSegments(source.getSinkPropagator(),
sourceSegment);
}
processPeers(sourceSegment, leftTuples);
diff --git
a/drools-core/src/main/java/org/drools/core/reteoo/LeftInputAdapterNode.java
b/drools-core/src/main/java/org/drools/core/reteoo/LeftInputAdapterNode.java
index 39ed5cb651..a5368ff34e 100644
--- a/drools-core/src/main/java/org/drools/core/reteoo/LeftInputAdapterNode.java
+++ b/drools-core/src/main/java/org/drools/core/reteoo/LeftInputAdapterNode.java
@@ -42,7 +42,6 @@ import org.drools.core.common.SuperCacheFixer;
import org.drools.core.common.TupleSets;
import org.drools.core.common.UpdateContext;
import org.drools.core.phreak.DetachedTuple;
-import org.drools.core.phreak.RuntimeSegmentUtilities;
import org.drools.core.reteoo.builder.BuildContext;
import org.drools.core.rule.consequence.InternalMatch;
import org.drools.core.util.AbstractLinkedListNode;
@@ -180,9 +179,7 @@ public class LeftInputAdapterNode extends LeftTupleSource
if ( sm.getTipNode() == liaNode) {
// liaNode in its own segment and child segments not yet created
if ( sm.isEmpty() ) {
- RuntimeSegmentUtilities.createChildSegments(reteEvaluator,
-
liaNode.getSinkPropagator(),
- sm);
+
reteEvaluator.getSegmentMemorySupport().createChildSegments(liaNode.getSinkPropagator(),
sm);
}
sm = sm.getFirst(); // repoint to the child sm
}
@@ -272,9 +269,7 @@ public class LeftInputAdapterNode extends LeftTupleSource
if ( sm.getTipNode() == liaNode ) {
// liaNode in it's own segment and child segments not yet created
if ( sm.isEmpty() ) {
- RuntimeSegmentUtilities.createChildSegments(reteEvaluator,
-
liaNode.getSinkPropagator(),
- sm);
+
reteEvaluator.getSegmentMemorySupport().createChildSegments(liaNode.getSinkPropagator(),
sm);
}
sm = sm.getFirst(); // repoint to the child sm
}
@@ -332,9 +327,7 @@ public class LeftInputAdapterNode extends LeftTupleSource
if ( sm.getTipNode() == liaNode) {
// liaNode in it's own segment and child segments not yet created
if ( sm.isEmpty() ) {
- RuntimeSegmentUtilities.createChildSegments(reteEvaluator,
-
liaNode.getSinkPropagator(),
- sm);
+
reteEvaluator.getSegmentMemorySupport().createChildSegments(liaNode.getSinkPropagator(),
sm);
}
sm = sm.getFirst(); // repoint to the child sm
}
diff --git a/drools-core/src/main/java/org/drools/core/reteoo/PathMemory.java
b/drools-core/src/main/java/org/drools/core/reteoo/PathMemory.java
index f753167dd4..03fa08f1a4 100644
--- a/drools-core/src/main/java/org/drools/core/reteoo/PathMemory.java
+++ b/drools-core/src/main/java/org/drools/core/reteoo/PathMemory.java
@@ -236,4 +236,12 @@ public class PathMemory extends
AbstractLinkedListNode<Memory>
public ActivationsManager getActualActivationsManager() {
return activationsManager;
}
+
+ public void addSegmentToPathMemory(SegmentMemory smem) {
+ if (smem.getRootNode().getPathIndex() >=
getPathEndNode().getStartTupleSource().getPathIndex()) {
+ smem.addPathMemory(this);
+ setSegmentMemory(smem.getPos(), smem);
+ }
+
+ }
}
diff --git
a/drools-core/src/main/java/org/drools/core/reteoo/SegmentMemory.java
b/drools-core/src/main/java/org/drools/core/reteoo/SegmentMemory.java
index cd828e8c8c..dac6ea9a1b 100644
--- a/drools-core/src/main/java/org/drools/core/reteoo/SegmentMemory.java
+++ b/drools-core/src/main/java/org/drools/core/reteoo/SegmentMemory.java
@@ -27,11 +27,11 @@ import java.util.List;
import org.drools.base.reteoo.NodeTypeEnums;
import org.drools.core.common.Memory;
import org.drools.core.common.MemoryFactory;
-import org.drools.core.common.ReteEvaluator;
+import org.drools.core.common.NodeMemories;
+import org.drools.core.common.SegmentMemorySupport;
import org.drools.core.common.TupleSets;
import org.drools.core.common.TupleSetsImpl;
import org.drools.core.phreak.BuildtimeSegmentUtilities;
-import org.drools.core.phreak.RuntimeSegmentUtilities;
import org.drools.core.reteoo.AsyncReceiveNode.AsyncReceiveMemory;
import org.drools.core.reteoo.QueryElementNode.QueryElementNodeMemory;
import org.drools.core.reteoo.TupleToObjectNode.SubnetworkPathMemory;
@@ -42,7 +42,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static org.drools.core.phreak.BuildtimeSegmentUtilities.nextNodePosMask;
-import static
org.drools.core.phreak.RuntimeSegmentUtilities.getQuerySegmentMemory;
public class SegmentMemory extends LinkedList<SegmentMemory>
implements
@@ -684,9 +683,9 @@ public class SegmentMemory extends LinkedList<SegmentMemory>
this.tipNode = tipNode;
}
- public SegmentMemory newSegmentMemory(ReteEvaluator reteEvaluator) {
+ public SegmentMemory newSegmentMemory(NodeMemories nodeMemories,
SegmentMemorySupport segmentMemorySupport) {
SegmentMemory smem = new SegmentMemory();
- updateSegmentMemory(smem, reteEvaluator);
+ updateSegmentMemory(nodeMemories, segmentMemorySupport, smem);
return smem;
}
@@ -696,23 +695,23 @@ public class SegmentMemory extends
LinkedList<SegmentMemory>
return smem;
}
- public void updateSegmentMemory(SegmentMemory smem, ReteEvaluator
reteEvaluator) {
+ public void updateSegmentMemory(NodeMemories nodeMemories,
SegmentMemorySupport segmentMemorySupport, SegmentMemory smem) {
smem.updateFromPrototype(this);
- Memory[] nodeMemories = new Memory[getNodesInSegment().length];
+ Memory[] updatedMemories = new Memory[getNodesInSegment().length];
for (int i = 0; i < memories.length; i++) {
- Memory mem = reteEvaluator.getNodeMemory((MemoryFactory)
getNodesInSegment()[i]);
+ Memory mem = nodeMemories.getNodeMemory((MemoryFactory)
getNodesInSegment()[i]);
if (i > 0) {
- mem.setPrevious(nodeMemories[i - 1]);
- nodeMemories[i - 1].setNext(mem);
+ mem.setPrevious(updatedMemories[i - 1]);
+ updatedMemories[i - 1].setNext(mem);
}
- nodeMemories[i] = mem;
+ updatedMemories[i] = mem;
mem.setSegmentMemory(smem);
MemoryPrototype proto = memories[i];
if (proto != null) {
- proto.populateMemory(reteEvaluator, mem);
+ proto.populateMemory(nodeMemories, segmentMemorySupport,
mem);
}
}
- smem.setNodeMemories(nodeMemories);
+ smem.setNodeMemories(updatedMemories);
}
public SegmentPrototype initFromSegmentMemory(SegmentMemory smem) {
@@ -1029,7 +1028,7 @@ public class SegmentMemory extends
LinkedList<SegmentMemory>
return null;
}
- public abstract void populateMemory(ReteEvaluator reteEvaluator,
Memory memory);
+ public abstract void populateMemory(NodeMemories nodeMemories,
SegmentMemorySupport segmentMemorySupport, Memory memory);
public void setNodePosMaskBit(long nodePosMaskBit) {
this.nodePosMaskBit = nodePosMaskBit;
@@ -1050,14 +1049,14 @@ public class SegmentMemory extends
LinkedList<SegmentMemory>
}
@Override
- public void populateMemory(ReteEvaluator reteEvaluator, Memory memory)
{
+ public void populateMemory(NodeMemories nodeMemories,
SegmentMemorySupport segmentMemorySupport, Memory memory) {
BetaMemory betaMemory = (BetaMemory) memory;
betaMemory.setNodePosMaskBit(nodePosMaskBit);
if (tton != null) {
- SubnetworkPathMemory riaMem = (SubnetworkPathMemory)
reteEvaluator.getNodeMemories().peekNodeMemory(
+ SubnetworkPathMemory riaMem = (SubnetworkPathMemory)
nodeMemories.peekNodeMemory(
tton);
if (riaMem == null) {
- riaMem = (SubnetworkPathMemory)
RuntimeSegmentUtilities.initializePathMemory(reteEvaluator, tton);
+ riaMem = (SubnetworkPathMemory)
segmentMemorySupport.initializePathMemory(tton);
}
betaMemory.setSubnetworkPathMemory(riaMem);
}
@@ -1071,7 +1070,7 @@ public class SegmentMemory extends
LinkedList<SegmentMemory>
}
@Override
- public void populateMemory(ReteEvaluator reteEvaluator, Memory
liaMemory) {
+ public void populateMemory(NodeMemories nodeMemories,
SegmentMemorySupport segmentMemorySupport, Memory liaMemory) {
((SegmentNodeMemory) liaMemory).setNodePosMaskBit(nodePosMaskBit);
}
}
@@ -1083,7 +1082,7 @@ public class SegmentMemory extends
LinkedList<SegmentMemory>
}
@Override
- public void populateMemory(ReteEvaluator reteEvaluator, Memory memory)
{
+ public void populateMemory(NodeMemories nodeMemories,
SegmentMemorySupport segmentMemorySupport, Memory memory) {
((ReactiveFromNode.ReactiveFromMemory)
memory).setNodePosMaskBit(nodePosMaskBit);
}
}
@@ -1093,7 +1092,7 @@ public class SegmentMemory extends
LinkedList<SegmentMemory>
public ConditionalBranchMemoryPrototype() {}
@Override
- public void populateMemory(ReteEvaluator reteEvaluator, Memory memory)
{}
+ public void populateMemory(NodeMemories nodeMemories,
SegmentMemorySupport segmentMemorySupport, Memory memory) {}
}
public static class RightInputAdapterPrototype extends MemoryPrototype {
@@ -1101,7 +1100,7 @@ public class SegmentMemory extends
LinkedList<SegmentMemory>
public RightInputAdapterPrototype() {}
@Override
- public void populateMemory(ReteEvaluator reteEvaluator, Memory memory)
{}
+ public void populateMemory(NodeMemories nodeMemories,
SegmentMemorySupport segmentMemorySupport, Memory memory) {}
}
public static class TerminalPrototype extends MemoryPrototype {
@@ -1109,7 +1108,7 @@ public class SegmentMemory extends
LinkedList<SegmentMemory>
public TerminalPrototype() {}
@Override
- public void populateMemory(ReteEvaluator reteEvaluator, Memory memory)
{}
+ public void populateMemory(NodeMemories nodeMemories,
SegmentMemorySupport segmentMemorySupport, Memory memory) {}
}
public static class FromMemoryPrototype extends MemoryPrototype {
@@ -1117,7 +1116,7 @@ public class SegmentMemory extends
LinkedList<SegmentMemory>
public FromMemoryPrototype() {}
@Override
- public void populateMemory(ReteEvaluator reteEvaluator, Memory memory)
{}
+ public void populateMemory(NodeMemories nodeMemories,
SegmentMemorySupport segmentMemorySupport, Memory memory) {}
}
public static class EvalMemoryPrototype extends MemoryPrototype {
@@ -1125,7 +1124,7 @@ public class SegmentMemory extends
LinkedList<SegmentMemory>
public EvalMemoryPrototype() {}
@Override
- public void populateMemory(ReteEvaluator reteEvaluator, Memory memory)
{}
+ public void populateMemory(NodeMemories nodeMemories,
SegmentMemorySupport segmentMemorySupport, Memory memory) {}
}
public static class QueryMemoryPrototype extends MemoryPrototype {
@@ -1138,9 +1137,9 @@ public class SegmentMemory extends
LinkedList<SegmentMemory>
}
@Override
- public void populateMemory(ReteEvaluator reteEvaluator, Memory mem) {
+ public void populateMemory(NodeMemories nodeMemories,
SegmentMemorySupport segmentMemorySupport, Memory mem) {
QueryElementNodeMemory qmem = (QueryElementNodeMemory) mem;
- SegmentMemory querySmem = getQuerySegmentMemory(reteEvaluator,
queryNode);
+ SegmentMemory querySmem =
segmentMemorySupport.getQuerySegmentMemory(queryNode);
qmem.setQuerySegmentMemory(querySmem);
qmem.setNodePosMaskBit(nodePosMaskBit);
}
@@ -1153,7 +1152,7 @@ public class SegmentMemory extends
LinkedList<SegmentMemory>
}
@Override
- public void populateMemory(ReteEvaluator reteEvaluator, Memory mem) {
+ public void populateMemory(NodeMemories nodeMemories,
SegmentMemorySupport segmentMemorySupport, Memory mem) {
TimerNodeMemory tmem = (TimerNodeMemory) mem;
tmem.setNodePosMaskBit(nodePosMaskBit);
}
@@ -1164,7 +1163,7 @@ public class SegmentMemory extends
LinkedList<SegmentMemory>
public AsyncSendMemoryPrototype() {}
@Override
- public void populateMemory(ReteEvaluator reteEvaluator, Memory mem) {}
+ public void populateMemory(NodeMemories nodeMemories,
SegmentMemorySupport segmentMemorySupport, Memory mem) {}
}
public static class AsyncReceiveMemoryPrototype extends MemoryPrototype {
@@ -1174,7 +1173,7 @@ public class SegmentMemory extends
LinkedList<SegmentMemory>
}
@Override
- public void populateMemory(ReteEvaluator reteEvaluator, Memory mem) {
+ public void populateMemory(NodeMemories nodeMemories,
SegmentMemorySupport segmentMemorySupport, Memory mem) {
AsyncReceiveMemory amem = (AsyncReceiveMemory) mem;
amem.setNodePosMaskBit(nodePosMaskBit);
}
@@ -1189,8 +1188,8 @@ public class SegmentMemory extends
LinkedList<SegmentMemory>
}
@Override
- public void populateMemory(ReteEvaluator reteEvaluator, Memory
accMemory) {
- betaProto.populateMemory(reteEvaluator,
((AccumulateNode.AccumulateMemory) accMemory).getBetaMemory());
+ public void populateMemory(NodeMemories nodeMemories,
SegmentMemorySupport segmentMemorySupport, Memory accMemory) {
+ betaProto.populateMemory(nodeMemories, segmentMemorySupport,
((AccumulateNode.AccumulateMemory) accMemory).getBetaMemory());
}
}
}
diff --git
a/drools-core/src/main/java/org/drools/core/reteoo/SegmentPrototypeRegistry.java
b/drools-core/src/main/java/org/drools/core/reteoo/SegmentPrototypeRegistry.java
index 06f284ad64..9c97a21a82 100644
---
a/drools-core/src/main/java/org/drools/core/reteoo/SegmentPrototypeRegistry.java
+++
b/drools-core/src/main/java/org/drools/core/reteoo/SegmentPrototypeRegistry.java
@@ -18,7 +18,8 @@
*/
package org.drools.core.reteoo;
-import org.drools.core.common.ReteEvaluator;
+import org.drools.core.common.NodeMemories;
+import org.drools.core.common.SegmentMemorySupport;
import org.drools.core.reteoo.SegmentMemory.SegmentPrototype;
public interface SegmentPrototypeRegistry {
@@ -27,9 +28,9 @@ public interface SegmentPrototypeRegistry {
void registerSegmentPrototype(LeftTupleNode tupleSource, SegmentPrototype
smem);
- SegmentMemory createSegmentFromPrototype(ReteEvaluator reteEvaluator,
LeftTupleSource tupleSource);
+ SegmentMemory createSegmentFromPrototype(NodeMemories nodeMemories,
SegmentMemorySupport segmentMemorySupport, LeftTupleSource tupleSource);
- SegmentMemory createSegmentFromPrototype(ReteEvaluator reteEvaluator,
SegmentPrototype smem);
+ SegmentMemory createSegmentFromPrototype(SegmentPrototype smem,
NodeMemories nodeMemories, SegmentMemorySupport segmentMemorySupport);
SegmentPrototype getSegmentPrototype(SegmentMemory segment);
diff --git
a/drools-core/src/main/java/org/drools/core/reteoo/SegmentPrototypeRegistryImpl.java
b/drools-core/src/main/java/org/drools/core/reteoo/SegmentPrototypeRegistryImpl.java
index e81bded164..08db5a4a77 100644
---
a/drools-core/src/main/java/org/drools/core/reteoo/SegmentPrototypeRegistryImpl.java
+++
b/drools-core/src/main/java/org/drools/core/reteoo/SegmentPrototypeRegistryImpl.java
@@ -22,7 +22,8 @@ import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
-import org.drools.core.common.ReteEvaluator;
+import org.drools.core.common.NodeMemories;
+import org.drools.core.common.SegmentMemorySupport;
import org.drools.core.reteoo.SegmentMemory.SegmentPrototype;
@@ -52,13 +53,13 @@ public class SegmentPrototypeRegistryImpl implements
SegmentPrototypeRegistry {
}
@Override
- public SegmentMemory createSegmentFromPrototype(ReteEvaluator
reteEvaluator, LeftTupleSource tupleSource) {
+ public SegmentMemory createSegmentFromPrototype(NodeMemories nodeMemories,
SegmentMemorySupport segmentMemorySupport, LeftTupleSource tupleSource) {
SegmentPrototype proto = segmentProtos.get(tupleSource.getId());
- return createSegmentFromPrototype(reteEvaluator, proto);
+ return createSegmentFromPrototype(proto, nodeMemories,
segmentMemorySupport);
}
- public SegmentMemory createSegmentFromPrototype(ReteEvaluator
reteEvaluator, SegmentPrototype proto) {
- return proto.newSegmentMemory(reteEvaluator);
+ public SegmentMemory createSegmentFromPrototype(SegmentPrototype proto,
NodeMemories nodeMemories, SegmentMemorySupport segmentMemorySupport) {
+ return proto.newSegmentMemory(nodeMemories, segmentMemorySupport);
}
public SegmentPrototype getSegmentPrototype(SegmentMemory segment) {
diff --git
a/drools-kiesession/src/main/java/org/drools/kiesession/consequence/StatefulKnowledgeSessionForRHS.java
b/drools-kiesession/src/main/java/org/drools/kiesession/consequence/StatefulKnowledgeSessionForRHS.java
index 27d25c296c..f4ddcb1a55 100644
---
a/drools-kiesession/src/main/java/org/drools/kiesession/consequence/StatefulKnowledgeSessionForRHS.java
+++
b/drools-kiesession/src/main/java/org/drools/kiesession/consequence/StatefulKnowledgeSessionForRHS.java
@@ -41,6 +41,7 @@ import org.drools.core.common.NodeMemories;
import org.drools.core.common.ObjectStore;
import org.drools.core.common.ObjectTypeConfigurationRegistry;
import org.drools.core.common.ReteEvaluator;
+import org.drools.core.common.SegmentMemorySupport;
import org.drools.core.event.AgendaEventSupport;
import org.drools.core.event.RuleEventListenerSupport;
import org.drools.core.event.RuleRuntimeEventSupport;
@@ -435,6 +436,10 @@ public class StatefulKnowledgeSessionForRHS
public NodeMemories getNodeMemories() {
return delegate.getNodeMemories();
}
+
+ public SegmentMemorySupport getSegmentMemorySupport() {
+ return delegate.getSegmentMemorySupport();
+ }
public long getNextPropagationIdCounter() {
return delegate.getNextPropagationIdCounter();
diff --git
a/drools-kiesession/src/main/java/org/drools/kiesession/session/StatefulKnowledgeSessionImpl.java
b/drools-kiesession/src/main/java/org/drools/kiesession/session/StatefulKnowledgeSessionImpl.java
index e8db17285c..11dc3d32bd 100644
---
a/drools-kiesession/src/main/java/org/drools/kiesession/session/StatefulKnowledgeSessionImpl.java
+++
b/drools-kiesession/src/main/java/org/drools/kiesession/session/StatefulKnowledgeSessionImpl.java
@@ -55,6 +55,7 @@ import org.drools.core.common.ObjectTypeConfigurationRegistry;
import org.drools.core.common.PropagationContext;
import org.drools.core.common.PropagationContextFactory;
import org.drools.core.common.ReteEvaluator;
+import org.drools.core.common.SegmentMemorySupport;
import org.drools.core.common.SuperCacheFixer;
import org.drools.core.event.AgendaEventSupport;
import org.drools.core.event.RuleEventListenerSupport;
@@ -65,6 +66,7 @@ import org.drools.core.management.DroolsManagementAgent;
import org.drools.core.marshalling.MarshallerReaderContext;
import org.drools.core.phreak.PropagationEntry;
import org.drools.core.phreak.RuleAgendaItem;
+import org.drools.core.phreak.SegmentMemorySupportImpl;
import org.drools.core.reteoo.AsyncReceiveNode;
import org.drools.core.reteoo.EntryPointNode;
import org.drools.core.reteoo.LeftInputAdapterNode;
@@ -174,6 +176,8 @@ public class StatefulKnowledgeSessionImpl extends
AbstractRuntime
/** The actual memory for the <code>JoinNode</code>s. */
private NodeMemories nodeMemories;
+ private SegmentMemorySupport segmentMemorySupport;
+
/** Global values which are associated with this memory. */
protected GlobalResolver globalResolver;
@@ -345,6 +349,8 @@ public class StatefulKnowledgeSessionImpl extends
AbstractRuntime
this.entryPointsManager = (NamedEntryPointsManager)
RuntimeComponentFactory.get().getEntryPointFactory().createEntryPointsManager(kBase,
this, handleFactory);
+ this.segmentMemorySupport = new SegmentMemorySupportImpl(nodeMemories,
kBase.getSegmentPrototypeRegistry(), entryPointsManager.getDefaultEntryPoint());
+
this.sequential = conf.isSequential();
this.globalResolver =
RuntimeComponentFactory.get().createGlobalResolver(this, this.environment);
@@ -1351,6 +1357,11 @@ public class StatefulKnowledgeSessionImpl extends
AbstractRuntime
return nodeMemories;
}
+
+ public SegmentMemorySupport getSegmentMemorySupport() {
+ return segmentMemorySupport;
+ }
+
public RuleRuntimeEventSupport getRuleRuntimeEventSupport() {
return this.ruleRuntimeEventSupport;
}
diff --git
a/drools-kiesession/src/test/java/org/drools/kiesession/NodeSegmentUnlinkingTest.java
b/drools-kiesession/src/test/java/org/drools/kiesession/NodeSegmentUnlinkingTest.java
index 2bc17916d1..fb333004be 100644
---
a/drools-kiesession/src/test/java/org/drools/kiesession/NodeSegmentUnlinkingTest.java
+++
b/drools-kiesession/src/test/java/org/drools/kiesession/NodeSegmentUnlinkingTest.java
@@ -40,7 +40,6 @@ import org.drools.core.reteoo.SegmentMemory.SegmentPrototype;
import org.drools.core.reteoo.TerminalNode;
import org.drools.kiesession.rulebase.InternalKnowledgeBase;
import org.drools.core.phreak.PhreakNotNode;
-import org.drools.core.phreak.RuntimeSegmentUtilities;
import org.drools.core.reteoo.BetaNode;
import org.drools.core.reteoo.ExistsNode;
import org.drools.core.reteoo.JoinNode;
@@ -285,7 +284,7 @@ public class NodeSegmentUnlinkingTest {
StatefulKnowledgeSessionImpl ksession =
(StatefulKnowledgeSessionImpl)kBase.newKieSession();
- RuntimeSegmentUtilities.getOrCreateSegmentMemory(ksession, liaNode);
+ ksession.getSegmentMemorySupport().getOrCreateSegmentMemory(liaNode);
liaNode.assertObject((InternalFactHandle) ksession.insert("str"),
context, ksession);
@@ -318,7 +317,7 @@ public class NodeSegmentUnlinkingTest {
// Initialise from lian
StatefulKnowledgeSessionImpl ksession =
(StatefulKnowledgeSessionImpl)kBase.newKieSession();
- RuntimeSegmentUtilities.getOrCreateSegmentMemory(ksession, liaNode);
+ ksession.getSegmentMemorySupport().getOrCreateSegmentMemory(liaNode);
InternalFactHandle fh1 = (InternalFactHandle) ksession.insert( "str1"
);
n1.getRightInput().assertObject( fh1, context, ksession );
@@ -510,7 +509,7 @@ public class NodeSegmentUnlinkingTest {
InternalWorkingMemory wm) {
BetaMemory betaMemory = (BetaMemory) wm.getNodeMemory(node);
if ( betaMemory.getSegmentMemory() == null ) {
- RuntimeSegmentUtilities.getOrCreateSegmentMemory(wm, node);
+ wm.getSegmentMemorySupport().getOrCreateSegmentMemory(node);
}
return betaMemory;
diff --git
a/drools-kiesession/src/test/java/org/drools/kiesession/RuleUnlinkingTest.java
b/drools-kiesession/src/test/java/org/drools/kiesession/RuleUnlinkingTest.java
index c514b37003..1c4e1a9459 100644
---
a/drools-kiesession/src/test/java/org/drools/kiesession/RuleUnlinkingTest.java
+++
b/drools-kiesession/src/test/java/org/drools/kiesession/RuleUnlinkingTest.java
@@ -38,7 +38,6 @@ import org.drools.core.reteoo.NotRight;
import org.drools.core.reteoo.PathEndNode;
import org.drools.core.reteoo.TerminalNode;
import org.drools.kiesession.rulebase.InternalKnowledgeBase;
-import org.drools.core.phreak.RuntimeSegmentUtilities;
import org.drools.core.reteoo.BetaNode;
import org.drools.core.reteoo.ExistsNode;
import org.drools.core.reteoo.JoinNode;
@@ -328,7 +327,7 @@ public class RuleUnlinkingTest {
DefaultFactHandle f1 = (DefaultFactHandle) wm.insert( "test1" );
- RuntimeSegmentUtilities.getOrCreateSegmentMemory(wm, liaNode);
+ wm.getSegmentMemorySupport().getOrCreateSegmentMemory(liaNode);
liaNode.assertObject( f1, context, wm );
n1.getRightInput().assertObject( f1, context, wm );
n3.getRightInput().assertObject( f1, context, wm );
@@ -389,7 +388,7 @@ public class RuleUnlinkingTest {
InternalWorkingMemory wm) {
BetaMemory betaMemory = (BetaMemory) wm.getNodeMemory(node);
if ( betaMemory.getSegmentMemory() == null ) {
- RuntimeSegmentUtilities.getOrCreateSegmentMemory(wm, node);
+ wm.getSegmentMemorySupport().getOrCreateSegmentMemory(node);
}
return betaMemory;
diff --git
a/drools-kiesession/src/test/java/org/drools/kiesession/RuleUnlinkingWithSegmentMemoryTest.java
b/drools-kiesession/src/test/java/org/drools/kiesession/RuleUnlinkingWithSegmentMemoryTest.java
index ee95f4648c..b24f10d2b1 100644
---
a/drools-kiesession/src/test/java/org/drools/kiesession/RuleUnlinkingWithSegmentMemoryTest.java
+++
b/drools-kiesession/src/test/java/org/drools/kiesession/RuleUnlinkingWithSegmentMemoryTest.java
@@ -29,7 +29,6 @@ import org.drools.core.common.PhreakPropagationContextFactory;
import org.drools.core.common.PropagationContextFactory;
import org.drools.base.definitions.rule.impl.RuleImpl;
import org.drools.core.impl.RuleBaseFactory;
-import org.drools.core.phreak.RuntimeSegmentUtilities;
import org.drools.core.phreak.BuildtimeSegmentUtilities;
import org.drools.core.reteoo.BetaMemory;
import org.drools.core.reteoo.BetaNode;
@@ -230,12 +229,12 @@ public class RuleUnlinkingWithSegmentMemoryTest {
PathMemory rtn3Rs = wm.getNodeMemory( rtn3 );
// lian
- RuntimeSegmentUtilities.getOrCreateSegmentMemory(wm, lian);
+ wm.getSegmentMemorySupport().getOrCreateSegmentMemory(lian);
LeftInputAdapterNode.LiaNodeMemory lmem = wm.getNodeMemory( lian );
assertThat(lmem.getNodePosMaskBit()).isEqualTo(1);
// n1
- RuntimeSegmentUtilities.getOrCreateSegmentMemory(wm, n1);
+ wm.getSegmentMemorySupport().getOrCreateSegmentMemory(n1);
bm = (BetaMemory) wm.getNodeMemory(n1);
assertThat(bm.getNodePosMaskBit()).isEqualTo(2);
assertThat(bm.getSegmentMemory().getAllLinkedMaskTest()).isEqualTo(15);
@@ -269,7 +268,7 @@ public class RuleUnlinkingWithSegmentMemoryTest {
assertThat(list.contains(rtn3Rs)).isTrue();
// n4
- RuntimeSegmentUtilities.getOrCreateSegmentMemory(wm, n4);
+ wm.getSegmentMemorySupport().getOrCreateSegmentMemory(n4);
bm = (BetaMemory) wm.getNodeMemory(n4);
assertThat(bm.getNodePosMaskBit()).isEqualTo(1);
assertThat(bm.getSegmentMemory().getAllLinkedMaskTest()).isEqualTo(3);
@@ -290,7 +289,7 @@ public class RuleUnlinkingWithSegmentMemoryTest {
assertThat(list.contains(rtn3Rs)).isTrue();
// n6
- RuntimeSegmentUtilities.getOrCreateSegmentMemory(wm, n6);
+ wm.getSegmentMemorySupport().getOrCreateSegmentMemory(n6);
bm = (BetaMemory) wm.getNodeMemory(n6);
assertThat(bm.getNodePosMaskBit()).isEqualTo(1);
assertThat(bm.getSegmentMemory().getAllLinkedMaskTest()).isEqualTo(7);
diff --git
a/drools-ruleunits/drools-ruleunits-impl/src/main/java/org/drools/ruleunits/impl/sessions/RuleUnitExecutorImpl.java
b/drools-ruleunits/drools-ruleunits-impl/src/main/java/org/drools/ruleunits/impl/sessions/RuleUnitExecutorImpl.java
index ca15e339e2..b190b6b07a 100644
---
a/drools-ruleunits/drools-ruleunits-impl/src/main/java/org/drools/ruleunits/impl/sessions/RuleUnitExecutorImpl.java
+++
b/drools-ruleunits/drools-ruleunits-impl/src/main/java/org/drools/ruleunits/impl/sessions/RuleUnitExecutorImpl.java
@@ -46,6 +46,7 @@ import org.drools.core.common.PhreakPropagationContext;
import org.drools.core.common.PropagationContext;
import org.drools.core.common.PropagationContextFactory;
import org.drools.core.common.ReteEvaluator;
+import org.drools.core.common.SegmentMemorySupport;
import org.drools.core.common.SuperCacheFixer;
import org.drools.core.event.AgendaEventSupport;
import org.drools.core.event.RuleEventListenerSupport;
@@ -53,6 +54,7 @@ import org.drools.core.event.RuleRuntimeEventSupport;
import org.drools.core.impl.ActivationsManagerImpl;
import org.drools.core.impl.InternalRuleBase;
import org.drools.core.phreak.PropagationEntry;
+import org.drools.core.phreak.SegmentMemorySupportImpl;
import org.drools.core.reteoo.ObjectTypeNode;
import org.drools.core.reteoo.RuntimeComponentFactory;
import org.drools.core.reteoo.TerminalNode;
@@ -101,6 +103,8 @@ public class RuleUnitExecutorImpl implements ReteEvaluator {
private final FactHandleFactory handleFactory;
private final NodeMemories nodeMemories;
+
+ private final SegmentMemorySupport segmentMemorySupport;
private final ActivationsManager activationsManager;
private final EntryPointsManager entryPointsManager;
@@ -131,6 +135,8 @@ public class RuleUnitExecutorImpl implements ReteEvaluator {
this.activationsManager = new ActivationsManagerImpl(ruleBase, this,
handleFactory);
this.entryPointsManager =
RuntimeComponentFactory.get().getEntryPointFactory().createEntryPointsManager(ruleBase,
this, handleFactory);
+
+ this.segmentMemorySupport = new SegmentMemorySupportImpl(nodeMemories,
ruleBase.getSegmentPrototypeRegistry(),
entryPointsManager.getDefaultEntryPoint());
this.timerService = sessionConfiguration.createTimerService();
initInitialFact();
@@ -183,6 +189,11 @@ public class RuleUnitExecutorImpl implements ReteEvaluator
{
public <T extends Memory> T getNodeMemory(MemoryFactory<T> node) {
return nodeMemories.getNodeMemory( node );
}
+
+ @Override
+ public SegmentMemorySupport getSegmentMemorySupport() {
+ return segmentMemorySupport;
+ }
@Override
public NodeMemories getNodeMemories() {
diff --git
a/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/integrationtests/LinkingTest.java
b/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/integrationtests/LinkingTest.java
index a398988b43..e9be02f3af 100644
---
a/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/integrationtests/LinkingTest.java
+++
b/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/integrationtests/LinkingTest.java
@@ -34,7 +34,6 @@ import
org.drools.core.reteoo.TupleToObjectNode.SubnetworkPathMemory;
import org.drools.kiesession.session.StatefulKnowledgeSessionImpl;
import org.drools.core.phreak.RuleAgendaItem;
import org.drools.core.phreak.RuleExecutor;
-import org.drools.core.phreak.RuntimeSegmentUtilities;
import org.drools.core.reteoo.EvalConditionNode;
import org.drools.core.reteoo.ExistsNode;
import org.drools.core.reteoo.JoinNode;
@@ -424,7 +423,7 @@ public class LinkingTest {
JoinNode eNode = ( JoinNode )
exists1n.getSinkPropagator().getSinks()[0];
RuleTerminalNode rtn = ( RuleTerminalNode )
eNode.getSinkPropagator().getSinks()[0];
- RuntimeSegmentUtilities.getOrCreateSegmentMemory(wm, exists1n);
+ wm.getSegmentMemorySupport().getOrCreateSegmentMemory(exists1n);
BetaMemory existsBm = (BetaMemory) wm.getNodeMemory(exists1n);
assertThat(existsBm.getSegmentMemory().getLinkedNodeMask()).isEqualTo(0);
@@ -1040,7 +1039,7 @@ public class LinkingTest {
NotNode bNode = ( NotNode) aNode.getSinkPropagator().getSinks()[0];
JoinNode cNode = ( JoinNode) bNode.getSinkPropagator().getSinks()[0];
- RuntimeSegmentUtilities.getOrCreateSegmentMemory(wm, cNode);
+ wm.getSegmentMemorySupport().getOrCreateSegmentMemory(cNode);
LiaNodeMemory amem = wm.getNodeMemory(aNode);
// Only NotNode is linked in
@@ -1117,7 +1116,7 @@ public class LinkingTest {
NotNode bNode = ( NotNode) aNode.getSinkPropagator().getSinks()[0];
JoinNode cNode = ( JoinNode) bNode.getSinkPropagator().getSinks()[0];
- RuntimeSegmentUtilities.getOrCreateSegmentMemory(wm, cNode);
+ wm.getSegmentMemorySupport().getOrCreateSegmentMemory(cNode);
LiaNodeMemory amem = wm.getNodeMemory(aNode);
// Only NotNode is linked in
diff --git
a/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/integrationtests/phreak/PhreakJoinNodeTest.java
b/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/integrationtests/phreak/PhreakJoinNodeTest.java
index 1a7e6002da..a322d2d6e0 100644
---
a/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/integrationtests/phreak/PhreakJoinNodeTest.java
+++
b/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/integrationtests/phreak/PhreakJoinNodeTest.java
@@ -82,10 +82,10 @@ public class PhreakJoinNodeTest {
bm0 =(BetaMemory) wm.getNodeMemory(sinkNode);
- smem = proto1.newSegmentMemory(wm);
+ smem = proto1.newSegmentMemory(wm.getNodeMemories(),
wm.getSegmentMemorySupport());
bm.setSegmentMemory( smem );
- smem0 = proto2.newSegmentMemory(wm);
+ smem0 = proto2.newSegmentMemory(wm.getNodeMemories(),
wm.getSegmentMemorySupport());
bm0.setSegmentMemory( smem0 );
smem.add( smem0 );
diff --git
a/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/integrationtests/phreak/PhreakNotNodeTest.java
b/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/integrationtests/phreak/PhreakNotNodeTest.java
index f5739b5fb8..f72c3cd8e2 100644
---
a/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/integrationtests/phreak/PhreakNotNodeTest.java
+++
b/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/integrationtests/phreak/PhreakNotNodeTest.java
@@ -80,10 +80,10 @@ public class PhreakNotNodeTest {
BetaMemory bm1 =(BetaMemory) wm.getNodeMemory(sinkNode);
- SegmentMemory smem = proto1.newSegmentMemory(wm);
+ SegmentMemory smem = proto1.newSegmentMemory(wm.getNodeMemories(),
wm.getSegmentMemorySupport());
bm.setSegmentMemory( smem );
- SegmentMemory childSmem = proto2.newSegmentMemory(wm);
+ SegmentMemory childSmem =
proto2.newSegmentMemory(wm.getNodeMemories(), wm.getSegmentMemorySupport());
bm1.setSegmentMemory( childSmem );
smem.add( childSmem );
diff --git
a/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/integrationtests/phreak/ScenarioTest.java
b/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/integrationtests/phreak/ScenarioTest.java
index 1d5c05f20e..d897bce890 100644
---
a/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/integrationtests/phreak/ScenarioTest.java
+++
b/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/integrationtests/phreak/ScenarioTest.java
@@ -84,10 +84,10 @@ public class ScenarioTest {
bm0 =(BetaMemory) wm.getNodeMemory(sinkNode);
- smem = proto1.newSegmentMemory(wm);
+ smem = proto1.newSegmentMemory(wm.getNodeMemories(),
wm.getSegmentMemorySupport());
bm.setSegmentMemory( smem );
- smem0 = proto2.newSegmentMemory(wm);
+ smem0 = proto2.newSegmentMemory(wm.getNodeMemories(),
wm.getSegmentMemorySupport());
bm0.setSegmentMemory( smem0 );
smem.add( smem0 );
diff --git
a/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/integrationtests/phreak/SegmentPropagationTest.java
b/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/integrationtests/phreak/SegmentPropagationTest.java
index 890738d168..e97d3db0e0 100644
---
a/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/integrationtests/phreak/SegmentPropagationTest.java
+++
b/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/integrationtests/phreak/SegmentPropagationTest.java
@@ -104,18 +104,18 @@ public class SegmentPropagationTest {
bm1 =(BetaMemory) wm.getNodeMemory(sinkNode1);
bm2 =(BetaMemory) wm.getNodeMemory(sinkNode2);
- smem = proto1.newSegmentMemory(wm);
+ smem = proto1.newSegmentMemory(wm.getNodeMemories(),
wm.getSegmentMemorySupport());
bm.setSegmentMemory( smem );
- smem0 = proto2.newSegmentMemory(wm);
+ smem0 = proto2.newSegmentMemory(wm.getNodeMemories(),
wm.getSegmentMemorySupport());
bm0.setSegmentMemory( smem0 );
smem.add( smem0 );
- smem1 = proto3.newSegmentMemory(wm);
+ smem1 = proto3.newSegmentMemory(wm.getNodeMemories(),
wm.getSegmentMemorySupport());
bm1.setSegmentMemory( smem1 );
smem.add( smem1 );
- smem2 = proto4.newSegmentMemory(wm);
+ smem2 = proto4.newSegmentMemory(wm.getNodeMemories(),
wm.getSegmentMemorySupport());
bm2.setSegmentMemory( smem2 );
smem.add( smem2 );
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]