[jboss-svn-commits] JBL Code SVN: r6617 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools/reteoo main/java/org/drools/util test/java/org/drools/reteoo

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Oct 5 10:30:46 EDT 2006


Author: mark.proctor at jboss.com
Date: 2006-10-05 10:30:40 -0400 (Thu, 05 Oct 2006)
New Revision: 6617

Removed:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleTupleSink.java
Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeTupleSinkAdapter.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteTuple.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleObjectSinkAdapter.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleTupleSinkAdapter.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSinkPropagator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ObjectHashMap.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LeftInputAdapterNodeTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockTupleSink.java
Log:
JBRULES-498 Optimised HashMap implementations
-Make LeftInputAdapterNode work and its unit tests

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeTupleSinkAdapter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeTupleSinkAdapter.java	2006-10-05 12:47:12 UTC (rev 6616)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeTupleSinkAdapter.java	2006-10-05 14:30:40 UTC (rev 6617)
@@ -1,15 +1,8 @@
 package org.drools.reteoo;
 
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.spi.PropagationContext;
-import org.drools.util.LinkedList;
-import org.drools.util.LinkedListEntry;
 
 public class CompositeTupleSinkAdapter
     implements
@@ -49,7 +42,7 @@
                               context,
                               workingMemory );
         }
-    }
+    }        
 
     public void propagateRetractTuple(ReteTuple tuple,
                                       InternalFactHandle handle,
@@ -62,37 +55,18 @@
                                workingMemory );
         }
     }
-
-    public void propagateModifyTuple(ReteTuple tuple,
-                                     InternalFactHandle handle,
-                                     PropagationContext context,
-                                     InternalWorkingMemory workingMemory) {
-
+    
+    public void propagateRetractTuple(ReteTuple tuple,
+                                      PropagationContext context,
+                                      InternalWorkingMemory workingMemory) {
         for ( TupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextTupleSinkNode() ) {
-            sink.modifyTuple( new ReteTuple( tuple,
-                                             handle ),
-                              context,
-                              workingMemory );
+            sink.retractTuple( new ReteTuple( tuple ),
+                               context,
+                               workingMemory );
         }
-    }
+    }    
 
-    public LinkedList createAndPropagateAssertTupleWithMemory(InternalFactHandle handle,
-                                                              PropagationContext context,
-                                                              InternalWorkingMemory workingMemory) {
-        LinkedList list = new LinkedList();
-        // while this is the root fact, one branch propagates into one or more TerminalNodes, so we 
-        // have to remember the activations.
-        for ( TupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextTupleSinkNode() ) {
-            ReteTuple tuple = new ReteTuple( handle );
-            list.add( new LinkedListEntry( tuple ) );
-            sink.assertTuple( tuple,
-                              context,
-                              workingMemory );
-        }
-        return list;
-    }
-
-    public void createAndPropagateAssertTuple(InternalFactHandle handle,
+    public ReteTuple createAndPropagateAssertTuple(InternalFactHandle handle,
                                               PropagationContext context,
                                               InternalWorkingMemory workingMemory) {
         // This is the root fact, so we don't need to clone it.
@@ -102,33 +76,9 @@
                               context,
                               workingMemory );
         }
+        return tuple;
     }
 
-    public void createAndPropagateRetractTuple(LinkedList list,
-                                               PropagationContext context,
-                                               InternalWorkingMemory workingMemory) {
-        LinkedListEntry entry = (LinkedListEntry) list.getFirst();
-        for ( TupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextTupleSinkNode() ) {
-            sink.retractTuple( (ReteTuple) entry.getObject(),
-                               context,
-                               workingMemory );
-            entry = (LinkedListEntry) entry.getNext();
-        }
-    }
-
-    public void createAndPropagateModifyTuple(LinkedList list,
-                                              PropagationContext context,
-                                              InternalWorkingMemory workingMemory) {
-        LinkedListEntry entry = (LinkedListEntry) list.getFirst();
-
-        for ( TupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextTupleSinkNode() ) {
-            sink.modifyTuple( (ReteTuple) entry.getObject(),
-                              context,
-                              workingMemory );
-            entry = (LinkedListEntry) entry.getNext();
-        }
-    }
-
     public void createAndPropagateRetractTuple(ReteTuple tuple,
                                                PropagationContext context,
                                                InternalWorkingMemory workingMemory) {
@@ -138,17 +88,7 @@
                                workingMemory );
         }
     }
-
-    public void createAndPropagateModifyTuple(ReteTuple tuple,
-                                              PropagationContext context,
-                                              InternalWorkingMemory workingMemory) {
-        for ( TupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextTupleSinkNode() ) {
-            sink.modifyTuple( tuple,
-                              context,
-                              workingMemory );
-        }
-    }
-
+    
     public TupleSink[] getSinks() {
         TupleSink[] sinkArray = new TupleSink[this.sinks.size()];
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java	2006-10-05 12:47:12 UTC (rev 6616)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java	2006-10-05 14:30:40 UTC (rev 6617)
@@ -99,13 +99,13 @@
 
     public FieldConstraint[] getConstraints() {
         LinkedList constraints = this.constraints.getConstraints();
-        
-        FieldConstraint[] array = new FieldConstraint[ constraints.size() ];
+
+        FieldConstraint[] array = new FieldConstraint[constraints.size()];
         int i = 0;
-        for ( LinkedListEntry entry = ( LinkedListEntry ) constraints.getFirst(); entry != null; entry = ( LinkedListEntry ) entry.getNext() ) {
-            array[i++] = ( FieldConstraint ) entry.getObject();
+        for ( LinkedListEntry entry = (LinkedListEntry) constraints.getFirst(); entry != null; entry = (LinkedListEntry) entry.getNext() ) {
+            array[i++] = (FieldConstraint) entry.getObject();
         }
-        return array;        
+        return array;
     }
 
     /* (non-Javadoc)
@@ -145,21 +145,17 @@
                              final PropagationContext context,
                              final InternalWorkingMemory workingMemory) {
         if ( (this.constraints == null) || (this.constraints.isAllowed( handle,
-                                                              null,
-                                                              workingMemory )) ) {
+                                                                        null,
+                                                                        workingMemory )) ) {
+            ReteTuple tuple = this.sink.createAndPropagateAssertTuple( handle,
+                                                                       context,
+                                                                       workingMemory );
+
             if ( this.hasMemory ) {
-                LinkedList list = this.sink.createAndPropagateAssertTupleWithMemory( handle,
-                                                                                     context,
-                                                                                     workingMemory );
                 ObjectHashMap map = (ObjectHashMap) workingMemory.getNodeMemory( this );
-                // no need to scan, we know it doesn't exist
                 map.put( handle,
-                         list,
+                         tuple,
                          false );
-            } else {
-                this.sink.createAndPropagateAssertTuple( handle,
-                                                         context,
-                                                         workingMemory );
             }
         }
     }
@@ -178,36 +174,32 @@
     public void retractObject(final InternalFactHandle handle,
                               final PropagationContext context,
                               final InternalWorkingMemory workingMemory) {
+        ReteTuple tuple = null;
         if ( this.hasMemory ) {
             ObjectHashMap map = (ObjectHashMap) workingMemory.getNodeMemory( this );
-            LinkedList list = (LinkedList) map.remove( handle );
-            this.sink.createAndPropagateRetractTuple( list,
-                                                      context,
-                                                      workingMemory );
+            tuple = ( ReteTuple ) map.remove( handle );
         } else {
-            ReteTuple tuple = new ReteTuple( handle );
-            this.sink.createAndPropagateRetractTuple( tuple,
-                                                      context,
-                                                      workingMemory );
+            tuple = new ReteTuple( handle );            
         }
+        
+        this.sink.createAndPropagateRetractTuple( tuple,
+                                                  context,
+                                                  workingMemory );
     }
 
     public void updateSink(TupleSink sink,
                            PropagationContext context,
                            InternalWorkingMemory workingMemory) {
         if ( this.hasMemory ) {
-            // We have memory so iterate over all entries making new Tuples and adding them
-            // to the memory before propagating
+            // We have memory so iterate over all entries
             ObjectHashMap map = (ObjectHashMap) workingMemory.getNodeMemory( this );
             Iterator it = map.iterator();
-            for ( ObjectEntry entry = ( ObjectEntry ) it.next(); entry != null; it.next() ) {
+            for ( ObjectEntry entry = (ObjectEntry) it.next(); entry != null; it.next() ) {
                 InternalFactHandle handle = (InternalFactHandle) entry.getKey();
-                LinkedList list = (LinkedList) entry.getValue();
-                ReteTuple tuple = new ReteTuple( handle );
-                list.add( new LinkedListEntry( tuple ) );
+                ReteTuple tuple = (ReteTuple) entry.getValue();
                 sink.assertTuple( tuple,
                                   context,
-                                  workingMemory );                
+                                  workingMemory );
             }
         } else {
             ObjectSinkAdapter adapter = new ObjectSinkAdapter( sink );
@@ -267,9 +259,10 @@
         implements
         ObjectSink {
         private TupleSink sink;
+
         public ObjectSinkAdapter(TupleSink sink) {
             this.sink = sink;
-        }        
+        }
 
         public void assertObject(InternalFactHandle handle,
                                  PropagationContext context,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteTuple.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteTuple.java	2006-10-05 12:47:12 UTC (rev 6616)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteTuple.java	2006-10-05 14:30:40 UTC (rev 6617)
@@ -139,7 +139,11 @@
             return false;
         }
         
-        return this.parent.equals( other.parent );
+        if( this.parent == null ) {
+            return ( other.parent == null );
+        } else {
+            return this.parent.equals( other.parent );   
+        }        
     }
     
     public boolean equals(Object object) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleObjectSinkAdapter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleObjectSinkAdapter.java	2006-10-05 12:47:12 UTC (rev 6616)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleObjectSinkAdapter.java	2006-10-05 14:30:40 UTC (rev 6617)
@@ -10,13 +10,13 @@
     
     private ObjectSink sink;
     
-    public SingleObjectSinkAdapter(ObjectSink sink) {
+    public SingleObjectSinkAdapter(ObjectSink sink) {    
         this.sink = sink;
     }
 
     public void propagateAssertObject(InternalFactHandle handle,
                                       PropagationContext context,
-                                      InternalWorkingMemory workingMemory) {
+                                      InternalWorkingMemory workingMemory) {              
         this.sink.assertObject( handle, context, workingMemory );
 
     }

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleTupleSink.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleTupleSink.java	2006-10-05 12:47:12 UTC (rev 6616)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleTupleSink.java	2006-10-05 14:30:40 UTC (rev 6617)
@@ -1,34 +0,0 @@
-package org.drools.reteoo;
-
-import org.drools.common.InternalWorkingMemory;
-import org.drools.spi.PropagationContext;
-
-public class SingleTupleSink implements TupleSink {
-    private TupleSink sink;
-    public SingleTupleSink(TupleSink sink) {
-        this.sink = sink;
-    }
-    
-    public void assertTuple(ReteTuple tuple,
-                            PropagationContext context,
-                            InternalWorkingMemory workingMemory) {
-        sink.assertTuple( tuple, context, workingMemory );
-        
-    }
-
-    public void modifyTuple(ReteTuple tuple,
-                            PropagationContext context,
-                            InternalWorkingMemory workingMemory) {
-        sink.modifyTuple( tuple, context, workingMemory );
-        
-    }
-
-    public void retractTuple(ReteTuple tuple,
-                             PropagationContext context,
-                             InternalWorkingMemory workingMemory) {
-        this.retractTuple( tuple, context, workingMemory );
-        
-    }
-
-
-}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleTupleSinkAdapter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleTupleSinkAdapter.java	2006-10-05 12:47:12 UTC (rev 6616)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleTupleSinkAdapter.java	2006-10-05 14:30:40 UTC (rev 6617)
@@ -1,15 +1,8 @@
 package org.drools.reteoo;
 
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.spi.PropagationContext;
-import org.drools.util.LinkedList;
-import org.drools.util.LinkedListEntry;
 
 public class SingleTupleSinkAdapter
     implements
@@ -19,100 +12,133 @@
     public SingleTupleSinkAdapter(TupleSink sink) {
         this.sink = sink;
     }
-
+    
     public void propagateAssertTuple(ReteTuple tuple,
                                      InternalFactHandle handle,
-                                     TupleMatch tupleMatch,
                                      PropagationContext context,
                                      InternalWorkingMemory workingMemory) {
-        ReteTuple joined = new ReteTuple( tuple,
-                                          handle,
-                                          sink );
-        tupleMatch.addJoinedTuple( joined );
-        joined.assertTuple( context,
-                            workingMemory );
+        this.sink.assertTuple( new ReteTuple( tuple,
+                                              handle ),
+                               context,
+                               workingMemory );
     }
 
-    public LinkedList createAndPropagateAssertTuple(InternalFactHandle handle,
-                                           PropagationContext context,
-                                           InternalWorkingMemory workingMemory) {
-        final LinkedList list = new LinkedList();
-        ReteTuple tuple = new ReteTuple( handle,
-                                         sink );
-        list.add( new LinkedListEntry( tuple ) );
-        tuple.assertTuple( context,
-                           workingMemory );
-        return list;
-    }
-
     public void propagateAssertTuple(ReteTuple tuple,
                                      PropagationContext context,
                                      InternalWorkingMemory workingMemory) {
-        final ReteTuple child = new ReteTuple( tuple,
-                                               sink );
-        // no TupleMatch so instead add as a linked tuple
-        tuple.addChildEntry( child );
-        child.assertTuple( context,
-                           workingMemory );
-    }
+        this.sink.assertTuple( new ReteTuple( tuple ),
+                               context,
+                               workingMemory );
+    }        
 
-    /**
-     * @inheritDoc
-     */
-    public void propagateAssertTuple(final ReteTuple tuple,
-                                     final InternalFactHandle handle,
-                                     final PropagationContext context,
-                                     final InternalWorkingMemory workingMemory) {
-        final ReteTuple joined = new ReteTuple( tuple,
-                                                handle,
-                                                sink );
-        tuple.addChildEntry( joined );
-        joined.assertTuple( context,
-                            workingMemory );
-    }
-
-    public TupleSink[] getSinks() {
-        return new TupleSink[]{this.sink};
-    }
-
-    public void propagateNewTupleSink(TupleMatch tupleMatch,
+    public void propagateRetractTuple(ReteTuple tuple,
+                                      InternalFactHandle handle,
                                       PropagationContext context,
                                       InternalWorkingMemory workingMemory) {
-        // do nothing, as we have no new tuple sinks
-        throw new RuntimeException( "This is a bug you cannot update new data through this single sink adapter" );
+        this.sink.retractTuple( new ReteTuple( tuple,
+                                          handle ),
+                           context,
+                           workingMemory );
     }
-
-    public void propagateNewTupleSink(InternalFactHandle handle,
-                                      LinkedList list,
+    
+    public void propagateRetractTuple(ReteTuple tuple,
                                       PropagationContext context,
                                       InternalWorkingMemory workingMemory) {
-        // do nothing, as we have no new tuple sinks
-        throw new RuntimeException( "This is a bug you cannot update new data through this single sink adapter" );
+        this.sink.retractTuple( new ReteTuple( tuple ),
+                           context,
+                           workingMemory );
+    }    
 
+    public ReteTuple createAndPropagateAssertTuple(InternalFactHandle handle,
+                                              PropagationContext context,
+                                              InternalWorkingMemory workingMemory) {
+        // This is the root fact, so we don't need to clone it.
+        ReteTuple tuple = new ReteTuple( handle );
+        this.sink.assertTuple( tuple,
+                          context,
+                          workingMemory );
+        return tuple;
     }
 
-    public void propagateNewTupleSink(ReteTuple tuple,
-                                      PropagationContext context,
-                                      InternalWorkingMemory workingMemory) {
-        // do nothing, as we have no new tuple sinks
-        throw new RuntimeException( "This is a bug you cannot update new data through this single sink adapter" );
+    public void createAndPropagateRetractTuple(ReteTuple tuple,
+                                               PropagationContext context,
+                                               InternalWorkingMemory workingMemory) {
+        this.sink.retractTuple( tuple,
+                           context,
+                           workingMemory );
     }
+    
+    public TupleSink[] getSinks() {
+        return new TupleSink[] { this.sink };
+    }
 
-    public List getPropagatedTuples(final Map memory,
-                                    final InternalWorkingMemory workingMemory,
-                                    final TupleSink sink) {
-        final List propagatedTuples = new ArrayList( memory.size() );
+    //    public void propagateNewTupleSink(TupleMatch tupleMatch,
+    //                                      PropagationContext context,
+    //                                      InternalWorkingMemory workingMemory) {
+    //
+    //        final TupleSink sink = sinks.getLast();
+    //        final ReteTuple tuple = new ReteTuple( tupleMatch.getTuple(),
+    //                                               tupleMatch.getObjectMatches().getFactHandle(),
+    //                                               sink );
+    //        tupleMatch.addJoinedTuple( tuple );
+    //        tuple.assertTuple( context,
+    //                           workingMemory );
+    //    }
+    //
+    //    public void propagateNewTupleSink(ReteTuple tuple,
+    //                                      PropagationContext context,
+    //                                      InternalWorkingMemory workingMemory) {
+    //
+    //        final TupleSink sink = sinks.getLast();
+    //        ReteTuple child = new ReteTuple( tuple,
+    //                                         sink );
+    //        tuple.addChildEntry( child );
+    //        child.assertTuple( context,
+    //                           workingMemory );
+    //    }
+    //
+    //    public void propagateNewTupleSink(InternalFactHandle handle,
+    //                                      LinkedList list,
+    //                                      PropagationContext context,
+    //                                      InternalWorkingMemory workingMemory) {
+    //        TupleSink sink = this.sinks.getLast();
+    //        ReteTuple tuple = new ReteTuple( handle,
+    //                                         sink );
+    //        list.add( new LinkedListEntry( tuple ) );
+    //        tuple.assertTuple( context,
+    //                           workingMemory );
+    //    }
+    //
+    //    /**
+    //     * @inheritDoc
+    //     */
+    //    public List getPropagatedTuples(final Map memory,
+    //                                    final InternalWorkingMemory workingMemory,
+    //                                    final TupleSink sink) {
+    //        int index = 0;
+    //        for ( TupleSinkNode node = this.sinks.getFirst(); node != null; node = node.getNextTupleSinkNode() ) {
+    //            if ( node.equals( sink ) ) {
+    //                break;
+    //            }
+    //            index++;
+    //        }
+    //
+    //        final List propagatedTuples = new ArrayList( memory.size() );
+    //
+    //        for ( final Iterator it = memory.values().iterator(); it.hasNext(); ) {
+    //            final LinkedList tuples = (LinkedList) it.next();
+    //            LinkedListEntry wrapper = (LinkedListEntry) tuples.getFirst();
+    //            for ( int i = 0; i < index; i++ ) {
+    //                wrapper = (LinkedListEntry) wrapper.getNext();
+    //            }
+    //            propagatedTuples.add( wrapper.getObject() );
+    //        }
+    //
+    //        return propagatedTuples;
+    //    }
 
-        for ( final Iterator it = memory.values().iterator(); it.hasNext(); ) {
-            final LinkedList tuples = (LinkedList) it.next();
-            propagatedTuples.add( ((LinkedListEntry) tuples.getFirst()).getObject() );
-        }
-
-        return propagatedTuples;
-    }
-
     public int size() {
-        return 1;
+        return ( this.sink !=  null ) ?  1 :  0;
     }
+}
 
-}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSinkPropagator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSinkPropagator.java	2006-10-05 12:47:12 UTC (rev 6616)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSinkPropagator.java	2006-10-05 14:30:40 UTC (rev 6617)
@@ -22,22 +22,10 @@
     
     public void propagateRetractTuple(ReteTuple tuple,
                                       PropagationContext context,
-                                      InternalWorkingMemory workingMemory);      
-    
-    public void propagateModifyTuple(ReteTuple tuple,
-                                     InternalFactHandle handle,
-                                     PropagationContext context,
-                                     InternalWorkingMemory workingMemory);    
-    
-    public void propagateModifyTuple(ReteTuple tuple,
-                                     PropagationContext context,
-                                     InternalWorkingMemory workingMemory);       
+                                      InternalWorkingMemory workingMemory);            
 
-    public LinkedList createAndPropagateAssertTupleWithMemory(InternalFactHandle handle,
-                                                              PropagationContext context,
-                                                              InternalWorkingMemory workingMemory);
 
-    public void createAndPropagateAssertTuple(InternalFactHandle handle,
+    public ReteTuple createAndPropagateAssertTuple(InternalFactHandle handle,
                                               PropagationContext context,
                                               InternalWorkingMemory workingMemory);
 
@@ -45,18 +33,6 @@
                                                PropagationContext context,
                                                InternalWorkingMemory workingMemory);
 
-    public void createAndPropagateRetractTuple(LinkedList list,
-                                               PropagationContext context,
-                                               InternalWorkingMemory workingMemory);
-
-    public void createAndPropagateModifyTuple(ReteTuple tuple,
-                                              PropagationContext context,
-                                              InternalWorkingMemory workingMemory);
-
-    public void createAndPropagateModifyTuple(LinkedList list,
-                                              PropagationContext context,
-                                              InternalWorkingMemory workingMemory);
-
     public TupleSink[] getSinks();
 
     //    public void propagateNewTupleSink(TupleMatch tupleMatch,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ObjectHashMap.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ObjectHashMap.java	2006-10-05 12:47:12 UTC (rev 6616)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ObjectHashMap.java	2006-10-05 14:30:40 UTC (rev 6617)
@@ -89,12 +89,12 @@
                 }
                 current.setNext( null );
                 this.size--;
-                return current;
+                return current.getValue();
             }
             previous = current;
             current = next;
         }
-        return current;
+        return null;
     }
     
     public Entry getBucket(int hashCode) {

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LeftInputAdapterNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LeftInputAdapterNodeTest.java	2006-10-05 12:47:12 UTC (rev 6616)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LeftInputAdapterNodeTest.java	2006-10-05 14:30:40 UTC (rev 6617)
@@ -16,17 +16,20 @@
  * limitations under the License.
  */
 
+import java.lang.reflect.Field;
 import java.util.List;
 import java.util.Map;
 
 import org.drools.DroolsTestCase;
 import org.drools.RuleBaseFactory;
+import org.drools.common.BaseNode;
 import org.drools.common.DefaultFactHandle;
 import org.drools.common.PropagationContextImpl;
 import org.drools.spi.PropagationContext;
 import org.drools.spi.Tuple;
 import org.drools.util.LinkedList;
 import org.drools.util.LinkedListEntry;
+import org.drools.util.ObjectHashMap;
 
 public class LeftInputAdapterNodeTest extends DroolsTestCase {
 
@@ -53,20 +56,24 @@
 
         final LeftInputAdapterNode liaNode = new LeftInputAdapterNode( 1,
                                                                        source );
+        Field field =  ObjectSource.class.getDeclaredField( "sink" );
+        field.setAccessible( true );
+        ObjectSinkPropagator sink = ( ObjectSinkPropagator ) field.get( source );
+        
 
         assertEquals( 1,
                       liaNode.getId() );
+        assertNull( sink );
 
-        assertLength( 0,
-                      source.getObjectSinksAsList() );
-
         liaNode.attach();
+        
+        sink = ( ObjectSinkPropagator ) field.get( source );
 
-        assertLength( 1,
-                      source.getObjectSinksAsList() );
+        assertEquals( 1,
+                      sink.getSinks().length );
 
         assertSame( liaNode,
-                    source.getObjectSinks().getLastObjectSink() );
+                    sink.getSinks()[0] );
     }
 
     /**
@@ -74,7 +81,7 @@
      * 
      * @throws Exception
      */
-    public void testAssertObject() throws Exception {
+    public void testAssertObjectWithoutMemory() throws Exception {
         final PropagationContext context = new PropagationContextImpl( 0,
                                                                        PropagationContext.ASSERTION,
                                                                        null,
@@ -103,15 +110,54 @@
         assertSame( string1,
                     workingMemory.getObject( tuple0.get( 0 ) ) );
 
+    }
+
+    /**
+     * Tests the assertion of objects into LeftInputAdapterNode
+     * 
+     * @throws Exception
+     */
+    public void testAssertObjectWithMemory() throws Exception {
+        final PropagationContext context = new PropagationContextImpl( 0,
+                                                                       PropagationContext.ASSERTION,
+                                                                       null,
+                                                                       null );
+
+        final ReteooWorkingMemory workingMemory = new ReteooWorkingMemory( 1,
+                                                                           (ReteooRuleBase) RuleBaseFactory.newRuleBase() );
+
+        final LeftInputAdapterNode liaNode = new LeftInputAdapterNode( 1,
+                                                                       new MockObjectSource( 15 ) );       
+        
+        final MockTupleSink sink = new MockTupleSink();
+        liaNode.addTupleSink( sink );
+        
+        //force liaNode to have memory
+        Field field =  BaseNode.class.getDeclaredField( "hasMemory" );
+        field.setAccessible( true );
+        field.set( liaNode, new  Boolean( true ) );
+        
+        final Object string1 = "cheese";
+
+        // assert object
+        final DefaultFactHandle f0 = (DefaultFactHandle) workingMemory.assertObject( string1 );
+        liaNode.assertObject( f0,
+                              context,
+                              workingMemory );
+
+        final List asserted = sink.getAsserted();
+        assertLength( 1,
+                      asserted );
+        final Tuple tuple0 = (Tuple) ((Object[]) asserted.get( 0 ))[0];
+        assertSame( string1,
+                    workingMemory.getObject( tuple0.get( 0 ) ) );
+
         // check node memory
-        final Map map = (Map) workingMemory.getNodeMemory( liaNode );
-        final LinkedList list0 = (LinkedList) map.get( f0 );
-        assertEquals( 1,
-                      list0.size() );
+        final ObjectHashMap map = (ObjectHashMap) workingMemory.getNodeMemory( liaNode );
         assertSame( tuple0,
-                    ((LinkedListEntry) list0.getFirst()).getObject() );
+                    map.get( f0 ) );
 
-        // check memory stacks correctly
+        // check memory works with multiple handles
         final DefaultFactHandle f1 = (DefaultFactHandle) workingMemory.assertObject( "test1" );
         liaNode.assertObject( f1,
                               context,
@@ -121,24 +167,21 @@
                       asserted );
         final Tuple tuple1 = (Tuple) ((Object[]) asserted.get( 1 ))[0];
 
-        final LinkedList list1 = (LinkedList) map.get( f1 );
-        assertEquals( 1,
-                      list1.size() );
         assertSame( tuple1,
-                    ((LinkedListEntry) list1.getFirst()).getObject() );
+                    map.get( f1 ) );
 
         assertNotSame( tuple0,
                        tuple1 );
 
-    }
-
+    }    
+    
     /**
      * Tests the retractions from a LeftInputAdapterNode.
      * Object Assertions result in tuple propagations, so we 
      * test the remove(...) method
      * @throws Exception
      */
-    public void testRetractObject() throws Exception {
+    public void testRetractObjectWithoutMemory() throws Exception {
         final PropagationContext context = new PropagationContextImpl( 0,
                                                                        PropagationContext.ASSERTION,
                                                                        null,
@@ -156,7 +199,7 @@
 
         final DefaultFactHandle f0 = (DefaultFactHandle) workingMemory.assertObject( "f1" );
 
-        /* assert object */
+        // assert object 
         liaNode.assertObject( f0,
                               context,
                               workingMemory );
@@ -167,12 +210,56 @@
                                context,
                                workingMemory );
 
-        final Map map = (Map) workingMemory.getNodeMemory( liaNode );
+        assertEquals( tuple,
+                    ((Object[]) sink.getRetracted().get( 0 ))[0] );
+        assertNotSame( tuple,
+                       ((Object[]) sink.getRetracted().get( 0 ))[0] );  
+
+    }
+    
+    public void testRetractObjectWithMemory() throws Exception {
+        final PropagationContext context = new PropagationContextImpl( 0,
+                                                                       PropagationContext.ASSERTION,
+                                                                       null,
+                                                                       null );
+
+        final ReteooWorkingMemory workingMemory = new ReteooWorkingMemory( 1,
+                                                                           (ReteooRuleBase) RuleBaseFactory.newRuleBase() );
+
+        final MockObjectSource source = new MockObjectSource( 15 );
+
+        final LeftInputAdapterNode liaNode = new LeftInputAdapterNode( 1,
+                                                                       source );
+        //force liaNode to have memory
+        Field field =  BaseNode.class.getDeclaredField( "hasMemory" );
+        field.setAccessible( true );
+        field.set( liaNode, new  Boolean( true ) );
+        
+        final MockTupleSink sink = new MockTupleSink();
+        liaNode.addTupleSink( sink );
+
+        final DefaultFactHandle f0 = (DefaultFactHandle) workingMemory.assertObject( "f1" );
+
+        // assert object
+        liaNode.assertObject( f0,
+                              context,
+                              workingMemory );
+        
+        final Tuple tuple = (Tuple) ((Object[]) sink.getAsserted().get( 0 ))[0];
+        
+        final ObjectHashMap map = (ObjectHashMap) workingMemory.getNodeMemory( liaNode );
+        assertSame( tuple, map.get( f0 ) );
+
+        liaNode.retractObject( f0,
+                               context,
+                               workingMemory );
+
+
         assertNull( map.get( f0 ) );
 
         assertSame( tuple,
                     ((Object[]) sink.getRetracted().get( 0 ))[0] );
 
-    }
+    }    
 
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockTupleSink.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockTupleSink.java	2006-10-05 12:47:12 UTC (rev 6616)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockTupleSink.java	2006-10-05 14:30:40 UTC (rev 6617)
@@ -39,7 +39,7 @@
     private static final long serialVersionUID = -5292603482246485028L;
     private final List        asserted         = new ArrayList();
     private final List        retracted        = new ArrayList();
-    private final List        modified         = new ArrayList();
+  
 
     public MockTupleSink() {
         super( 0 );
@@ -49,26 +49,20 @@
         super( id );
     }
 
-    public void assertTuple(final Tuple tuple,
+    public void assertTuple(final ReteTuple tuple,
                             final PropagationContext context,
-                            final ReteooWorkingMemory workingMemory) {
+                            final InternalWorkingMemory workingMemory) {
         this.asserted.add( new Object[]{tuple, context, workingMemory} );
 
     }
 
-    public void retractTuple(final Tuple tuple,
+    public void retractTuple(final ReteTuple tuple,
                              final PropagationContext context,
-                             final ReteooWorkingMemory workingMemory) {
+                             final InternalWorkingMemory workingMemory) {
         this.retracted.add( new Object[]{tuple, context, workingMemory} );
 
     }
 
-    public void modifyTuple(final Tuple tuple,
-                            final PropagationContext context,
-                            final ReteooWorkingMemory workingMemory) {
-        this.modified.add( new Object[]{tuple, context, workingMemory} );
-    }
-
     public List getAsserted() {
         return this.asserted;
     }
@@ -77,10 +71,6 @@
         return this.retracted;
     }
 
-    public List getModified() {
-        return this.modified;
-    }
-
     public void ruleAttached() {
         // TODO Auto-generated method stub
     }
@@ -102,8 +92,9 @@
 
     }
 
-    public void updateNewNode(final InternalWorkingMemory workingMemory,
-                              final PropagationContext context) throws FactException {
+    public void updateSink(final TupleSink sink,
+                           final PropagationContext context,
+                           final InternalWorkingMemory workingMemory) throws FactException {
         // TODO Auto-generated method stub
 
     }




More information about the jboss-svn-commits mailing list