[jboss-svn-commits] JBL Code SVN: r19195 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools/reteoo and 5 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Mar 21 17:07:44 EDT 2008


Author: mark.proctor at jboss.com
Date: 2008-03-21 17:07:44 -0400 (Fri, 21 Mar 2008)
New Revision: 19195

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightTupleSink.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/LeftTupleIndexHashTable.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/LeftTupleList.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/RightTupleIndexHashTable.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/RightTupleList.java
Removed:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHandleIndexHashTable.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashTable.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactList.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleHashTable.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleIndexHashTable.java
Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/NamedEntryPoint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/QuadroupleBetaConstraints.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.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/EntryPointNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.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/LeftTuple.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTupleMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/MemoryVisitor.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/RightTuple.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/BaseBetaConstraintsTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/EvalConditionNodeTest.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/ObjectTypeNodeTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FactHashTableTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexEntryTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexHashTableTest.java
Log:
JBRULES-1520 RightTuple merge for asynchronous Rete propagations
-most of the basics are in place now, just trying to get manners running.

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -27,13 +27,12 @@
 import org.drools.spi.BetaNodeFieldConstraint;
 import org.drools.spi.Constraint;
 import org.drools.util.AbstractHashTable.FieldIndex;
-import org.drools.util.FactHandleIndexHashTable;
-import org.drools.util.FactHashTable;
-import org.drools.util.FactList;
+import org.drools.util.RightTupleIndexHashTable;
+import org.drools.util.RightTupleList;
 import org.drools.util.LinkedList;
 import org.drools.util.LinkedListEntry;
-import org.drools.util.TupleHashTable;
-import org.drools.util.TupleIndexHashTable;
+import org.drools.util.LeftTupleList;
+import org.drools.util.LeftTupleIndexHashTable;
 
 import java.io.IOException;
 import java.io.ObjectInput;
@@ -240,23 +239,23 @@
             final FieldIndex[] indexes = (FieldIndex[]) list.toArray( new FieldIndex[list.size()] );
             LeftTupleMemory tupleMemory;
             if ( config.isIndexLeftBetaMemory() ) {
-                tupleMemory = new TupleIndexHashTable( indexes );
+                tupleMemory = new LeftTupleIndexHashTable( indexes );
             } else {
-                tupleMemory = new TupleHashTable();
+                tupleMemory = new LeftTupleList();
             }
 
             RightTupleMemory factHandleMemory;
             if ( config.isIndexRightBetaMemory() ) {
-                factHandleMemory = new FactHandleIndexHashTable( indexes );
+                factHandleMemory = new RightTupleIndexHashTable( indexes );
             } else {
-                factHandleMemory = config.isSequential() ? (RightTupleMemory) new FactList() : (RightTupleMemory) new FactHashTable();
+                factHandleMemory = new RightTupleList();
             }
             memory = new BetaMemory( config.isSequential() ? null : tupleMemory,
                                      factHandleMemory,
                                      this.createContext() );
         } else {
-            memory = new BetaMemory( config.isSequential() ? null : new TupleHashTable(),
-                                     config.isSequential() ? (RightTupleMemory) new FactList() : (RightTupleMemory) new FactHashTable(),
+            memory = new BetaMemory( config.isSequential() ? null : new LeftTupleList(),
+                                     new RightTupleList(),
                                      this.createContext() );
         }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -26,13 +26,12 @@
 import org.drools.rule.VariableConstraint;
 import org.drools.spi.BetaNodeFieldConstraint;
 import org.drools.util.AbstractHashTable.FieldIndex;
-import org.drools.util.FactHandleIndexHashTable;
-import org.drools.util.FactHashTable;
-import org.drools.util.FactList;
+import org.drools.util.RightTupleIndexHashTable;
+import org.drools.util.RightTupleList;
 import org.drools.util.LinkedList;
 import org.drools.util.LinkedListEntry;
-import org.drools.util.TupleHashTable;
-import org.drools.util.TupleIndexHashTable;
+import org.drools.util.LeftTupleList;
+import org.drools.util.LeftTupleIndexHashTable;
 
 import java.io.IOException;
 import java.io.ObjectInput;
@@ -229,23 +228,23 @@
 
             LeftTupleMemory tupleMemory;
             if ( config.isIndexLeftBetaMemory() ) {
-                tupleMemory = new TupleIndexHashTable( indexes );
+                tupleMemory = new LeftTupleIndexHashTable( indexes );
             } else {
-                tupleMemory = new TupleHashTable();
+                tupleMemory = new LeftTupleList();
             }
 
             RightTupleMemory factHandleMemory;
             if ( config.isIndexRightBetaMemory() ) {
-                factHandleMemory = new FactHandleIndexHashTable( indexes );
+                factHandleMemory = new RightTupleIndexHashTable( indexes );
             } else {
-                factHandleMemory = config.isSequential() ? (RightTupleMemory) new FactList() : (RightTupleMemory) new FactHashTable();
+                factHandleMemory = (RightTupleMemory) new RightTupleList();
             }
             memory = new BetaMemory( config.isSequential() ? null : tupleMemory,
                                      factHandleMemory,
                                      this.createContext() );
         } else {
-            memory = new BetaMemory( config.isSequential() ? null : new TupleHashTable(),
-                                     config.isSequential() ? (RightTupleMemory) new FactList() : (RightTupleMemory) new FactHashTable(),
+            memory = new BetaMemory( config.isSequential() ? null : new LeftTupleList(),
+                                     new RightTupleList(),
                                      this.createContext() );
         }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -21,10 +21,9 @@
 import org.drools.reteoo.RightTupleMemory;
 import org.drools.reteoo.LeftTuple;
 import org.drools.rule.ContextEntry;
-import org.drools.util.FactHashTable;
-import org.drools.util.FactList;
+import org.drools.util.RightTupleList;
 import org.drools.util.LinkedList;
-import org.drools.util.TupleHashTable;
+import org.drools.util.LeftTupleList;
 
 import java.io.IOException;
 import java.io.ObjectInput;
@@ -105,8 +104,8 @@
     }
 
     public BetaMemory createBetaMemory(final RuleBaseConfiguration config) {
-        final BetaMemory memory = new BetaMemory( config.isSequential() ? null : new TupleHashTable(),
-                                                  config.isSequential() ? (RightTupleMemory) new FactList() : (RightTupleMemory) new FactHashTable(),
+        final BetaMemory memory = new BetaMemory( config.isSequential() ? null : new LeftTupleList(),
+                                                  new RightTupleList(),
                                                   this.createContext() );
 
         return memory;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/NamedEntryPoint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/NamedEntryPoint.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/NamedEntryPoint.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -271,9 +271,13 @@
                                                                                       -1,
                                                                                       -1,
                                                                                       this.entryPoint );
+            
+            ObjectTypeConf typeConf = this.typeConfReg.getObjectTypeConf( this.entryPoint,
+                                                                          handle.getObject() );            
 
             this.entryPointNode.retractObject( handle,
                                                propagationContext,
+                                               typeConf,
                                                this.wm );
 
             final Object object = handle.getObject();
@@ -329,9 +333,13 @@
                                                                                       -1,
                                                                                       -1,
                                                                                       entryPoint );
+            
+            ObjectTypeConf typeConf = this.typeConfReg.getObjectTypeConf( this.entryPoint,
+                                                                          handle.getObject() );            
 
             this.entryPointNode.retractObject( handle,
                                                propagationContext,
+                                               typeConf,
                                                this.wm );
 
         } finally {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/QuadroupleBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/QuadroupleBetaConstraints.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/QuadroupleBetaConstraints.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -26,13 +26,12 @@
 import org.drools.rule.VariableConstraint;
 import org.drools.spi.BetaNodeFieldConstraint;
 import org.drools.util.AbstractHashTable.FieldIndex;
-import org.drools.util.FactHandleIndexHashTable;
-import org.drools.util.FactHashTable;
-import org.drools.util.FactList;
+import org.drools.util.RightTupleIndexHashTable;
+import org.drools.util.RightTupleList;
 import org.drools.util.LinkedList;
 import org.drools.util.LinkedListEntry;
-import org.drools.util.TupleHashTable;
-import org.drools.util.TupleIndexHashTable;
+import org.drools.util.LeftTupleList;
+import org.drools.util.LeftTupleIndexHashTable;
 
 import java.io.IOException;
 import java.io.ObjectInput;
@@ -330,23 +329,23 @@
             final FieldIndex[] indexes = (FieldIndex[]) list.toArray( new FieldIndex[list.size()] );
             LeftTupleMemory tupleMemory;
             if ( conf.isIndexLeftBetaMemory() ) {
-                tupleMemory = new TupleIndexHashTable( indexes );
+                tupleMemory = new LeftTupleIndexHashTable( indexes );
             } else {
-                tupleMemory = new TupleHashTable();
+                tupleMemory = new LeftTupleList();
             }
 
             RightTupleMemory factHandleMemory;
             if ( conf.isIndexRightBetaMemory() ) {
-                factHandleMemory = new FactHandleIndexHashTable( indexes );
+                factHandleMemory = new RightTupleIndexHashTable( indexes );
             } else {
-                factHandleMemory = conf.isSequential() ? (RightTupleMemory) new FactList() : (RightTupleMemory) new FactHashTable();
+                factHandleMemory = new RightTupleList();
             }
             memory = new BetaMemory( conf.isSequential() ? null : tupleMemory,
                                      factHandleMemory,
                                      this.createContext() );
         } else {
-            memory = new BetaMemory( conf.isSequential() ? null : new TupleHashTable(),
-                                     conf.isSequential() ? (RightTupleMemory) new FactList() : (RightTupleMemory) new FactHashTable(),
+            memory = new BetaMemory( conf.isSequential() ? null : new LeftTupleList(),
+                                     new RightTupleList(),
                                      this.createContext() );
         }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -30,12 +30,12 @@
 import org.drools.rule.VariableConstraint;
 import org.drools.spi.BetaNodeFieldConstraint;
 import org.drools.util.AbstractHashTable;
-import org.drools.util.FactHashTable;
-import org.drools.util.FactHandleIndexHashTable;
+import org.drools.util.RightTupleList;
+import org.drools.util.RightTupleIndexHashTable;
 import org.drools.util.LinkedList;
 import org.drools.util.LinkedListEntry;
-import org.drools.util.TupleHashTable;
-import org.drools.util.TupleIndexHashTable;
+import org.drools.util.LeftTupleList;
+import org.drools.util.LeftTupleIndexHashTable;
 import org.drools.util.AbstractHashTable.FieldIndex;
 
 public class SingleBetaConstraints
@@ -171,23 +171,23 @@
                                                      variableConstraint.getEvaluator() );
             LeftTupleMemory tupleMemory;
             if ( this.conf.isIndexLeftBetaMemory() ) {
-                tupleMemory = new TupleIndexHashTable( new FieldIndex[]{index} );
+                tupleMemory = new LeftTupleIndexHashTable( new FieldIndex[]{index} );
             } else {
-                tupleMemory = new TupleHashTable();
+                tupleMemory = new LeftTupleList();
             }
 
             RightTupleMemory factHandleMemory;
             if ( this.conf.isIndexRightBetaMemory() ) {
-                factHandleMemory = new FactHandleIndexHashTable( new FieldIndex[]{index} );
+                factHandleMemory = new RightTupleIndexHashTable( new FieldIndex[]{index} );
             } else {
-                factHandleMemory = new FactHashTable();
+                factHandleMemory = new RightTupleList();
             }
             memory = new BetaMemory( config.isSequential() ? null : tupleMemory,
                                      factHandleMemory,
                                      this.createContext() );
         } else {
-            memory = new BetaMemory( config.isSequential() ? null : new TupleHashTable(),
-                                     new FactHashTable(),
+            memory = new BetaMemory( config.isSequential() ? null : new LeftTupleList(),
+                                     new RightTupleList(),
                                      this.createContext() );
         }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -31,13 +31,12 @@
 import org.drools.rule.ContextEntry;
 import org.drools.rule.VariableConstraint;
 import org.drools.spi.BetaNodeFieldConstraint;
-import org.drools.util.FactHashTable;
-import org.drools.util.FactHandleIndexHashTable;
-import org.drools.util.FactList;
+import org.drools.util.RightTupleList;
+import org.drools.util.RightTupleIndexHashTable;
 import org.drools.util.LinkedList;
 import org.drools.util.LinkedListEntry;
-import org.drools.util.TupleHashTable;
-import org.drools.util.TupleIndexHashTable;
+import org.drools.util.LeftTupleList;
+import org.drools.util.LeftTupleIndexHashTable;
 import org.drools.util.AbstractHashTable.FieldIndex;
 
 public class TripleBetaConstraints
@@ -276,23 +275,23 @@
             final FieldIndex[] indexes = (FieldIndex[]) list.toArray( new FieldIndex[list.size()] );
             LeftTupleMemory tupleMemory;
             if ( conf.isIndexLeftBetaMemory() ) {
-                tupleMemory = new TupleIndexHashTable( indexes );
+                tupleMemory = new LeftTupleIndexHashTable( indexes );
             } else {
-                tupleMemory = new TupleHashTable();
+                tupleMemory = new LeftTupleList();
             }
 
             RightTupleMemory factHandleMemory;
             if ( conf.isIndexRightBetaMemory() ) {
-                factHandleMemory = new FactHandleIndexHashTable( indexes );
+                factHandleMemory = new RightTupleIndexHashTable( indexes );
             } else {
-                factHandleMemory = conf.isSequential() ? (RightTupleMemory) new FactList() : (RightTupleMemory) new FactHashTable();
+                factHandleMemory = new RightTupleList();
             }
             memory = new BetaMemory( conf.isSequential() ? null : tupleMemory,
                                      factHandleMemory,
                                      this.createContext() );
         } else {
-            memory = new BetaMemory( conf.isSequential() ? null : new TupleHashTable(),
-                                     conf.isSequential() ? (RightTupleMemory) new FactList() : (RightTupleMemory) new FactHashTable(),
+            memory = new BetaMemory( conf.isSequential() ? null : new LeftTupleList(),
+                                     new RightTupleList(),
                                      this.createContext() );
         }
 

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	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -32,7 +32,7 @@
 import org.drools.spi.AlphaNodeFieldConstraint;
 import org.drools.spi.PropagationContext;
 import org.drools.util.FactEntry;
-import org.drools.util.FactHashTable;
+import org.drools.util.RightTupleList;
 import org.drools.util.Iterator;
 
 /**

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -38,7 +38,7 @@
 import org.drools.spi.ObjectType;
 import org.drools.spi.PropagationContext;
 import org.drools.util.FactEntry;
-import org.drools.util.FactHashTable;
+import org.drools.util.RightTupleList;
 import org.drools.util.Iterator;
 
 /**
@@ -195,12 +195,6 @@
         }
     }
 
-    public void retractObject(final InternalFactHandle handle,
-                              final PropagationContext context,
-                              final InternalWorkingMemory workingMemory) {
-        // do nothing, dummy method to impl the interface                
-    }
-
     /**
      * Adds the <code>ObjectSink</code> so that it may receive
      * <code>Objects</code> propagated from this <code>ObjectSource</code>.
@@ -276,26 +270,27 @@
     public void updateSink(final ObjectSink sink,
                            final PropagationContext context,
                            final InternalWorkingMemory workingMemory) {
-        // JBRULES-612: the cache MUST be invalidated when a new node type is added to the network, so iterate and reset all caches.
-        final ObjectTypeNode node = (ObjectTypeNode) sink;
-
-        final ObjectType newObjectType = node.getObjectType();
-
-        InternalWorkingMemoryEntryPoint wmEntryPoint = (InternalWorkingMemoryEntryPoint) workingMemory.getWorkingMemoryEntryPoint( this.entryPoint.getEntryPointId() );
-
-        for ( ObjectTypeConf objectTypeConf : wmEntryPoint.getObjectTypeConfigurationRegistry().values() ) {
-            if ( newObjectType.isAssignableFrom( objectTypeConf.getConcreteObjectTypeNode().getObjectType() ) ) {
-                objectTypeConf.resetCache();
-                ObjectTypeNode sourceNode = objectTypeConf.getConcreteObjectTypeNode();
-                FactHashTable table = (FactHashTable) workingMemory.getNodeMemory( sourceNode );
-                Iterator factIter = table.iterator();
-                for ( FactEntry factEntry = (FactEntry) factIter.next(); factEntry != null; factEntry = (FactEntry) factIter.next() ) {
-                    sink.assertObject( factEntry.getFactHandle(),
-                                       context,
-                                       workingMemory );
-                }
-            }
-        }
+        // @todo
+//        // JBRULES-612: the cache MUST be invalidated when a new node type is added to the network, so iterate and reset all caches.
+//        final ObjectTypeNode node = (ObjectTypeNode) sink;
+//
+//        final ObjectType newObjectType = node.getObjectType();
+//
+//        InternalWorkingMemoryEntryPoint wmEntryPoint = (InternalWorkingMemoryEntryPoint) workingMemory.getWorkingMemoryEntryPoint( this.entryPoint.getEntryPointId() );
+//
+//        for ( ObjectTypeConf objectTypeConf : wmEntryPoint.getObjectTypeConfigurationRegistry().values() ) {
+//            if ( newObjectType.isAssignableFrom( objectTypeConf.getConcreteObjectTypeNode().getObjectType() ) ) {
+//                objectTypeConf.resetCache();
+//                ObjectTypeNode sourceNode = objectTypeConf.getConcreteObjectTypeNode();
+//                RightTupleList table = (RightTupleList) workingMemory.getNodeMemory( sourceNode );
+//                Iterator factIter = table.iterator();
+//                for ( FactEntry factEntry = (FactEntry) factIter.next(); factEntry != null; factEntry = (FactEntry) factIter.next() ) {
+//                    sink.assertObject( factEntry.getFactHandle(),
+//                                       context,
+//                                       workingMemory );
+//                }
+//            }
+//        }
     }
 
     public boolean isObjectMemoryEnabled() {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -30,7 +30,7 @@
 import org.drools.rule.EvalCondition;
 import org.drools.spi.PropagationContext;
 import org.drools.util.Iterator;
-import org.drools.util.TupleHashTable;
+import org.drools.util.LeftTupleList;
 
 /**
  * Node which filters <code>ReteTuple</code>s.
@@ -323,7 +323,7 @@
 
         private static final long serialVersionUID = -2754669682742843929L;
 
-        public TupleHashTable     tupleMemory;
+        public LeftTupleList     tupleMemory;
         public Object             context;
 
         public EvalMemory() {
@@ -334,13 +334,13 @@
                           final Object context) {
             this.context = context;
             if ( tupleMemoryEnabled ) {
-                this.tupleMemory = new TupleHashTable();
+                this.tupleMemory = new LeftTupleList();
             }
         }
 
         public void readExternal(ObjectInput in) throws IOException,
                                                 ClassNotFoundException {
-            tupleMemory = (TupleHashTable) in.readObject();
+            tupleMemory = (LeftTupleList) in.readObject();
             context = in.readObject();
         }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -20,7 +20,7 @@
 import org.drools.util.Iterator;
 import org.drools.util.LinkedList;
 import org.drools.util.LinkedListEntry;
-import org.drools.util.TupleHashTable;
+import org.drools.util.LeftTupleList;
 
 public class FromNode extends LeftTupleSource
     implements
@@ -234,7 +234,7 @@
     }
 
     public Object createMemory(final RuleBaseConfiguration config) {
-        BetaMemory beta = new BetaMemory( new TupleHashTable(),
+        BetaMemory beta = new BetaMemory( new LeftTupleList(),
                                           null,
                                           this.betaConstraints.createContext() );
         return new FromMemory( beta,

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	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -25,7 +25,7 @@
 import org.drools.reteoo.builder.BuildContext;
 import org.drools.spi.PropagationContext;
 import org.drools.util.FactEntry;
-import org.drools.util.FactHashTable;
+import org.drools.util.RightTupleList;
 import org.drools.util.Iterator;
 
 import java.io.ObjectOutput;
@@ -227,7 +227,7 @@
     }
 
     public Object createMemory(final RuleBaseConfiguration config) {
-        return new FactHashTable();
+        return new RightTupleList();
     }
 
     /**

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -12,8 +12,8 @@
 import org.drools.spi.Activation;
 import org.drools.spi.Tuple;
 import org.drools.util.Entry;
-import org.drools.util.FactHashTable;
-import org.drools.util.TupleHashTable;
+import org.drools.util.RightTupleList;
+import org.drools.util.LeftTupleList;
 
 public class LeftTuple
     implements
@@ -49,7 +49,7 @@
     private LeftTuple                rightParentNext;
 
     // node memory
-    private TupleHashTable           memory;
+    private LeftTupleList           memory;
     private Entry                    next;
     private Entry                    previous;
 
@@ -258,11 +258,11 @@
         return entry.handle;
     }
 
-    public TupleHashTable getMemory() {
+    public LeftTupleList getMemory() {
         return this.memory;
     }
 
-    public void setMemory(TupleHashTable memory) {
+    public void setMemory(LeftTupleList memory) {
         this.memory = memory;
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTupleMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTupleMemory.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTupleMemory.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -11,7 +11,7 @@
 
     public void add(LeftTuple tuple);
 
-    public LeftTuple remove(LeftTuple leftTuple);
+    public void remove(LeftTuple leftTuple);
 
     public boolean contains(LeftTuple leftTuple);
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/MemoryVisitor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/MemoryVisitor.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/MemoryVisitor.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -12,10 +12,10 @@
 import org.drools.spi.ObjectType;
 import org.drools.util.AbstractHashTable;
 import org.drools.util.Entry;
-import org.drools.util.FactHandleIndexHashTable;
-import org.drools.util.FactHashTable;
+import org.drools.util.RightTupleIndexHashTable;
+import org.drools.util.RightTupleList;
 import org.drools.util.ReflectiveVisitor;
-import org.drools.util.FactHandleIndexHashTable.FieldIndexEntry;
+import org.drools.util.RightTupleIndexHashTable.FieldIndexEntry;
 
 public class MemoryVisitor extends ReflectiveVisitor
     implements
@@ -63,7 +63,7 @@
     public void visitObjectTypeNode(final ObjectTypeNode node) {
         System.out.println( indent() + node );
 
-        final FactHashTable memory = (FactHashTable) this.workingMemory.getNodeMemory( node );
+        final RightTupleList memory = (RightTupleList) this.workingMemory.getNodeMemory( node );
         checkObjectHashTable( memory );
 
         this.indent++;
@@ -84,7 +84,7 @@
     public void visitAlphaNode(final AlphaNode node) {
         System.out.println( indent() + node );
 
-        final FactHashTable memory = (FactHashTable) this.workingMemory.getNodeMemory( node );
+        final RightTupleList memory = (RightTupleList) this.workingMemory.getNodeMemory( node );
         checkObjectHashTable( memory );
 
         this.indent++;
@@ -193,16 +193,16 @@
     //    }
 
     private void checkObjectHashTable(final RightTupleMemory memory) {
-        if ( memory instanceof FactHashTable ) {
-            checkFactHashTable( (FactHashTable) memory );
-        } else if ( memory instanceof FactHandleIndexHashTable ) {
-            checkFieldIndexHashTable( (FactHandleIndexHashTable) memory );
+        if ( memory instanceof RightTupleList ) {
+            checkFactHashTable( (RightTupleList) memory );
+        } else if ( memory instanceof RightTupleIndexHashTable ) {
+            checkFieldIndexHashTable( (RightTupleIndexHashTable) memory );
         } else {
             throw new RuntimeException( memory.getClass() + " should not be here" );
         }
     }
 
-    private void checkFactHashTable(final FactHashTable memory) {
+    private void checkFactHashTable(final RightTupleList memory) {
         final Entry[] entries = memory.getTable();
         int count = 0;
         for ( int i = 0, length = entries.length; i < length; i++ ) {
@@ -221,7 +221,7 @@
         }
     }
 
-    private void checkFieldIndexHashTable(final FactHandleIndexHashTable memory) {
+    private void checkFieldIndexHashTable(final RightTupleIndexHashTable memory) {
         final Entry[] entries = memory.getTable();
         int factCount = 0;
         int bucketCount = 0;

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	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -36,7 +36,7 @@
 import org.drools.spi.ObjectType;
 import org.drools.spi.PropagationContext;
 import org.drools.util.FactEntry;
-import org.drools.util.FactHashTable;
+import org.drools.util.RightTupleList;
 import org.drools.util.Iterator;
 import org.drools.util.ObjectHashSet;
 
@@ -168,7 +168,7 @@
         }
 
         if ( this.objectMemoryEnabled ) {
-            final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( this );
+            final ObjectHashSet memory = (ObjectHashSet) workingMemory.getNodeMemory( this );
             memory.add( factHandle,
                         false );
         }
@@ -178,12 +178,6 @@
                                          workingMemory );
     }
 
-    public void retractRightTuple(final RightTuple rightTuple,
-                                  final PropagationContext context,
-                                  final InternalWorkingMemory workingMemory) {
-        throw new UnsupportedOperationException( "ObjectTypeNode.retractRightTuple is not supported." );
-    }
-
     /**
      * Retract the <code>FactHandleimpl</code> from the <code>Rete</code> network. Also remove the 
      * <code>FactHandleImpl</code> from the node memory.
@@ -226,13 +220,13 @@
     public void updateSink(final ObjectSink sink,
                            final PropagationContext context,
                            final InternalWorkingMemory workingMemory) {
-        final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( this );
-        final Iterator it = memory.iterator();
-        for ( FactEntry entry = (FactEntry) it.next(); entry != null; entry = (FactEntry) it.next() ) {
-            sink.assertObject( entry.getFactHandle(),
-                               context,
-                               workingMemory );
-        }
+//        final ObjectHashSet memory = (ObjectHashSet) workingMemory.getNodeMemory( this );
+        //for ( RightTuple rightTuple = (RightTuple) memory.getFirst( null ); rightTuple != null; rightTuple = (RightTuple) rightTuple.getNext() ) {
+            //@ TODO
+            //            sink.assertRightTuple( rightTuple,
+            //                                   context,
+            //                                   workingMemory );
+//        }
     }
 
     /**
@@ -298,7 +292,7 @@
      * to switch back to a standard HashMap.
      */
     public Object createMemory(final RuleBaseConfiguration config) {
-        return new FactHashTable();
+        return new ObjectHashSet();
     }
 
     public boolean isObjectMemoryEnabled() {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightTuple.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightTuple.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightTuple.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -6,7 +6,7 @@
 
 import org.drools.common.InternalFactHandle;
 import org.drools.util.Entry;
-import org.drools.util.FactHashTable;
+import org.drools.util.RightTupleList;
 
 public class RightTuple
     implements
@@ -16,7 +16,7 @@
     private RightTuple               handlePrevious;
     private RightTuple               handleNext;
 
-    private FactHashTable            memory;
+    private RightTupleList            memory;
 
     private Entry                    previous;
     private Entry                    next;
@@ -99,11 +99,11 @@
         this.blocked = blocked;
     }
 
-    public FactHashTable getMemory() {
+    public RightTupleList getMemory() {
         return memory;
     }
 
-    public void setMemory(FactHashTable memory) {
+    public void setMemory(RightTupleList memory) {
         this.memory = memory;
     }
 

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightTupleSink.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightTupleSink.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightTupleSink.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -0,0 +1,10 @@
+package org.drools.reteoo;
+
+import org.drools.common.InternalWorkingMemory;
+import org.drools.spi.PropagationContext;
+
+public interface RightTupleSink {
+    public void retractRightTuple(final RightTuple rightTuple,
+                                  final PropagationContext context,
+                                  final InternalWorkingMemory workingMemory);
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -46,7 +46,7 @@
 import org.drools.spi.RuleFlowGroup;
 import org.drools.util.Iterator;
 import org.drools.util.LinkedList;
-import org.drools.util.TupleHashTable;
+import org.drools.util.LeftTupleList;
 
 /**
  * Leaf Rete-OO node responsible for enacting <code>Action</code> s on a
@@ -198,7 +198,8 @@
         }
 
         //we only have to clone the head fact to make sure the graph is not affected during consequence reads after a modify
-        final LeftTuple cloned = new LeftTuple( tuple );
+        // @FIXME
+        final LeftTuple cloned = tuple;//new LeftTuple( tuple );
 
         final InternalAgenda agenda = (InternalAgenda) workingMemory.getAgenda();
 
@@ -386,14 +387,9 @@
                                  final PropagationContext context,
                                  final InternalWorkingMemory workingMemory) {
         final TerminalNodeMemory memory = (TerminalNodeMemory) workingMemory.getNodeMemory( this );
-        final LeftTuple tuple = memory.getTupleMemory().remove( leftTuple );
-        if ( tuple == null ) {
-            // tuple should only be null if it was asserted and reached a no-loop causing it to exit early
-            // before being added to the node memory and an activation created and attached
-            return;
-        }
+        memory.getTupleMemory().remove( leftTuple );
 
-        final Activation activation = tuple.getActivation();
+        final Activation activation = leftTuple.getActivation();
         if ( activation.getLogicalDependencies() != null && !activation.getLogicalDependencies().isEmpty() ) {
             context.addRetractedTuple( this.rule,
                                        activation );
@@ -583,10 +579,10 @@
 
         private RuleFlowGroup       ruleFlowGroup;
 
-        private TupleHashTable      tupleMemory;
+        private LeftTupleList      tupleMemory;
 
         public TerminalNodeMemory() {
-            this.tupleMemory = new TupleHashTable();
+            this.tupleMemory = new LeftTupleList();
         }
 
         public void readExternal(ObjectInput in) throws IOException,
@@ -594,7 +590,7 @@
             agendaGroup = (InternalAgendaGroup) in.readObject();
             activationGroup = (ActivationGroup) in.readObject();
             ruleFlowGroup = (RuleFlowGroup) in.readObject();
-            tupleMemory = (TupleHashTable) in.readObject();
+            tupleMemory = (LeftTupleList) in.readObject();
         }
 
         public void writeExternal(ObjectOutput out) throws IOException {
@@ -620,7 +616,7 @@
             this.activationGroup = activationGroup;
         }
 
-        public TupleHashTable getTupleMemory() {
+        public LeftTupleList getTupleMemory() {
             return this.tupleMemory;
         }
 

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	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -629,13 +629,13 @@
 
         public int hashCodeOf(final Object object) {
             int hashCode = this.startResult;
-            hashCode = TupleIndexHashTable.PRIME * hashCode + this.extractor.getHashCode( null, object );
+            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.extractor.getHashCode( null, object );
             return rehash( hashCode );
         }
 
         public int hashCodeOf(final LeftTuple tuple) {
             int hashCode = this.startResult;
-            hashCode = TupleIndexHashTable.PRIME * hashCode + this.declaration.getHashCode( null, tuple.get( this.declaration ).getObject() );
+            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.declaration.getHashCode( null, tuple.get( this.declaration ).getObject() );
             return rehash( hashCode );
         }
 
@@ -726,8 +726,8 @@
         public int hashCodeOf(final Object object) {
             int hashCode = this.startResult;
 
-            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index0.extractor.getHashCode( null, object );
-            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index1.extractor.getHashCode( null, object );
+            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index0.extractor.getHashCode( null, object );
+            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index1.extractor.getHashCode( null, object );
 
             return rehash( hashCode );
         }
@@ -735,8 +735,8 @@
         public int hashCodeOf(final LeftTuple tuple) {
             int hashCode = this.startResult;
 
-            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index0.declaration.getHashCode( null, tuple.get( this.index0.declaration ).getObject() );
-            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index1.declaration.getHashCode( null, tuple.get( this.index1.declaration ).getObject() );
+            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index0.declaration.getHashCode( null, tuple.get( this.index0.declaration ).getObject() );
+            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index1.declaration.getHashCode( null, tuple.get( this.index1.declaration ).getObject() );
 
             return rehash( hashCode );
         }
@@ -847,9 +847,9 @@
         public int hashCodeOf(final Object object) {
             int hashCode = this.startResult;
 
-            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index0.extractor.getHashCode( null, object );;
-            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index1.extractor.getHashCode( null, object );;
-            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index2.extractor.getHashCode( null, object );;
+            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index0.extractor.getHashCode( null, object );;
+            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index1.extractor.getHashCode( null, object );;
+            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index2.extractor.getHashCode( null, object );;
 
             return rehash( hashCode );
         }
@@ -857,9 +857,9 @@
         public int hashCodeOf(final LeftTuple tuple) {
             int hashCode = this.startResult;
 
-            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index0.declaration.getHashCode( null, tuple.get( this.index0.declaration ).getObject() );
-            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index1.declaration.getHashCode( null, tuple.get( this.index1.declaration ).getObject() );
-            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index2.declaration.getHashCode( null, tuple.get( this.index2.declaration ).getObject() );
+            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index0.declaration.getHashCode( null, tuple.get( this.index0.declaration ).getObject() );
+            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index1.declaration.getHashCode( null, tuple.get( this.index1.declaration ).getObject() );
+            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index2.declaration.getHashCode( null, tuple.get( this.index2.declaration ).getObject() );
 
             return rehash( hashCode );
         }

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHandleIndexHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHandleIndexHashTable.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHandleIndexHashTable.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -1,415 +0,0 @@
-/**
- *
- */
-package org.drools.util;
-
-import org.drools.common.InternalFactHandle;
-import org.drools.reteoo.RightTupleMemory;
-import org.drools.reteoo.LeftTuple;
-import org.drools.util.TupleIndexHashTable.FieldIndexEntry;
-
-import java.io.ObjectInput;
-import java.io.IOException;
-import java.io.ObjectOutput;
-import java.io.Externalizable;
-
-public class FactHandleIndexHashTable extends AbstractHashTable
-    implements
-    RightTupleMemory, Externalizable {
-
-    private static final long           serialVersionUID = 400L;
-
-    public static final int             PRIME            = 31;
-
-    private int                         startResult;
-
-    private FieldIndexHashTableIterator tupleValueIterator;
-
-    private int                         factSize;
-
-    private Index                       index;
-
-    public FactHandleIndexHashTable() {
-    }
-
-    public FactHandleIndexHashTable(final FieldIndex[] index) {
-        this( 16,
-              0.75f,
-              index );
-    }
-
-    public FactHandleIndexHashTable(final int capacity,
-                                    final float loadFactor,
-                                    final FieldIndex[] index) {
-        super( capacity,
-               loadFactor );
-
-        this.startResult = FactHandleIndexHashTable.PRIME;
-        for ( int i = 0, length = index.length; i < length; i++ ) {
-            this.startResult = FactHandleIndexHashTable.PRIME * this.startResult + index[i].getExtractor().getIndex();
-        }
-
-        switch ( index.length ) {
-            case 0 :
-                throw new IllegalArgumentException( "FieldIndexHashTable cannot use an index[] of length  0" );
-            case 1 :
-                this.index = new SingleIndex( index,
-                                              this.startResult );
-                break;
-            case 2 :
-                this.index = new DoubleCompositeIndex( index,
-                                                       this.startResult );
-                break;
-            case 3 :
-                this.index = new TripleCompositeIndex( index,
-                                                       this.startResult );
-                break;
-            default :
-                throw new IllegalArgumentException( "FieldIndexHashTable cannot use an index[] of length  great than 3" );
-        }
-    }
-
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        super.readExternal(in);
-        startResult = in.readInt();
-        tupleValueIterator  = (FieldIndexHashTableIterator)in.readObject();
-        factSize    = in.readInt();
-        index       = (Index)in.readObject();
-    }
-
-    public void writeExternal(ObjectOutput out) throws IOException {
-        super.writeExternal(out);
-        out.writeInt(startResult);
-        out.writeObject(tupleValueIterator);
-        out.writeInt(factSize);
-        out.writeObject(index);
-    }
-
-    public Iterator iterator() {
-        throw new UnsupportedOperationException( "FieldIndexHashTable does not support  iterator()" );
-    }
-
-    public Iterator iterator(final LeftTuple tuple) {
-        if ( this.tupleValueIterator == null ) {
-            this.tupleValueIterator = new FieldIndexHashTableIterator();
-        }
-        final FieldIndexEntry entry = get( tuple );
-        this.tupleValueIterator.reset( (entry != null) ? entry.first : null );
-        return this.tupleValueIterator;
-    }
-
-    public boolean isIndexed() {
-        return true;
-    }
-
-    public Index getIndex() {
-        return this.index;
-    }
-
-    public Entry getBucket(final Object object) {
-        final int hashCode = this.index.hashCodeOf( object );
-        final int index = indexOf( hashCode,
-                                   this.table.length );
-
-        return this.table[index];
-    }
-
-    /**
-     * Fast re-usable iterator
-     *
-     */
-    public static class FieldIndexHashTableIterator
-        implements
-        Iterator, Externalizable {
-        private Entry entry;
-
-        public FieldIndexHashTableIterator() {
-
-        }
-
-        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-            entry   = (Entry)in.readObject();
-        }
-
-        public void writeExternal(ObjectOutput out) throws IOException {
-            out.writeObject(entry);
-        }
-
-        /* (non-Javadoc)
-         * @see org.drools.util.Iterator#next()
-         */
-        public Object next() {
-            final Entry current = this.entry;
-            this.entry = (this.entry != null) ? this.entry.getNext() : null;
-            return current;
-        }
-
-        /* (non-Javadoc)
-         * @see org.drools.util.Iterator#reset()
-         */
-        public void reset(final Entry entry) {
-            this.entry = entry;
-        }
-    }
-
-    public Entry[] toArray() {
-        Entry[] result = new Entry[this.factSize];
-        int index = 0;
-        for ( int i = 0; i < this.table.length; i++ ) {
-            FieldIndexEntry fieldIndexEntry = (FieldIndexEntry)this.table[i];
-            while ( fieldIndexEntry != null ) {
-                Entry entry = fieldIndexEntry.getFirst();
-                while ( entry != null ) {
-                    result[index++] = entry;
-                    entry = entry.getNext();
-                }
-                fieldIndexEntry  = ( FieldIndexEntry ) fieldIndexEntry.getNext();
-            }
-        }
-        return result;
-    }
-
-    public boolean add(final InternalFactHandle handle) {
-        final FieldIndexEntry entry = getOrCreate( handle.getObject() );
-        entry.add( handle );
-        this.factSize++;
-        return true;
-    }
-
-    public boolean add(final InternalFactHandle handle,
-                       final boolean checkExists) {
-        throw new UnsupportedOperationException( "FieldIndexHashTable does not support add(InternalFactHandle handle, boolean checkExists)" );
-    }
-
-    public boolean remove(final InternalFactHandle handle) {
-        final Object object = handle.getObject();
-        //this.index.setCachedValue( object );
-        final int hashCode = this.index.hashCodeOf( object );
-
-        final int index = indexOf( hashCode,
-                                   this.table.length );
-
-        // search the table for  the Entry, we need to track previous  and next, so if the
-        // Entry is empty after  its had the FactEntry removed, we must remove  it from the table
-        FieldIndexEntry previous = (FieldIndexEntry) this.table[index];
-        FieldIndexEntry current = previous;
-        while ( current != null ) {
-            final FieldIndexEntry next = (FieldIndexEntry) current.next;
-            if ( current.matches( object,
-                                  hashCode ) ) {
-                current.remove( handle );
-                this.factSize--;
-                // If the FactEntryIndex is empty, then remove it from the hash table
-                if ( current.first == null ) {
-                    if ( previous == current ) {
-                        this.table[index] = next;
-                    } else {
-                        previous.next = next;
-                    }
-                    current.next = null;
-                    this.size--;
-                }
-                return true;
-            }
-            previous = current;
-            current = next;
-        }
-        return false;
-    }
-
-    public boolean contains(final InternalFactHandle handle) {
-        final Object object = handle.getObject();
-        //this.index.setCachedValue( object );
-
-        final int hashCode = this.index.hashCodeOf( object );
-
-        final int index = indexOf( hashCode,
-                                   this.table.length );
-
-        FieldIndexEntry current = (FieldIndexEntry) this.table[index];
-        while ( current != null ) {
-            if ( current.matches( object,
-                                  hashCode ) ) {
-                return true;
-            }
-            current = (FieldIndexEntry) current.next;
-        }
-        return false;
-    }
-
-    public FieldIndexEntry get(final LeftTuple tuple) {
-        //this.index.setCachedValue( tuple );
-
-        final int hashCode = this.index.hashCodeOf( tuple );
-
-        final int index = indexOf( hashCode,
-                                   this.table.length );
-        FieldIndexEntry entry = (FieldIndexEntry) this.table[index];
-
-        while ( entry != null ) {
-            if ( entry.matches( tuple,
-                                hashCode ) ) {
-                return entry;
-            }
-            entry = (FieldIndexEntry) entry.getNext();
-        }
-
-        return entry;
-    }
-
-    /**
-     * We use this method to aviod to table lookups for the same hashcode; which is what we would have to do if we did
-     * a get and then a create if the value is null.
-     *
-     * @param value
-     * @return
-     */
-    private FieldIndexEntry getOrCreate(final Object object) {
-        //this.index.setCachedValue( object );
-
-        final int hashCode = this.index.hashCodeOf( object );
-
-        final int index = indexOf( hashCode,
-                                   this.table.length );
-        FieldIndexEntry entry = (FieldIndexEntry) this.table[index];
-
-        while ( entry != null ) {
-            if ( entry.matches( object,
-                                hashCode ) ) {
-                return entry;
-            }
-            entry = (FieldIndexEntry) entry.next;
-        }
-
-        if ( entry == null ) {
-            entry = new FieldIndexEntry( this.index,
-                                         hashCode );
-            entry.next = this.table[index];
-            this.table[index] = entry;
-
-            if ( this.size++ >= this.threshold ) {
-                resize( 2 * this.table.length );
-            }
-        }
-        return entry;
-    }
-
-    public int size() {
-        return this.factSize;
-    }
-
-    public static class FieldIndexEntry
-        implements
-        Entry {
-
-        private static final long serialVersionUID = 400L;
-        private Entry             next;
-        private FactEntryImpl         first;
-        private int         hashCode;
-        private Index             index;
-
-        public FieldIndexEntry() {
-
-        }
-
-        public FieldIndexEntry(final Index index,
-                               final int hashCode) {
-            this.index = index;
-            this.hashCode = hashCode;
-        }
-
-        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-            next    = (Entry)in.readObject();
-            first   = (FactEntryImpl)in.readObject();
-            hashCode    = in.readInt();
-            index   = (Index)in.readObject();
-        }
-
-        public void writeExternal(ObjectOutput out) throws IOException {
-            out.writeObject(next);
-            out.writeObject(first);
-            out.writeInt(hashCode);
-            out.writeObject(index);
-        }
-        public Entry getNext() {
-            return this.next;
-        }
-
-        public void setNext(final Entry next) {
-            this.next = next;
-        }
-
-        public FactEntryImpl getFirst() {
-            return this.first;
-        }
-
-        public void add(final InternalFactHandle handle) {
-            final FactEntryImpl entry = new FactEntryImpl( handle );
-            entry.next = this.first;
-            this.first = entry;
-        }
-
-        public FactEntryImpl get(final InternalFactHandle handle) {
-            final long id = handle.getId();
-            FactEntryImpl current = this.first;
-            while ( current != null ) {
-                if ( current.handle.getId() == id ) {
-                    return current;
-                }
-                current = (FactEntryImpl) current.next;
-            }
-            return null;
-        }
-
-        public FactEntryImpl remove(final InternalFactHandle handle) {
-            final long id = handle.getId();
-
-            FactEntryImpl previous = this.first;
-            FactEntryImpl current = previous;
-            while ( current != null ) {
-                final FactEntryImpl next = (FactEntryImpl) current.next;
-                if ( current.handle.getId() == id ) {
-                    if ( this.first == current ) {
-                        this.first = next;
-                    } else {
-                        previous.next = next;
-                    }
-                    current.next = null;
-                    return current;
-                }
-                previous = current;
-                current = next;
-            }
-            return current;
-        }
-
-        //        public boolean matches(int otherHashCode) {
-        //            return this.hashCode == otherHashCode && this.index.equal( this.first.getFactHandle().getObject() );
-        //        }
-
-        public boolean matches(final Object object,
-                               final int objectHashCode) {
-            return this.hashCode == objectHashCode && this.index.equal( this.first.getFactHandle().getObject(),
-                                                                        object );
-        }
-
-        public boolean matches(final LeftTuple tuple,
-                               final int tupleHashCode) {
-            return this.hashCode == tupleHashCode && this.index.equal( this.first.getFactHandle().getObject(),
-                                                                       tuple );
-        }
-
-        public int hashCode() {
-            return this.hashCode;
-        }
-
-        public boolean equals(final Object object) {
-            final FieldIndexEntry other = (FieldIndexEntry) object;
-            return this.hashCode == other.hashCode && this.index == other.index;
-        }
-
-        public String toString() {
-            return "FieldIndexEntry( hashCode=" + this.hashCode + " first=" + this.first + " )";
-        }
-    }
-}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashTable.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashTable.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -1,115 +0,0 @@
-/**
- * 
- */
-package org.drools.util;
-
-import org.drools.common.InternalFactHandle;
-import org.drools.reteoo.RightTupleMemory;
-import org.drools.reteoo.LeftTuple;
-
-public class FactHashTable extends AbstractHashTable
-    implements
-    RightTupleMemory {
-    private static final long serialVersionUID = 400L;
-
-    public FactHashTable() {
-        this( 16,
-              0.75f );
-    }
-
-    public FactHashTable(final int capacity,
-                         final float loadFactor) {
-        super( capacity,
-               loadFactor );
-    }
-
-    public Iterator iterator(final LeftTuple tuple) {
-        return iterator();
-    }
-
-    public boolean add(final InternalFactHandle handle) {
-        return add( handle,
-                    true );
-    }
-
-    public boolean add(final InternalFactHandle handle,
-                       final boolean checkExists) {
-        final int hashCode = this.comparator.hashCodeOf( handle );
-        final int index = indexOf( hashCode,
-                                   this.table.length );
-
-        // scan the linked entries to see if it exists
-        if ( checkExists ) {
-            FactEntryImpl current = (FactEntryImpl) this.table[index];
-            while ( current != null ) {
-                if ( hashCode == current.hashCode && handle.getId() == current.handle.getId() ) {
-                    return false;
-                }
-                current = (FactHashTable.FactEntryImpl) current.getNext();
-            }
-        }
-
-        // We aren't checking the key exists, or it didn't find the key
-        final FactEntryImpl entry = new FactEntryImpl( handle,
-                                               hashCode );
-        entry.next = this.table[index];
-        this.table[index] = entry;
-
-        if ( this.size++ >= this.threshold ) {
-            resize( 2 * this.table.length );
-        }
-        return true;
-    }
-
-    public boolean contains(final InternalFactHandle handle) {
-        final int hashCode = this.comparator.hashCodeOf( handle );
-        final int index = indexOf( hashCode,
-                                   this.table.length );
-
-        FactEntryImpl current = (FactEntryImpl) this.table[index];
-        while ( current != null ) {
-            if ( hashCode == current.hashCode && handle.getId() == current.handle.getId() ) {
-                return true;
-            }
-            current = (FactEntryImpl) current.getNext();
-        }
-        return false;
-    }
-
-    public boolean remove(final InternalFactHandle handle) {
-        final int hashCode = this.comparator.hashCodeOf( handle );
-        final int index = indexOf( hashCode,
-                                   this.table.length );
-
-        FactEntryImpl previous = (FactEntryImpl) this.table[index];
-        FactEntryImpl current = previous;
-        while ( current != null ) {
-            final FactEntryImpl next = (FactEntryImpl) current.getNext();
-            if ( hashCode == current.hashCode && handle.getId() == current.handle.getId() ) {
-                if ( previous == current ) {
-                    this.table[index] = next;
-                } else {
-                    previous.setNext( next );
-                }
-                current.setNext( null );
-                this.size--;
-                return true;
-            }
-            previous = current;
-            current = next;
-        }
-        return false;
-    }
-
-    public Entry getBucket(final Object object) {
-        final int hashCode = this.comparator.hashCodeOf( object );
-        final int index = indexOf( hashCode,
-                                   this.table.length );
-
-        return this.table[index];
-    }
-
-    public boolean isIndexed() {
-        return false;
-    }
-}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactList.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactList.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactList.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -1,81 +0,0 @@
-/**
- * 
- */
-package org.drools.util;
-
-import java.io.Serializable;
-
-import org.drools.common.InternalFactHandle;
-import org.drools.reteoo.RightTupleMemory;
-import org.drools.reteoo.LeftTuple;
-
-public class FactList
-    implements
-    RightTupleMemory {
-    private static final long serialVersionUID = 400L;
-
-    private final LinkedList list;
-    
-    public FactList() {
-        this.list = new LinkedList();
-    }
-
-    public Iterator iterator(final LeftTuple tuple) {
-        return iterator();
-    }
-
-    public boolean add(final InternalFactHandle handle) {
-        return add( handle,
-                    true );
-    }
-
-    public boolean add(final InternalFactHandle handle,
-                       final boolean checkExists) {
-        this.list.add( new FactEntryImpl( handle ) );
-        return true;
-    }
-
-    public boolean contains(final InternalFactHandle handle) {
-        Iterator it = this.list.iterator();
-        for ( Object object = it.next(); object != null; object = it.next() ) {
-            if ( handle.equals( ((LinkedListEntry)object).getObject() ) ) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public boolean remove(final InternalFactHandle handle) {
-        Iterator it = this.list.iterator();
-        for ( Object object = it.next(); object != null; object = it.next() ) {
-            if ( handle.equals( ((LinkedListEntry)object).getObject() ) ) {
-                this.list.remove( (LinkedListEntry)object );
-                return true;
-            }
-        }
-        return false;
-    }
-    
-    public Iterator iterator() {
-        return this.list.iterator();
-    }
-
-    public int size() {
-        return  this.list.size();
-    }
-
-    public boolean isIndexed() {
-        return false;
-    }
-    
-    public static class FactEntryImpl extends LinkedListEntry implements FactEntry, Serializable {    
-        public FactEntryImpl(InternalFactHandle handle) {
-            super(handle);
-        }
-
-        public InternalFactHandle getFactHandle() {
-            return (InternalFactHandle) getObject();
-        }
-        
-    }
-}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/LeftTupleIndexHashTable.java (from rev 19176, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleIndexHashTable.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/LeftTupleIndexHashTable.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/LeftTupleIndexHashTable.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -0,0 +1,318 @@
+/**
+ *
+ */
+package org.drools.util;
+
+import org.drools.common.InternalFactHandle;
+import org.drools.reteoo.LeftTuple;
+import org.drools.reteoo.LeftTupleMemory;
+import org.drools.reteoo.RightTuple;
+
+import java.io.ObjectOutput;
+import java.io.ObjectInput;
+import java.io.IOException;
+import java.io.Externalizable;
+
+public class LeftTupleIndexHashTable extends AbstractHashTable
+    implements
+    LeftTupleMemory {
+
+    private static final long               serialVersionUID = 400L;
+
+    public static final int                 PRIME            = 31;
+
+    private int                             startResult;
+
+    private FieldIndexHashTableFullIterator tupleValueFullIterator;
+
+    private int                             factSize;
+
+    private Index                           index;
+
+    public LeftTupleIndexHashTable(final FieldIndex[] index) {
+        this( 128,
+              0.75f,
+              index );
+    }
+
+    public LeftTupleIndexHashTable(final int capacity,
+                                   final float loadFactor,
+                                   final FieldIndex[] index) {
+        super( capacity,
+               loadFactor );
+
+        this.startResult = LeftTupleIndexHashTable.PRIME;
+        for ( int i = 0, length = index.length; i < length; i++ ) {
+            this.startResult += LeftTupleIndexHashTable.PRIME * this.startResult + index[i].getExtractor().getIndex();
+        }
+
+        switch ( index.length ) {
+            case 0 :
+                throw new IllegalArgumentException( "FieldIndexHashTable cannot use an index[] of length  0" );
+            case 1 :
+                this.index = new SingleIndex( index,
+                                              this.startResult );
+                break;
+            case 2 :
+                this.index = new DoubleCompositeIndex( index,
+                                                       this.startResult );
+                break;
+            case 3 :
+                this.index = new TripleCompositeIndex( index,
+                                                       this.startResult );
+                break;
+            default :
+                throw new IllegalArgumentException( "FieldIndexHashTable cannot use an index[] of length  great than 3" );
+        }
+    }
+
+    public Iterator iterator() {
+        if ( this.tupleValueFullIterator == null ) {
+            this.tupleValueFullIterator = new FieldIndexHashTableFullIterator( this );
+        }
+        this.tupleValueFullIterator.reset();
+        return this.tupleValueFullIterator;
+    }
+
+    public LeftTuple getFirst(final RightTuple rightTuple) {
+        LeftTupleList bucket = get( rightTuple );
+        if ( bucket != null ) {
+            return bucket.getFirst( null );
+        } else {
+            return null;
+        }
+    }
+
+    public boolean isIndexed() {
+        return true;
+    }
+
+    public Index getIndex() {
+        return this.index;
+    }
+
+    public Entry getBucket(final Object object) {
+        final int hashCode = this.index.hashCodeOf( object );
+        final int index = indexOf( hashCode,
+                                   this.table.length );
+
+        return this.table[index];
+    }
+
+    public static class FieldIndexHashTableFullIterator
+        implements
+        Iterator {
+        private AbstractHashTable hashTable;
+        private Entry[]           table;
+        private int               row;
+        private int               length;
+        private Entry             entry;
+
+        public FieldIndexHashTableFullIterator(final AbstractHashTable hashTable) {
+            this.hashTable = hashTable;
+        }
+
+        /* (non-Javadoc)
+         * @see org.drools.util.Iterator#next()
+         */
+        public Object next() {
+            if ( this.entry == null ) {
+                // keep skipping rows until we come to the end, or find one that is populated
+                while ( this.entry == null ) {
+                    this.row++;
+                    if ( this.row == this.length ) {
+                        return null;
+                    }
+                    this.entry = (this.table[this.row] != null) ? ((LeftTupleList) this.table[this.row]).first : null;
+                }
+            } else {
+                this.entry = this.entry.getNext();
+                if ( this.entry == null ) {
+                    this.entry = (Entry) next();
+                }
+            }
+
+            return this.entry;
+        }
+
+        public void remove() {
+            throw new UnsupportedOperationException( "FieldIndexHashTableFullIterator does not support remove()." );
+        }
+
+        /* (non-Javadoc)
+         * @see org.drools.util.Iterator#reset()
+         */
+        public void reset() {
+            this.table = this.hashTable.getTable();
+            this.length = this.table.length;
+            this.row = -1;
+            this.entry = null;
+        }
+    }
+
+    public LeftTuple[] toArray() {
+        LeftTuple[] result = new LeftTuple[this.factSize];
+        int index = 0;
+        for ( int i = 0; i < this.table.length; i++ ) {
+            LeftTupleList bucket = (LeftTupleList) this.table[i];
+            while ( bucket != null ) {
+                LeftTuple entry = (LeftTuple) bucket.getFirst( null );
+                while ( entry != null ) {
+                    result[index++] = entry;
+                    entry = (LeftTuple) entry.getNext();
+                }
+                bucket = (LeftTupleList) bucket.getNext();
+            }
+        }
+        return result;
+    }
+
+    public void add(final LeftTuple tuple) {
+        final LeftTupleList entry = getOrCreate( tuple );
+        tuple.setMemory( entry );
+        entry.add( tuple );
+        this.factSize++;
+    }
+
+    public void remove(final LeftTuple leftTuple) {
+        if ( leftTuple.getMemory() != null ) {
+            LeftTupleList memory = leftTuple.getMemory();
+            memory.remove( leftTuple );
+            if ( memory.first == null ) {
+                final int index = indexOf( memory.hashCode(),
+                                           this.table.length );
+                LeftTupleList previous = null;
+                LeftTupleList current = (LeftTupleList) this.table[index];
+                while ( current != memory ) {
+                    previous = current;
+                    current = (LeftTupleList) current.getNext();
+                }
+
+                if ( previous != null ) {
+                    previous.next = current.next;
+                } else {
+                    this.table[index] = current.next;
+                }
+                this.size--;
+            }
+            return;
+        }
+
+        final int hashCode = this.index.hashCodeOf( leftTuple );
+        final int index = indexOf( hashCode,
+                                   this.table.length );
+
+        // search the table for  the Entry, we need to track previous, so if the Entry
+        // is empty we can remove it.
+        LeftTupleList previous = null;
+        LeftTupleList current = (LeftTupleList) this.table[index];
+        while ( current != null ) {
+            if ( current.matches( leftTuple,
+                                  hashCode ) ) {
+                current.remove( leftTuple );
+                this.factSize--;
+
+                if ( current.first == null ) {
+                    if ( previous != null ) {
+                        previous.next = current.next;
+                    } else {
+                        this.table[index] = current.next;
+                    }
+                    this.size--;
+                }
+                break;
+            }
+            previous = current;
+            current = (LeftTupleList) current.next;
+        }
+        leftTuple.setNext( null );
+        leftTuple.setPrevious( null );
+    }
+
+    public boolean contains(final LeftTuple tuple) {
+        final int hashCode = this.index.hashCodeOf( tuple );
+
+        final int index = indexOf( hashCode,
+                                   this.table.length );
+
+        LeftTupleList current = (LeftTupleList) this.table[index];
+        while ( current != null ) {
+            if ( current.matches( tuple,
+                                  hashCode ) ) {
+                return true;
+            }
+            current = (LeftTupleList) current.next;
+        }
+        return false;
+    }
+
+    public LeftTupleList get(final RightTuple rightTuple) {
+        final Object object = rightTuple.getFactHandle().getObject();
+        final int hashCode = this.index.hashCodeOf( object );
+
+        final int index = indexOf( hashCode,
+                                   this.table.length );
+        LeftTupleList entry = (LeftTupleList) this.table[index];
+
+        while ( entry != null ) {
+            if ( entry.matches( object,
+                                hashCode ) ) {
+                return entry;
+            }
+            entry = (LeftTupleList) entry.getNext();
+        }
+
+        return entry;
+    }
+
+    /**
+     * We use this method to aviod to table lookups for the same hashcode; which is what we would have to do if we did
+     * a get and then a create if the value is null.
+     * 
+     * @param value
+     * @return
+     */
+    private LeftTupleList getOrCreate(final LeftTuple tuple) {
+        final int hashCode = this.index.hashCodeOf( tuple );
+
+        final int index = indexOf( hashCode,
+                                   this.table.length );
+        LeftTupleList entry = (LeftTupleList) this.table[index];
+
+        // search to find an existing entry
+        while ( entry != null ) {
+            if ( entry.matches( tuple,
+                                hashCode ) ) {
+                return entry;
+            }
+            entry = (LeftTupleList) entry.next;
+        }
+
+        // entry does not exist, so create
+        if ( entry == null ) {
+            entry = new LeftTupleList( this.index,
+                                       hashCode );
+            entry.next = this.table[index];
+            this.table[index] = entry;
+
+            if ( this.size++ >= this.threshold ) {
+                resize( 2 * this.table.length );
+            }
+        }
+        return entry;
+    }
+
+    public int size() {
+        return this.factSize;
+    }
+
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        Iterator it = iterator();
+        for ( LeftTuple leftTuple = (LeftTuple) it.next(); leftTuple != null; leftTuple = (LeftTuple) it.next() ) {
+            builder.append( leftTuple + "\n" );
+        }
+
+        return builder.toString();
+    }
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/LeftTupleList.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/LeftTupleList.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/LeftTupleList.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -0,0 +1,213 @@
+/**
+ * 
+ */
+package org.drools.util;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.drools.common.InternalFactHandle;
+import org.drools.reteoo.LeftTuple;
+import org.drools.reteoo.LeftTupleMemory;
+import org.drools.reteoo.RightTuple;
+import org.drools.util.AbstractHashTable.Index;
+
+public class LeftTupleList
+    implements
+    LeftTupleMemory,
+    Entry {
+
+    public static final long       serialVersionUID = 400L;
+    //      private Entry             previous;
+    public Entry                   next;
+
+    public LeftTuple               first;
+
+    private final int              hashCode;
+    private final Index            index;
+
+    private TupleHashTableIterator iterator;
+
+    private int                    size;
+
+    public LeftTupleList() {
+        // this is not an index bucket        
+        this.hashCode = 0;
+        this.index = null;
+    }
+
+    public LeftTupleList(final Index index,
+                          final int hashCode) {
+        this.index = index;
+        this.hashCode = hashCode;
+    }
+
+    public LeftTuple getFirst(RightTuple rightTuple) {
+        return this.first;
+    }
+
+    public void add(final LeftTuple leftTuple) {
+        if ( this.first != null ) {
+            leftTuple.setNext( this.first );
+            this.first.setPrevious( leftTuple );
+        }
+
+        this.first = leftTuple;
+
+        this.size++;
+    }
+
+    public void remove(final LeftTuple leftTuple) {
+        LeftTuple previous = (LeftTuple) leftTuple.getPrevious();
+        LeftTuple next = (LeftTuple) leftTuple.getNext();
+
+        if ( previous != null && next != null ) {
+            //remove  from middle
+            previous.setNext( next );
+            next.setPrevious( previous );
+        } else if ( next != null ) {
+            //remove from first
+            this.first = next;
+            next.setPrevious( null );
+        } else if ( previous != null ) {
+            //remove from end
+            previous.setNext( null );
+        } else {
+            this.first = null;
+        }
+
+        leftTuple.setPrevious( null );
+        leftTuple.setNext( null );
+
+        this.size--;
+    }
+
+    public boolean contains(final LeftTuple leftTuple) {
+        return get( leftTuple ) != null;
+    }
+
+    public Object get(final LeftTuple leftTtuple) {
+        LeftTuple current = this.first;
+        while ( current != null ) {
+            if ( leftTtuple.equals( current ) ) {
+                return current;
+            }
+            current = (LeftTuple) current.getNext();
+        }
+        return null;
+    }
+
+    public int size() {
+        return this.size;
+    }
+
+    public LeftTuple[] toArray() {
+        LeftTuple[] tuples = new LeftTuple[this.size];
+
+        LeftTuple current = first;
+        for ( int i = 0; i < this.size; i++ ) {
+            tuples[i] = current;
+            current = (LeftTuple) current.getNext();
+        }
+
+        return tuples;
+    }
+
+    public Entry getBucket(final Object object) {
+        return this.first;
+    }
+
+    public Iterator iterator() {
+        if ( this.iterator == null ) {
+            this.iterator = new TupleHashTableIterator();
+        }
+        this.iterator.reset( this.first );
+        return this.iterator;
+    }
+
+    public static class TupleHashTableIterator
+        implements
+        Iterator {
+        private LeftTuple current;
+
+        public void reset(LeftTuple first) {
+            this.current = first;
+        }
+
+        public Object next() {
+            if ( this.current != null ) {
+                LeftTuple returnValue = this.current;
+                this.current = (LeftTuple) current.getNext();
+                return returnValue;
+            } else {
+                return null;
+            }
+        }
+
+        public void remove() {
+            // do nothing
+        }
+    }
+
+    public boolean isIndexed() {
+        return false;
+    }
+
+    public boolean matches(final Object object,
+                           final int objectHashCode) {
+        return this.hashCode == objectHashCode && this.index.equal( object,
+                                                                    this.first );
+    }
+
+    public boolean matches(final LeftTuple tuple,
+                           final int tupleHashCode) {
+        return this.hashCode == tupleHashCode && this.index.equal( this.first,
+                                                                   tuple );
+    }
+
+    public int hashCode() {
+        return this.hashCode;
+    }
+
+    public boolean equals(final Object object) {
+        final LeftTupleList other = (LeftTupleList) object;
+        return this.hashCode == other.hashCode && this.index == other.index;
+    }
+
+    public Entry getNext() {
+        return this.next;
+    }
+
+    public void setNext(final Entry next) {
+        this.next = next;
+    }
+
+    public Entry getPrevious() {
+        return null;
+    }
+
+    public void setPrevious(Entry previous) {
+        //      this.previous = previous;           
+    }
+
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        Iterator it = iterator();
+        for ( LeftTuple leftTuple = (LeftTuple) it.next(); leftTuple != null; leftTuple = (LeftTuple) it.next() ) {
+            builder.append( leftTuple + "\n" );
+        }
+
+        return builder.toString();
+    }
+
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        // @todo
+        
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+        // @todo        
+    }
+}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/RightTupleIndexHashTable.java (from rev 19178, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHandleIndexHashTable.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/RightTupleIndexHashTable.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/RightTupleIndexHashTable.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -0,0 +1,312 @@
+/**
+ *
+ */
+package org.drools.util;
+
+import org.drools.common.InternalFactHandle;
+import org.drools.reteoo.RightTuple;
+import org.drools.reteoo.RightTupleMemory;
+import org.drools.reteoo.LeftTuple;
+
+import java.io.ObjectInput;
+import java.io.IOException;
+import java.io.ObjectOutput;
+import java.io.Externalizable;
+
+public class RightTupleIndexHashTable  extends AbstractHashTable
+    implements
+    RightTupleMemory {
+
+    private static final long serialVersionUID = 400L;
+
+    public static final int   PRIME            = 31;
+
+    private int               startResult;
+
+    private int               factSize;
+
+    private Index             index;
+
+    public RightTupleIndexHashTable(final FieldIndex[] index) {
+        this( 128,
+              0.75f,
+              index );
+    }
+
+    public RightTupleIndexHashTable(final int capacity,
+                                    final float loadFactor,
+                                    final FieldIndex[] index) {
+        super( capacity,
+               loadFactor );
+
+        this.startResult = RightTupleIndexHashTable.PRIME;
+        for ( int i = 0, length = index.length; i < length; i++ ) {
+            this.startResult = RightTupleIndexHashTable.PRIME * this.startResult + index[i].getExtractor().getIndex();
+        }
+
+        switch ( index.length ) {
+            case 0 :
+                throw new IllegalArgumentException( "FieldIndexHashTable cannot use an index[] of length  0" );
+            case 1 :
+                this.index = new SingleIndex( index,
+                                              this.startResult );
+                break;
+            case 2 :
+                this.index = new DoubleCompositeIndex( index,
+                                                       this.startResult );
+                break;
+            case 3 :
+                this.index = new TripleCompositeIndex( index,
+                                                       this.startResult );
+                break;
+            default :
+                throw new IllegalArgumentException( "FieldIndexHashTable cannot use an index[] of length  great than 3" );
+        }
+    }
+
+    public RightTuple getFirst(LeftTuple leftTuple) {
+        RightTupleList bucket = get( leftTuple );
+        if ( bucket != null ) {
+            return bucket.first;
+        } else {
+            return null;
+        }
+    }
+
+    public RightTuple getLast(LeftTuple leftTuple) {
+        RightTupleList bucket = get( leftTuple );
+        if ( bucket != null ) {
+            return bucket.last;
+        } else {
+            return null;
+        }
+    }
+
+    public boolean isIndexed() {
+        return true;
+    }
+
+    public Index getIndex() {
+        return this.index;
+    }
+
+    public Entry getBucket(final Object object) {
+        final int hashCode = this.index.hashCodeOf( object );
+        final int index = indexOf( hashCode,
+                                   this.table.length );
+
+        return this.table[index];
+    }
+
+    /**
+     * Fast re-usable iterator
+     *
+     */
+    public static class FieldIndexHashTableIterator
+        implements
+        Iterator {
+        private Entry entry;
+
+        public FieldIndexHashTableIterator() {
+
+        }
+
+        /* (non-Javadoc)
+         * @see org.drools.util.Iterator#next()
+         */
+        public Object next() {
+            final Entry current = this.entry;
+            this.entry = (this.entry != null) ? this.entry.getNext() : null;
+            return current;
+        }
+
+        public void remove() {
+
+        }
+
+        /* (non-Javadoc)
+         * @see org.drools.util.Iterator#reset()
+         */
+        public void reset(final Entry entry) {
+            this.entry = entry;
+        }
+    }
+
+    public Entry[] toArray() {
+        Entry[] result = new Entry[this.factSize];
+        int index = 0;
+        for ( int i = 0; i < this.table.length; i++ ) {
+            RightTupleList bucket = (RightTupleList) this.table[i];
+            while ( bucket != null ) {
+                Entry entry = bucket.first;
+                while ( entry != null ) {
+                    result[index++] = entry;
+                    entry = entry.getNext();
+                }
+                bucket = (RightTupleList) bucket.next;
+            }
+        }
+        return result;
+    }
+
+    public void add(final RightTuple rightTuple) {
+        final RightTupleList entry = getOrCreate( rightTuple.getFactHandle().getObject() );
+        rightTuple.setMemory( entry );
+        entry.add( rightTuple );
+        this.factSize++;
+    }
+
+    /**
+     * We assume that this rightTuple is contained in this hash table
+     */
+    public void remove(final RightTuple rightTuple) {
+        if ( rightTuple.getMemory() != null ) {
+            RightTupleList memory = rightTuple.getMemory();
+            memory.remove( rightTuple );
+            if ( memory.first == null ) {
+                final int index = indexOf( memory.hashCode(),
+                                           this.table.length );
+                RightTupleList previous = null;
+                RightTupleList current = (RightTupleList) this.table[index];
+                while ( current != memory ) {
+                    previous = current;
+                    current = (RightTupleList) current.getNext();
+                }
+
+                if ( previous != null ) {
+                    previous.next = current.next;
+                } else {
+                    this.table[index] = current.next;
+                }
+                this.size--;
+            }
+            return;
+        }
+
+        final Object object = rightTuple.getFactHandle().getObject();
+        final int hashCode = this.index.hashCodeOf( object );
+        final int index = indexOf( hashCode,
+                                   this.table.length );
+
+        // search the table for  the Entry, we need to track previous, so if the Entry
+        // is empty we can remove it.
+        RightTupleList previous = null;
+        RightTupleList current = (RightTupleList) this.table[index];
+        while ( current != null ) {
+            if ( current.matches( object,
+                                  hashCode ) ) {
+                current.remove( rightTuple );
+                this.factSize--;
+
+                if ( current.first == null ) {
+                    if ( previous != null ) {
+                        previous.next = current.next;
+                    } else {
+                        this.table[index] = current.next;
+                    }
+                    this.size--;
+                }
+                break;
+            }
+            previous = current;
+            current = (RightTupleList) current.next;
+        }
+        rightTuple.setNext( null );
+        rightTuple.setPrevious( null );
+    }
+
+    public boolean contains(final RightTuple rightTuple) {
+        final Object object = rightTuple.getFactHandle().getObject();
+
+        final int hashCode = this.index.hashCodeOf( object );
+
+        final int index = indexOf( hashCode,
+                                   this.table.length );
+
+        RightTupleList current = (RightTupleList) this.table[index];
+        while ( current != null ) {
+            if ( current.matches( object,
+                                  hashCode ) ) {
+                return true;
+            }
+            current = (RightTupleList) current.next;
+        }
+        return false;
+    }
+
+    public RightTupleList get(final LeftTuple tuple) {
+        //this.index.setCachedValue( tuple );
+
+        final int hashCode = this.index.hashCodeOf( tuple );
+
+        final int index = indexOf( hashCode,
+                                   this.table.length );
+        RightTupleList entry = (RightTupleList) this.table[index];
+
+        while ( entry != null ) {
+            if ( entry.matches( tuple,
+                                hashCode ) ) {
+                return entry;
+            }
+            entry = (RightTupleList) entry.getNext();
+        }
+
+        return entry;
+    }
+
+    /**
+     * We use this method to aviod to table lookups for the same hashcode; which is what we would have to do if we did
+     * a get and then a create if the value is null.
+     * 
+     * @param value
+     * @return
+     */
+    private RightTupleList getOrCreate(final Object object) {
+        //this.index.setCachedValue( object );
+
+        final int hashCode = this.index.hashCodeOf( object );
+
+        final int index = indexOf( hashCode,
+                                   this.table.length );
+        RightTupleList entry = (RightTupleList) this.table[index];
+
+        while ( entry != null ) {
+            if ( entry.matches( object,
+                                hashCode ) ) {
+                return entry;
+            }
+            entry = (RightTupleList) entry.next;
+        }
+
+        if ( entry == null ) {
+            entry = new RightTupleList( this.index,
+                                       hashCode );
+            entry.next = this.table[index];
+            this.table[index] = entry;
+
+            if ( this.size++ >= this.threshold ) {
+                resize( 2 * this.table.length );
+            }
+        }
+        return entry;
+    }
+
+    public int size() {
+        return this.factSize;
+    }
+
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        for ( Entry entry : this.table ) {
+            while ( entry != null ) {
+                RightTupleList bucket = (RightTupleList) entry;
+                for ( RightTuple rightTuple = bucket.getFirst( null ); rightTuple != null; rightTuple = (RightTuple) rightTuple.getNext() ) {
+                    builder.append( rightTuple );
+                }
+                entry = entry.getNext();
+            }
+        }
+
+        return builder.toString();
+    }
+}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/RightTupleList.java (from rev 19178, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashTable.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/RightTupleList.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/RightTupleList.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -0,0 +1,190 @@
+/**
+ * 
+ */
+package org.drools.util;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.drools.common.InternalFactHandle;
+import org.drools.reteoo.RightTuple;
+import org.drools.reteoo.RightTupleMemory;
+import org.drools.reteoo.LeftTuple;
+import org.drools.util.AbstractHashTable.Index;
+
+public class RightTupleList
+    implements
+    RightTupleMemory, Entry {
+        private static final long serialVersionUID = 400L;
+        
+        public Entry             previous;
+        public Entry             next;
+        
+        public RightTuple        first;
+        public RightTuple        last;
+        
+        private final int         hashCode;
+        private final Index       index;
+        
+        public RightTupleList() {
+            // this is not an index bucket
+            this.hashCode = 0;
+            this.index = null;
+        }
+        
+        public RightTupleList(final Index index,
+                               final int hashCode) {
+            this.index = index;
+            this.hashCode = hashCode;
+        }
+        
+        public RightTuple getFirst(LeftTuple leftTuple) {
+            return this.first;
+        }
+        
+        public RightTuple getLast(LeftTuple leftTuple) {
+            return this.last;
+        }
+
+        public void add(final RightTuple rightTuple) {                
+            if ( this.first != null ) {
+                this.first.setPrevious( rightTuple );
+                rightTuple.setNext( this.first );
+                this.first = rightTuple;       
+            } else {
+                this.first = rightTuple;
+                this.last = rightTuple;;
+            }
+        }
+        
+        /**
+         * We assume that this rightTuple is contained in this hash table
+         */
+        public void remove(final RightTuple rightTuple) {
+            RightTuple previous = ( RightTuple ) rightTuple.getPrevious();
+            RightTuple next = ( RightTuple ) rightTuple.getNext();
+            
+            if ( previous  != null && next != null ) {
+                // remove from middle
+                previous.setNext( next );
+                next.setPrevious( previous );
+            } else if ( next != null ) {
+                // remove from first
+                this.first = next;
+                next.setPrevious( null );
+            } else if ( previous != null ) {
+                // remove from end
+                this.last = previous;
+                previous.setNext( null );
+            } else {
+                // remove everything
+                this.last = null;
+                this.first = null;
+            }       
+        }  
+        
+        public RightTuple get(final InternalFactHandle handle) {
+            RightTuple current = this.first;            
+            while ( current != null ) {
+                if ( handle == current.getFactHandle() ) {
+                    return current;
+                }
+                current = (RightTuple) current.getNext();
+            }
+            return null;        
+        }
+        
+        public boolean contains(final InternalFactHandle handle) {
+            return get( handle ) != null;
+        }
+        
+        
+        public RightTuple get(final RightTuple rightTuple) {
+            InternalFactHandle handle = rightTuple.getFactHandle();
+            RightTuple current = this.first;            
+            while ( current != null ) {
+                if ( handle == current.getFactHandle() ) {
+                    return current;
+                }
+                current = (RightTuple) current.getNext();
+            }
+            return null;        
+        }
+
+        public boolean contains(final RightTuple rightTuple) {
+            return get( rightTuple ) != null;
+        }
+        
+        public int size() {
+            int i = 0;
+            RightTuple current = this.first;        
+            while ( current != null ) {
+                current = (RightTuple) current.getNext();
+                i++;
+            }
+            return i;
+        }
+
+        public boolean matches(final Object object,
+                               final int objectHashCode) {
+            return this.hashCode == objectHashCode && this.index.equal( this.first.getFactHandle().getObject(),
+                                                                        object );
+        }
+
+        public boolean matches(final LeftTuple tuple,
+                               final int tupleHashCode) {
+            return this.hashCode == tupleHashCode && this.index.equal( this.first.getFactHandle().getObject(),
+                                                                       tuple );
+        }
+
+        public int hashCode() {
+            return this.hashCode;
+        }
+
+        public boolean equals(final Object object) {
+            final RightTupleList other = (RightTupleList) object;
+            return this.hashCode == other.hashCode && this.index == other.index;
+        }
+
+        public Entry getPrevious() {
+            return null;
+            //          return this.previous;            
+        }
+
+        public void setPrevious(Entry previous) {
+            //          this.previous = previous;
+        }
+        
+        public Entry getNext() {
+            return this.next;
+        }
+
+        public void setNext(final Entry next) {
+            this.next = next;
+        }    
+
+        public boolean isIndexed() {
+            return ( this.index != null );
+        }
+        
+        public String toString() {
+            StringBuilder builder = new StringBuilder();
+            for ( RightTuple rightTuple = ( RightTuple ) this.first; rightTuple  != null; rightTuple = ( RightTuple ) rightTuple.getNext() ) {
+                builder.append( rightTuple );
+            }
+                    
+            return builder.toString();
+        }
+
+        public void readExternal(ObjectInput in) throws IOException,
+                                                ClassNotFoundException {
+            // TODO Auto-generated method stub
+            
+        }
+
+        public void writeExternal(ObjectOutput out) throws IOException {
+            // TODO Auto-generated method stub
+            
+        }    
+}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleHashTable.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleHashTable.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -1,96 +0,0 @@
-/**
- * 
- */
-package org.drools.util;
-
-import org.drools.common.InternalFactHandle;
-import org.drools.reteoo.LeftTuple;
-import org.drools.reteoo.LeftTupleMemory;
-
-public class TupleHashTable extends AbstractHashTable
-    implements
-    LeftTupleMemory {
-    public TupleHashTable() {
-        this( 16,
-              0.75f );
-    }
-
-    public TupleHashTable(final int capacity,
-                          final float loadFactor) {
-        super( capacity,
-               loadFactor );
-    }
-
-    public Iterator iterator(final InternalFactHandle handle) {
-        return iterator();
-    }
-
-    public void add(final LeftTuple tuple) {
-        final int hashCode = tuple.hashCode();
-        final int index = indexOf( hashCode,
-                                   this.table.length );
-
-        tuple.setNext( this.table[index] );
-        this.table[index] = tuple;
-
-        if ( this.size++ >= this.threshold ) {
-            resize( 2 * this.table.length );
-        }
-    }
-
-    public LeftTuple get(final LeftTuple tuple) {
-        final int hashCode = tuple.hashCode();
-        final int index = indexOf( hashCode,
-                                   this.table.length );
-
-        LeftTuple current = (LeftTuple) this.table[index];
-        while ( current != null ) {
-            if ( hashCode == current.hashCode() && tuple.equals( current ) ) {
-                return current;
-            }
-            current = (LeftTuple) current.getNext();
-        }
-        return null;
-    }
-
-    public LeftTuple remove(final LeftTuple tuple) {
-        final int hashCode = tuple.hashCode();
-        final int index = indexOf( hashCode,
-                                   this.table.length );
-
-        LeftTuple previous = (LeftTuple) this.table[index];
-        LeftTuple current = previous;
-        while ( current != null ) {
-            final LeftTuple next = (LeftTuple) current.getNext();
-            if ( hashCode == current.hashCode() && tuple.equals( current ) ) {
-                if ( previous == current ) {
-                    this.table[index] = next;
-                } else {
-                    previous.setNext( next );
-                }
-                current.setNext( null );
-                this.size--;
-                return current;
-            }
-            previous = current;
-            current = next;
-        }
-        return current;
-    }
-
-    public Entry getBucket(final Object object) {
-        final int hashCode = object.hashCode();
-        final int index = indexOf( hashCode,
-                                   this.table.length );
-
-        return this.table[index];
-    }
-
-    public boolean contains(final LeftTuple tuple) {
-        return (get( tuple ) != null);
-    }
-
-    public boolean isIndexed() {
-        return false;
-    }
-}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleIndexHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleIndexHashTable.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleIndexHashTable.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -1,469 +0,0 @@
-/**
- *
- */
-package org.drools.util;
-
-import org.drools.common.InternalFactHandle;
-import org.drools.reteoo.LeftTuple;
-import org.drools.reteoo.LeftTupleMemory;
-
-import java.io.ObjectOutput;
-import java.io.ObjectInput;
-import java.io.IOException;
-import java.io.Externalizable;
-
-public class TupleIndexHashTable extends AbstractHashTable
-    implements
-    LeftTupleMemory {
-
-    private static final long               serialVersionUID = 400L;
-
-    public static final int                 PRIME            = 31;
-
-    private int                             startResult;
-
-    private FieldIndexHashTableIterator     tupleValueIterator;
-    private FieldIndexHashTableFullIterator tupleValueFullIterator;
-
-    private int                             factSize;
-
-    private Index                           index;
-
-    public TupleIndexHashTable() {
-    }
-
-    public TupleIndexHashTable(final FieldIndex[] index) {
-        this( 16,
-              0.75f,
-              index );
-    }
-
-    public TupleIndexHashTable(final int capacity,
-                               final float loadFactor,
-                               final FieldIndex[] index) {
-        super( capacity,
-               loadFactor );
-
-        this.startResult = TupleIndexHashTable.PRIME;
-        for ( int i = 0, length = index.length; i < length; i++ ) {
-            this.startResult += TupleIndexHashTable.PRIME * this.startResult + index[i].getExtractor().getIndex();
-        }
-
-        switch ( index.length ) {
-            case 0 :
-                throw new IllegalArgumentException( "FieldIndexHashTable cannot use an index[] of length  0" );
-            case 1 :
-                this.index = new SingleIndex( index,
-                                              this.startResult );
-                break;
-            case 2 :
-                this.index = new DoubleCompositeIndex( index,
-                                                       this.startResult );
-                break;
-            case 3 :
-                this.index = new TripleCompositeIndex( index,
-                                                       this.startResult );
-                break;
-            default :
-                throw new IllegalArgumentException( "FieldIndexHashTable cannot use an index[] of length  great than 3" );
-        }
-    }
-
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        super.readExternal(in);
-        startResult = in.readInt();
-        tupleValueIterator  = (FieldIndexHashTableIterator)in.readObject();
-        tupleValueFullIterator  = (FieldIndexHashTableFullIterator)in.readObject();
-        factSize    = in.readInt();
-        index       = (Index)in.readObject();
-    }
-
-    public void writeExternal(ObjectOutput out) throws IOException {
-        super.writeExternal(out);
-        out.writeInt(startResult);
-        out.writeObject(tupleValueIterator);
-        out.writeObject(tupleValueFullIterator);
-        out.writeInt(factSize);
-        out.writeObject(index);
-    }
-
-    public Iterator iterator() {
-        if ( this.tupleValueFullIterator == null ) {
-            this.tupleValueFullIterator = new FieldIndexHashTableFullIterator( this );
-        }
-        this.tupleValueFullIterator.reset();
-        return this.tupleValueFullIterator;
-    }
-
-    public Iterator iterator(final InternalFactHandle handle) {
-        if ( this.tupleValueIterator == null ) {
-            this.tupleValueIterator = new FieldIndexHashTableIterator();
-        }
-        final FieldIndexEntry entry = get( handle );
-        this.tupleValueIterator.reset( (entry != null) ? entry.first : null );
-        return this.tupleValueIterator;
-    }
-
-    public boolean isIndexed() {
-        return true;
-    }
-
-    public Index getIndex() {
-        return this.index;
-    }
-
-    public Entry getBucket(final Object object) {
-        final int hashCode = this.index.hashCodeOf( object );
-        final int index = indexOf( hashCode,
-                                   this.table.length );
-
-        return this.table[index];
-    }
-
-    /**
-     * Fast re-usable iterator
-     *
-     */
-    public static class FieldIndexHashTableIterator
-        implements
-        Iterator, Externalizable {
-        private Entry entry;
-
-        public FieldIndexHashTableIterator() {
-
-        }
-
-        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-            entry   = (Entry)in.readObject();
-        }
-
-        public void writeExternal(ObjectOutput out) throws IOException {
-            out.writeObject(entry);
-        }
-
-        /* (non-Javadoc)
-         * @see org.drools.util.Iterator#next()
-         */
-        public Object next() {
-            final Entry current = this.entry;
-            this.entry = (this.entry != null) ? this.entry.getNext() : null;
-            return current;
-        }
-
-        /* (non-Javadoc)
-         * @see org.drools.util.Iterator#reset()
-         */
-        public void reset(final Entry entry) {
-            this.entry = entry;
-        }
-    }
-
-    public static class FieldIndexHashTableFullIterator
-        implements
-        Iterator, Externalizable {
-        private AbstractHashTable hashTable;
-        private Entry[]           table;
-        private int               row;
-        private int               length;
-        private Entry             entry;
-
-        public FieldIndexHashTableFullIterator() {
-
-        }
-        public FieldIndexHashTableFullIterator(final AbstractHashTable hashTable) {
-            this.hashTable = hashTable;
-        }
-
-        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-            hashTable   = (AbstractHashTable)in.readObject();
-            table   = (Entry[])in.readObject();
-            row     = in.readInt();
-            length  = in.readInt();
-            entry   = (Entry)in.readObject();
-        }
-
-        public void writeExternal(ObjectOutput out) throws IOException {
-            out.writeObject(hashTable);
-            out.writeObject(table);
-            out.writeInt(row);
-            out.writeInt(length);
-            out.writeObject(entry);
-        }
-
-        /* (non-Javadoc)
-         * @see org.drools.util.Iterator#next()
-         */
-        public Object next() {
-            if ( this.entry == null ) {
-                // keep skipping rows until we come to the end, or find one that is populated
-                while ( this.entry == null ) {
-                    this.row++;
-                    if ( this.row == this.length ) {
-                        return null;
-                    }
-                    this.entry = (this.table[this.row] != null) ? ((FieldIndexEntry) this.table[this.row]).first : null;
-                }
-            } else {
-                this.entry = this.entry.getNext();
-                if ( this.entry == null ) {
-                    this.entry = (Entry) next();
-                }
-            }
-
-            return this.entry;
-        }
-
-        /* (non-Javadoc)
-         * @see org.drools.util.Iterator#reset()
-         */
-        public void reset() {
-            this.table = this.hashTable.getTable();
-            this.length = this.table.length;
-            this.row = -1;
-            this.entry = null;
-        }
-    }
-
-    public Entry[] toArray() {
-        Entry[] result = new Entry[this.factSize];
-        int index = 0;
-        for ( int i = 0; i < this.table.length; i++ ) {
-            FieldIndexEntry fieldIndexEntry = (FieldIndexEntry)this.table[i];
-            while ( fieldIndexEntry != null ) {
-                Entry entry = fieldIndexEntry.getFirst();
-                while ( entry != null ) {
-                    result[index++] = entry;
-                    entry = entry.getNext();
-                }
-                fieldIndexEntry  = ( FieldIndexEntry ) fieldIndexEntry.getNext();
-            }
-        }
-        return result;
-    }
-
-    public void add(final LeftTuple tuple) {
-        final FieldIndexEntry entry = getOrCreate( tuple );
-        entry.add( tuple );
-        this.factSize++;
-    }
-
-    public boolean add(final LeftTuple tuple,
-                       final boolean checkExists) {
-        throw new UnsupportedOperationException( "FieldIndexHashTable does not support add(ReteTuple tuple, boolean checkExists)" );
-    }
-
-    public LeftTuple remove(final LeftTuple tuple) {
-        final int hashCode = this.index.hashCodeOf( tuple );
-
-        final int index = indexOf( hashCode,
-                                   this.table.length );
-
-        // search the table for  the Entry, we need to track previous  and next, so if the
-        // Entry is empty after  its had the FactEntry removed, we must remove  it from the table
-        FieldIndexEntry previous = (FieldIndexEntry) this.table[index];
-        FieldIndexEntry current = previous;
-        while ( current != null ) {
-            final FieldIndexEntry next = (FieldIndexEntry) current.next;
-            if ( current.matches( tuple,
-                                  hashCode ) ) {
-                final LeftTuple old = current.remove( tuple );
-                this.factSize--;
-                // If the FactEntryIndex is empty, then remove it from the hash table
-                if ( current.first == null ) {
-                    if ( previous == current ) {
-                        this.table[index] = next;
-                    } else {
-                        previous.next = next;
-                    }
-                    current.next = null;
-                    this.size--;
-                }
-                return old;
-            }
-            previous = current;
-            current = next;
-        }
-        return null;
-    }
-
-    public boolean contains(final LeftTuple tuple) {
-        final int hashCode = this.index.hashCodeOf( tuple );
-
-        final int index = indexOf( hashCode,
-                                   this.table.length );
-
-        FieldIndexEntry current = (FieldIndexEntry) this.table[index];
-        while ( current != null ) {
-            if ( current.matches( tuple,
-                                  hashCode ) ) {
-                return true;
-            }
-            current = (FieldIndexEntry) current.next;
-        }
-        return false;
-    }
-
-    public FieldIndexEntry get(final InternalFactHandle handle) {
-        final Object object = handle.getObject();
-        final int hashCode = this.index.hashCodeOf( handle.getObject() );
-
-        final int index = indexOf( hashCode,
-                                   this.table.length );
-        FieldIndexEntry entry = (FieldIndexEntry) this.table[index];
-
-        while ( entry != null ) {
-            if ( entry.matches( object,
-                                hashCode ) ) {
-                return entry;
-            }
-            entry = (FieldIndexEntry) entry.getNext();
-        }
-
-        return entry;
-    }
-
-    /**
-     * We use this method to aviod to table lookups for the same hashcode; which is what we would have to do if we did
-     * a get and then a create if the value is null.
-     *
-     * @param value
-     * @return
-     */
-    private FieldIndexEntry getOrCreate(final LeftTuple tuple) {
-        final int hashCode = this.index.hashCodeOf( tuple );
-
-        final int index = indexOf( hashCode,
-                                   this.table.length );
-        FieldIndexEntry entry = (FieldIndexEntry) this.table[index];
-
-        // search to find an existing entry
-        while ( entry != null ) {
-            if ( entry.matches( tuple,
-                                hashCode ) ) {
-                return entry;
-            }
-            entry = (FieldIndexEntry) entry.next;
-        }
-
-        // entry does not exist, so create
-        if ( entry == null ) {
-            entry = new FieldIndexEntry( this.index,
-                                         hashCode );
-            entry.next = this.table[index];
-            this.table[index] = entry;
-
-            if ( this.size++ >= this.threshold ) {
-                resize( 2 * this.table.length );
-            }
-        }
-        return entry;
-    }
-
-    public int size() {
-        return this.factSize;
-    }
-
-    public static class FieldIndexEntry
-        implements
-        Entry {
-
-        private static final long serialVersionUID = 400L;
-        private Entry             next;
-        private LeftTuple         first;
-        private int         hashCode;
-        private Index             index;
-
-        public FieldIndexEntry() {
-
-        }
-        public FieldIndexEntry(final Index index,
-                               final int hashCode) {
-            this.index = index;
-            this.hashCode = hashCode;
-        }
-
-        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-            next    = (Entry)in.readObject();
-            first   = (LeftTuple)in.readObject();
-            hashCode    = in.readInt();
-            index   = (Index)in.readObject();
-        }
-
-        public void writeExternal(ObjectOutput out) throws IOException {
-            out.writeObject(next);
-            out.writeObject(first);
-            out.writeInt(hashCode);
-            out.writeObject(index);
-        }
-
-        public Entry getNext() {
-            return this.next;
-        }
-
-        public void setNext(final Entry next) {
-            this.next = next;
-        }
-
-        public LeftTuple getFirst() {
-            return this.first;
-        }
-
-        public void add(final LeftTuple tuple) {
-            tuple.setNext( this.first );
-            this.first = tuple;
-        }
-
-        public LeftTuple get(final LeftTuple tuple) {
-            LeftTuple current = this.first;
-            while ( current != null ) {
-                if ( tuple.equals( current ) ) {
-                    return current;
-                }
-                current = (LeftTuple) current.getNext();
-            }
-            return null;
-        }
-
-        public LeftTuple remove(final LeftTuple tuple) {
-            LeftTuple previous = this.first;
-            LeftTuple current = previous;
-            while ( current != null ) {
-                final LeftTuple next = (LeftTuple) current.getNext();
-                if ( tuple.equals( current ) ) {
-                    if ( this.first == current ) {
-                        this.first = next;
-                    } else {
-                        previous.setNext( next );
-                    }
-                    current.setNext( null );
-                    return current;
-                }
-                previous = current;
-                current = next;
-            }
-            return current;
-        }
-
-        public boolean matches(final Object object,
-                               final int objectHashCode) {
-            return this.hashCode == objectHashCode && this.index.equal( object,
-                                                                        this.first );
-        }
-
-        public boolean matches(final LeftTuple tuple,
-                               final int tupleHashCode) {
-            return this.hashCode == tupleHashCode && this.index.equal( this.first,
-                                                                       tuple );
-        }
-
-        public int hashCode() {
-            return this.hashCode;
-        }
-
-        public boolean equals(final Object object) {
-            final FieldIndexEntry other = (FieldIndexEntry) object;
-            return this.hashCode == other.hashCode && this.index == other.index;
-        }
-    }
-
-}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/BaseBetaConstraintsTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/BaseBetaConstraintsTest.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/BaseBetaConstraintsTest.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -22,12 +22,12 @@
 import org.drools.spi.BetaNodeFieldConstraint;
 import org.drools.spi.Evaluator;
 import org.drools.spi.FieldExtractor;
-import org.drools.util.FactHandleIndexHashTable;
-import org.drools.util.FactHashTable;
+import org.drools.util.RightTupleIndexHashTable;
+import org.drools.util.RightTupleList;
 import org.drools.util.LinkedList;
 import org.drools.util.LinkedListEntry;
-import org.drools.util.TupleHashTable;
-import org.drools.util.TupleIndexHashTable;
+import org.drools.util.LeftTupleList;
+import org.drools.util.LeftTupleIndexHashTable;
 import org.drools.util.AbstractHashTable.FieldIndex;
 import org.drools.util.AbstractHashTable.Index;
 
@@ -101,7 +101,7 @@
         BetaMemory betaMemory = betaConstraints.createBetaMemory( config );
 
         if ( indexedPositions.length > 0 ) {
-            TupleIndexHashTable tupleHashTable = (TupleIndexHashTable) betaMemory.getLeftTupleMemory();
+            LeftTupleIndexHashTable tupleHashTable = (LeftTupleIndexHashTable) betaMemory.getLeftTupleMemory();
             assertTrue( tupleHashTable.isIndexed() );
             Index index = tupleHashTable.getIndex();
 
@@ -110,7 +110,7 @@
                                              index.getFieldIndex( i ) );
             }
 
-            FactHandleIndexHashTable factHashTable = (FactHandleIndexHashTable) betaMemory.getRightTupleMemory();
+            RightTupleIndexHashTable factHashTable = (RightTupleIndexHashTable) betaMemory.getRightTupleMemory();
             assertTrue( factHashTable.isIndexed() );
             index = factHashTable.getIndex();
 
@@ -119,10 +119,10 @@
                                              index.getFieldIndex( i ) );
             }
         } else {
-            TupleHashTable tupleHashTable = (TupleHashTable) betaMemory.getLeftTupleMemory();
+            LeftTupleList tupleHashTable = (LeftTupleList) betaMemory.getLeftTupleMemory();
             assertFalse( tupleHashTable.isIndexed() );
 
-            FactHashTable factHashTable = (FactHashTable) betaMemory.getRightTupleMemory();
+            RightTupleList factHashTable = (RightTupleList) betaMemory.getRightTupleMemory();
             assertFalse( factHashTable.isIndexed() );
         }
     }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -65,7 +65,7 @@
         };
 
         //workingMemory.addEventListener(listener );
-        final InputStream is = getClass().getResourceAsStream( "/manners128.dat" );
+        final InputStream is = getClass().getResourceAsStream( "/manners8.dat" );
         final List list = getInputObjects( is );
         for ( final Iterator it = list.iterator(); it.hasNext(); ) {
             final Object object = it.next();

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeTest.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeTest.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -39,7 +39,7 @@
 import org.drools.spi.FieldExtractor;
 import org.drools.spi.FieldValue;
 import org.drools.spi.PropagationContext;
-import org.drools.util.FactHashTable;
+import org.drools.util.RightTupleList;
 
 public class AlphaNodeTest extends DroolsTestCase {
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/EvalConditionNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/EvalConditionNodeTest.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/EvalConditionNodeTest.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -24,7 +24,7 @@
 import org.drools.reteoo.EvalConditionNode.EvalMemory;
 import org.drools.reteoo.builder.BuildContext;
 import org.drools.spi.PropagationContext;
-import org.drools.util.TupleHashTable;
+import org.drools.util.LeftTupleList;
 
 public class EvalConditionNodeTest extends DroolsTestCase {
     private PropagationContext  context;

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	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LeftInputAdapterNodeTest.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -29,7 +29,7 @@
 import org.drools.reteoo.builder.BuildContext;
 import org.drools.spi.PropagationContext;
 import org.drools.spi.Tuple;
-import org.drools.util.FactHashTable;
+import org.drools.util.RightTupleList;
 
 public class LeftInputAdapterNodeTest extends DroolsTestCase {
     private ReteooRuleBase ruleBase;
@@ -161,7 +161,7 @@
                     workingMemory.getObject( tuple0.get( 0 ) ) );
 
         // check node memory
-        final FactHashTable table = (FactHashTable) workingMemory.getNodeMemory( liaNode );
+        final RightTupleList table = (RightTupleList) workingMemory.getNodeMemory( liaNode );
         assertEquals( 1,
                       table.size() );
         assertTrue( table.contains( f0 ) );
@@ -256,7 +256,7 @@
 
         final Tuple tuple = (Tuple) ((Object[]) sink.getAsserted().get( 0 ))[0];
 
-        final FactHashTable map = (FactHashTable) workingMemory.getNodeMemory( liaNode );
+        final RightTupleList map = (RightTupleList) workingMemory.getNodeMemory( liaNode );
         assertTrue( map.contains( f0 ) );
 
         liaNode.retractObject( f0,

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeNodeTest.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeNodeTest.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -39,7 +39,7 @@
 import org.drools.rule.EntryPoint;
 import org.drools.spi.ObjectType;
 import org.drools.spi.PropagationContext;
-import org.drools.util.FactHashTable;
+import org.drools.util.RightTupleList;
 import org.drools.util.ObjectHashMap;
 
 public class ObjectTypeNodeTest extends DroolsTestCase {
@@ -129,7 +129,7 @@
                     workingMemory.getObject( (DefaultFactHandle) ((Object[]) asserted.get( 0 ))[0] ) );
 
         // check asserted object was added to memory
-        final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( objectTypeNode );
+        final RightTupleList memory = (RightTupleList) workingMemory.getNodeMemory( objectTypeNode );
         assertEquals( 1,
                       memory.size() );
         assertTrue( memory.contains( handle1 ) );
@@ -182,7 +182,7 @@
                     workingMemory.getObject( (DefaultFactHandle) ((Object[]) asserted.get( 0 ))[0] ) );
 
         // it's sequential, so check the asserted object was not added to the node memory
-        final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( objectTypeNode );
+        final RightTupleList memory = (RightTupleList) workingMemory.getNodeMemory( objectTypeNode );
         assertEquals( 0,
                       memory.size() );
     }
@@ -198,7 +198,7 @@
                                                                   new ClassObjectType( String.class ),
                                                                   buildContext );
 
-        final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( objectTypeNode );
+        final RightTupleList memory = (RightTupleList) workingMemory.getNodeMemory( objectTypeNode );
 
         assertNotNull( memory );
     }
@@ -258,7 +258,7 @@
                                      context,
                                      workingMemory );
         /* check asserted object was added to memory */
-        final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( objectTypeNode );
+        final RightTupleList memory = (RightTupleList) workingMemory.getNodeMemory( objectTypeNode );
         assertEquals( 1,
                       memory.size() );
 
@@ -386,7 +386,7 @@
                       ((InternalFactHandle) ((Object[]) asserted.get( 0 ))[0]).getObject() );
 
         // check asserted object was added to memory
-        final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( objectTypeNode );
+        final RightTupleList memory = (RightTupleList) workingMemory.getNodeMemory( objectTypeNode );
         assertEquals( 1,
                       memory.size() );
         assertTrue( memory.contains( handle1 ) );
@@ -437,7 +437,7 @@
                       person );
 
         // check asserted object was added to memory
-        final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( objectTypeNode );
+        final RightTupleList memory = (RightTupleList) workingMemory.getNodeMemory( objectTypeNode );
         assertEquals( 1,
                       memory.size() );
         assertTrue( memory.contains( handle1 ) );

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FactHashTableTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FactHashTableTest.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FactHashTableTest.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -6,7 +6,7 @@
 
 public class FactHashTableTest extends TestCase {
     public void testEmptyIterator() {
-        final FactHashTable map = new FactHashTable();
+        final RightTupleList map = new RightTupleList();
         final Iterator it = map.iterator();
         for ( ObjectEntry entry = (ObjectEntry) it.next(); entry != null; entry = (ObjectEntry) it.next() ) {
             fail( "Map is empty, there should be no iteration" );

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexEntryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexEntryTest.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexEntryTest.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -13,7 +13,7 @@
 import org.drools.util.AbstractHashTable.FactEntryImpl;
 import org.drools.util.AbstractHashTable.FieldIndex;
 import org.drools.util.AbstractHashTable.SingleIndex;
-import org.drools.util.FactHandleIndexHashTable.FieldIndexEntry;
+import org.drools.util.RightTupleIndexHashTable.FieldIndexEntry;
 
 public class FieldIndexEntryTest extends TestCase {
     ClassFieldExtractorCache cache = ClassFieldExtractorCache.getInstance();

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexHashTableTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexHashTableTest.java	2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexHashTableTest.java	2008-03-21 21:07:44 UTC (rev 19195)
@@ -20,7 +20,7 @@
 import org.drools.spi.FieldExtractor;
 import org.drools.util.AbstractHashTable.FactEntryImpl;
 import org.drools.util.AbstractHashTable.FieldIndex;
-import org.drools.util.FactHandleIndexHashTable.FieldIndexEntry;
+import org.drools.util.RightTupleIndexHashTable.FieldIndexEntry;
 import org.drools.util.ObjectHashMap.ObjectEntry;
 
 public class FieldIndexHashTableTest extends TestCase {
@@ -43,7 +43,7 @@
                                                       declaration,
                                                       equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ) );
 
-        final FactHandleIndexHashTable map = new FactHandleIndexHashTable( new FieldIndex[]{fieldIndex} );
+        final RightTupleIndexHashTable map = new RightTupleIndexHashTable( new FieldIndex[]{fieldIndex} );
 
         final Cheese cheddar = new Cheese( "cheddar",
                                            10 );
@@ -92,7 +92,7 @@
                                                       declaration,
                                                       equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ) );
 
-        final FactHandleIndexHashTable map = new FactHandleIndexHashTable( new FieldIndex[]{fieldIndex} );
+        final RightTupleIndexHashTable map = new RightTupleIndexHashTable( new FieldIndex[]{fieldIndex} );
 
         assertEquals( 0,
                       map.size() );
@@ -149,7 +149,7 @@
                                                       declaration,
                                                       equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ) );
 
-        final FactHandleIndexHashTable map = new FactHandleIndexHashTable( new FieldIndex[]{fieldIndex} );
+        final RightTupleIndexHashTable map = new RightTupleIndexHashTable( new FieldIndex[]{fieldIndex} );
 
         assertEquals( 0,
                       map.size() );
@@ -206,7 +206,7 @@
                                                       declaration,
                                                       equals.getEvaluator( ValueType.OBJECT_TYPE, Operator.EQUAL ) );
 
-        final FactHandleIndexHashTable map = new FactHandleIndexHashTable( new FieldIndex[]{fieldIndex} );
+        final RightTupleIndexHashTable map = new RightTupleIndexHashTable( new FieldIndex[]{fieldIndex} );
 
         final TestClass c1 = new TestClass( 0,
                                             new TestClass( 20,
@@ -253,7 +253,7 @@
                                                       declaration,
                                                       equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ) );
 
-        final FactHandleIndexHashTable map = new FactHandleIndexHashTable( new FieldIndex[]{fieldIndex} );
+        final RightTupleIndexHashTable map = new RightTupleIndexHashTable( new FieldIndex[]{fieldIndex} );
 
         assertEquals( 0,
                       map.size() );
@@ -320,7 +320,7 @@
                                                       declaration,
                                                       equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ) );
 
-        final FactHandleIndexHashTable map = new FactHandleIndexHashTable( new FieldIndex[]{fieldIndex} );
+        final RightTupleIndexHashTable map = new RightTupleIndexHashTable( new FieldIndex[]{fieldIndex} );
 
         assertEquals( 0,
                       map.size() );
@@ -537,7 +537,7 @@
                                                       declaration,
                                                       equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ) );
 
-        final FactHandleIndexHashTable map = new FactHandleIndexHashTable( new FieldIndex[]{fieldIndex} );
+        final RightTupleIndexHashTable map = new RightTupleIndexHashTable( new FieldIndex[]{fieldIndex} );
 
         final Cheese stilton = new Cheese( "stilton",
                                            55 );




More information about the jboss-svn-commits mailing list