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 94ad1abaa4 [incubator-kie-issues #203] Cleanup Phreak code - Minor
refactoring in SegmentMemory handling (#6508)
94ad1abaa4 is described below
commit 94ad1abaa44e874967b6ee1233f135403b056d73
Author: Paolo Bizzarri <[email protected]>
AuthorDate: Fri Oct 31 08:01:03 2025 +0100
[incubator-kie-issues #203] Cleanup Phreak code - Minor refactoring in
SegmentMemory handling (#6508)
* Several code cleanups
* Now everything compiles
---
.../drools/core/common/SegmentMemorySupport.java | 3 +-
.../org/drools/core/phreak/EagerPhreakBuilder.java | 5 ++-
.../org/drools/core/phreak/LazyPhreakBuilder.java | 5 ++-
.../drools/core/phreak/RuleNetworkEvaluator.java | 10 +++--
.../core/phreak/RuleNetworkEvaluatorImpl.java | 43 +++++++++++-----------
.../core/phreak/SegmentMemorySupportImpl.java | 6 ++-
.../drools/core/reteoo/LeftInputAdapterNode.java | 32 ++++------------
.../java/org/drools/core/reteoo/SegmentMemory.java | 4 ++
.../metric/phreak/PhreakTimerNodeMetric.java | 1 -
9 files changed, 52 insertions(+), 57 deletions(-)
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
index 2c86767f0a..810303b68d 100644
--- a/drools-core/src/main/java/org/drools/core/common/SegmentMemorySupport.java
+++ b/drools-core/src/main/java/org/drools/core/common/SegmentMemorySupport.java
@@ -19,7 +19,6 @@
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;
@@ -36,7 +35,7 @@ public interface SegmentMemorySupport {
public SegmentMemory getQuerySegmentMemory(QueryElementNode queryNode);
- public void createChildSegments(LeftTupleSinkPropagator sinkProp,
SegmentMemory smem);
+ public void initializeChildSegmentsIfNeeded(SegmentMemory smem);
public SegmentMemory createChildSegment(LeftTupleNode node);
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 07b76940af..a9eca6c6d8 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
@@ -1121,8 +1121,9 @@ public class EagerPhreakBuilder implements PhreakBuilder {
memory.getSegmentMemory().getStagedLeftTuples().addInsert(peer);
} else {
// If parent is Lian, then this must be called, so that any
linking or unlinking can be done.
- LeftInputAdapterNode.doInsertSegmentMemoryWithFlush(wm, true,
liaMem, memory.getSegmentMemory(), peer, node
- .getLeftTupleSource().isStreamMode());
+ List<PathMemory> pathsToFlush =
LeftInputAdapterNode.doInsertSegmentMemory(wm, true, liaMem,
memory.getSegmentMemory(), peer, node
+ .getLeftTupleSource().isStreamMode() );
+ wm.getRuleNetworkEvaluator().forceFlushPaths(pathsToFlush);
}
return peer;
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 0aab6e6516..8fa435e129 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
@@ -1032,8 +1032,9 @@ class LazyPhreakBuilder implements PhreakBuilder {
memory.getSegmentMemory().getStagedLeftTuples().addInsert(peer);
} else {
// If parent is Lian, then this must be called, so that any
linking or unlinking can be done.
- LeftInputAdapterNode.doInsertSegmentMemoryWithFlush(wm, true,
liaMem, memory.getSegmentMemory(), peer, node
- .getLeftTupleSource().isStreamMode());
+ List<PathMemory> pathsToFlush =
LeftInputAdapterNode.doInsertSegmentMemory(wm, true, liaMem,
memory.getSegmentMemory(), peer, node
+ .getLeftTupleSource().isStreamMode() );
+ wm.getRuleNetworkEvaluator().forceFlushPaths(pathsToFlush);
}
return peer;
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 5dcc47f39b..5d1034d11b 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
@@ -18,6 +18,7 @@
*/
package org.drools.core.phreak;
+import java.util.Collection;
import java.util.List;
import org.drools.base.common.NetworkNode;
@@ -51,15 +52,18 @@ public interface RuleNetworkEvaluator {
void forceFlushWhenSubnetwork(PathMemory pmem);
- public boolean flushLeftTupleIfNecessary(SegmentMemory sm, boolean
streamMode);
+ boolean flushLeftTupleIfNecessary(SegmentMemory sm, boolean streamMode);
- public boolean flushLeftTupleIfNecessary(SegmentMemory sm,
+ boolean flushLeftTupleIfNecessary(SegmentMemory sm,
TupleImpl leftTuple,
boolean streamMode,
short stagedType);
List<PathMemory> findPathsToFlushFromSubnetwork(PathMemory pmem);
- void propagate(SegmentMemory sourceSegment, TupleSets leftTuples);
+
+ void forceFlushPaths(Collection<PathMemory> pathsToFlush);
+
+ void propagate(SegmentMemory smem, TupleSets actualResultLeftTuples);
}
diff --git
a/drools-core/src/main/java/org/drools/core/phreak/RuleNetworkEvaluatorImpl.java
b/drools-core/src/main/java/org/drools/core/phreak/RuleNetworkEvaluatorImpl.java
index 4917b97de4..8766deb094 100644
---
a/drools-core/src/main/java/org/drools/core/phreak/RuleNetworkEvaluatorImpl.java
+++
b/drools-core/src/main/java/org/drools/core/phreak/RuleNetworkEvaluatorImpl.java
@@ -19,6 +19,7 @@
package org.drools.core.phreak;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
@@ -49,12 +50,10 @@ import org.drools.core.reteoo.ExistsNode;
import org.drools.core.reteoo.FromNode;
import org.drools.core.reteoo.FromNode.FromMemory;
import org.drools.core.reteoo.JoinNode;
-import org.drools.core.reteoo.LeftInputAdapterNode;
import org.drools.core.reteoo.LeftTuple;
import org.drools.core.reteoo.LeftTupleNode;
import org.drools.core.reteoo.LeftTupleSink;
import org.drools.core.reteoo.LeftTupleSinkNode;
-import org.drools.core.reteoo.LeftTupleSource;
import org.drools.core.reteoo.NotNode;
import org.drools.core.reteoo.ObjectSink;
import org.drools.core.reteoo.PathEndNode;
@@ -73,7 +72,6 @@ import org.drools.core.reteoo.Tuple;
import org.drools.core.reteoo.TupleFactory;
import org.drools.core.reteoo.TupleImpl;
import org.drools.core.reteoo.TupleToObjectNode;
-import org.drools.core.reteoo.TupleToObjectNode.SubnetworkPathMemory;
import org.drools.core.util.LinkedList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -147,7 +145,7 @@ public class RuleNetworkEvaluatorImpl implements
RuleNetworkEvaluator {
return;
}
- LeftInputAdapterNode liaNode = (LeftInputAdapterNode)
smem.getRootNode();
+ LeftTupleNode liaNode = smem.getRootNode();
NetworkNode node;
Memory nodeMem;
@@ -188,7 +186,7 @@ public class RuleNetworkEvaluatorImpl implements
RuleNetworkEvaluator {
}
long bit = 1;
- for (NetworkNode node = sm.getRootNode(); node != sink; node =
((LeftTupleSource) node).getSinkPropagator()
+ for (NetworkNode node = sm.getRootNode(); node != sink; node =
((LeftTupleNode) node).getSinkPropagator()
.getFirstLeftTupleSink()) {
//update the bit to the correct node position.
bit = nextNodePosMask(bit);
@@ -201,11 +199,17 @@ public class RuleNetworkEvaluatorImpl implements
RuleNetworkEvaluator {
@Override
public void forceFlushWhenSubnetwork(PathMemory pmem) {
- for (PathMemory outPmem : findPathsToFlushFromSubnetwork(pmem)) {
+ forceFlushPaths(findPathsToFlushFromSubnetwork(pmem));
+ }
+
+ @Override
+ public void forceFlushPaths(Collection<PathMemory> pmems) {
+ for (PathMemory outPmem : pmems) {
forceFlushPath(outPmem);
}
}
+
@Override
public List<PathMemory> findPathsToFlushFromSubnetwork(PathMemory pmem) {
List<PathMemory> paths = null;
@@ -399,8 +403,8 @@ public class RuleNetworkEvaluatorImpl implements
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())) {
-
segmentMemorySupport.createChildSegments(smem.getTipNode().getSinkPropagator(),
smem);
+ if (!NodeTypeEnums.isTerminalNode(smem.getTipNode())) {
+
segmentMemorySupport.initializeChildSegmentsIfNeeded(smem);
}
smem = smems[i];
@@ -436,7 +440,7 @@ public class RuleNetworkEvaluatorImpl implements
RuleNetworkEvaluator {
log.trace("{} Skip Node {}", indent(offset), node);
}
bit = nextNodePosMask(bit); // shift to check the next node
- node = ((LeftTupleSource)
node).getSinkPropagator().getFirstLeftTupleSink();
+ node = ((LeftTupleNode)
node).getSinkPropagator().getFirstLeftTupleSink();
nodeMem = nodeMem.getNext();
}
}
@@ -460,7 +464,7 @@ public class RuleNetworkEvaluatorImpl implements
RuleNetworkEvaluator {
}
stagedLeftTuples = getTargetStagedLeftTuples(smem, node);
- LeftTupleSinkNode sink = ((LeftTupleSource)
node).getSinkPropagator().getFirstLeftTupleSink();
+ LeftTupleSinkNode sink = ((LeftTupleNode)
node).getSinkPropagator().getFirstLeftTupleSink();
trgTuples = evalNode(activationsManager, executor, stack, pmem,
smems, smem, smemIndex, bit, nodeMem, node, sink, srcTuples, stagedLeftTuples,
processSubnetwork);
if (trgTuples == null) {
@@ -569,9 +573,7 @@ public class RuleNetworkEvaluatorImpl implements
RuleNetworkEvaluator {
NetworkNode node) {
if (node == smem.getTipNode()) {
// we are about to process the segment tip, allow it to merge
insert/update/delete clashes
- if (smem.isEmpty()) {
- segmentMemorySupport.createChildSegments(((LeftTupleSource)
node).getSinkPropagator(), smem);
- }
+ segmentMemorySupport.initializeChildSegmentsIfNeeded(smem);
return smem.getFirst().getStagedLeftTuples().takeAll();
} else {
return null;
@@ -749,7 +751,7 @@ public class RuleNetworkEvaluatorImpl implements
RuleNetworkEvaluator {
BetaMemory bm,
BetaNode betaNode,
LeftTupleSinkNode sink) {
- SubnetworkPathMemory pathMem = bm.getSubnetworkPathMemory();
+ PathMemory pathMem = bm.getSubnetworkPathMemory();
SegmentMemory[] subnetworkSmems = pathMem.getSegmentMemories();
SegmentMemory subSmem = null;
for (int i = 0; subSmem == null; i++) {
@@ -767,6 +769,8 @@ public class RuleNetworkEvaluatorImpl implements
RuleNetworkEvaluator {
log.trace("{} SubnetworkQueue {} {}", indent(offset),
betaNode.toString(), srcTuples.toStringSizes());
}
+
+
TupleSets subLts = subSmem.getStagedLeftTuples().takeAll();
// node is first in the segment, so bit is 1
@@ -892,16 +896,13 @@ public class RuleNetworkEvaluatorImpl implements
RuleNetworkEvaluator {
srcTuples.resetAll();
}
+ @Override
public void propagate(SegmentMemory sourceSegment, TupleSets leftTuples) {
if (leftTuples.isEmpty()) {
return;
}
-
- LeftTupleSource source = ( LeftTupleSource )
sourceSegment.getTipNode();
- if ( sourceSegment.isEmpty() ) {
-
segmentMemorySupport.createChildSegments(source.getSinkPropagator(),
sourceSegment);
- }
+ segmentMemorySupport.initializeChildSegmentsIfNeeded(sourceSegment);
processPeers(sourceSegment, leftTuples);
@@ -1030,7 +1031,7 @@ public class RuleNetworkEvaluatorImpl implements
RuleNetworkEvaluator {
}
private static int getOffset(NetworkNode node) {
- LeftTupleSource lt;
+ LeftTupleNode lt;
int offset = 1;
if (NodeTypeEnums.isTerminalNode(node)) {
lt = ((TerminalNode) node).getLeftTupleSource();
@@ -1038,7 +1039,7 @@ public class RuleNetworkEvaluatorImpl implements
RuleNetworkEvaluator {
} else if (node.getType() == NodeTypeEnums.TupleToObjectNode) {
lt = ((TupleToObjectNode) node).getLeftTupleSource();
} else {
- lt = (LeftTupleSource) node;
+ lt = (LeftTupleNode) node;
}
while (!NodeTypeEnums.isLeftInputAdapterNode(lt)) {
offset++;
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
index d7b277af20..79271c7018 100644
---
a/drools-core/src/main/java/org/drools/core/phreak/SegmentMemorySupportImpl.java
+++
b/drools-core/src/main/java/org/drools/core/phreak/SegmentMemorySupportImpl.java
@@ -210,11 +210,13 @@ public class SegmentMemorySupportImpl implements
SegmentMemorySupport {
return memory.getSegmentMemory();
}
- public void createChildSegments(LeftTupleSinkPropagator sinkProp,
SegmentMemory smem) {
+ @Override
+ public void initializeChildSegmentsIfNeeded(SegmentMemory smem) {
+ LeftTupleSinkPropagator sinkPropagator =
smem.getTipNode().getSinkPropagator();
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
+ for (LeftTupleSinkNode sink = sinkPropagator.getFirstLeftTupleSink();
sink != null; sink = sink
.getNextLeftTupleSinkNode()) {
SegmentMemory childSmem = PhreakBuilder.isEagerSegmentCreation() ?
createChildSegment(sink)
: createChildSegmentLazily(sink);
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 7cf58f76cf..676de2a570 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
@@ -18,6 +18,7 @@
*/
package org.drools.core.reteoo;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
@@ -173,10 +174,7 @@ public class LeftInputAdapterNode extends LeftTupleSource
boolean useLeftMemory) {
SegmentMemory sm = lm.getOrCreateSegmentMemory( liaNode, reteEvaluator
);
if ( sm.getTipNode() == liaNode) {
- // liaNode in its own segment and child segments not yet created
- if ( sm.isEmpty() ) {
-
reteEvaluator.getSegmentMemorySupport().createChildSegments(liaNode.getSinkPropagator(),
sm);
- }
+
reteEvaluator.getSegmentMemorySupport().initializeChildSegmentsIfNeeded(sm);
sm = sm.getFirst(); // repoint to the child sm
}
@@ -199,8 +197,9 @@ public class LeftInputAdapterNode extends LeftTupleSource
TupleImpl leftTuple = TupleFactory.createLeftTuple( sink, factHandle,
useLeftMemory );
leftTuple.setPropagationContext( context );
+ Collection<PathMemory> pathsToFlush;
if ( sm.getRootNode() == liaNode ) {
- doInsertSegmentMemoryWithFlush(reteEvaluator, notifySegment, lm,
sm, leftTuple, liaNode.isStreamMode());
+ pathsToFlush = doInsertSegmentMemory(reteEvaluator, notifySegment,
lm, sm, leftTuple, liaNode.isStreamMode() );
} else {
// sm points to lia child sm, so iterate for all remaining children
// all peer tuples must be created before propagation, or eager
evaluation subnetworks have problem
@@ -210,9 +209,8 @@ public class LeftInputAdapterNode extends LeftTupleSource
sink = sm.getSinkFactory();
peer = TupleFactory.createPeer( sink, peer ); // pctx is set
during peer cloning
}
-
sm = originaSm;
- Set<PathMemory> pathsToFlush = new HashSet<>();
+ pathsToFlush = new HashSet<>();
pathsToFlush.addAll( doInsertSegmentMemory( reteEvaluator,
notifySegment, lm, sm, leftTuple, liaNode.isStreamMode() ) );
if ( sm.getRootNode() != liaNode ) {
// sm points to lia child sm, so iterate for all remaining
children
@@ -223,16 +221,8 @@ public class LeftInputAdapterNode extends LeftTupleSource
}
}
- for (PathMemory outPmem : pathsToFlush) {
-
reteEvaluator.getRuleNetworkEvaluator().forceFlushPath(outPmem);
- }
- }
- }
-
- public static void doInsertSegmentMemoryWithFlush(ReteEvaluator
reteEvaluator, boolean notifySegment, LiaNodeMemory lm, SegmentMemory sm,
TupleImpl leftTuple, boolean streamMode) {
- for (PathMemory outPmem : doInsertSegmentMemory(reteEvaluator,
notifySegment, lm, sm, leftTuple, streamMode )) {
- reteEvaluator.getRuleNetworkEvaluator().forceFlushPath(outPmem);
}
+ reteEvaluator.getRuleNetworkEvaluator().forceFlushPaths(pathsToFlush);
}
public static List<PathMemory> doInsertSegmentMemory(ReteEvaluator
reteEvaluator, boolean linkOrNotify, LiaNodeMemory lm, SegmentMemory sm,
TupleImpl leftTuple, boolean streamMode) {
@@ -263,10 +253,7 @@ public class LeftInputAdapterNode extends LeftTupleSource
final boolean linkOrNotify,
final LiaNodeMemory lm) {
if ( sm.getTipNode() == liaNode ) {
- // liaNode in it's own segment and child segments not yet created
- if ( sm.isEmpty() ) {
-
reteEvaluator.getSegmentMemorySupport().createChildSegments(liaNode.getSinkPropagator(),
sm);
- }
+
reteEvaluator.getSegmentMemorySupport().initializeChildSegmentsIfNeeded(sm);
sm = sm.getFirst(); // repoint to the child sm
}
@@ -321,10 +308,7 @@ public class LeftInputAdapterNode extends LeftTupleSource
final LiaNodeMemory lm,
SegmentMemory sm) {
if ( sm.getTipNode() == liaNode) {
- // liaNode in it's own segment and child segments not yet created
- if ( sm.isEmpty() ) {
-
reteEvaluator.getSegmentMemorySupport().createChildSegments(liaNode.getSinkPropagator(),
sm);
- }
+
reteEvaluator.getSegmentMemorySupport().initializeChildSegmentsIfNeeded(sm);
sm = sm.getFirst(); // repoint to the child sm
}
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 dac6ea9a1b..fe5da91e80 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
@@ -79,6 +79,10 @@ public class SegmentMemory extends LinkedList<SegmentMemory>
return proto.getRootNode();
}
+ public boolean isOnlyLiaSegment() {
+ return getRootNode() == getTipNode();
+ }
+
public SegmentPrototype getSegmentPrototype() {
return proto;
}
diff --git
a/drools-metric/src/main/java/org/drools/metric/phreak/PhreakTimerNodeMetric.java
b/drools-metric/src/main/java/org/drools/metric/phreak/PhreakTimerNodeMetric.java
index be0d215885..f86ec081ac 100644
---
a/drools-metric/src/main/java/org/drools/metric/phreak/PhreakTimerNodeMetric.java
+++
b/drools-metric/src/main/java/org/drools/metric/phreak/PhreakTimerNodeMetric.java
@@ -22,7 +22,6 @@ import org.drools.core.common.ActivationsManager;
import org.drools.core.common.ReteEvaluator;
import org.drools.core.common.TupleSets;
import org.drools.core.phreak.PhreakTimerNode;
-import org.drools.core.reteoo.LeftTuple;
import org.drools.core.reteoo.LeftTupleSink;
import org.drools.core.reteoo.PathMemory;
import org.drools.core.reteoo.SegmentMemory;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]