[jboss-svn-commits] JBL Code SVN: r7436 - labs/jbossrules/branches/3.0.x/drools-core/src/main/java/org/drools/reteoo

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Nov 7 13:47:53 EST 2006


Author: tirelli
Date: 2006-11-07 13:47:50 -0500 (Tue, 07 Nov 2006)
New Revision: 7436

Modified:
   labs/jbossrules/branches/3.0.x/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java
   labs/jbossrules/branches/3.0.x/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java
Log:
JBRULES-481: fixing add/removal issue on LIAN and sharing counter on TerminalNode

Modified: labs/jbossrules/branches/3.0.x/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java
===================================================================
--- labs/jbossrules/branches/3.0.x/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java	2006-11-07 18:45:25 UTC (rev 7435)
+++ labs/jbossrules/branches/3.0.x/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java	2006-11-07 18:47:50 UTC (rev 7436)
@@ -93,10 +93,12 @@
     }
 
     public FieldConstraint[] getConstraints() {
-        
+
         // Sanity check
-        if (binder==null) {return null;}
-        
+        if ( binder == null ) {
+            return null;
+        }
+
         return this.binder.getConstraints();
     }
 
@@ -164,11 +166,12 @@
 
         final LinkedList list = new LinkedList();
 
-        ReteTuple tuple = new ReteTuple( handle );
+        if ( !getTupleSinks().isEmpty() ) {
 
-        list.add( new LinkedListObjectWrapper( tuple ) );
+            ReteTuple tuple = new ReteTuple( handle );
 
-        if ( !getTupleSinks().isEmpty() ) {
+            list.add( new LinkedListObjectWrapper( tuple ) );
+
             // We do this one seperately so we avoid another tuple replication
             ((TupleSink) getTupleSinks().get( 0 )).assertTuple( tuple,
                                                                 context,
@@ -266,13 +269,17 @@
 
         // Iterate the memory and assert all tuples into the newly attached TupleSink
         final Map memory = (Map) workingMemory.getNodeMemory( this );
-        for ( final Iterator it = memory.values().iterator(); it.hasNext(); ) {
-            final LinkedList list = (LinkedList) it.next();
-            for ( LinkedListNode node = list.getFirst(); node != null; node = node.getNext() ) {
-                sink.assertTuple( (ReteTuple) ((LinkedListObjectWrapper) node).getObject(),
-                                  context,
-                                  workingMemory );
-            }
+        for ( final Iterator it = memory.entrySet().iterator(); it.hasNext(); ) {
+            Map.Entry entry = (Map.Entry) it.next();
+            DefaultFactHandle handle = (DefaultFactHandle) entry.getKey();
+            LinkedList list = (LinkedList) entry.getValue();
+
+            ReteTuple newTuple = new ReteTuple( handle );
+            list.add( new LinkedListObjectWrapper( newTuple ) );
+            sink.assertTuple( newTuple,
+                              context,
+                              workingMemory );
+
         }
 
         this.attachingNewNode = false;
@@ -280,8 +287,24 @@
 
     public void remove(final BaseNode node,
                        final ReteooWorkingMemory[] workingMemories) {
-        if( !node.isInUse() ) {
+        if ( !node.isInUse() ) {
+            final int index = this.getTupleSinks().indexOf( node );
             getTupleSinks().remove( node );
+            
+            // as we store the tuples propagated to each sink, 
+            // we need to remove all these tuples from memory
+            for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
+                final Map memory = (Map) workingMemories[i].getNodeMemory( this );
+
+                for ( final Iterator it = memory.values().iterator(); it.hasNext(); ) {
+                    final LinkedList tuples = (LinkedList) it.next();
+                    LinkedListObjectWrapper wrapper = (LinkedListObjectWrapper) tuples.getFirst();
+                    for ( int j = 0; j < index; j++ ) {
+                        wrapper = (LinkedListObjectWrapper) wrapper.getNext();
+                    }
+                    tuples.remove( wrapper );
+                }
+            }
         }
         removeShare();
         if ( !this.isInUse() ) {
@@ -291,6 +314,7 @@
         }
         this.objectSource.remove( this,
                                   workingMemories );
+        
     }
 
     /**

Modified: labs/jbossrules/branches/3.0.x/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java
===================================================================
--- labs/jbossrules/branches/3.0.x/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java	2006-11-07 18:45:25 UTC (rev 7435)
+++ labs/jbossrules/branches/3.0.x/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java	2006-11-07 18:47:50 UTC (rev 7436)
@@ -296,6 +296,7 @@
             workingMemory.propagateQueuedActions();
         }
 
+        removeShare();
         this.tupleSource.remove( this,
                                  workingMemories );
     }




More information about the jboss-svn-commits mailing list