[jboss-svn-commits] JBL Code SVN: r17697 - in labs/jbossrules/branches/righttuple/drools-core/src: main/java/org/drools/common and 5 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Jan 10 17:46:29 EST 2008


Author: mark.proctor at jboss.com
Date: 2008-01-10 17:46:28 -0500 (Thu, 10 Jan 2008)
New Revision: 17697

Modified:
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/base/SequentialKnowledgeHelper.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/BetaConstraints.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/DefaultAgenda.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/QuadroupleBetaConstraints.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/CompositeLeftTupleSinkAdapter.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/JoinNode.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/MemoryVisitor.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/NotNode.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/RightTuple.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/SingleLeftTupleSinkAdapter.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/AbstractCompositeConstraint.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/AbstractCompositeRestriction.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/ContextEntry.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/VariableRestriction.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/spi/KnowledgeHelper.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/util/FactHandleIndexHashTable.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/util/FactHashTable.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/util/TupleHashTable.java
   labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/util/TupleIndexHashTable.java
   labs/jbossrules/branches/righttuple/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java
Log:
-waltz and manners now run, but waltz  is very slow.

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -49,6 +49,13 @@
         this.activation = agendaItem;
         this.tuple = agendaItem.getTuple();
     }
+    
+    public void reset() {
+        this.rule = null;
+        this.subrule = null;
+        this.activation = null;
+        this.tuple = null;
+    }
 
     public void insert(final Object object) throws FactException {
         insert( object,

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/base/SequentialKnowledgeHelper.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/base/SequentialKnowledgeHelper.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/base/SequentialKnowledgeHelper.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -53,6 +53,14 @@
         this.activation = agendaItem;
         this.tuple = agendaItem.getTuple();
     }
+    
+    public void reset() {
+        this.rule = null;
+        this.subrule = null;
+        this.activation = null;
+        this.tuple = null;
+    }
+    
 
     public void insert(final Object object) throws FactException {        
     }

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/BetaConstraints.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/BetaConstraints.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/BetaConstraints.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -31,4 +31,8 @@
     public boolean isEmpty();
 
     public BetaMemory createBetaMemory(final RuleBaseConfiguration config);
+    
+    public void resetTuple();
+    
+    public void resetFactHandle();    
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/DefaultAgenda.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/DefaultAgenda.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/DefaultAgenda.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -548,6 +548,7 @@
             this.knowledgeHelper.setActivation( activation );
             activation.getRule().getConsequence().evaluate( this.knowledgeHelper,
                                                             this.workingMemory );
+            this.knowledgeHelper.reset();
         } catch ( final Exception e ) {
             this.consequenceExceptionHandler.handleException( activation, this.workingMemory, e );
         }

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -149,6 +149,18 @@
                                           rightTuple.getHandle() );
         }
     }
+    
+    public void resetTuple() {
+        for ( ContextEntry context = this.contexts; context != null; context = context.getNext() ) {
+            context.resetTuple();
+        }
+    }
+    
+    public void resetFactHandle() {
+        for ( ContextEntry context = this.contexts; context != null; context = context.getNext() ) {
+            context.resetFactHandle();
+        }
+    }     
 
     /* (non-Javadoc)
      * @see org.drools.common.BetaNodeConstraints#isAllowedCachedLeft(java.lang.Object)

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -138,6 +138,16 @@
         this.context1.updateFromFactHandle( workingMemory,
                                             rightTuple.getHandle() );
     }
+    
+    public void resetTuple() {
+        this.context0.resetTuple();
+        this.context1.resetTuple();
+    }
+    
+    public void resetFactHandle() {
+        this.context0.resetFactHandle();
+        this.context1.resetFactHandle();
+    }      
 
     /* (non-Javadoc)
      * @see org.drools.common.BetaNodeConstraints#isAllowedCachedLeft(java.lang.Object)

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -60,6 +60,12 @@
                                      final RightTuple rightTuple) {
     }
 
+    public void resetTuple() {
+    }
+    
+    public void resetFactHandle() {
+    } 
+    
     /* (non-Javadoc)
      * @see org.drools.common.BetaNodeConstraints#isAllowedCachedLeft(java.lang.Object)
      */

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -130,5 +130,13 @@
                                          final InternalFactHandle handle) {
             this.right = handle.getObject();
         }
+        
+        public void resetTuple() {
+            this.left = null;
+        }
+        
+        public void resetFactHandle() {
+            this.right = null;
+        }         
     }
 }

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -123,8 +123,15 @@
         public void updateFromFactHandle(final InternalWorkingMemory workingMemory,
                                          final InternalFactHandle handle) {
             this.right = handle.getObject();
-
         }
+        
+        public void resetTuple() {
+            this.left = null;
+        }
+        
+        public void resetFactHandle() {
+            this.right = null;
+        }                
     }
 
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/QuadroupleBetaConstraints.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/QuadroupleBetaConstraints.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/QuadroupleBetaConstraints.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -199,6 +199,20 @@
         this.context3.updateFromFactHandle( workingMemory,
                                             rightTuple.getHandle() );
     }
+    
+    public void resetTuple() {
+        this.context0.resetTuple();
+        this.context1.resetTuple();
+        this.context2.resetTuple();
+        this.context3.resetTuple();
+    }
+    
+    public void resetFactHandle() {
+        this.context0.resetFactHandle();
+        this.context1.resetFactHandle();
+        this.context2.resetFactHandle();
+        this.context3.resetFactHandle();
+    }      
 
     /* (non-Javadoc)
      * @see org.drools.common.BetaNodeConstraints#isAllowedCachedLeft(java.lang.Object)

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -110,6 +110,14 @@
         this.context.updateFromFactHandle( workingMemory,
                                            rightTuple.getHandle() );
     }
+    
+    public void resetTuple() {
+        this.context.resetTuple();
+    }
+    
+    public void resetFactHandle() {
+        this.context.resetFactHandle();
+    }     
 
     /* (non-Javadoc)
      * @see org.drools.common.BetaNodeConstraints#isAllowedCachedLeft(java.lang.Object)

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -165,6 +165,18 @@
         this.context2.updateFromFactHandle( workingMemory,
                                             rightTuple.getHandle() );
     }
+    
+    public void resetTuple() {
+        this.context0.resetTuple();
+        this.context1.resetTuple();
+        this.context2.resetTuple();
+    }
+    
+    public void resetFactHandle() {
+        this.context0.resetFactHandle();
+        this.context1.resetFactHandle();
+        this.context2.resetFactHandle();
+    }     
 
     /* (non-Javadoc)
      * @see org.drools.common.BetaNodeConstraints#isAllowedCachedLeft(java.lang.Object)

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -141,5 +141,13 @@
             // it MUST be a rete tuple
             this.right = (LeftTuple) handle.getObject();
         }
+        
+        public void resetTuple() {
+            this.left = null;
+        }
+        
+        public void resetFactHandle() {
+            this.right = null;
+        }         
     }
 }

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/CompositeLeftTupleSinkAdapter.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/CompositeLeftTupleSinkAdapter.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/CompositeLeftTupleSinkAdapter.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -50,14 +50,14 @@
                                           final InternalWorkingMemory workingMemory) {
         LeftTuple child = leftTuple.getBetaChildren();
         while ( child != null ) {
-            //LeftTuple temp = leftTuple.getRightParentNext();
+            LeftTuple temp = child.getLeftParentNext();
             //child.unlinkFromParents();
-            child.unlinkFromRightParent();
             child.getSink().retractTuple( child,
                                           context,
                                           workingMemory );
-            child = child.getRightParentNext();
-            //child = temp;
+            child.unlinkFromRightParent();            
+            //child = child.getLeftParentNext();
+            child = temp;
         }
         leftTuple.setBetaChildren( null );
     }
@@ -67,14 +67,14 @@
                                            final InternalWorkingMemory workingMemory) {
         LeftTuple child = rightTuple.getBetaChildren();
         while ( child != null ) {
-            //LeftTuple temp = child.getRightParentNext();
+            LeftTuple temp = child.getRightParentNext();
             //child.unlinkFromParents();
-            child.unlinkFromLeftParent();
             child.getSink().retractTuple( child,
                                           context,
                                           workingMemory );
-            child = child.getRightParentNext();
-            //child = temp;
+            child.unlinkFromLeftParent();            
+            //child = child.getRightParentNext();
+            child = temp;
         }
         rightTuple.setBetaChildren( null );
     }

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/JoinNode.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/JoinNode.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/JoinNode.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -108,6 +108,8 @@
                                                 workingMemory );
             }
         }
+        
+        this.constraints.resetTuple();
     }
 
     /**
@@ -151,6 +153,7 @@
                                                 workingMemory );
             }
         }
+        this.constraints.resetFactHandle();
     }
 
     /**
@@ -231,6 +234,8 @@
                 }
             }
         }
+        this.constraints.updateFromTuple( workingMemory,
+                                          null );        
     }
 
     public String toString() {

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -118,34 +118,51 @@
         this.sink = sink;
     }
 
-    public void unlinkFromParents() {
-        if ( this.rightParent != null ) {
-            if ( this.rightParentPrevious != null ) {
-                this.rightParentPrevious.rightParentNext = this.rightParentNext;
-            } else {
-                // first one in the chain, so treat differently
-                this.rightParent.setBetaChildren( this.rightParentNext );
-            }
-
-            if ( rightParentNext != null ) {
-                rightParentNext.rightParentPrevious = this.rightParentPrevious;
-            }
-        }
-
-        if ( this.leftParent != null ) {
-            if ( this.leftParentPrevious != null ) {
-                this.leftParentPrevious.leftParentNext = this.leftParentNext;
-            } else {
-                // first one in the chain, so treat differently                
-                this.leftParent.setBetaChildren( this.leftParentNext );
-            }
-
-            if ( leftParentNext != null ) {
-                leftParentNext.leftParentPrevious = this.leftParentPrevious;
-            }
-        }
-    }
-    
+//    public void unlinkFromParents() {
+//        LeftTuple previous = (LeftTuple) this.rightParentPrevious;
+//        LeftTuple next = (LeftTuple) this.rightParentNext;
+//
+//        if ( previous != null && next != null ) {
+//            //remove  from middle
+//            this.rightParentPrevious.rightParentNext = this.rightParentNext;
+//            this.rightParentNext.rightParentPrevious = this.rightParentPrevious;
+//        } else if ( next != null ) {
+//            //remove from first
+//            this.rightParent.setBetaChildren( this.rightParentNext );
+//            this.rightParentNext.rightParentPrevious = null;
+//        } else if ( previous != null ) {
+//            //remove from end
+//            this.rightParentPrevious.rightParentNext = null;
+//        } else if ( this.rightParent != null ){
+//            this.rightParent.setBetaChildren( null );
+//        }    
+//
+//        if ( previous != null && next != null ) {
+//            //remove  from middle
+//            this.leftParentPrevious.leftParentNext = this.leftParentNext;
+//            this.leftParentNext.leftParentPrevious = this.leftParentPrevious;
+//        } else if ( next != null ) {
+//            //remove from first
+//            this.leftParent.children = this.leftParentNext;
+//            this.leftParentNext.leftParentPrevious = null;
+//        } else if ( previous != null ) {
+//            //remove from end
+//            this.leftParentPrevious.leftParentNext = null;
+//        } else {
+//            this.leftParent.children = null;
+//        }   
+//        
+//        this.parent  = null;
+//        
+//        this.leftParent  = null;
+//        this.leftParentPrevious = null;        
+//        this.leftParentNext =  null;
+//        
+//        this.rightParent  = null;
+//        this.rightParentPrevious = null;
+//        this.rightParentPrevious = null;
+//    }
+//    
     public void unlinkFromLeftParent() {
         LeftTuple previous = (LeftTuple) this.leftParentPrevious;
         LeftTuple next = (LeftTuple) this.leftParentNext;
@@ -163,10 +180,22 @@
             this.leftParentPrevious.leftParentNext = null;
         } else {
             this.leftParent.children = null;
-        }        
-    }
+        }
+        
+        //this.parent  = null;
+        
+        this.leftParent  = null;
+        this.leftParentPrevious = null;        
+        this.leftParentNext =  null;
+        
+        this.blocker = null;
+        
+        this.rightParent  = null;
+        this.rightParentPrevious = null;
+        this.rightParentNext = null;        
+    }           
     
-    public void unlinkFromRightParent() {
+    public void unlinkFromRightParent() {               
         LeftTuple previous = (LeftTuple) this.rightParentPrevious;
         LeftTuple next = (LeftTuple) this.rightParentNext;
 
@@ -183,8 +212,21 @@
             this.rightParentPrevious.rightParentNext = null;
         } else if ( this.rightParent != null ){
             this.rightParent.setBetaChildren( null );
-        }          
+        }
+        
+        //this.parent  = null;
+        
+        this.leftParent  = null;
+        this.leftParentPrevious = null;        
+        this.leftParentNext =  null;
+        
+        this.blocker = null;        
+        
+        this.rightParent  = null;
+        this.rightParentPrevious = null;
+        this.rightParentNext = null;        
     }
+    
 
     public LeftTupleSink getSink() {
         return sink;

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/MemoryVisitor.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/MemoryVisitor.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/MemoryVisitor.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -11,7 +11,8 @@
 import org.drools.util.FactHandleIndexHashTable;
 import org.drools.util.FactHashTable;
 import org.drools.util.ReflectiveVisitor;
-import org.drools.util.FactHandleIndexHashTable.FieldIndexEntry;
+import org.drools.util.TupleHashTable;
+import org.drools.util.TupleIndexHashTable;
 
 public class MemoryVisitor extends ReflectiveVisitor {
     private InternalWorkingMemory workingMemory;
@@ -153,7 +154,7 @@
         this.indent--;
     }
 
-    public void visitTerminalNode(final RuleTerminalNode node) {
+    public void visitRuleTerminalNode(final RuleTerminalNode node) {
         System.out.println( indent() + node );
         final TerminalNodeMemory memory = (TerminalNodeMemory) this.workingMemory.getNodeMemory( node );
         checkTupleMemory( memory.getTupleMemory() );
@@ -176,25 +177,27 @@
 
     private void checkObjectHashTable(final RightTupleMemory memory) {
         if ( memory instanceof FactHashTable ) {
-            checkFactHashTable( (FactHashTable) memory );
+            checkRightTupleList( (FactHashTable) memory );
         } else if ( memory instanceof FactHandleIndexHashTable ) {
-            checkFieldIndexHashTable( (FactHandleIndexHashTable) memory );
+            checkRightTupleIndexHashTable( (FactHandleIndexHashTable) memory );
         } else {
             throw new RuntimeException( memory.getClass() + " should not be here" );
         }
     }
 
-    private void checkFactHashTable(final FactHashTable memory) {
-        final Entry[] entries = memory.getTable();
+    private void checkRightTupleList(final FactHashTable memory) {
+        RightTuple rightTuple = memory.getFirst( null );
         int count = 0;
-        for ( int i = 0, length = entries.length; i < length; i++ ) {
-            if ( entries[i] != null ) {
-                Entry entry = entries[i];
-                while ( entry != null ) {
-                    count++;
-                    entry = entry.getNext();
-                }
+        while ( rightTuple != null ) {
+            count++;
+            if  ( rightTuple.getBetaChildren() !=  null ) {
+                System.out.println( indent() + "error : RightTuple has beta children " + rightTuple );
             }
+            
+            if ( rightTuple.getBlocked() != null) {
+                System.out.println( indent() + "error : RightTuple is blocking a tuple " + rightTuple );
+            }
+            rightTuple = ( RightTuple ) rightTuple.getNext();            
         }
 
         System.out.println( indent() + "FactHashTable: " + memory.size() + ":" + count );
@@ -203,24 +206,31 @@
         }
     }
 
-    private void checkFieldIndexHashTable(final FactHandleIndexHashTable memory) {
+    private void checkRightTupleIndexHashTable(final FactHandleIndexHashTable memory) {
         final Entry[] entries = memory.getTable();
         int factCount = 0;
         int bucketCount = 0;
         for ( int i = 0, length = entries.length; i < length; i++ ) {
             if ( entries[i] != null ) {
-                FieldIndexEntry fieldIndexEntry = (FieldIndexEntry) entries[i];
-                while ( fieldIndexEntry != null ) {
-                    if ( fieldIndexEntry.getFirst() != null ) {
-                        Entry entry = fieldIndexEntry.getFirst();
-                        while ( entry != null ) {
-                            entry = entry.getNext();
+                FactHashTable alphaList = (FactHashTable) entries[i];
+                while ( alphaList != null ) {
+                    if ( alphaList.getFirst(null) != null ) {
+                        RightTuple rightTuple = alphaList.getFirst(null);
+                        while ( rightTuple != null ) {
+                            if  ( rightTuple.getBetaChildren() !=  null ) {
+                                System.out.println( indent() + "error : RightTuple has beta children " + rightTuple );
+                            }
+                            
+                            if ( rightTuple.getBlocked() != null) {
+                                System.out.println( indent() + "error : RightTuple is blocking a tuple " + rightTuple );
+                            }                         
+                            rightTuple = (RightTuple) rightTuple.getNext();                            
                             factCount++;
                         }
                     } else {
-                        System.out.println( "error : fieldIndexHashTable cannot have empty FieldIndexEntry objects" );
+                        System.out.println( "error : RightTupleIndexHashTable cannot have empty RightTupleList objects" );
                     }
-                    fieldIndexEntry = (FieldIndexEntry) fieldIndexEntry.getNext();
+                    alphaList = (FactHashTable) alphaList.getNext();
                     bucketCount++;
                 }
             }
@@ -229,7 +239,7 @@
         try {
             final Field field = AbstractHashTable.class.getDeclaredField( "size" );
             field.setAccessible( true );
-            System.out.println( indent() + "FieldIndexBuckets: " + ((Integer) field.get( memory )).intValue() + ":" + bucketCount );
+            System.out.println( indent() + "RightTupleBuckets: " + ((Integer) field.get( memory )).intValue() + ":" + bucketCount );
             if ( ((Integer) field.get( memory )).intValue() != bucketCount ) {
                 System.out.println( indent() + "error" );
             }
@@ -237,29 +247,74 @@
             e.printStackTrace();
         }
 
-        System.out.println( indent() + "FieldIndexFacts: " + memory.size() + ":" + factCount );
+        System.out.println( indent() + "RightTupleFacts: " + memory.size() + ":" + factCount );
         if ( memory.size() != factCount ) {
             System.out.println( indent() + "error" );
         }
     }
 
     private void checkTupleMemory(final LeftTupleMemory memory) {
+        if ( memory instanceof TupleHashTable ) {
+            checkLeftTupleList( (TupleHashTable) memory );
+        } else if ( memory instanceof TupleIndexHashTable ) {
+            checkLeftTupleIndexedHashTable( (TupleIndexHashTable) memory );
+        } else {
+            throw new RuntimeException( memory.getClass() + " should not be here" );
+        }
+    }
+    
+    private void  checkLeftTupleList(final TupleHashTable memory){
+        Entry entry = memory.getFirst( null );
+        int count = 0;
+        while ( entry != null ) {
+            count++;
+            entry = entry.getNext();
+        }
+
+        System.out.println( indent() + "TupleHashTable: " + memory.size() + ":" + count );
+        if ( memory.size() != count ) {
+            System.out.println( indent() + "error" );
+        }
+    }
+    
+    private void checkLeftTupleIndexedHashTable(final TupleIndexHashTable memory) {
         final Entry[] entries = memory.getTable();
-        int count = 0;
+        int factCount = 0;
+        int bucketCount = 0;
         for ( int i = 0, length = entries.length; i < length; i++ ) {
             if ( entries[i] != null ) {
-                Entry entry = entries[i];
-                while ( entry != null ) {
-                    count++;
-                    entry = entry.getNext();
+                TupleHashTable leftList = (TupleHashTable) entries[i];
+                while ( leftList != null ) {
+                    if ( leftList.getFirst(null) != null ) {
+                        Entry entry = leftList.getFirst(null);
+                        while ( entry != null ) {
+                            entry = entry.getNext();
+                            factCount++;
+                        }
+                    } else {
+                        System.out.println( "error : LeftIndexHashTable cannot have empty TupleHashTable objects" );
+                    }
+                    leftList = (TupleHashTable) leftList.getNext();
+                    bucketCount++;
                 }
             }
         }
 
-        System.out.println( indent() + "TupleMemory: " + memory.size() + ":" + count );
-        if ( memory.size() != count ) {
+        try {
+            final Field field = AbstractHashTable.class.getDeclaredField( "size" );
+            field.setAccessible( true );
+            System.out.println( indent() + "LeftIndexBuckets: " + ((Integer) field.get( memory )).intValue() + ":" + bucketCount );
+            if ( ((Integer) field.get( memory )).intValue() != bucketCount ) {
+                System.out.println( indent() + "error" );
+            }
+        } catch ( final Exception e ) {
+            e.printStackTrace();
+        }
+
+        System.out.println( indent() + "LeftIndexFacts: " + memory.size() + ":" + factCount );
+        if ( memory.size() != factCount ) {
             System.out.println( indent() + "error" );
-        }
+        }        
     }
 
     private String indent() {

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/NotNode.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/NotNode.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/NotNode.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -106,6 +106,8 @@
                 break;
             }
         }
+        
+        this.constraints.resetTuple();     
 
         if ( leftTuple.getBlocker() == null ) {
             // only add it to node memory if still need Objects to attempt to match
@@ -149,7 +151,6 @@
             // we know that only unblocked LeftTuples are  still in the memory
             if ( this.constraints.isAllowedCachedRight( leftTuple ) ) {
                 leftTuple.setBlocker( rightTuple );
-                leftTuple.setBlocker( rightTuple );
 
                 LeftTuple blockedPrevious = rightTuple.getBlocked();
                 if ( blockedPrevious != null ) {
@@ -169,6 +170,8 @@
                 }
             }
         }
+        
+        this.constraints.resetFactHandle();       
     }
 
     /**
@@ -263,17 +266,17 @@
             LeftTuple next = (LeftTuple) leftTuple.getBlockedNext();
             if ( previous != null && next != null ) {
                 //remove  from middle
-                previous.setNext( next );
-                next.setPrevious( previous );
+                previous.setBlockedNext( next );
+                next.setBlockedPrevious( previous );
             } else if ( next != null ) {
                 //remove from first
-                leftTuple.getBlocker().setBlocked( next );
-                next.setPrevious( null );
+                blocker.setBlocked( next );
+                next.setBlockedPrevious( null );
             } else if ( previous != null ) {
                 //remove from end
-                previous.setNext( null );
+                previous.setBlockedNext( null );
             } else {
-                leftTuple.getBlocker().setBlocked( null );
+                blocker.setBlocked( null );
             }
         }
     }

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/RightTuple.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/RightTuple.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/RightTuple.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -8,7 +8,7 @@
     Entry {
     private final InternalFactHandle handle;
 
-    private final RightTuple         parent;
+    private RightTuple               parent;
     private RightTuple               parentPrevious;
     private RightTuple               parentNext;
 
@@ -29,14 +29,14 @@
         this.hashCode = this.handle.hashCode();
         this.parent = null;
     }
-    
+
     public RightTuple(InternalFactHandle handle,
                       RightTupleSink sink) {
         this.handle = handle;
         this.hashCode = this.handle.hashCode();
         this.parent = null;
         this.sink = sink;
-    }    
+    }
 
     public RightTuple(RightTuple parent) {
         this.handle = parent.getHandle();
@@ -44,7 +44,7 @@
         this.parent = parent;
 
         this.parentNext = parent.getAlphaChildren();
-        if  (parentNext != null ) {
+        if ( parentNext != null ) {
             this.parentNext.parentPrevious = this;
         }
         parent.setAlphaChildren( this );
@@ -57,14 +57,13 @@
         this.parent = parent;
 
         this.parentNext = parent.getAlphaChildren();
-        if  (parentNext != null ) {
+        if ( parentNext != null ) {
             this.parentNext.parentPrevious = this;
         }
         parent.setAlphaChildren( this );
-        
+
         this.sink = sink;
 
-
     }
 
     public RightTupleSink getRightTupleSink() {
@@ -72,18 +71,23 @@
     }
 
     public void unlinkFromRightParent() {
-        if ( this.parent != null ) {            
+        if ( this.parent != null ) {
             if ( this.parentPrevious != null ) {
-                this.parentPrevious.parentNext = this.parentNext;                
+                this.parentPrevious.parentNext = this.parentNext;
             } else {
                 // first one in the chain, so treat differently                
-                this.parent.setAlphaChildren( this.parentNext );                
+                this.parent.setAlphaChildren( this.parentNext );
             }
-            
-            if (  this.parentNext != null ) {
+
+            if ( this.parentNext != null ) {
                 this.parentNext.parentPrevious = this.parentPrevious;
             }
         }
+
+        this.parent = null;
+        this.parentPrevious = null;
+        this.parentNext = null;
+        this.blocked = null;
     }
 
     public InternalFactHandle getHandle() {
@@ -100,15 +104,15 @@
 
     public void setParentPrevious(RightTuple parentPrevious) {
         this.parentPrevious = parentPrevious;
-    }       
+    }
 
     public RightTuple getParentNext() {
         return parentNext;
     }
-    
+
     public void setParentNext(RightTuple parentNext) {
         this.parentNext = parentNext;
-    }    
+    }
 
     public LeftTuple getBlocked() {
         return blocked;
@@ -161,10 +165,10 @@
     public int hashCode() {
         return this.hashCode;
     }
-    
+
     public String toString() {
         return this.handle.toString() + "\n";
-    }    
+    }
 
     public boolean equals(RightTuple other) {
         // we know the object is never null and always of the  type ReteTuple

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/SingleLeftTupleSinkAdapter.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/SingleLeftTupleSinkAdapter.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/SingleLeftTupleSinkAdapter.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -31,20 +31,37 @@
                                context,
                                workingMemory );
     }
+    
+//    public void propagateNotRetractLeftTuple(final LeftTuple leftTuple,
+//                                          final PropagationContext context,
+//                                          final InternalWorkingMemory workingMemory) {
+//            LeftTuple child = leftTuple.getBetaChildren();
+//            while ( child != null ) {
+//                //LeftTuple temp = leftTuple.getRightParentNext();
+//                //child.unlinkFromParents();
+//                //child.unlinkFromLeftParent();
+//                child.getSink().retractTuple( child,
+//                                              context,
+//                                              workingMemory );
+//                child = child.getLeftParentNext();
+//                //child = temp;
+//            }
+//            leftTuple.setBetaChildren( null );
+//        }    
 
     public void propagateRetractLeftTuple(final LeftTuple leftTuple,
                                       final PropagationContext context,
                                       final InternalWorkingMemory workingMemory) {
         LeftTuple child = leftTuple.getBetaChildren();
         while ( child != null ) {
-            //LeftTuple temp = leftTuple.getRightParentNext();
+            LeftTuple temp = child.getLeftParentNext();
             //child.unlinkFromParents();
-            child.unlinkFromRightParent();
             child.getSink().retractTuple( child,
                                           context,
                                           workingMemory );
-            child = child.getRightParentNext();
-            //child = temp;
+            child.unlinkFromRightParent();            
+            //child = child.getLeftParentNext();
+            child = temp;
         }
         leftTuple.setBetaChildren( null );
     }
@@ -54,14 +71,14 @@
                                       final InternalWorkingMemory workingMemory) {
         LeftTuple child = rightTuple.getBetaChildren();
         while ( child != null ) {
-            //LeftTuple temp = child.getRightParentNext();
+            LeftTuple temp = child.getRightParentNext();
             //child.unlinkFromParents();
-            child.unlinkFromLeftParent();
             child.getSink().retractTuple( child,
                                           context,
                                           workingMemory );
-            child = child.getRightParentNext();
-            //child = temp;
+            child.unlinkFromLeftParent();            
+            //child = child.getRightParentNext();
+            child = temp;
         }
         rightTuple.setBetaChildren( null );
     }    

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/AbstractCompositeConstraint.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/AbstractCompositeConstraint.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/AbstractCompositeConstraint.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -228,6 +228,18 @@
                                              tuple );
             }
         }
+        
+        public void resetTuple() {
+            for ( int i = 0, length = this.contexts.length; i < length; i++ ) {
+                this.contexts[i].resetTuple();
+            }
+        }
+        
+        public void resetFactHandle() {
+            for ( int i = 0, length = this.contexts.length; i < length; i++ ) {
+                this.contexts[i].resetFactHandle();
+            }
+        }           
 
     }
 

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/AbstractCompositeRestriction.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/AbstractCompositeRestriction.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/AbstractCompositeRestriction.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -127,6 +127,18 @@
                                                         tuple );
             }
         }
+        
+        public void resetTuple() {
+            for ( int i = 0, length = this.contextEntries.length; i < length; i++ ) {
+                this.contextEntries[i].resetTuple();
+            }
+        }
+        
+        public void resetFactHandle() {
+            for ( int i = 0, length = this.contextEntries.length; i < length; i++ ) {
+                this.contextEntries[i].resetFactHandle();
+            }
+        }        
 
     }
 

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/ContextEntry.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/ContextEntry.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/ContextEntry.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -19,5 +19,9 @@
 
     public void updateFromFactHandle(InternalWorkingMemory workingMemory,
                                      InternalFactHandle handle);
+    
+    public void resetTuple();
+    
+    public void resetFactHandle();
 
 }

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -165,6 +165,13 @@
                                     final LeftTuple tuple) {
             // nothing to do
         }
+        
+        public void resetTuple() {            
+        }
+        
+        public void resetFactHandle() {
+            this.object = null;
+        }        
 
     }
 

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -315,6 +315,14 @@
             this.workingMemory = workingMemory;
             this.leftTuple = tuple;
         }
+        
+        public void resetTuple() {
+            this.leftTuple = null;
+        }
+        
+        public void resetFactHandle() {
+            this.rightObject = null;
+        }        
     }
 
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -358,6 +358,14 @@
         public InternalWorkingMemory getWorkingMemory() {
             return this.workingMemory;
         }
+        
+        public void resetTuple() {
+            this.leftTuple = null;
+        }
+        
+        public void resetFactHandle() {
+            this.handle = null;
+        }        
     }
 
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/VariableRestriction.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/VariableRestriction.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/rule/VariableRestriction.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -212,6 +212,14 @@
         public boolean isRightNull() {
             return this.rightNull;
         }
+        
+        public void resetTuple() {
+            this.reteTuple = null;
+        }
+        
+        public void resetFactHandle() {
+            this.object = null;
+        }        
     }
 
     public static class ObjectVariableContextEntry extends VariableContextEntry {
@@ -247,6 +255,17 @@
             this.right = this.extractor.getValue( workingMemory,
                                                   evaluator.prepareObject( handle ) );
         }
+        
+        public void resetTuple() {
+            this.reteTuple = null;
+            this.left = null;
+            this.reteTuple = null;
+        }
+        
+        public void resetFactHandle() {
+            this.right = null;
+            this.object = null;
+        }        
     }
 
     public static class LongVariableContextEntry extends VariableContextEntry {

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/spi/KnowledgeHelper.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/spi/KnowledgeHelper.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/spi/KnowledgeHelper.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -43,6 +43,9 @@
     
     public void setActivation(final Activation agendaItem); 
     
+    public void reset();
+    
+    
     /**
      * Asserts an object, notice that it does not return the FactHandle
      * 

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/util/FactHandleIndexHashTable.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/util/FactHandleIndexHashTable.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/util/FactHandleIndexHashTable.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -18,8 +18,6 @@
 
     private int                         startResult;
 
-    private FieldIndexHashTableIterator tupleValueIterator;
-
     private int                         factSize;
 
     private Index                       index;
@@ -277,6 +275,21 @@
     public int size() {
         return this.factSize;
     }
+    
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        for ( Entry entry : this.table) {
+            while ( entry != null ) { 
+                FactHashTable bucket = ( FactHashTable ) entry;
+                for ( RightTuple  rightTuple = bucket.getFirst( null ); rightTuple != null; rightTuple = ( RightTuple ) rightTuple.getNext()  ) {
+                    builder.append( rightTuple );
+                }
+                entry = entry.getNext();
+            }
+        }
+        
+        return builder.toString();
+    }
 
 //    public static class FactHashTable
 //        implements

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/util/FactHashTable.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/util/FactHashTable.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/util/FactHashTable.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -143,10 +143,6 @@
         return this.hashCode == other.hashCode && this.index == other.index;
     }
 
-    public String toString() {
-        return "FieldIndexEntry( hashCode=" + this.hashCode + " first=" + this.first + " )";
-    }
-
     public Entry getPrevious() {
         return null;
         //          return this.previous;            
@@ -167,4 +163,13 @@
     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();
+    }    
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/util/TupleHashTable.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/util/TupleHashTable.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/util/TupleHashTable.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -72,6 +72,9 @@
         } else {
             this.first = null;
         }
+        
+        leftTuple.setPrevious(  null );
+        leftTuple.setNext( null );
 
         this.size--;
     }
@@ -183,4 +186,14 @@
     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();
+    }
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/util/TupleIndexHashTable.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/util/TupleIndexHashTable.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/util/TupleIndexHashTable.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -168,13 +168,17 @@
     }
     
     public void remove(final LeftTuple leftTuple) {
-        LeftTuple previousRightTuple = (LeftTuple) leftTuple.getPrevious();
-        if ( previousRightTuple != null && leftTuple.getNext() != null ) {
+        LeftTuple previousLeftTuple = (LeftTuple) leftTuple.getPrevious();
+        LeftTuple nextLeftTuple = (LeftTuple) leftTuple.getNext();
+        if ( previousLeftTuple != null && nextLeftTuple != null ) {
             // Optimisation for tuple self removal if it's not the first in the chain
             // we can't do this if it's the only remain tuple, as we need to also remove the parent bucket.
-            previousRightTuple.setNext( leftTuple.getNext() );
-            leftTuple.getNext().setPrevious( previousRightTuple );
+            previousLeftTuple.setNext( nextLeftTuple );
+            nextLeftTuple.setPrevious( previousLeftTuple );
             this.size--;
+            leftTuple.setPrevious( null );
+            leftTuple.setNext( null );
+            return;
         }
         
         final int hashCode = this.index.hashCodeOf( leftTuple );
@@ -206,6 +210,9 @@
             previous = current;
             current = next;
         }
+        
+        leftTuple.setPrevious( null );
+        leftTuple.setNext( null );
     }
 
     public boolean contains(final LeftTuple tuple) {
@@ -284,6 +291,16 @@
     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();
+    }    
 
 //    public static class TupleHashTable
 //        implements

Modified: labs/jbossrules/branches/righttuple/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java	2008-01-10 22:30:37 UTC (rev 17696)
+++ labs/jbossrules/branches/righttuple/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java	2008-01-10 22:46:28 UTC (rev 17697)
@@ -23,8 +23,10 @@
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
 import org.drools.WorkingMemory;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.event.AfterActivationFiredEvent;
 import org.drools.event.DefaultAgendaEventListener;
+import org.drools.reteoo.MemoryVisitor;
 
 public class ReteooMannersTest extends BaseMannersTest {
 
@@ -65,7 +67,7 @@
         };
 
         //workingMemory.addEventListener(listener );
-        final InputStream is = getClass().getResourceAsStream( "/manners32.dat" );
+        final InputStream is = getClass().getResourceAsStream( "/manners64.dat" );
         final List list = getInputObjects( is );
         for ( final Iterator it = list.iterator(); it.hasNext(); ) {
             final Object object = it.next();
@@ -77,6 +79,9 @@
         final long start = System.currentTimeMillis();
         workingMemory.fireAllRules();
         System.err.println( System.currentTimeMillis() - start );
+        
+        MemoryVisitor visitor = new MemoryVisitor( (InternalWorkingMemory) workingMemory);
+        visitor.visit( ruleBase );
 
         //System.out.println( listener );
 




More information about the jboss-svn-commits mailing list