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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sat Sep 23 18:38:35 EDT 2006


Author: mark.proctor at jboss.com
Date: 2006-09-23 18:38:21 -0400 (Sat, 23 Sep 2006)
New Revision: 6391

Removed:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/beta/
Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BaseNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultFactHandle.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeTupleSinkAdapter.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/InitialFactHandle.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/LeftInputAdapterNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSinkPropagator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSource.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSink.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSinkPropagator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSource.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ObjectHashMap.java
Log:
JBRULES-498 Optimised HashMap impls

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2006-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2006-09-23 22:38:21 UTC (rev 6391)
@@ -94,7 +94,7 @@
     protected GlobalResolver                  globalResolver;
 
     protected static final Object             NULL                                          = new Serializable() {
-                                                                                                private static final long serialVersionUID = -6666310064415179894L;
+                                                                                                private static final long serialVersionUID = 320L;
                                                                                             };
 
     /** The eventSupport */

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BaseNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BaseNode.java	2006-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BaseNode.java	2006-09-23 22:38:21 UTC (rev 6391)
@@ -30,8 +30,6 @@
     NetworkNode {
     protected final int id;
 
-    protected boolean   attachingNewNode = false;
-
     protected boolean   hasMemory        = false;
 
     protected int       sharedCount      = 0;
@@ -86,19 +84,19 @@
     public abstract void remove(BaseNode node,
                                 InternalWorkingMemory[] workingMemories);
 
-    /**
-     * When nodes are added to the network that already has data. that existing data must be repropagated to the new node.
-     * This new propagation may result in one or more assertions, so a PropagationContext and the workingMemory for the facts
-     * must be provided.
-     * 
-     * @param workingMemory
-     *      The WorkingMemory
-     * @param context
-     *      The PropagationContext
-     *      
-     */
-    public abstract void updateNewNode(InternalWorkingMemory workingMemory,
-                                       PropagationContext context);
+//    /**
+//     * When nodes are added to the network that already has data. that existing data must be repropagated to the new node.
+//     * This new propagation may result in one or more assertions, so a PropagationContext and the workingMemory for the facts
+//     * must be provided.
+//     * 
+//     * @param workingMemory
+//     *      The WorkingMemory
+//     * @param context
+//     *      The PropagationContext
+//     *      
+//     */
+//    public abstract void updateNewNode(InternalWorkingMemory workingMemory,
+//                                       PropagationContext context);    
 
     /**
      * Each time a node is shared a counter is increased.

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultFactHandle.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultFactHandle.java	2006-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultFactHandle.java	2006-09-23 22:38:21 UTC (rev 6391)
@@ -99,7 +99,7 @@
      * @see Object
      */
     public int hashCode() {
-        return (int)  this.id;
+        return (int)(this.id ^ (this.id >>> 32));
     }
 
     /**

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java	2006-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java	2006-09-23 22:38:21 UTC (rev 6391)
@@ -102,15 +102,19 @@
 
     public void attach(final InternalWorkingMemory[] workingMemories) {
         attach();
-
+        
+        // we are attaching this node with existing working memories
+        // so this  node must also have memory
+        this.hasMemory = true;
         for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
             final InternalWorkingMemory workingMemory = workingMemories[i];
             final PropagationContext propagationContext = new PropagationContextImpl( workingMemory.getNextPropagationIdCounter(),
                                                                                       PropagationContext.RULE_ADDITION,
                                                                                       null,
                                                                                       null );
-            this.objectSource.updateNewNode( workingMemory,
-                                             propagationContext );
+            this.objectSource.updateSink( this,
+                                          propagationContext,
+                                          workingMemory );
         }
     }
 
@@ -181,10 +185,7 @@
         }
     }
 
-    public void updateNewNode(final InternalWorkingMemory workingMemory,
-                              final PropagationContext context) {
-        this.attachingNewNode = true;
-
+    public void updateSink(ObjectSink sink, PropagationContext context, InternalWorkingMemory workingMemory) {
         FactHashSet memory = null;
 
         // if it was not storing facts in memory previously, create memory and
@@ -195,9 +196,7 @@
             for(Iterator it = this.objectSource.getPropagatedFacts( workingMemory ).iterator(); it.hasNext(); ) {
                 InternalFactHandle handle = (InternalFactHandle) it.next();
                 memory.add( handle, false );
-                this.sink.propagateNewObjectSink( handle,
-                                                  context,
-                                                  workingMemory );
+                sink.assertObject( handle, context, workingMemory );
             }
         } else {
             // if already has memory, just iterate and propagate
@@ -206,15 +205,11 @@
             for ( int i = 0, length  = entries.length; i < length; i++ ) {
                 AbstractHashTable.FactEntry current = entries[i];
                 while  ( current != null ) {
-                    this.sink.propagateNewObjectSink( current.getFactHandle(),
-                                                      context,
-                                                      workingMemory );
+                    sink.assertObject( current.getFactHandle(), context, workingMemory );
                     current = ( AbstractHashTable.FactEntry ) current.getNext();
                 }
             }        
-        }
-
-        this.attachingNewNode = false;
+        }        
     }
 
     public void remove(final BaseNode node,

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaMemory.java	2006-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaMemory.java	2006-09-23 22:38:21 UTC (rev 6391)
@@ -1,202 +0,0 @@
-/*
- * Copyright 2005 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.
- */
-
-package org.drools.reteoo;
-
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.drools.RuleBaseConfiguration;
-import org.drools.WorkingMemory;
-import org.drools.common.BetaNodeConstraints;
-import org.drools.common.InternalFactHandle;
-import org.drools.reteoo.beta.BetaLeftMemory;
-import org.drools.reteoo.beta.BetaMemoryFactory;
-import org.drools.reteoo.beta.BetaRightMemory;
-import org.drools.spi.Tuple;
-
-/**
- * Memory for left and right inputs of a <code>BetaNode</code>. The LeftMemory is a <code>LinkedList</code> for all incoming 
- * <code>Tuples</code> and the right memory is a LinkedHashMap which stores each incoming <code>FactHandle</code> with 
- * its <code>ObjectMatche</code>. A LinkedHashMap is used as iteration must be in assertion order otherwise you break
- * LIFO based agenda evaluation.
- * 
- * @see ReteTuple
- * @see ObjectMatches
- * 
- * @author <a href="mailto:mark.proctor at jboss.com">Mark Proctor</a>
- * @author <a href="mailto:bob at werken.com">Bob McWhirter</a>
- */
-class BetaMemory
-    implements
-    Serializable {
-    // ------------------------------------------------------------
-    // Instance members
-    // ------------------------------------------------------------
-
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -5494203883277782421L;
-
-    /** Left-side tuples. */
-    private BetaLeftMemory    leftMemory;
-
-    /** Right-side tuples. */
-    private BetaRightMemory   rightMemory;
-
-    /** 
-     * This map is needed to link FactHandles to ObjectMatches specifically to
-     * support random access operations like remove(fact);
-     */
-    private Map               rightObjectMap;
-
-    // ------------------------------------------------------------
-    // Constructors
-    // ------------------------------------------------------------
-
-    /**
-     * Construct a BetaMemory with a LinkedList for the <code>Tuples</code> and a <code>LinkedHashMap</code> for the 
-     * <code>FactHandle</code>s
-     */
-    BetaMemory(final RuleBaseConfiguration config,
-               final BetaNodeConstraints binder) {
-        this.leftMemory = BetaMemoryFactory.newLeftMemory( config,
-                                                           binder );
-        this.rightMemory = BetaMemoryFactory.newRightMemory( config,
-                                                             binder );
-        this.rightObjectMap = new HashMap();
-    }
-
-    public BetaLeftMemory getLeftTupleMemory() {
-        return this.leftMemory;
-    }
-
-    public BetaRightMemory getRightObjectMemory() {
-        return this.rightMemory;
-    }
-
-    /**
-     * @return A tuple iterator with possible matches for the handle
-     */
-    public Iterator leftTupleIterator(final WorkingMemory wm,
-                                      final InternalFactHandle handle) {
-        return this.leftMemory.iterator( wm,
-                                         handle );
-    }
-
-    /**
-     * The iterator iterates the propagated FactHandles in assertion order
-     * @return The an Iterator for the right memory
-     */
-    Iterator rightObjectIterator(final WorkingMemory wm,
-                                 final Tuple tuple) {
-        return this.rightMemory.iterator( wm,
-                                          tuple );
-    }
-
-    /**
-     * Add a <code>ReteTuple</code> to the memory.
-     * @param tuple
-     */
-    void add(final WorkingMemory wm,
-             final ReteTuple tuple) {
-        this.leftMemory.add( wm,
-                             tuple );
-    }
-
-    /**
-     * Remove the <code>ReteTuple</code> from the left memory.
-     * @param tuple
-     */
-    void remove(final WorkingMemory wm,
-                final ReteTuple tuple) {
-        this.leftMemory.remove( wm,
-                                tuple );
-    }
-
-    /**
-     * Adds a <code>FactHandleImp</code> to the right memory <code>LinkedHashMap</code>. On being added to
-     * The right memory an <code>ObjectMatches</code> class is created and added as the key's value and then returned.
-     *  
-     *  @see ObjectMatches
-     *  
-     * @param handle
-     * @return
-     *      The ObjectMatches to hold the tuples that match with the <code>FactHandleImpl</code>
-     */
-    ObjectMatches add(final WorkingMemory wm,
-                      final InternalFactHandle handle) {
-        final ObjectMatches objectMatches = new ObjectMatches( handle );
-        this.rightObjectMap.put( handle,
-                                 objectMatches );
-        this.rightMemory.add( wm,
-                              objectMatches );
-        return objectMatches;
-    }
-
-    ObjectMatches add(final WorkingMemory wm,
-                      final ObjectMatches objectMatches) {
-        this.rightObjectMap.put( objectMatches.getFactHandle(),
-                                 objectMatches );
-        this.rightMemory.add( wm,
-                              objectMatches );
-        return objectMatches;
-    }
-
-    /**
-     * Remove the <code>FactHandleImpl<code> from the right memroy <code>LinkedHashMap</code>. The key's ObjectMatches
-     * value is returned.
-     * 
-     * @param handle
-     * @return
-     *      The ObjectMatches that held the tuples that match with the <code>FactHandleImpl</code>
-     */
-    ObjectMatches remove(final WorkingMemory wm,
-                         final InternalFactHandle handle) {
-        final ObjectMatches matches = (ObjectMatches) this.rightObjectMap.remove( handle );
-        this.rightMemory.remove( wm,
-                                 matches );
-        return matches;
-    }
-
-    /**
-     * @return The boolean value indicating the empty status of the left tuple memory
-     */
-    public boolean isLeftMemoryEmpty() {
-        return this.leftMemory.isEmpty();
-    }
-
-    /**
-     * @return The boolean value indicating the empty status of the right fact handle memory
-     */
-    public boolean isRightMemoryEmpty() {
-        return this.rightMemory.isEmpty();
-    }
-
-    /**
-     * Produce debug string.
-     * 
-     * @return The debug string.
-     */
-    public String toString() {
-        return "[JoinMemory]";
-        //return "[JoinMemory \n\tleft=" + this.leftMemory + "\n\tright=" + this.rightMemory + "]";
-    }
-
-}

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-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeTupleSinkAdapter.java	2006-09-23 22:38:21 UTC (rev 6391)
@@ -35,7 +35,9 @@
 
         for ( TupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextTupleSinkNode() ) {
             sink.assertTuple( new ReteTuple( tuple,
-                                             handle), context, workingMemory );
+                                             handle ),
+                              context,
+                              workingMemory );
         }
     }
 
@@ -43,34 +45,85 @@
                                      PropagationContext context,
                                      InternalWorkingMemory workingMemory) {
         for ( TupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextTupleSinkNode() ) {
-            sink.assertTuple( new ReteTuple( tuple), context, workingMemory );
+            sink.assertTuple( 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,
-                                           PropagationContext context,
-                                           InternalWorkingMemory workingMemory) {
+                                              PropagationContext context,
+                                              InternalWorkingMemory workingMemory) {
+        // This is the root fact, so we don't need to clone it.
+        ReteTuple tuple = new ReteTuple( handle );
         for ( TupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextTupleSinkNode() ) {
-            sink.assertTuple( new ReteTuple( handle ), context, workingMemory );
+            sink.assertTuple( tuple,
+                              context,
+                              workingMemory );
         }
     }
-    
-    public void createAndPropagateRetractTuple(InternalFactHandle handle,
+
+    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) {
-           for ( TupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextTupleSinkNode() ) {
-               sink.retractTuple( new ReteTuple( handle ), context, 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 createAndPropagateModifyTuple(InternalFactHandle handle,
+
+    public void createAndPropagateRetractTuple(ReteTuple tuple,
                                                PropagationContext context,
                                                InternalWorkingMemory workingMemory) {
-            for ( TupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextTupleSinkNode() ) {
-                sink.modifyTuple( new ReteTuple( handle ), context, workingMemory );
-            }
-     }    
+        for ( TupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextTupleSinkNode() ) {
+            sink.retractTuple( tuple,
+                               context,
+                               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()];
 
@@ -82,70 +135,70 @@
         return sinkArray;
     }
 
-//    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;
-//    }
+    //    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;
+    //    }
 
     public int size() {
         return this.sinks.size();

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/InitialFactHandle.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/InitialFactHandle.java	2006-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/InitialFactHandle.java	2006-09-23 22:38:21 UTC (rev 6391)
@@ -23,7 +23,7 @@
     /**
      * 
      */
-    private static final long        serialVersionUID = -9081273269528006282L;
+    private static final long        serialVersionUID = 320L;
 
     private final InternalFactHandle delegate;
 

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	2006-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java	2006-09-23 22:38:21 UTC (rev 6391)
@@ -374,20 +374,18 @@
     /* (non-Javadoc)
      * @see org.drools.reteoo.BaseNode#updateNewNode(org.drools.reteoo.WorkingMemoryImpl, org.drools.spi.PropagationContext)
      */
-    public void updateNewNode(final InternalWorkingMemory workingMemory,
-                              final PropagationContext context) {
-        this.attachingNewNode = true;
+    public void updateSink(final TupleSink sink,
+                           final InternalWorkingMemory workingMemory,
+                           final PropagationContext context) {
 
         final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
 
         for ( final Iterator it = memory.getRightObjectMemory().iterator(); it.hasNext(); ) {
             final ObjectMatches objectMatches = (ObjectMatches) it.next();
-            for ( TupleMatch tupleMatch = objectMatches.getFirstTupleMatch(); tupleMatch != null; tupleMatch = (TupleMatch) tupleMatch.getNext() ) {                
-                this.sink.propagateNewTupleSink( tupleMatch, context, workingMemory );
+            for ( TupleMatch tupleMatch = objectMatches.getFirstTupleMatch(); tupleMatch != null; tupleMatch = (TupleMatch) tupleMatch.getNext() ) {
+                this.sink.propagateAssertTuple( tupleMatch.getTuple(), context, workingMemory );
             }
         }
-
-        this.attachingNewNode = false;
     }
 
     /**

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-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java	2006-09-23 22:38:21 UTC (rev 6391)
@@ -16,6 +16,7 @@
  * limitations under the License.
  */
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -34,6 +35,8 @@
 import org.drools.util.LinkedList;
 import org.drools.util.LinkedListNode;
 import org.drools.util.LinkedListEntry;
+import org.drools.util.ObjectHashMap;
+import org.drools.util.ObjectHashMap.ObjectEntry;
 
 /**
  * All asserting Facts must propagated into the right <code>ObjectSink</code> side of a BetaNode, if this is the first Column
@@ -53,8 +56,8 @@
     /**
      * 
      */
-    private static final long    serialVersionUID = 320L;
-    private final ObjectSource   objectSource;
+    private static final long         serialVersionUID = 320L;
+    private final ObjectSource        objectSource;
     private final BetaNodeConstraints binder;
 
     /**
@@ -67,10 +70,12 @@
      *      The parent node, where Facts are propagated from
      */
     public LeftInputAdapterNode(final int id,
-                                final ObjectSource source) {
+                                final ObjectSource source,
+                                final boolean hashMemory) {
         this( id,
               source,
-              null );
+              null,
+              hashMemory );
     }
 
     /**
@@ -87,11 +92,12 @@
      */
     public LeftInputAdapterNode(final int id,
                                 final ObjectSource source,
-                                final BetaNodeConstraints binder) {
+                                final BetaNodeConstraints binder,
+                                final boolean hashMemory) {
         super( id );
         this.objectSource = source;
         this.binder = binder;
-        setHasMemory( true );
+        setHasMemory( hashMemory );
     }
 
     public FieldConstraint[] getConstraints() {
@@ -114,8 +120,9 @@
                                                                                       PropagationContext.RULE_ADDITION,
                                                                                       null,
                                                                                       null );
-            this.objectSource.updateNewNode( workingMemory,
-                                             propagationContext );
+            this.objectSource.updateSink( this,
+                                          propagationContext,
+                                          workingMemory );
         }
     }
 
@@ -133,15 +140,23 @@
     public void assertObject(final InternalFactHandle handle,
                              final PropagationContext context,
                              final InternalWorkingMemory workingMemory) {
-        final Map memory = (Map) workingMemory.getNodeMemory( this );
-
         if ( (this.binder == null) || (this.binder.isAllowed( handle,
                                                               null,
                                                               workingMemory )) ) {
-            memory.put( handle,
-                        this.sink.createAndAssertTuple( 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,
+                         false );
+            } else {
+                this.sink.createAndPropagateAssertTuple( handle,
+                                                         context,
+                                                         workingMemory );
+            }
         }
     }
 
@@ -159,83 +174,66 @@
     public void retractObject(final InternalFactHandle handle,
                               final PropagationContext context,
                               final InternalWorkingMemory workingMemory) {
-        final Map memory = (Map) workingMemory.getNodeMemory( this );
-        final LinkedList list = (LinkedList) memory.remove( handle );
-
-        // the handle might have been filtered out by the binder
-        if ( list != null ) {
-            for ( LinkedListNode node = list.removeFirst(); node != null; node = list.removeFirst() ) {
-                ReteTuple tuple = (ReteTuple) ((LinkedListEntry) node).getObject();
-                tuple.retractTuple( context,
-                                    workingMemory );
-            }
+        if ( this.hasMemory ) {
+            ObjectHashMap map = (ObjectHashMap) workingMemory.getNodeMemory( this );
+            LinkedList list = (LinkedList) map.remove( handle );
+            this.sink.createAndPropagateRetractTuple( list,
+                                                      context,
+                                                      workingMemory );
+        } else {
+            ReteTuple tuple = new ReteTuple( handle );
+            this.sink.createAndPropagateRetractTuple( tuple,
+                                                      context,
+                                                      workingMemory );
         }
     }
 
     public void modifyObject(final InternalFactHandle handle,
                              final PropagationContext context,
                              final InternalWorkingMemory workingMemory) {
-        final Map memory = (Map) workingMemory.getNodeMemory( this );
+        if ( this.hasMemory ) {
+            ObjectHashMap map = (ObjectHashMap) workingMemory.getNodeMemory( this );
+            LinkedList list = (LinkedList) map.get( handle );
+            this.sink.createAndPropagateModifyTuple( list,
+                                                     context,
+                                                     workingMemory );
+        } else {
+            ReteTuple tuple = new ReteTuple( handle );
+            this.sink.createAndPropagateModifyTuple( tuple,
+                                                     context,
+                                                     workingMemory );
+        }
+    }
 
-        if ( (this.binder == null) || (this.binder.isAllowed( handle,
-                                                              null,
-                                                              workingMemory )) ) {
-            final LinkedList list = (LinkedList) memory.get( handle );
-
-            if ( list != null ) {
-                // already existed, so propagate as a modify
-                for ( LinkedListNode node = list.getFirst(); node != null; node = node.getNext() ) {
-                    ReteTuple tuple = (ReteTuple) ((LinkedListEntry) node).getObject();
-                    tuple.modifyTuple( 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
+            ObjectHashMap map = (ObjectHashMap) workingMemory.getNodeMemory( this );
+            ObjectEntry[] entries = (ObjectEntry[]) map.getTable();
+            for ( int i = 0, length = entries.length; i < length; i++ ) {
+                ObjectEntry current = entries[i];
+                while ( current != null ) {
+                    InternalFactHandle handle = (InternalFactHandle) current.getKey();
+                    LinkedList list = (LinkedList) current.getValue();
+                    ReteTuple tuple = new ReteTuple( handle );
+                    list.add( new LinkedListEntry( tuple ) );
+                    sink.assertTuple( tuple,
+                                      context,
+                                      workingMemory );
+                    current = (ObjectEntry) current.getNext();
                 }
-            } else {
-                // didn't existed, so propagate as an assert
-                memory.put( handle,
-                            this.sink.createAndAssertTuple( handle,
-                                                            context,
-                                                            workingMemory ) );
             }
         } else {
-            final LinkedList list = (LinkedList) memory.remove( handle );
-
-            if ( list != null ) {
-                for ( LinkedListNode node = list.getFirst(); node != null; node = node.getNext() ) {
-                    ReteTuple tuple = (ReteTuple) ((LinkedListEntry) node).getObject();
-                    tuple.retractTuple( context,
-                                        workingMemory );
-                }
-            }
+            ObjectSinkAdapter adapter = new ObjectSinkAdapter( sink );
+            this.objectSource.updateSink( adapter,
+                                          context,
+                                          workingMemory );
         }
     }
 
-    /* (non-Javadoc)
-     * @see org.drools.reteoo.BaseNode#updateNewNode(org.drools.reteoo.WorkingMemoryImpl, org.drools.spi.PropagationContext)
-     */
-    public void updateNewNode(final InternalWorkingMemory workingMemory,
-                              final PropagationContext context) {
-        this.attachingNewNode = true;
-
-        // Get the newly attached TupleSink
-        //        final TupleSink sink = (TupleSink) getTupleSinks().get( getTupleSinks().size() - 1 );
-
-        // Iterate the memory and assert all tuples into the newly attached TupleSink
-        final Map memory = (Map) workingMemory.getNodeMemory( this );
-
-        for ( final Iterator it = memory.entrySet().iterator(); it.hasNext(); ) {
-            Entry entry = (Entry) it.next();
-
-            final InternalFactHandle handle = (InternalFactHandle) entry.getKey();
-            final LinkedList list = (LinkedList) entry.getValue();
-            this.sink.propagateNewTupleSink( handle,
-                                             list,
-                                             context,
-                                             workingMemory );
-        }
-
-        this.attachingNewNode = false;
-    }
-
     public void remove(final BaseNode node,
                        final InternalWorkingMemory[] workingMemories) {
         if ( !node.isInUse() ) {
@@ -251,14 +249,6 @@
                                   workingMemories );
     }
 
-    /**
-     * LeftInputAdapter uses a HashMap for memory. The key is the received <code>FactHandleImpl</code> and the
-     * created <code>ReteTuple</code> is the value.
-     */
-    public Object createMemory(final RuleBaseConfiguration config) {
-        return new HashMap();
-    }
-
     public int hashCode() {
         return this.objectSource.hashCode();
     }
@@ -285,9 +275,73 @@
      */
     public List getPropagatedTuples(final InternalWorkingMemory workingMemory,
                                     final TupleSink sink) {
-        final Map memory = (Map) workingMemory.getNodeMemory( this );
-        return this.sink.getPropagatedTuples( memory,
-                                              workingMemory,
-                                              sink );
+        List tupeList = new ArrayList();
+        if (  this.hasMemory ) {  
+            ObjectHashMap map = (ObjectHashMap) workingMemory.getNodeMemory( this );
+            ObjectEntry[] entries = (ObjectEntry[]) map.getTable();
+            for ( int i = 0, length = entries.length; i < length; i++ ) {
+                ObjectEntry current = entries[i];
+                while ( current != null ) {
+                    LinkedList list = (LinkedList) current.getValue();
+                    for ( LinkedListEntry entry = ( LinkedListEntry ) list.getFirst(); entry != null; entry = ( LinkedListEntry ) entry.getNext() ) {
+                        tupeList.add( entry.getObject() );
+                    }                    
+                    current = (ObjectEntry) current.getNext();
+                }
+            }                    
+        } else{
+            ObjectSinkAdapter adapter = new ObjectSinkAdapter( tupeList );
+        }
+        return tupeList;
     }
+
+    public Object createMemory(RuleBaseConfiguration config) {
+        return new ObjectHashMap();
+    }
+
+    /**
+     * Used with the updateSink method, so that the parent ObjectSource
+     * can  update the  TupleSink
+     * @author mproctor
+     *
+     */
+    private static class ObjectSinkAdapter
+        implements
+        ObjectSink {
+        private TupleSink sink;
+        private List list;
+        
+        public ObjectSinkAdapter(List list) {
+            this.list = list;
+        }
+
+        public ObjectSinkAdapter(TupleSink sink) {
+            this.sink = sink;
+        }        
+
+        public void assertObject(InternalFactHandle handle,
+                                 PropagationContext context,
+                                 InternalWorkingMemory workingMemory) {
+            ReteTuple tuple = new ReteTuple( handle );
+            if ( this.sink != null  ) {
+                this.sink.assertTuple( tuple,
+                                       context,
+                                       workingMemory );
+            } else {
+                this.list.add( tuple );
+            }
+        }
+
+        public void modifyObject(InternalFactHandle handle,
+                                 PropagationContext context,
+                                 InternalWorkingMemory workingMemory) {
+            throw new UnsupportedOperationException( "ObjectSinkAdapter onlys supports assertObject method calls" );
+        }
+
+        public void retractObject(InternalFactHandle handle,
+                                  PropagationContext context,
+                                  InternalWorkingMemory workingMemory) {
+            throw new UnsupportedOperationException( "ObjectSinkAdapter onlys supports assertObject method calls" );
+        }
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSinkPropagator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSinkPropagator.java	2006-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSinkPropagator.java	2006-09-23 22:38:21 UTC (rev 6391)
@@ -20,9 +20,5 @@
                                       PropagationContext context,
                                       InternalWorkingMemory workingMemory);
 
-    public ObjectSink[] getSinks();
-
-    public void propagateNewObjectSink(InternalFactHandle handle,
-                                       PropagationContext context,
-                                       InternalWorkingMemory workingMemory); 
+    public ObjectSink[] getSinks(); 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSource.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSource.java	2006-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSource.java	2006-09-23 22:38:21 UTC (rev 6391)
@@ -22,6 +22,7 @@
 import org.drools.common.BaseNode;
 import org.drools.common.DefaultFactHandle;
 import org.drools.common.InternalWorkingMemory;
+import org.drools.spi.PropagationContext;
 
 /**
  * A source of <code>FactHandle</code>s for an <code>ObjectSink</code>.
@@ -117,5 +118,7 @@
         }         
     }
     
+    public abstract void updateSink(ObjectSink sink, PropagationContext context, InternalWorkingMemory workingMemory);
+    
     public abstract List getPropagatedFacts(InternalWorkingMemory workingMemory);
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java	2006-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java	2006-09-23 22:38:21 UTC (rev 6391)
@@ -168,24 +168,16 @@
                              final InternalWorkingMemory workingMemory) {        
         this.sink.propagateModifyObject( handle, context, workingMemory );       
     }
-
-    /* (non-Javadoc)
-     * @see org.drools.reteoo.BaseNode#updateNewNode(org.drools.reteoo.WorkingMemoryImpl, org.drools.spi.PropagationContext)
-     */
-    public void updateNewNode(final InternalWorkingMemory workingMemory,
-                              final PropagationContext context) {
-        this.attachingNewNode = true;
-        
+    
+    public void updateSink(ObjectSink sink, PropagationContext context, InternalWorkingMemory workingMemory) {
         final PrimitiveLongMap memory = (PrimitiveLongMap) workingMemory.getNodeMemory( this );        
 
         for ( final Iterator it = memory.values().iterator(); it.hasNext(); ) {            
             final DefaultFactHandle handle = (DefaultFactHandle) it.next();
-            this.sink.propagateNewObjectSink( handle, context, workingMemory );
+            sink.assertObject( handle, context, workingMemory );
         }
+    }    
 
-        this.attachingNewNode = false;
-    }
-
     /**
      * Rete needs to know that this ObjectTypeNode has been added
      */

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSink.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSink.java	2006-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSink.java	2006-09-23 22:38:21 UTC (rev 6391)
@@ -18,8 +18,10 @@
 
 import java.io.Serializable;
 
+import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.spi.PropagationContext;
+import org.drools.spi.Tuple;
 import org.drools.util.LinkedListNode;
 
 /**
@@ -56,5 +58,4 @@
     void modifyTuple(ReteTuple tuple,
                      PropagationContext context,
                      InternalWorkingMemory workingMemory);
-
 }

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-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSinkPropagator.java	2006-09-23 22:38:21 UTC (rev 6391)
@@ -3,6 +3,7 @@
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.spi.PropagationContext;
+import org.drools.util.LinkedList;
 
 public interface TupleSinkPropagator {
     public void propagateAssertTuple(ReteTuple tuple,
@@ -14,36 +15,48 @@
                                      PropagationContext context,
                                      InternalWorkingMemory workingMemory);
 
+    public LinkedList createAndPropagateAssertTupleWithMemory(InternalFactHandle handle,
+                                                              PropagationContext context,
+                                                              InternalWorkingMemory workingMemory);
+
     public void createAndPropagateAssertTuple(InternalFactHandle handle,
-                                             PropagationContext context,
-                                             InternalWorkingMemory workingMemory);
-    
-    public void createAndPropagateRetractTuple(InternalFactHandle handle,
                                               PropagationContext context,
-                                              InternalWorkingMemory workingMemory); 
-    
-    public void createAndPropagateModifyTuple(InternalFactHandle handle,
+                                              InternalWorkingMemory workingMemory);
+
+    public void createAndPropagateRetractTuple(ReteTuple tuple,
                                                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,
-//                                      PropagationContext context,
-//                                      InternalWorkingMemory workingMemory);
-//
-//    public void propagateNewTupleSink(InternalFactHandle handle,
-//                                      LinkedList list,
-//                                      PropagationContext context,
-//                                      InternalWorkingMemory workingMemory);
-//
-//    public void propagateNewTupleSink(ReteTuple tuple,
-//                                      PropagationContext context,
-//                                      InternalWorkingMemory workingMemory);
-//
-//    public List getPropagatedTuples(final Map memory,
-//                                    final InternalWorkingMemory workingMemory,
-//                                    final TupleSink sink);
+    //    public void propagateNewTupleSink(TupleMatch tupleMatch,
+    //                                      PropagationContext context,
+    //                                      InternalWorkingMemory workingMemory);
+    //
+    //    public void propagateNewTupleSink(InternalFactHandle handle,
+    //                                      LinkedList list,
+    //                                      PropagationContext context,
+    //                                      InternalWorkingMemory workingMemory);
+    //
+    //    public void propagateNewTupleSink(ReteTuple tuple,
+    //                                      PropagationContext context,
+    //                                      InternalWorkingMemory workingMemory);
+    //
+    //    public List getPropagatedTuples(final Map memory,
+    //                                    final InternalWorkingMemory workingMemory,
+    //                                    final TupleSink sink);
 
     public int size();
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSource.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSource.java	2006-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSource.java	2006-09-23 22:38:21 UTC (rev 6391)
@@ -115,5 +115,7 @@
      */
     public abstract List getPropagatedTuples(InternalWorkingMemory workingMemory,
                                              TupleSink sink);
+    
+    public abstract void updateSink(TupleSink sink, PropagationContext context, InternalWorkingMemory workingMemory);
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java	2006-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java	2006-09-23 22:38:21 UTC (rev 6391)
@@ -16,7 +16,6 @@
     protected int              threshold;
     protected float            loadFactor;
 
-    protected boolean          checkExists;
     protected ObjectComparator comparator;
 
     protected Entry[]          table;
@@ -32,13 +31,8 @@
         this.threshold = (int) (capacity * loadFactor);
         this.table = new Entry[capacity];
         this.comparator = EqualityEquals.getInstance();
-        this.checkExists = false;
     }
 
-    public void setCheckExists(boolean checkExists) {
-        this.checkExists = checkExists;
-    }
-
     public void setComparator(ObjectComparator comparator) {
         this.comparator = comparator;
     }

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-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ObjectHashMap.java	2006-09-23 22:38:21 UTC (rev 6391)
@@ -4,6 +4,7 @@
 package org.drools.util;
 
 public class ObjectHashMap extends AbstractHashTable {
+    
     public ObjectHashMap() {
         this( 16,
               0.75f );
@@ -14,9 +15,15 @@
         super( capacity,
                loadFactor );
     }
+    
+    public Object put(Object key,
+                      Object value) {
+        return put(key, value, true);
+    }    
 
     public Object put(Object key,
-                      Object value) {
+                      Object value,
+                      boolean checkExists ) {
         int hashCode = hash( key );
         int index = indexOf( hashCode,
                              table.length );
@@ -113,7 +120,7 @@
         return hashCode & (dataSize - 1);
     }
 
-    private static class ObjectEntry
+    public static class ObjectEntry
         implements
         Entry {
         private Object key;




More information about the jboss-svn-commits mailing list