[jboss-svn-commits] JBL Code SVN: r34068 - labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Jul 20 12:04:15 EDT 2010


Author: tirelli
Date: 2010-07-20 12:04:13 -0400 (Tue, 20 Jul 2010)
New Revision: 34068

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTupleSinkAdapter.java
Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ExistsNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java
Log:
JBRULES-2584: fixing dynamic rules that include evals

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java	2010-07-20 15:32:38 UTC (rev 34067)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java	2010-07-20 16:04:13 UTC (rev 34068)
@@ -136,8 +136,8 @@
                                                        false );
         } else {
             // this is a hack, to not add closed DroolsQuery objects
-            Object object = ((InternalFactHandle)context.getFactHandle()).getObject();
-            if ( memory.betaMemory.getLeftTupleMemory() != null && !(object instanceof DroolsQuery &&  !((DroolsQuery)object).isOpen() ) ) {                
+            Object object = ((InternalFactHandle) context.getFactHandle()).getObject();
+            if ( memory.betaMemory.getLeftTupleMemory() != null && !(object instanceof DroolsQuery && !((DroolsQuery) object).isOpen()) ) {
                 memory.betaMemory.getLeftTupleMemory().add( leftTuple );
                 memory.betaMemory.getCreatedHandles().put( leftTuple,
                                                            accresult,
@@ -145,7 +145,7 @@
             } else {
                 useLeftMemory = false;
             }
-        }        
+        }
 
         accresult.context = this.accumulate.createContext();
 
@@ -158,7 +158,8 @@
                                           workingMemory,
                                           leftTuple );
 
-        for ( RightTuple rightTuple = memory.betaMemory.getRightTupleMemory().getFirst( leftTuple, (InternalFactHandle) context.getFactHandle() ); rightTuple != null; rightTuple = (RightTuple) rightTuple.getNext() ) {
+        for ( RightTuple rightTuple = memory.betaMemory.getRightTupleMemory().getFirst( leftTuple,
+                                                                                        (InternalFactHandle) context.getFactHandle() ); rightTuple != null; rightTuple = (RightTuple) rightTuple.getNext() ) {
             InternalFactHandle handle = rightTuple.getFactHandle();
             if ( this.constraints.isAllowedCachedLeft( memory.betaMemory.getContext(),
                                                        handle ) ) {
@@ -244,10 +245,10 @@
 
         memory.betaMemory.getRightTupleMemory().add( rightTuple );
 
-        if ( memory.betaMemory.getLeftTupleMemory() == null || memory.betaMemory.getLeftTupleMemory().size() == 0  ) {
+        if ( memory.betaMemory.getLeftTupleMemory() == null || memory.betaMemory.getLeftTupleMemory().size() == 0 ) {
             // do nothing here, as we know there are no left tuples at this stage in sequential mode or for a query.
             // unless it's an "Open Query" and thus that will have left memory, so continue as normal
-            return;            
+            return;
         }
 
         this.constraints.updateFromFactHandle( memory.betaMemory.getContext(),
@@ -331,7 +332,8 @@
 
         RightTupleMemory rightMemory = memory.betaMemory.getRightTupleMemory();
 
-        RightTuple rightTuple = rightMemory.getFirst( leftTuple, (InternalFactHandle) context.getFactHandle() );
+        RightTuple rightTuple = rightMemory.getFirst( leftTuple,
+                                                      (InternalFactHandle) context.getFactHandle() );
 
         // first check our index (for indexed nodes only) hasn't changed and we are returning the same bucket
         if ( childLeftTuple != null && rightMemory.isIndexed() && rightTuple != rightMemory.getFirst( childLeftTuple.getRightParent() ) ) {
@@ -376,7 +378,7 @@
                             // add a new match
                             addMatch( leftTuple,
                                       rightTuple,
-                                      childLeftTuple, 
+                                      childLeftTuple,
                                       null,
                                       workingMemory,
                                       memory,
@@ -434,11 +436,11 @@
         // this is needed to fix for indexing and deterministic iteration
         memory.betaMemory.getRightTupleMemory().remove( rightTuple );
         memory.betaMemory.getRightTupleMemory().add( rightTuple );
-        
+
         if ( memory.betaMemory.getLeftTupleMemory() == null || memory.betaMemory.getLeftTupleMemory().size() == 0 ) {
             // do nothing here, as we know there are no left tuples at this stage in sequential mode.
             return;
-        }        
+        }
 
         // WTD here
         //                if ( !behavior.assertRightTuple( memory.getBehaviorContext(),
@@ -525,7 +527,7 @@
                                   memory,
                                   accctx,
                                   true );
-                        if( temp != null ) {
+                        if ( temp != null ) {
                             childLeftTuple = temp;
                         }
                         evaluateResultConstraints( ActivitySource.RIGHT,
@@ -580,7 +582,7 @@
                                            final InternalWorkingMemory workingMemory,
                                            final AccumulateMemory memory,
                                            final AccumulateContext accctx,
-                                           final boolean useLeftMemory ) {
+                                           final boolean useLeftMemory) {
 
         // get the actual result
         final Object result = this.accumulate.getResult( memory.workingMemoryContext,
@@ -658,8 +660,8 @@
             // assert
             this.sink.propagateAssertLeftTuple( leftTuple,
                                                 accctx.result,
-                                                null, 
                                                 null,
+                                                null,
                                                 context,
                                                 workingMemory,
                                                 useLeftMemory );
@@ -763,7 +765,7 @@
                           final InternalWorkingMemory workingMemory,
                           final AccumulateMemory memory,
                           final AccumulateContext accresult,
-                          final boolean useLeftMemory ) {
+                          final boolean useLeftMemory) {
         LeftTuple tuple = leftTuple;
         InternalFactHandle handle = rightTuple.getFactHandle();
         if ( this.unwrapRightObject ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java	2010-07-20 15:32:38 UTC (rev 34067)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java	2010-07-20 16:04:13 UTC (rev 34068)
@@ -408,7 +408,7 @@
      */
     private static class LeftTupleSinkUpdateAdapter
         implements
-        LeftTupleSink {
+        LeftTupleSink, LeftTupleSinkAdapter {
         private final EvalConditionNode node;
         private final LeftTupleSink     sink;
         private final EvalCondition     constraint;
@@ -426,6 +426,8 @@
                                     final InternalWorkingMemory workingMemory) {
 
             final EvalMemory memory = (EvalMemory) workingMemory.getNodeMemory( node );
+            // need to be overridden, because it was pointing to the adapter instead
+            leftTuple.setLeftTupleSink( this.node );
 
             final boolean allowed = this.constraint.isAllowed( leftTuple,
                                                                workingMemory,
@@ -487,6 +489,10 @@
             return sink.getPartitionId();
         }
 
+        public LeftTupleSink getRealSink() {
+            return this.node;
+        }
+
     }
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ExistsNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ExistsNode.java	2010-07-20 15:32:38 UTC (rev 34067)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ExistsNode.java	2010-07-20 16:04:13 UTC (rev 34068)
@@ -112,7 +112,8 @@
             }
         }
 
-        for ( RightTuple rightTuple = memory.getRightTupleMemory().getFirst( leftTuple, (InternalFactHandle) context.getFactHandle() ); rightTuple != null; rightTuple = (RightTuple) rightTuple.getNext() ) {
+        for ( RightTuple rightTuple = memory.getRightTupleMemory().getFirst( leftTuple,
+                                                                             (InternalFactHandle) context.getFactHandle() ); rightTuple != null; rightTuple = (RightTuple) rightTuple.getNext() ) {
             if ( this.constraints.isAllowedCachedLeft( memory.getContext(),
                                                        rightTuple.getFactHandle() ) ) {
 
@@ -304,7 +305,8 @@
             memory.getLeftTupleMemory().remove( leftTuple );
         } else {
             // check if we changed bucket
-            if ( rightMemory.isIndexed() && rightMemory.getFirst( blocker ) != rightMemory.getFirst( leftTuple, (InternalFactHandle) context.getFactHandle() ) ) {
+            if ( rightMemory.isIndexed() && rightMemory.getFirst( blocker ) != rightMemory.getFirst( leftTuple,
+                                                                                                     (InternalFactHandle) context.getFactHandle() ) ) {
                 // we changed bucket, so blocker no longer blocks
                 blocker.removeBlocked( leftTuple );
                 leftTuple.setBlocker( null );
@@ -332,7 +334,8 @@
             }
 
             // find first blocker, because it's a modify, we need to start from the beginning again        
-            RightTuple rightTuple = rightMemory.getFirst( leftTuple, (InternalFactHandle) context.getFactHandle() );
+            RightTuple rightTuple = rightMemory.getFirst( leftTuple,
+                                                          (InternalFactHandle) context.getFactHandle() );
             for ( RightTuple newBlocker = rightTuple; newBlocker != null; newBlocker = (RightTuple) newBlocker.getNext() ) {
                 if ( this.constraints.isAllowedCachedLeft( memory.getContext(),
                                                            newBlocker.getFactHandle() ) ) {
@@ -377,7 +380,7 @@
                                  InternalWorkingMemory workingMemory) {
         final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
 
-        if ( memory.getLeftTupleMemory() == null || ( memory.getLeftTupleMemory().size() == 0 && rightTuple.getBlocked() == null ) ) {
+        if ( memory.getLeftTupleMemory() == null || (memory.getLeftTupleMemory().size() == 0 && rightTuple.getBlocked() == null) ) {
             // do nothing here, as we know there are no left tuples
 
             //normally do this at the end, but as we are exiting early, make sure the buckets are still correct.

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java	2010-07-20 15:32:38 UTC (rev 34067)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java	2010-07-20 16:04:13 UTC (rev 34068)
@@ -391,13 +391,14 @@
             Map<Object, RightTuple> matches = (Map<Object, RightTuple>) memory.betaMemory.getCreatedHandles().get( leftTuple );
             for ( RightTuple rightTuples : matches.values() ) {
                 for ( RightTuple rightTuple = rightTuples; rightTuple != null; rightTuple = (RightTuple) rightTuples.getNext() ) {
-                    this.sink.propagateAssertLeftTuple( leftTuple,
-                                                        rightTuple,
-                                                        null,
-                                                        null, 
-                                                        context,
-                                                        workingMemory,
-                                                        this.tupleMemoryEnabled );
+                    sink.assertLeftTuple( new LeftTuple( leftTuple,
+                                                         rightTuple,
+                                                         null,
+                                                         null,
+                                                         sink,
+                                                         this.tupleMemoryEnabled ),
+                                          context,
+                                          workingMemory );
                 }
             }
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java	2010-07-20 15:32:38 UTC (rev 34067)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java	2010-07-20 16:04:13 UTC (rev 34068)
@@ -61,14 +61,14 @@
         final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
 
         boolean useLeftMemory = true;
-        if ( this.tupleMemoryEnabled  ) {
+        if ( this.tupleMemoryEnabled ) {
             memory.getLeftTupleMemory().add( leftTuple );
         } else {
             // This is a hack, to not add closed DroolsQuery objects
-            Object object = ((InternalFactHandle)context.getFactHandle()).getObject();                
-            if ( object instanceof DroolsQuery &&  !((DroolsQuery)object).isOpen() ) {
+            Object object = ((InternalFactHandle) context.getFactHandle()).getObject();
+            if ( object instanceof DroolsQuery && !((DroolsQuery) object).isOpen() ) {
                 useLeftMemory = false;
-            } else  if ( memory.getLeftTupleMemory() != null ) {
+            } else if ( memory.getLeftTupleMemory() != null ) {
                 // LeftMemory will be null for sequential (still created for queries).
                 memory.getLeftTupleMemory().add( leftTuple );
             }
@@ -77,7 +77,8 @@
         this.constraints.updateFromTuple( memory.getContext(),
                                           workingMemory,
                                           leftTuple );
-        for ( RightTuple rightTuple = memory.getRightTupleMemory().getFirst( leftTuple, (InternalFactHandle) context.getFactHandle() ); rightTuple != null; rightTuple = (RightTuple) rightTuple.getNext() ) {
+        for ( RightTuple rightTuple = memory.getRightTupleMemory().getFirst( leftTuple,
+                                                                             (InternalFactHandle) context.getFactHandle() ); rightTuple != null; rightTuple = (RightTuple) rightTuple.getNext() ) {
             final InternalFactHandle handle = rightTuple.getFactHandle();
             if ( this.constraints.isAllowedCachedLeft( memory.getContext(),
                                                        handle ) ) {
@@ -111,9 +112,9 @@
         }
 
         memory.getRightTupleMemory().add( rightTuple );
-        if (  memory.getLeftTupleMemory() == null || memory.getLeftTupleMemory().size() == 0  ) {
+        if ( memory.getLeftTupleMemory() == null || memory.getLeftTupleMemory().size() == 0 ) {
             // do nothing here, as no left memory
-            return;            
+            return;
         }
 
         this.constraints.updateFromFactHandle( memory.getContext(),
@@ -183,11 +184,11 @@
         // this is needed to fix for indexing and deterministic iteration
         memory.getRightTupleMemory().remove( rightTuple );
         memory.getRightTupleMemory().add( rightTuple );
-        
+
         if ( memory.getLeftTupleMemory() != null && memory.getLeftTupleMemory().size() == 0 ) {
             // do nothing here, as we know there are no left tuples.
             return;
-        }        
+        }
 
         LeftTuple childLeftTuple = rightTuple.firstChild;
 
@@ -200,7 +201,7 @@
                                                rightTuple.getFactHandle() );
 
         // first check our index (for indexed nodes only) hasn't changed and we are returning the same bucket
-        if ( childLeftTuple != null && leftMemory.isIndexed() && ( leftTuple == null || ( leftTuple.getMemory() != childLeftTuple.getLeftParent().getMemory() ) ) ) {            
+        if ( childLeftTuple != null && leftMemory.isIndexed() && (leftTuple == null || (leftTuple.getMemory() != childLeftTuple.getLeftParent().getMemory())) ) {
             // our index has changed, so delete all the previous propagations
             this.sink.propagateRetractRightTuple( rightTuple,
                                                   context,
@@ -281,10 +282,11 @@
 
         RightTupleMemory rightMemory = memory.getRightTupleMemory();
 
-        RightTuple rightTuple = rightMemory.getFirst( leftTuple, (InternalFactHandle) context.getFactHandle() );
+        RightTuple rightTuple = rightMemory.getFirst( leftTuple,
+                                                      (InternalFactHandle) context.getFactHandle() );
 
         // first check our index (for indexed nodes only) hasn't changed and we are returning the same bucket
-        if ( childLeftTuple != null && rightMemory.isIndexed() && ( rightTuple == null || ( rightTuple.getMemory() != childLeftTuple.getRightParent().getMemory() ) ) ) {
+        if ( childLeftTuple != null && rightMemory.isIndexed() && (rightTuple == null || (rightTuple.getMemory() != childLeftTuple.getRightParent().getMemory())) ) {
             // our index has changed, so delete all the previous propagations
             this.sink.propagateRetractLeftTuple( leftTuple,
                                                  context,
@@ -358,14 +360,15 @@
                            final PropagationContext context,
                            final InternalWorkingMemory workingMemory) {
 
-        final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );       
-        
+        final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
+
         final Iterator tupleIter = memory.getLeftTupleMemory().iterator();
         for ( LeftTuple leftTuple = (LeftTuple) tupleIter.next(); leftTuple != null; leftTuple = (LeftTuple) tupleIter.next() ) {
             this.constraints.updateFromTuple( memory.getContext(),
                                               workingMemory,
                                               leftTuple );
-            for ( RightTuple rightTuple = memory.getRightTupleMemory().getFirst( leftTuple, (InternalFactHandle) context.getFactHandle() ); rightTuple != null; rightTuple = (RightTuple) rightTuple.getNext() ) {
+            for ( RightTuple rightTuple = memory.getRightTupleMemory().getFirst( leftTuple,
+                                                                                 (InternalFactHandle) context.getFactHandle() ); rightTuple != null; rightTuple = (RightTuple) rightTuple.getNext() ) {
                 if ( this.constraints.isAllowedCachedLeft( memory.getContext(),
                                                            rightTuple.getFactHandle() ) ) {
                     sink.assertLeftTuple( new LeftTuple( leftTuple,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java	2010-07-20 15:32:38 UTC (rev 34067)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java	2010-07-20 16:04:13 UTC (rev 34068)
@@ -314,6 +314,13 @@
     public LeftTupleSink getLeftTupleSink() {
         return sink;
     }
+    
+    /* Had to add the set method because sink adapters must override 
+     * the tuple sink set when the tuple was created.
+     */
+    public void setLeftTupleSink( LeftTupleSink sink ) {
+        this.sink = sink;
+    }
 
     public LeftTuple getLeftParent() {
         return leftParent;

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTupleSinkAdapter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTupleSinkAdapter.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTupleSinkAdapter.java	2010-07-20 16:04:13 UTC (rev 34068)
@@ -0,0 +1,31 @@
+package org.drools.reteoo;
+
+/*
+ * Copyright 2010 JBoss Inc
+ *
+ * Licensed 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.
+ */
+
+/**
+ * Interface implemented by all sink adapters to allow
+ * nodes to create tuples that properly reference the real
+ * sink. 
+ */
+public interface LeftTupleSinkAdapter {
+
+    /**
+     * Returns the sink node that this adapter is wrapping
+     */
+    public LeftTupleSink getRealSink();
+    
+}



More information about the jboss-svn-commits mailing list