This is an automated email from the ASF dual-hosted git repository.

yamer 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 7f71103535 Fix for optaplanner test failures (#6527)
7f71103535 is described below

commit 7f7110353537c05e6b91d4164979ec42be3c0109
Author: Paolo Bizzarri <[email protected]>
AuthorDate: Sat Nov 22 11:05:00 2025 +0100

    Fix for optaplanner test failures (#6527)
---
 .../org/drools/core/phreak/PhreakExistsNode.java   |  4 ++--
 .../drools/core/phreak/PhreakNodeOperations.java   | 28 ++++++++++++++++++++++
 .../java/org/drools/core/phreak/PhreakNotNode.java |  4 ++--
 3 files changed, 32 insertions(+), 4 deletions(-)

diff --git 
a/drools-core/src/main/java/org/drools/core/phreak/PhreakExistsNode.java 
b/drools-core/src/main/java/org/drools/core/phreak/PhreakExistsNode.java
index 4057e27366..31f93d31f8 100644
--- a/drools-core/src/main/java/org/drools/core/phreak/PhreakExistsNode.java
+++ b/drools-core/src/main/java/org/drools/core/phreak/PhreakExistsNode.java
@@ -33,8 +33,8 @@ import org.drools.core.reteoo.TupleMemory;
 import org.drools.core.util.FastIterator;
 
 import static org.drools.core.phreak.PhreakJoinNode.updateChildLeftTuple;
+import static 
org.drools.core.phreak.PhreakNodeOperations.doUpdatesExistentialReorderLeftMemory;
 import static 
org.drools.core.phreak.PhreakNodeOperations.doUpdatesExistentialReorderRightMemory;
-import static 
org.drools.core.phreak.PhreakNodeOperations.doUpdatesReorderLeftMemory;
 import static org.drools.core.phreak.PhreakNodeOperations.findLeftTupleBlocker;
 import static 
org.drools.core.phreak.PhreakNodeOperations.unlinkAndDeleteChildLeftTuple;
 import static org.drools.core.phreak.PhreakNodeOperations.useLeftMemory;
@@ -75,7 +75,7 @@ public class PhreakExistsNode {
         }
 
         if (srcLeftTuples.getUpdateFirst() != null )  {
-            doUpdatesReorderLeftMemory(bm, srcLeftTuples);
+            doUpdatesExistentialReorderLeftMemory(bm, srcLeftTuples);
         }
 
         if ( srcRightTuples.getUpdateFirst() != null ) {
diff --git 
a/drools-core/src/main/java/org/drools/core/phreak/PhreakNodeOperations.java 
b/drools-core/src/main/java/org/drools/core/phreak/PhreakNodeOperations.java
index cc059077f2..8634768df2 100644
--- a/drools-core/src/main/java/org/drools/core/phreak/PhreakNodeOperations.java
+++ b/drools-core/src/main/java/org/drools/core/phreak/PhreakNodeOperations.java
@@ -230,6 +230,34 @@ public class PhreakNodeOperations {
         }
     }
     
+    public static void doUpdatesExistentialReorderLeftMemory(BetaMemory bm,
+                                                             TupleSets 
srcLeftTuples) {
+        TupleMemory ltm = bm.getLeftTupleMemory();
+
+        // sides must first be re-ordered, to ensure iteration integrity
+        for (TupleImpl leftTuple = srcLeftTuples.getUpdateFirst(); leftTuple 
!= null; leftTuple = leftTuple.getStagedNext()) {
+            if (leftTuple.getMemory() != null) {
+                ltm.remove(leftTuple);
+            }
+        }
+
+        for (TupleImpl leftTuple = srcLeftTuples.getUpdateFirst(); leftTuple 
!= null; leftTuple = leftTuple.getStagedNext()) {
+            RightTuple blocker = leftTuple.getBlocker();
+            if (blocker == null) {
+                ltm.add(leftTuple);
+                for (TupleImpl childLeftTuple = leftTuple.getFirstChild(); 
childLeftTuple != null;) {
+                    TupleImpl childNext = childLeftTuple.getHandleNext();
+                    childLeftTuple.reAddRight();
+                    childLeftTuple = childNext;
+                }
+            } else if (blocker.getStagedType() != LeftTuple.NONE) {
+                // it's blocker is also being updated, so remove to force it 
to start from the beginning
+                blocker.removeBlocked((LeftTuple) leftTuple);
+            }
+        }
+    }
+
+    
     public static void doUpdatesExistentialReorderRightMemory(BetaMemory bm,
                                                               BetaNode 
betaNode,
                                                               TupleSets 
srcRightTuples) {
diff --git 
a/drools-core/src/main/java/org/drools/core/phreak/PhreakNotNode.java 
b/drools-core/src/main/java/org/drools/core/phreak/PhreakNotNode.java
index 730de5a669..9851cd2797 100644
--- a/drools-core/src/main/java/org/drools/core/phreak/PhreakNotNode.java
+++ b/drools-core/src/main/java/org/drools/core/phreak/PhreakNotNode.java
@@ -34,8 +34,8 @@ import org.drools.core.reteoo.TupleMemory;
 import org.drools.core.util.FastIterator;
 
 import static org.drools.core.phreak.PhreakJoinNode.updateChildLeftTuple;
+import static 
org.drools.core.phreak.PhreakNodeOperations.doUpdatesExistentialReorderLeftMemory;
 import static 
org.drools.core.phreak.PhreakNodeOperations.doUpdatesExistentialReorderRightMemory;
-import static 
org.drools.core.phreak.PhreakNodeOperations.doUpdatesReorderLeftMemory;
 import static org.drools.core.phreak.PhreakNodeOperations.findLeftTupleBlocker;
 import static 
org.drools.core.phreak.PhreakNodeOperations.unlinkAndDeleteChildLeftTuple;
 import static org.drools.core.phreak.PhreakNodeOperations.useLeftMemory;
@@ -80,7 +80,7 @@ public class PhreakNotNode {
 
         if (srcLeftTuples.getUpdateFirst() != null) {
             // must happen before right inserts, so it can find left tuples to 
block.
-            doUpdatesReorderLeftMemory(bm, srcLeftTuples);
+            doUpdatesExistentialReorderLeftMemory(bm, srcLeftTuples);
         }
 
         if ( srcRightTuples.getUpdateFirst() != null) {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to