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]

Reply via email to