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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Oct 12 08:04:11 EDT 2006


Author: mark.proctor at jboss.com
Date: 2006-10-12 08:04:00 -0400 (Thu, 12 Oct 2006)
New Revision: 6753

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BetaConstraints.java
   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/SingleBetaConstraints.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.java
Removed:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BetaNodeConstraints.java
Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/Builder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/ColumnConstraints.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/FromConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/LeapsBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.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/JoinNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/NotNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSource.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/JoinNodeTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/NotNodeTest.java
Log:
JBRULES-498 Optimised HashMap implementations
-Unrolled the loops

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BetaConstraints.java (from rev 6747, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BetaNodeConstraints.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BetaNodeConstraints.java	2006-10-11 18:08:10 UTC (rev 6747)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BetaConstraints.java	2006-10-12 12:04:00 UTC (rev 6753)
@@ -0,0 +1,26 @@
+package org.drools.common;
+
+import org.drools.reteoo.BetaMemory;
+import org.drools.reteoo.ObjectHashTable;
+import org.drools.reteoo.ReteTuple;
+import org.drools.util.LinkedList;
+import org.drools.util.TupleHashTable;
+
+public interface BetaConstraints {
+
+    public void updateFromTuple(ReteTuple tuple);
+
+    public void updateFromFactHandle(InternalFactHandle handle);
+
+    public boolean isAllowedCachedLeft(Object object);
+
+    public boolean isAllowedCachedRight(ReteTuple tuple);
+
+    public LinkedList getConstraints();    
+    
+    public boolean isIndexed();
+    
+    public boolean isEmpty();
+    
+    public BetaMemory createBetaMemory();
+}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BetaNodeConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BetaNodeConstraints.java	2006-10-12 11:41:24 UTC (rev 6752)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BetaNodeConstraints.java	2006-10-12 12:04:00 UTC (rev 6753)
@@ -1,180 +0,0 @@
-package org.drools.common;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.io.Serializable;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.drools.WorkingMemory;
-import org.drools.base.evaluators.Operator;
-import org.drools.common.InstanceNotEqualsConstraint.InstanceNotEqualsConstraintContextEntry;
-import org.drools.reteoo.BetaMemory;
-import org.drools.reteoo.ObjectHashTable;
-import org.drools.reteoo.ReteTuple;
-import org.drools.rule.ContextEntry;
-import org.drools.rule.Declaration;
-import org.drools.rule.LiteralConstraint;
-import org.drools.rule.VariableConstraint;
-import org.drools.spi.BetaNodeFieldConstraint;
-import org.drools.spi.Evaluator;
-import org.drools.spi.AlphaNodeFieldConstraint;
-import org.drools.spi.FieldExtractor;
-import org.drools.spi.Tuple;
-import org.drools.util.FactHashTable;
-import org.drools.util.FieldIndexHashTable;
-import org.drools.util.LinkedList;
-import org.drools.util.LinkedListEntry;
-import org.drools.util.TupleHashTable;
-
-public class BetaNodeConstraints
-    implements
-    Serializable {
-
-    /**
-     * 
-     */
-    private static final long               serialVersionUID         = 320L;
-
-    public final static BetaNodeConstraints emptyBetaNodeConstraints = new BetaNodeConstraints();
-
-    private final LinkedList                constraints;
-
-    private ContextEntry                    contexts;
-
-    public BetaNodeConstraints() {
-        this.constraints = null;
-        this.contexts = null;
-    }
-
-    public BetaNodeConstraints(final BetaNodeFieldConstraint constraint) {
-        this( new BetaNodeFieldConstraint[]{constraint} );
-    }
-
-    public BetaNodeConstraints(final BetaNodeFieldConstraint[] constraints) {
-        this.constraints = new LinkedList();
-        ContextEntry current = null;
-        for ( int i = 0, length = constraints.length; i < length; i++ ) {
-            this.constraints.add( new LinkedListEntry( constraints[i] ) );
-            ContextEntry context = constraints[i].getContextEntry();
-            if ( current == null ) {
-                current = context;
-                this.contexts = context;
-            } else {
-                current.setNext( context );
-            }
-            current = context;
-        }
-    }
-
-    public void updateFromTuple(ReteTuple tuple) {
-        for ( ContextEntry context = this.contexts; context != null; context = context.getNext() ) {
-            context.updateFromTuple( tuple );
-        }
-    }
-
-    public void updateFromFactHandle(InternalFactHandle handle) {
-        for ( ContextEntry context = this.contexts; context != null; context = context.getNext() ) {
-            context.updateFromFactHandle( handle );
-        }
-    }
-    
-    public boolean isAllowedCachedLeft(Object object ) {       
-        if ( this.constraints == null ) {
-            return true;
-        }
-
-        LinkedListEntry entry = (LinkedListEntry) this.constraints.getFirst();
-        ContextEntry context = this.contexts;
-        while ( entry != null ) {
-            if ( !((BetaNodeFieldConstraint) entry.getObject()).isAllowedCachedLeft(context, object ) ) {
-                return false;
-            }
-            entry = (LinkedListEntry) entry.getNext();
-            context = context.getNext();
-        }
-        return true;        
-    }    
-    
-    public boolean isAllowedCachedRight(ReteTuple tuple) {
-        if ( this.constraints == null ) {
-            return true;
-        }
-
-        LinkedListEntry entry = (LinkedListEntry) this.constraints.getFirst();
-        ContextEntry context = this.contexts;
-        while ( entry != null ) {
-            if ( !((BetaNodeFieldConstraint) entry.getObject()).isAllowedCachedRight(tuple, context ) ) {
-                return false;
-            }
-            entry = (LinkedListEntry) entry.getNext();
-            context = context.getNext();
-        }
-        return true;        
-    }          
-
-    //    public Set getRequiredDeclarations() {
-    //        final Set declarations = new HashSet();
-    //        for ( int i = 0; i < this.constraints.length; i++ ) {
-    //            final Declaration[] array = this.constraints[i].getRequiredDeclarations();
-    //            for ( int j = 0; j < array.length; j++ ) {
-    //                declarations.add( array[j] );
-    //            }
-    //        }
-    //        return declarations;
-    //    }
-
-    public int hashCode() {
-        return this.constraints.hashCode();
-    }
-
-    public LinkedList getConstraints() {
-        return this.constraints;
-    }
-
-    /**
-     * Determine if another object is equal to this.
-     * 
-     * @param object
-     *            The object to test.
-     * 
-     * @return <code>true</code> if <code>object</code> is equal to this,
-     *         otherwise <code>false</code>.
-     */
-    public boolean equals(final Object object) {
-        if ( this == object ) {
-            return true;
-        }
-
-        if ( object == null || getClass() != object.getClass() ) {
-            return false;
-        }
-
-        final BetaNodeConstraints other = (BetaNodeConstraints) object;
-
-        if ( this.constraints == other.constraints ) {
-            return true;
-        }
-
-        if ( this.constraints.size() != other.constraints.size() ) {
-            return false;
-        }
-
-        return this.constraints.equals( other );
-    }
-
-}
\ No newline at end of file

Added: 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	2006-10-12 11:41:24 UTC (rev 6752)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java	2006-10-12 12:04:00 UTC (rev 6753)
@@ -0,0 +1,225 @@
+package org.drools.common;
+
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.drools.WorkingMemory;
+import org.drools.base.evaluators.Operator;
+import org.drools.common.InstanceNotEqualsConstraint.InstanceNotEqualsConstraintContextEntry;
+import org.drools.reteoo.BetaMemory;
+import org.drools.reteoo.ObjectHashTable;
+import org.drools.reteoo.ReteTuple;
+import org.drools.rule.ContextEntry;
+import org.drools.rule.Declaration;
+import org.drools.rule.LiteralConstraint;
+import org.drools.rule.VariableConstraint;
+import org.drools.spi.BetaNodeFieldConstraint;
+import org.drools.spi.Constraint;
+import org.drools.spi.Evaluator;
+import org.drools.spi.AlphaNodeFieldConstraint;
+import org.drools.spi.FieldExtractor;
+import org.drools.spi.Tuple;
+import org.drools.util.FactHashTable;
+import org.drools.util.FieldIndexHashTable;
+import org.drools.util.LinkedList;
+import org.drools.util.LinkedListEntry;
+import org.drools.util.TupleHashTable;
+
+public class DefaultBetaConstraints
+    implements
+    Serializable, BetaConstraints {
+
+    /**
+     * 
+     */
+    private static final long               serialVersionUID         = 320L;
+
+    private final LinkedList                constraints;
+
+    private ContextEntry                    contexts;
+
+    private boolean                         indexed;   
+
+    public DefaultBetaConstraints(final BetaNodeFieldConstraint constraint) {
+        this( new BetaNodeFieldConstraint[]{constraint} );
+    }        
+
+    public DefaultBetaConstraints(final BetaNodeFieldConstraint[] constraints) {
+        this.constraints = new LinkedList();
+        ContextEntry current = null;
+        for ( int i = 0, length = constraints.length; i < length; i++ ) {
+            // Determine  if this constraint is indexable
+            // it is only indexable if there is already no indexed constraints
+            // An indexed constraint is always the first constraint
+            if ( isIndexable( constraints[i] ) && !indexed ) {
+                this.constraints.insertAfter( null, new LinkedListEntry( constraints[i] ) );
+                this.indexed = true;
+            } else {
+                this.constraints.add( new LinkedListEntry( constraints[i] ) );
+            }
+            //Setup  the  contextEntry cache to be iterated  in the same order
+            ContextEntry context = constraints[i].getContextEntry();
+            if ( current == null ) {
+                current = context;
+                this.contexts = context;
+            } else {
+                current.setNext( context );
+            }
+            current = context;
+        }
+    }
+    
+    private  boolean isIndexable(final BetaNodeFieldConstraint constraint) {        
+        if ( constraint.getClass() == VariableConstraint.class ) {
+            VariableConstraint variableConstraint = (VariableConstraint) constraint;
+            return ( variableConstraint.getEvaluator().getOperator() == Operator.EQUAL );
+        } else {
+            return false;
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#updateFromTuple(org.drools.reteoo.ReteTuple)
+     */
+    public void updateFromTuple(ReteTuple tuple) {
+        for ( ContextEntry context = this.contexts; context != null; context = context.getNext() ) {
+            context.updateFromTuple( tuple );
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#updateFromFactHandle(org.drools.common.InternalFactHandle)
+     */
+    public void updateFromFactHandle(InternalFactHandle handle) {
+        for ( ContextEntry context = this.contexts; context != null; context = context.getNext() ) {
+            context.updateFromFactHandle( handle );
+        }
+    }
+    
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#isAllowedCachedLeft(java.lang.Object)
+     */
+    public boolean isAllowedCachedLeft(Object object ) {       
+        LinkedListEntry entry = (LinkedListEntry) this.constraints.getFirst();
+        ContextEntry context = this.contexts;
+        while ( entry != null ) {
+            if ( !((BetaNodeFieldConstraint) entry.getObject()).isAllowedCachedLeft(context, object ) ) {
+                return false;
+            }
+            entry = (LinkedListEntry) entry.getNext();
+            context = context.getNext();
+        }
+        return true;        
+    }    
+    
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#isAllowedCachedRight(org.drools.reteoo.ReteTuple)
+     */
+    public boolean isAllowedCachedRight(ReteTuple tuple) {
+        LinkedListEntry entry = (LinkedListEntry) this.constraints.getFirst();
+        ContextEntry context = this.contexts;
+        while ( entry != null ) {
+            if ( !((BetaNodeFieldConstraint) entry.getObject()).isAllowedCachedRight(tuple, context ) ) {
+                return false;
+            }
+            entry = (LinkedListEntry) entry.getNext();
+            context = context.getNext();
+        }
+        return true;        
+    }   
+    
+    public boolean isIndexed() {
+        return this.indexed;
+    }
+    
+    public boolean isEmpty() {
+        return false;   
+    }
+    
+    public BetaMemory createBetaMemory()  {
+        BetaMemory memory;
+        if ( this.indexed ) {
+            Constraint constraint = ( Constraint ) this.constraints.getFirst();
+            VariableConstraint variableConstraint = (VariableConstraint) constraint;
+            memory = new BetaMemory( new TupleHashTable(),
+                                     new FieldIndexHashTable( variableConstraint.getFieldExtractor(),
+                                                              variableConstraint.getRequiredDeclarations()[0] ) );
+        } else  {        
+            memory = new BetaMemory( new TupleHashTable(),
+                                     new FactHashTable() );
+        }
+        
+        return memory;        
+    }    
+
+    //    public Set getRequiredDeclarations() {
+    //        final Set declarations = new HashSet();
+    //        for ( int i = 0; i < this.constraints.length; i++ ) {
+    //            final Declaration[] array = this.constraints[i].getRequiredDeclarations();
+    //            for ( int j = 0; j < array.length; j++ ) {
+    //                declarations.add( array[j] );
+    //            }
+    //        }
+    //        return declarations;
+    //    }
+
+    public int hashCode() {
+        return this.constraints.hashCode();
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#getConstraints()
+     */
+    public LinkedList getConstraints() {
+        return this.constraints;
+    }
+
+    /**
+     * Determine if another object is equal to this.
+     * 
+     * @param object
+     *            The object to test.
+     * 
+     * @return <code>true</code> if <code>object</code> is equal to this,
+     *         otherwise <code>false</code>.
+     */
+    public boolean equals(final Object object) {
+        if ( this == object ) {
+            return true;
+        }
+
+        if ( object == null || getClass() != object.getClass() ) {
+            return false;
+        }
+
+        final DefaultBetaConstraints other = (DefaultBetaConstraints) object;
+
+        if ( this.constraints == other.constraints ) {
+            return true;
+        }
+
+        if ( this.constraints.size() != other.constraints.size() ) {
+            return false;
+        }
+
+        return this.constraints.equals( other );
+    }
+
+}
\ No newline at end of file

Added: 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	2006-10-12 11:41:24 UTC (rev 6752)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.java	2006-10-12 12:04:00 UTC (rev 6753)
@@ -0,0 +1,208 @@
+package org.drools.common;
+
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.drools.WorkingMemory;
+import org.drools.base.evaluators.Operator;
+import org.drools.common.InstanceNotEqualsConstraint.InstanceNotEqualsConstraintContextEntry;
+import org.drools.reteoo.BetaMemory;
+import org.drools.reteoo.ObjectHashTable;
+import org.drools.reteoo.ReteTuple;
+import org.drools.rule.ContextEntry;
+import org.drools.rule.Declaration;
+import org.drools.rule.LiteralConstraint;
+import org.drools.rule.VariableConstraint;
+import org.drools.spi.BetaNodeFieldConstraint;
+import org.drools.spi.Constraint;
+import org.drools.spi.Evaluator;
+import org.drools.spi.AlphaNodeFieldConstraint;
+import org.drools.spi.FieldExtractor;
+import org.drools.spi.Tuple;
+import org.drools.util.FactHashTable;
+import org.drools.util.FieldIndexHashTable;
+import org.drools.util.LinkedList;
+import org.drools.util.LinkedListEntry;
+import org.drools.util.LinkedListNode;
+import org.drools.util.TupleHashTable;
+
+public class DoubleBetaConstraints
+    implements
+    Serializable,
+    BetaConstraints {
+
+    /**
+     * 
+     */
+    private static final long             serialVersionUID = 320L;
+
+    private final BetaNodeFieldConstraint constraint0;
+    private final BetaNodeFieldConstraint constraint1;
+
+    private ContextEntry                  context0;
+    private ContextEntry                  context1;
+
+    private boolean                       indexed;
+
+    public DoubleBetaConstraints(final BetaNodeFieldConstraint[] constraints) {
+        // find the first instrumental
+        for ( int i = 0, length = constraints.length; i < length; i++ ) {
+            if ( isIndexable( constraints[i] ) ) {
+                if ( i > 0) {
+                    // swap the constraint to the first position
+                    BetaNodeFieldConstraint temp = constraints[0];
+                    constraints[0] = constraints[i];
+                    constraints[i] = temp;
+                }
+                this.indexed = true;
+                break;
+            }
+        }
+
+        this.constraint0 = constraints[0];
+        this.context0 = this.constraint0.getContextEntry();
+
+        this.constraint1 = constraints[1];
+        this.context1 = this.constraint1.getContextEntry();
+    }
+
+    private boolean isIndexable(final BetaNodeFieldConstraint constraint) {
+        if ( constraint.getClass() == VariableConstraint.class ) {
+            VariableConstraint variableConstraint = (VariableConstraint) constraint;
+            return (variableConstraint.getEvaluator().getOperator() == Operator.EQUAL);
+        } else {
+            return false;
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#updateFromTuple(org.drools.reteoo.ReteTuple)
+     */
+    public void updateFromTuple(ReteTuple tuple) {
+        context0.updateFromTuple( tuple );
+        context1.updateFromTuple( tuple );
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#updateFromFactHandle(org.drools.common.InternalFactHandle)
+     */
+    public void updateFromFactHandle(InternalFactHandle handle) {
+        context0.updateFromFactHandle( handle );
+        context1.updateFromFactHandle( handle );
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#isAllowedCachedLeft(java.lang.Object)
+     */
+    public boolean isAllowedCachedLeft(Object object) {
+        return this.constraint0.isAllowedCachedLeft( context0,
+                                                     object ) && this.constraint1.isAllowedCachedLeft( context1,
+                                                                                                       object );
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#isAllowedCachedRight(org.drools.reteoo.ReteTuple)
+     */
+    public boolean isAllowedCachedRight(ReteTuple tuple) {
+        return this.constraint0.isAllowedCachedRight( tuple,
+                                                      context0 ) && this.constraint1.isAllowedCachedRight( tuple,
+                                                                                                           context1 );
+    }
+
+    public boolean isIndexed() {
+        return this.indexed;
+    }
+
+    public boolean isEmpty() {
+        return false;
+    }
+
+    public BetaMemory createBetaMemory() {
+        BetaMemory memory;
+        if ( this.indexed ) {
+            VariableConstraint variableConstraint = (VariableConstraint) this.constraint0;
+            memory = new BetaMemory( new TupleHashTable(),
+                                     new FieldIndexHashTable( variableConstraint.getFieldExtractor(),
+                                                              variableConstraint.getRequiredDeclarations()[0] ) );
+        } else {
+            memory = new BetaMemory( new TupleHashTable(),
+                                     new FactHashTable() );
+        }
+
+        return memory;
+    }
+
+    //    public Set getRequiredDeclarations() {
+    //        final Set declarations = new HashSet();
+    //        for ( int i = 0; i < this.constraints.length; i++ ) {
+    //            final Declaration[] array = this.constraints[i].getRequiredDeclarations();
+    //            for ( int j = 0; j < array.length; j++ ) {
+    //                declarations.add( array[j] );
+    //            }
+    //        }
+    //        return declarations;
+    //    }
+
+    public int hashCode() {
+        return this.constraint0.hashCode() ^ this.constraint0.hashCode();
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#getConstraints()
+     */
+    public LinkedList getConstraints() {
+        LinkedList list = new LinkedList();
+        list.add( new LinkedListEntry( this.constraint0 ) );
+        list.add( new LinkedListEntry( this.constraint1 ) );
+        return list;
+    }
+
+    /**
+     * Determine if another object is equal to this.
+     * 
+     * @param object
+     *            The object to test.
+     * 
+     * @return <code>true</code> if <code>object</code> is equal to this,
+     *         otherwise <code>false</code>.
+     */
+    public boolean equals(final Object object) {
+        if ( this == object ) {
+            return true;
+        }
+
+        if ( object == null || getClass() != object.getClass() ) {
+            return false;
+        }
+
+        final DoubleBetaConstraints other = (DoubleBetaConstraints) object;
+
+        if  ( this.constraint0 != other.constraint0 && this.constraint0.equals( other.constraint0 ) ) {
+            return false;
+        }
+        
+        if  ( this.constraint1 != other.constraint1 && this.constraint1.equals( other.constraint1 ) ) {
+            return false;
+        }
+        
+        return true;
+    }
+
+}
\ No newline at end of file

Added: 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	2006-10-12 11:41:24 UTC (rev 6752)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java	2006-10-12 12:04:00 UTC (rev 6753)
@@ -0,0 +1,134 @@
+package org.drools.common;
+
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.drools.WorkingMemory;
+import org.drools.base.evaluators.Operator;
+import org.drools.common.InstanceNotEqualsConstraint.InstanceNotEqualsConstraintContextEntry;
+import org.drools.reteoo.BetaMemory;
+import org.drools.reteoo.ObjectHashTable;
+import org.drools.reteoo.ReteTuple;
+import org.drools.rule.ContextEntry;
+import org.drools.rule.Declaration;
+import org.drools.rule.LiteralConstraint;
+import org.drools.rule.VariableConstraint;
+import org.drools.spi.BetaNodeFieldConstraint;
+import org.drools.spi.Constraint;
+import org.drools.spi.Evaluator;
+import org.drools.spi.AlphaNodeFieldConstraint;
+import org.drools.spi.FieldExtractor;
+import org.drools.spi.Tuple;
+import org.drools.util.FactHashTable;
+import org.drools.util.FieldIndexHashTable;
+import org.drools.util.LinkedList;
+import org.drools.util.LinkedListEntry;
+import org.drools.util.LinkedListNode;
+import org.drools.util.TupleHashTable;
+
+public class EmptyBetaConstraints
+    implements
+    Serializable, BetaConstraints {
+
+    private static final BetaConstraints INSTANCE = new EmptyBetaConstraints();
+    
+    public static BetaConstraints getInstance() {
+        return INSTANCE;
+    }
+    
+    /**
+     * 
+     */
+    private static final long               serialVersionUID         = 320L;   
+    
+    private EmptyBetaConstraints() {
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#updateFromTuple(org.drools.reteoo.ReteTuple)
+     */
+    public void updateFromTuple(ReteTuple tuple) {
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#updateFromFactHandle(org.drools.common.InternalFactHandle)
+     */
+    public void updateFromFactHandle(InternalFactHandle handle) {
+    }
+    
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#isAllowedCachedLeft(java.lang.Object)
+     */
+    public boolean isAllowedCachedLeft(Object object ) {
+        return true;
+    }    
+    
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#isAllowedCachedRight(org.drools.reteoo.ReteTuple)
+     */
+    public boolean isAllowedCachedRight(ReteTuple tuple) {
+        return true;
+    }   
+    
+    public boolean isIndexed() {
+        return false;
+    }
+    
+    public boolean isEmpty() {
+        return true;   
+    }
+    
+    public BetaMemory createBetaMemory()  {
+        BetaMemory memory = new BetaMemory( new TupleHashTable(),
+                                            new FactHashTable() );
+        
+        return memory;        
+    }    
+
+    public int hashCode() {
+        return 1;
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#getConstraints()
+     */
+    public LinkedList getConstraints() {
+        LinkedList list =  new LinkedList();
+        return list;
+    }
+
+    /**
+     * Determine if another object is equal to this.
+     * 
+     * @param object
+     *            The object to test.
+     * 
+     * @return <code>true</code> if <code>object</code> is equal to this,
+     *         otherwise <code>false</code>.
+     */
+    public boolean equals(final Object object) {
+        if ( this == object ) {
+            return true;
+        }
+
+        return ( object != null && getClass() == object.getClass() );
+    }
+
+}
\ No newline at end of file

Added: 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	2006-10-12 11:41:24 UTC (rev 6752)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java	2006-10-12 12:04:00 UTC (rev 6753)
@@ -0,0 +1,181 @@
+package org.drools.common;
+
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.drools.WorkingMemory;
+import org.drools.base.evaluators.Operator;
+import org.drools.common.InstanceNotEqualsConstraint.InstanceNotEqualsConstraintContextEntry;
+import org.drools.reteoo.BetaMemory;
+import org.drools.reteoo.ObjectHashTable;
+import org.drools.reteoo.ReteTuple;
+import org.drools.rule.ContextEntry;
+import org.drools.rule.Declaration;
+import org.drools.rule.LiteralConstraint;
+import org.drools.rule.VariableConstraint;
+import org.drools.spi.BetaNodeFieldConstraint;
+import org.drools.spi.Constraint;
+import org.drools.spi.Evaluator;
+import org.drools.spi.AlphaNodeFieldConstraint;
+import org.drools.spi.FieldExtractor;
+import org.drools.spi.Tuple;
+import org.drools.util.FactHashTable;
+import org.drools.util.FieldIndexHashTable;
+import org.drools.util.LinkedList;
+import org.drools.util.LinkedListEntry;
+import org.drools.util.LinkedListNode;
+import org.drools.util.TupleHashTable;
+
+public class SingleBetaConstraints
+    implements
+    Serializable,
+    BetaConstraints {
+
+    /**
+     * 
+     */
+    private static final long             serialVersionUID = 320L;
+
+    private final BetaNodeFieldConstraint constraint;
+
+    private ContextEntry                  context;
+
+    private boolean                       indexed;
+
+    public SingleBetaConstraints(final BetaNodeFieldConstraint constraint) {
+        this.constraint = constraint;
+        // Determine  if this constraint is indexable
+        if ( isIndexable( constraint ) ) {
+            this.indexed = true;
+        }
+
+        this.context = constraint.getContextEntry();
+    }
+
+    private boolean isIndexable(final BetaNodeFieldConstraint constraint) {
+        if ( constraint.getClass() == VariableConstraint.class ) {
+            VariableConstraint variableConstraint = (VariableConstraint) constraint;
+            return (variableConstraint.getEvaluator().getOperator() == Operator.EQUAL);
+        } else {
+            return false;
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#updateFromTuple(org.drools.reteoo.ReteTuple)
+     */
+    public void updateFromTuple(ReteTuple tuple) {
+        context.updateFromTuple( tuple );
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#updateFromFactHandle(org.drools.common.InternalFactHandle)
+     */
+    public void updateFromFactHandle(InternalFactHandle handle) {
+        context.updateFromFactHandle( handle );
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#isAllowedCachedLeft(java.lang.Object)
+     */
+    public boolean isAllowedCachedLeft(Object object) {
+        return this.constraint.isAllowedCachedLeft( context,
+                                                    object );
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#isAllowedCachedRight(org.drools.reteoo.ReteTuple)
+     */
+    public boolean isAllowedCachedRight(ReteTuple tuple) {
+        return this.constraint.isAllowedCachedRight( tuple,
+                                                     context );
+    }
+
+    public boolean isIndexed() {
+        return this.indexed;
+    }
+
+    public boolean isEmpty() {
+        return false;
+    }
+
+    public BetaMemory createBetaMemory() {
+        BetaMemory memory;
+        if ( this.indexed ) {
+            VariableConstraint variableConstraint = (VariableConstraint) this.constraint;
+            memory = new BetaMemory( new TupleHashTable(),
+                                     new FieldIndexHashTable( variableConstraint.getFieldExtractor(),
+                                                              variableConstraint.getRequiredDeclarations()[0] ) );
+        } else {
+            memory = new BetaMemory( new TupleHashTable(),
+                                     new FactHashTable() );
+        }
+
+        return memory;
+    }
+
+    //    public Set getRequiredDeclarations() {
+    //        final Set declarations = new HashSet();
+    //        for ( int i = 0; i < this.constraints.length; i++ ) {
+    //            final Declaration[] array = this.constraints[i].getRequiredDeclarations();
+    //            for ( int j = 0; j < array.length; j++ ) {
+    //                declarations.add( array[j] );
+    //            }
+    //        }
+    //        return declarations;
+    //    }
+
+    public int hashCode() {
+        return this.constraint.hashCode();
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#getConstraints()
+     */
+    public LinkedList getConstraints() {
+        LinkedList list = new LinkedList();
+        list.add( new LinkedListEntry( this.constraint ) );
+        return list;
+    }
+
+    /**
+     * Determine if another object is equal to this.
+     * 
+     * @param object
+     *            The object to test.
+     * 
+     * @return <code>true</code> if <code>object</code> is equal to this,
+     *         otherwise <code>false</code>.
+     */
+    public boolean equals(final Object object) {
+        if ( this == object ) {
+            return true;
+        }
+
+        if ( object == null || getClass() != object.getClass() ) {
+            return false;
+        }
+
+        final SingleBetaConstraints other = (SingleBetaConstraints) object;
+
+        return this.constraint == other.constraint || this.constraint.equals( other );
+    }
+
+}
\ No newline at end of file

Added: 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	2006-10-12 11:41:24 UTC (rev 6752)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.java	2006-10-12 12:04:00 UTC (rev 6753)
@@ -0,0 +1,222 @@
+package org.drools.common;
+
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.drools.WorkingMemory;
+import org.drools.base.evaluators.Operator;
+import org.drools.common.InstanceNotEqualsConstraint.InstanceNotEqualsConstraintContextEntry;
+import org.drools.reteoo.BetaMemory;
+import org.drools.reteoo.ObjectHashTable;
+import org.drools.reteoo.ReteTuple;
+import org.drools.rule.ContextEntry;
+import org.drools.rule.Declaration;
+import org.drools.rule.LiteralConstraint;
+import org.drools.rule.VariableConstraint;
+import org.drools.spi.BetaNodeFieldConstraint;
+import org.drools.spi.Constraint;
+import org.drools.spi.Evaluator;
+import org.drools.spi.AlphaNodeFieldConstraint;
+import org.drools.spi.FieldExtractor;
+import org.drools.spi.Tuple;
+import org.drools.util.FactHashTable;
+import org.drools.util.FieldIndexHashTable;
+import org.drools.util.LinkedList;
+import org.drools.util.LinkedListEntry;
+import org.drools.util.LinkedListNode;
+import org.drools.util.TupleHashTable;
+
+public class TripleBetaConstraints
+    implements
+    Serializable,
+    BetaConstraints {
+
+    /**
+     * 
+     */
+    private static final long             serialVersionUID = 320L;
+
+    private final BetaNodeFieldConstraint constraint0;
+    private final BetaNodeFieldConstraint constraint1;
+    private final BetaNodeFieldConstraint constraint2;
+
+    private ContextEntry                  context0;
+    private ContextEntry                  context1;
+    private ContextEntry                  context2;
+
+    private boolean                       indexed;
+
+    public TripleBetaConstraints(final BetaNodeFieldConstraint[] constraints) {
+        // find the first instrumental
+        for ( int i = 0, length = constraints.length; i < length; i++ ) {
+            if ( isIndexable( constraints[i] ) ) {
+                if ( i > 0) {
+                    // swap the constraint to the first position
+                    BetaNodeFieldConstraint temp = constraints[0];
+                    constraints[0] = constraints[i];
+                    constraints[i] = temp;
+                }
+                this.indexed = true;
+                break;
+            }
+        }
+
+        this.constraint0 = constraints[0];
+        this.context0 = this.constraint0.getContextEntry();
+
+        this.constraint1 = constraints[1];
+        this.context1 = this.constraint1.getContextEntry();
+        
+        this.constraint2 = constraints[2];
+        this.context2 = this.constraint2.getContextEntry();        
+    }
+
+    private boolean isIndexable(final BetaNodeFieldConstraint constraint) {
+        if ( constraint.getClass() == VariableConstraint.class ) {
+            VariableConstraint variableConstraint = (VariableConstraint) constraint;
+            return (variableConstraint.getEvaluator().getOperator() == Operator.EQUAL);
+        } else {
+            return false;
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#updateFromTuple(org.drools.reteoo.ReteTuple)
+     */
+    public void updateFromTuple(ReteTuple tuple) {
+        context0.updateFromTuple( tuple );
+        context1.updateFromTuple( tuple );
+        context2.updateFromTuple( tuple );
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#updateFromFactHandle(org.drools.common.InternalFactHandle)
+     */
+    public void updateFromFactHandle(InternalFactHandle handle) {
+        context0.updateFromFactHandle( handle );
+        context1.updateFromFactHandle( handle );
+        context2.updateFromFactHandle( handle );
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#isAllowedCachedLeft(java.lang.Object)
+     */
+    public boolean isAllowedCachedLeft(Object object) {
+        return this.constraint0.isAllowedCachedLeft( context0,
+                                                     object ) && this.constraint1.isAllowedCachedLeft( context1,
+                                                                                                       object ) && this.constraint2.isAllowedCachedLeft( context2,
+                                                                                                                                                         object );
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#isAllowedCachedRight(org.drools.reteoo.ReteTuple)
+     */
+    public boolean isAllowedCachedRight(ReteTuple tuple) {
+        return this.constraint0.isAllowedCachedRight( tuple,
+                                                      context0 ) && this.constraint1.isAllowedCachedRight( tuple,
+                                                                                                           context1 ) && this.constraint1.isAllowedCachedRight( tuple,
+                                                                                                                                                                context1 );
+    }
+
+    public boolean isIndexed() {
+        return this.indexed;
+    }
+
+    public boolean isEmpty() {
+        return false;
+    }
+
+    public BetaMemory createBetaMemory() {
+        BetaMemory memory;
+        if ( this.indexed ) {
+            VariableConstraint variableConstraint = (VariableConstraint) this.constraint0;
+            memory = new BetaMemory( new TupleHashTable(),
+                                     new FieldIndexHashTable( variableConstraint.getFieldExtractor(),
+                                                              variableConstraint.getRequiredDeclarations()[0] ) );
+        } else {
+            memory = new BetaMemory( new TupleHashTable(),
+                                     new FactHashTable() );
+        }
+
+        return memory;
+    }
+
+    //    public Set getRequiredDeclarations() {
+    //        final Set declarations = new HashSet();
+    //        for ( int i = 0; i < this.constraints.length; i++ ) {
+    //            final Declaration[] array = this.constraints[i].getRequiredDeclarations();
+    //            for ( int j = 0; j < array.length; j++ ) {
+    //                declarations.add( array[j] );
+    //            }
+    //        }
+    //        return declarations;
+    //    }
+
+    public int hashCode() {
+        return this.constraint0.hashCode() ^ this.constraint0.hashCode() ^ this.constraint0.hashCode();
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.BetaNodeConstraints#getConstraints()
+     */
+    public LinkedList getConstraints() {
+        LinkedList list = new LinkedList();
+        list.add( new LinkedListEntry( this.constraint0 ) );
+        list.add( new LinkedListEntry( this.constraint1 ) );
+        list.add( new LinkedListEntry( this.constraint2 ) );
+        return list;
+    }
+
+    /**
+     * Determine if another object is equal to this.
+     * 
+     * @param object
+     *            The object to test.
+     * 
+     * @return <code>true</code> if <code>object</code> is equal to this,
+     *         otherwise <code>false</code>.
+     */
+    public boolean equals(final Object object) {
+        if ( this == object ) {
+            return true;
+        }
+
+        if ( object == null || getClass() != object.getClass() ) {
+            return false;
+        }
+
+        final TripleBetaConstraints other = (TripleBetaConstraints) object;
+
+        if  ( this.constraint0 != other.constraint0 && this.constraint0.equals( other.constraint0 ) ) {
+            return false;
+        }
+        
+        if  ( this.constraint1 != other.constraint1 && this.constraint1.equals( other.constraint1 ) ) {
+            return false;
+        }
+        
+        if  ( this.constraint2 != other.constraint2 && this.constraint2.equals( other.constraint2 ) ) {
+            return false;
+        }        
+        
+        return true;
+    }
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/Builder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/Builder.java	2006-10-12 11:41:24 UTC (rev 6752)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/Builder.java	2006-10-12 12:04:00 UTC (rev 6753)
@@ -22,7 +22,8 @@
 import java.util.List;
 import java.util.Map;
 
-import org.drools.common.BetaNodeConstraints;
+import org.drools.common.BetaConstraints;
+import org.drools.common.DefaultBetaConstraints;
 import org.drools.rule.And;
 import org.drools.rule.Column;
 import org.drools.rule.Declaration;
@@ -156,7 +157,7 @@
      */
     final private static ColumnConstraints processColumn(final Column column,
                                                          final boolean removeIdentities ) {
-        BetaNodeConstraints binder;
+        BetaConstraints binder;
         final List alphaConstraints = new ArrayList( );
         final List predicateConstraints = new ArrayList( );
 
@@ -190,9 +191,9 @@
 
 
         if ( !predicateConstraints.isEmpty() ) {
-            binder = new BetaNodeConstraints( (AlphaNodeFieldConstraint[]) predicateConstraints.toArray( new AlphaNodeFieldConstraint[predicateConstraints.size()] ) );
+            binder = new DefaultBetaConstraints( (AlphaNodeFieldConstraint[]) predicateConstraints.toArray( new AlphaNodeFieldConstraint[predicateConstraints.size()] ) );
         } else {
-            binder = new BetaNodeConstraints();
+            binder = new DefaultBetaConstraints();
         }
 
         return new ColumnConstraints( column,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/ColumnConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/ColumnConstraints.java	2006-10-12 11:41:24 UTC (rev 6752)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/ColumnConstraints.java	2006-10-12 12:04:00 UTC (rev 6753)
@@ -20,7 +20,7 @@
 import java.util.List;
 
 import org.drools.WorkingMemory;
-import org.drools.common.BetaNodeConstraints;
+import org.drools.common.BetaConstraints;
 import org.drools.common.InternalFactHandle;
 import org.drools.rule.Column;
 import org.drools.spi.AlphaNodeFieldConstraint;
@@ -39,13 +39,13 @@
 
     private final boolean           alphaPresent;
 
-    private final BetaNodeConstraints    beta;
+    private final BetaConstraints    beta;
 
     private final boolean           betaPresent;
 
     public ColumnConstraints(final Column column,
                              final List alpha,
-                             final BetaNodeConstraints beta) {
+                             final BetaConstraints beta) {
         this.classType = LeapsBuilder.getLeapsClassType( column.getObjectType() );
 
         if ( beta != null ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/FromConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/FromConstraint.java	2006-10-12 11:41:24 UTC (rev 6752)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/FromConstraint.java	2006-10-12 12:04:00 UTC (rev 6753)
@@ -2,7 +2,7 @@
 
 import java.util.Arrays;
 
-import org.drools.common.BetaNodeConstraints;
+import org.drools.common.DefaultBetaConstraints;
 import org.drools.rule.Column;
 import org.drools.spi.DataProvider;
 
@@ -15,7 +15,7 @@
         super( column,
                ( constraints.getAlphaContraints( ) == null || constraints.getAlphaContraints( ).length == 0 ) ? Arrays.asList( new FromConstraint[0] )
                        : Arrays.asList( constraints.getAlphaContraints( ) ),
-               new BetaNodeConstraints( constraints.getBetaContraints( ) ) );
+               new DefaultBetaConstraints( constraints.getBetaContraints( ) ) );
         this.provider = provider;
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/LeapsBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/LeapsBuilder.java	2006-10-12 11:41:24 UTC (rev 6752)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/leaps/LeapsBuilder.java	2006-10-12 12:04:00 UTC (rev 6753)
@@ -23,7 +23,8 @@
 import java.util.Map;
 
 import org.drools.base.ClassObjectType;
-import org.drools.common.BetaNodeConstraints;
+import org.drools.common.BetaConstraints;
+import org.drools.common.DefaultBetaConstraints;
 import org.drools.facttemplates.FactTemplateObjectType;
 import org.drools.rule.And;
 import org.drools.rule.Column;
@@ -167,7 +168,7 @@
      * @return leaps packaged ColumnConstraints
      */
     final private static ColumnConstraints processColumn(final Column column ) {
-        BetaNodeConstraints binder;
+        BetaConstraints binder;
         final List alphaConstraints = new ArrayList( );
         final List predicateConstraints = new ArrayList( );
 
@@ -200,9 +201,9 @@
         }
 
         if ( !predicateConstraints.isEmpty() ) {
-            binder = new BetaNodeConstraints( (AlphaNodeFieldConstraint[]) predicateConstraints.toArray( new AlphaNodeFieldConstraint[predicateConstraints.size()] ) );
+            binder = new DefaultBetaConstraints( (AlphaNodeFieldConstraint[]) predicateConstraints.toArray( new AlphaNodeFieldConstraint[predicateConstraints.size()] ) );
         } else {
-            binder = new BetaNodeConstraints();
+            binder = new DefaultBetaConstraints();
         }
 
         return new ColumnConstraints( column,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java	2006-10-12 11:41:24 UTC (rev 6752)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java	2006-10-12 12:04:00 UTC (rev 6753)
@@ -21,7 +21,8 @@
 import java.util.List;
 import java.util.Map;
 
-import org.drools.common.BetaNodeConstraints;
+import org.drools.common.BetaConstraints;
+import org.drools.common.DefaultBetaConstraints;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.Accumulate;
@@ -45,7 +46,7 @@
 
     private final Accumulate          accumulate;
     private final AlphaNodeFieldConstraint[]   constraints;
-    private final BetaNodeConstraints resultsBinder;
+    private final BetaConstraints resultsBinder;
 
     /**
      * Construct.
@@ -67,8 +68,8 @@
               leftInput,
               rightInput,
               new AlphaNodeFieldConstraint[0],
-              new BetaNodeConstraints(),
-              new BetaNodeConstraints(),
+              new DefaultBetaConstraints(),
+              new DefaultBetaConstraints(),
               accumulate );
     }
 
@@ -76,8 +77,8 @@
                           final TupleSource leftInput,
                           final ObjectSource rightInput,
                           final AlphaNodeFieldConstraint[] constraints,
-                          final BetaNodeConstraints sourceBinder,
-                          final BetaNodeConstraints resultsBinder,
+                          final BetaConstraints sourceBinder,
+                          final BetaConstraints resultsBinder,
                           final Accumulate accumulate) {
         super( id,
                leftInput,
@@ -236,7 +237,7 @@
         memory.add( workingMemory,
                     handle );
 
-        final BetaNodeConstraints binder = constraints();
+        final BetaConstraints binder = constraints();
         for ( final Iterator it = memory.leftTupleIterator( workingMemory,
                                                             handle ); it.hasNext(); ) {
             final ReteTuple leftTuple = (ReteTuple) it.next();

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaNode.java	2006-10-12 11:41:24 UTC (rev 6752)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaNode.java	2006-10-12 12:04:00 UTC (rev 6753)
@@ -22,7 +22,9 @@
 import org.drools.RuleBaseConfiguration;
 import org.drools.base.evaluators.Operator;
 import org.drools.common.BaseNode;
-import org.drools.common.BetaNodeConstraints;
+import org.drools.common.BetaConstraints;
+import org.drools.common.DefaultBetaConstraints;
+import org.drools.common.EmptyBetaConstraints;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.NodeMemory;
@@ -62,12 +64,12 @@
     // ------------------------------------------------------------
 
     /** The left input <code>TupleSource</code>. */
-    protected final TupleSource           leftInput;
+    protected final TupleSource         leftInput;
 
     /** The right input <code>TupleSource</code>. */
-    protected final ObjectSource          rightInput;
+    protected final ObjectSource        rightInput;
 
-    protected final BetaNodeConstraints constraints;
+    protected final BetaConstraints constraints;
 
     private TupleSinkNode               previousTupleSinkNode;
     private TupleSinkNode               nextTupleSinkNode;
@@ -93,7 +95,7 @@
         this( id,
               leftInput,
               rightInput,
-              BetaNodeConstraints.emptyBetaNodeConstraints );
+              EmptyBetaConstraints.getInstance() );
     }
 
     /**
@@ -107,7 +109,7 @@
     BetaNode(final int id,
              final TupleSource leftInput,
              final ObjectSource rightInput,
-             final BetaNodeConstraints constraints) {
+             final BetaConstraints constraints) {
         super( id );
         this.leftInput = leftInput;
         this.rightInput = rightInput;
@@ -134,28 +136,28 @@
     }
 
     public List getRules() {
-        List list = new ArrayList();        
-        
+        List list = new ArrayList();
+
         TupleSink[] sinks = this.sink.getSinks();
-        for ( int i = 0, length = sinks.length; i < length; i++ ) {                
+        for ( int i = 0, length = sinks.length; i < length; i++ ) {
             if ( sinks[i].getClass() == TerminalNode.class ) {
-                list.add( ( ( TerminalNode ) sinks[i]).getRule().getName() );
-            } else if  ( sinks[i] instanceof BetaNode )  {
-                list.addAll( ( (BetaNode) sinks[i] ).getRules() );
+                list.add( ((TerminalNode) sinks[i]).getRule().getName() );
+            } else if ( sinks[i] instanceof BetaNode ) {
+                list.addAll( ((BetaNode) sinks[i]).getRules() );
             }
-        }        
-        
+        }
+
         return list;
-    } 
-    
-    public ObjectTypeNode  getObjectTypeNode() {
-            ObjectSource source = this.rightInput;
-            while ( source.getClass() != ObjectTypeNode.class ) {
-                source = source.objectSource;
-            }
-            return ((ObjectTypeNode)source);     
     }
-    
+
+    public ObjectTypeNode getObjectTypeNode() {
+        ObjectSource source = this.rightInput;
+        while ( source.getClass() != ObjectTypeNode.class ) {
+            source = source.objectSource;
+        }
+        return ((ObjectTypeNode) source);
+    }
+
     public void attach(final InternalWorkingMemory[] workingMemories) {
         attach();
 
@@ -177,21 +179,21 @@
 
     public void remove(final BaseNode node,
                        final InternalWorkingMemory[] workingMemories) {
-                if( !node.isInUse()) {
-                    removeTupleSink( ( TupleSink) node ); 
-                }
-                removeShare();
-        
-                if ( ! this.isInUse() ) {
-                    for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
-                        workingMemories[i].clearNodeMemory( this );
-                    }
-                }
-                this.rightInput.remove( this,
-                                        workingMemories );
-                this.leftInput.remove( this,
-                                       workingMemories );
+        if ( !node.isInUse() ) {
+            removeTupleSink( (TupleSink) node );
+        }
+        removeShare();
 
+        if ( !this.isInUse() ) {
+            for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
+                workingMemories[i].clearNodeMemory( this );
+            }
+        }
+        this.rightInput.remove( this,
+                                workingMemories );
+        this.leftInput.remove( this,
+                               workingMemories );
+
     }
 
     //public abstract TupleSink getTupleSink();
@@ -201,10 +203,10 @@
     public String toString() {
         return "";
     }
-    
+
     public void dumpMemory(InternalWorkingMemory workingMemory) {
         MemoryVisitor visitor = new MemoryVisitor( workingMemory );
-        visitor.visit( this );           
+        visitor.visit( this );
     }
 
     /* (non-Javadoc)
@@ -235,42 +237,43 @@
      * Creates a BetaMemory for the BetaNode's memory.
      */
     public Object createMemory(final RuleBaseConfiguration config) {
-        // iterate over all the constraints untill we find one that is indexeable. When we find it we remove it from the list and create the 
-        // BetaMemory for it. If we don't find one, we create a normal beta memory. We don't need the constraint as we can assume that 
-        // anything  returned by the memory already passes that test.
-        LinkedList constraints = this.constraints.getConstraints();
-        BetaMemory memory = null;
-        
-        if ( constraints != null ) {
-            
-            for ( LinkedListEntry entry = (LinkedListEntry) constraints.getFirst(); entry != null; entry = (LinkedListEntry) entry.getNext() ) {
-                BetaNodeFieldConstraint constraint = (BetaNodeFieldConstraint) entry.getObject();
-                if ( constraint.getClass() == VariableConstraint.class ) {
-                    VariableConstraint variableConstraint = (VariableConstraint) constraint;
-                    FieldExtractor extractor = variableConstraint.getFieldExtractor();
-                    Evaluator evaluator = variableConstraint.getEvaluator();
-                    if ( evaluator.getOperator() == Operator.EQUAL ) {
-                        // make suret the indexed constraint is first
-                        if  ( constraints.getFirst() != entry  ) {
-                            constraints.remove( entry );
-                            constraints.insertAfter( null, entry );
-                        }
-                        memory = new BetaMemory( new TupleHashTable(),
-                                                 new FieldIndexHashTable( extractor,
-                                                                          variableConstraint.getRequiredDeclarations()[0] ) );
-                        break;
-
-                    }
-                }                                                     
-            }
-        }
-        
-        if ( memory == null )  {
-            memory = new BetaMemory( new TupleHashTable(),
-                                     new FactHashTable() );            
-        }
-        
-        return memory;
+        return this.constraints.createBetaMemory();
+//        // iterate over all the constraints untill we find one that is indexeable. When we find it we remove it from the list and create the 
+//        // BetaMemory for it. If we don't find one, we create a normal beta memory. We don't need the constraint as we can assume that 
+//        // anything  returned by the memory already passes that test.
+//        LinkedList constraints = this.constraints.getConstraints();
+//        BetaMemory memory = null;
+//
+//        if ( constraints != null ) {
+//            for ( LinkedListEntry entry = (LinkedListEntry) constraints.getFirst(); entry != null; entry = (LinkedListEntry) entry.getNext() ) {
+//                BetaNodeFieldConstraint constraint = (BetaNodeFieldConstraint) entry.getObject();
+//                if ( constraint.getClass() == VariableConstraint.class ) {
+//                    VariableConstraint variableConstraint = (VariableConstraint) constraint;
+//                    FieldExtractor extractor = variableConstraint.getFieldExtractor();
+//                    Evaluator evaluator = variableConstraint.getEvaluator();
+//                    if ( evaluator.getOperator() == Operator.EQUAL ) {
+//                        // make suret the indexed constraint is first
+//                        if ( constraints.getFirst() != entry ) {
+//                            constraints.remove( entry );
+//                            constraints.insertAfter( null,
+//                                                     entry );
+//                        }
+//                        memory = new BetaMemory( new TupleHashTable(),
+//                                                 new FieldIndexHashTable( extractor,
+//                                                                          variableConstraint.getRequiredDeclarations()[0] ) );
+//                        break;
+//
+//                    }
+//                }
+//            }
+//        }
+//
+//        if ( memory == null ) {
+//            memory = new BetaMemory( new TupleHashTable(),
+//                                     new FactHashTable() );
+//        }
+//
+//        return memory;
     }
 
     /**

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.java	2006-10-12 11:41:24 UTC (rev 6752)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.java	2006-10-12 12:04:00 UTC (rev 6753)
@@ -22,7 +22,8 @@
 import java.util.List;
 import java.util.Map;
 
-import org.drools.common.BetaNodeConstraints;
+import org.drools.common.BetaConstraints;
+import org.drools.common.DefaultBetaConstraints;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.Collect;
@@ -44,7 +45,7 @@
 
     private final Collect             collect;
     private final AlphaNodeFieldConstraint[]   resultConstraints;
-    private final BetaNodeConstraints resultsBinder;
+    private final BetaConstraints resultsBinder;
 
     /**
      * Constructor.
@@ -66,8 +67,8 @@
               leftInput,
               rightInput,
               new AlphaNodeFieldConstraint[0],
-              new BetaNodeConstraints(),
-              new BetaNodeConstraints(),
+              new DefaultBetaConstraints(),
+              new DefaultBetaConstraints(),
               collect );
     }
 
@@ -93,8 +94,8 @@
                        final TupleSource leftInput,
                        final ObjectSource rightInput,
                        final AlphaNodeFieldConstraint[] resultConstraints,
-                       final BetaNodeConstraints sourceBinder,
-                       final BetaNodeConstraints resultsBinder,
+                       final BetaConstraints sourceBinder,
+                       final BetaConstraints resultsBinder,
                        final Collect collect) {
         super( id,
                leftInput,
@@ -239,7 +240,7 @@
         memory.add( workingMemory,
                     handle );
 
-        final BetaNodeConstraints binder = constraints();
+        final BetaConstraints binder = constraints();
         for ( final Iterator it = memory.leftTupleIterator( workingMemory,
                                                             handle ); it.hasNext(); ) {
             final ReteTuple leftTuple = (ReteTuple) it.next();

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	2006-10-12 11:41:24 UTC (rev 6752)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java	2006-10-12 12:04:00 UTC (rev 6753)
@@ -6,7 +6,8 @@
 
 import org.drools.RuleBaseConfiguration;
 import org.drools.common.BaseNode;
-import org.drools.common.BetaNodeConstraints;
+import org.drools.common.BetaConstraints;
+import org.drools.common.DefaultBetaConstraints;
 import org.drools.common.DefaultFactHandle;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
@@ -28,19 +29,19 @@
     private DataProvider        dataProvider;
     private TupleSource         tupleSource;
     private AlphaNodeFieldConstraint[]   constraints;
-    private BetaNodeConstraints binder;
+    private BetaConstraints binder;
 
     public FromNode(final int id,
                     final DataProvider dataProvider,
                     final TupleSource tupleSource,
                     final AlphaNodeFieldConstraint[] constraints,
-                    final BetaNodeConstraints binder) {
+                    final BetaConstraints binder) {
         super( id );
         this.dataProvider = dataProvider;
         this.tupleSource = tupleSource;
         this.constraints = constraints;
         if ( binder == null ) {
-            this.binder = new BetaNodeConstraints();
+            this.binder = new DefaultBetaConstraints();
         } else {
             this.binder = binder;
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java	2006-10-12 11:41:24 UTC (rev 6752)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java	2006-10-12 12:04:00 UTC (rev 6753)
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-import org.drools.common.BetaNodeConstraints;
+import org.drools.common.BetaConstraints;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.spi.PropagationContext;
@@ -77,7 +77,7 @@
     JoinNode(final int id,
              final TupleSource leftInput,
              final ObjectSource rightInput,
-             final BetaNodeConstraints binder) {
+             final BetaConstraints binder) {
         super( id,
                leftInput,
                rightInput,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java	2006-10-12 11:41:24 UTC (rev 6752)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java	2006-10-12 12:04:00 UTC (rev 6753)
@@ -24,7 +24,7 @@
 
 import org.drools.RuleBaseConfiguration;
 import org.drools.common.BaseNode;
-import org.drools.common.BetaNodeConstraints;
+import org.drools.common.DefaultBetaConstraints;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.NodeMemory;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/NotNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/NotNode.java	2006-10-12 11:41:24 UTC (rev 6752)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/NotNode.java	2006-10-12 12:04:00 UTC (rev 6753)
@@ -21,8 +21,10 @@
 import java.util.List;
 import java.util.Map;
 
-import org.drools.common.BetaNodeConstraints;
+import org.drools.common.BetaConstraints;
+import org.drools.common.DefaultBetaConstraints;
 import org.drools.common.DefaultFactHandle;
+import org.drools.common.EmptyBetaConstraints;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.spi.PropagationContext;
@@ -75,7 +77,7 @@
         super( id,
                leftInput,
                rightInput,
-               new BetaNodeConstraints() );
+               EmptyBetaConstraints.getInstance() );
     }
 
     /**
@@ -89,7 +91,7 @@
     NotNode(final int id,
             final TupleSource leftInput,
             final ObjectSource rightInput,
-            final BetaNodeConstraints joinNodeBinder) {
+            final BetaConstraints joinNodeBinder) {
         super( id,
                leftInput,
                rightInput,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java	2006-10-12 11:41:24 UTC (rev 6752)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java	2006-10-12 12:04:00 UTC (rev 6753)
@@ -33,9 +33,14 @@
 import org.drools.base.ValueType;
 import org.drools.base.evaluators.Operator;
 import org.drools.common.BaseNode;
-import org.drools.common.BetaNodeConstraints;
+import org.drools.common.BetaConstraints;
+import org.drools.common.DefaultBetaConstraints;
+import org.drools.common.DoubleBetaConstraints;
+import org.drools.common.EmptyBetaConstraints;
 import org.drools.common.InstanceEqualsConstraint;
 import org.drools.common.InstanceNotEqualsConstraint;
+import org.drools.common.SingleBetaConstraints;
+import org.drools.common.TripleBetaConstraints;
 import org.drools.rule.Accumulate;
 import org.drools.rule.And;
 import org.drools.rule.Collect;
@@ -249,7 +254,7 @@
                 continue;
             }
 
-            BetaNodeConstraints binder = null;
+            BetaConstraints binder = null;
             Column column = null;
 
             if ( object instanceof Column ) {
@@ -362,7 +367,7 @@
                                                                  alphaNodeSource ) );
     }
 
-    private BetaNodeConstraints attachColumn(final Column column,
+    private BetaConstraints attachColumn(final Column column,
                                         final GroupElement parent,
                                         final boolean removeIdentities) throws InvalidPatternException {
         // Adjusting offset in case a previous Initial-Fact was added to the network
@@ -379,14 +384,8 @@
         final List predicates = attachAlphaNodes( column,
                                                   removeIdentities );
 
-        BetaNodeConstraints binder;
-
-        if ( !predicates.isEmpty() ) {
-            binder = new BetaNodeConstraints( (BetaNodeFieldConstraint[]) predicates.toArray( new BetaNodeFieldConstraint[predicates.size()] ) );
-        } else {
-            binder = new BetaNodeConstraints();
-        }
-
+        BetaConstraints binder = createBetaNodeConstraint( predicates );
+        
         return binder;
     }
 
@@ -398,7 +397,7 @@
                                                             column.getObjectType(),
                                                             this.rete ) );
 
-        final List predicateConstraints = new ArrayList();
+        final List betaConstraints = new ArrayList();
 
         if ( removeIdentities && column.getObjectType().getClass() == ClassObjectType.class ) {
             // Check if this object type exists before
@@ -408,7 +407,7 @@
                 final Map.Entry entry = (Map.Entry) it.next();
                 final Class previousClass = ((ClassObjectType) entry.getKey()).getClassType();
                 if ( thisClass.isAssignableFrom( previousClass ) ) {
-                    predicateConstraints.add( new InstanceNotEqualsConstraint( (Column) entry.getValue()) );
+                    betaConstraints.add( new InstanceNotEqualsConstraint( (Column) entry.getValue()) );
                 }
             }
 
@@ -435,17 +434,17 @@
                                                                this.objectSource ) );
             } else {
                 checkUnboundDeclarations( ((BetaNodeFieldConstraint) constraint).getRequiredDeclarations() );
-                predicateConstraints.add( (BetaNodeFieldConstraint) constraint );
+                betaConstraints.add( (BetaNodeFieldConstraint) constraint );
             }
         }
 
-        return predicateConstraints;
+        return betaConstraints;
     }
 
     private void attachNot(final TupleSource tupleSource,
                            final Not not,
                            final ObjectSource ObjectSource,
-                           final BetaNodeConstraints binder,
+                           final BetaConstraints binder,
                            final Column column) {
         final NotNode notNode = (NotNode) attachNode( new NotNode( this.id++,
                                                                    tupleSource,
@@ -459,7 +458,7 @@
             attachNot( tupleSource,
                        (Not) not.getChild(),
                        adapter,
-                       new BetaNodeConstraints(),
+                       EmptyBetaConstraints.getInstance(),
                        column );
         } else if ( not.getChild() instanceof Exists ) {
             final RightInputAdapterNode adapter = (RightInputAdapterNode) attachNode( new RightInputAdapterNode( this.id++,
@@ -468,7 +467,7 @@
             attachExists( tupleSource,
                           (Exists) not.getChild(),
                           adapter,
-                          new BetaNodeConstraints(),
+                          EmptyBetaConstraints.getInstance(),
                           column );
         } else {
             this.tupleSource = notNode;
@@ -478,7 +477,7 @@
     private void attachExists(final TupleSource tupleSource,
                               final Exists exists,
                               final ObjectSource ObjectSource,
-                              final BetaNodeConstraints binder,
+                              final BetaConstraints binder,
                               final Column column) {
         NotNode notNode = (NotNode) attachNode( new NotNode( this.id++,
                                                              tupleSource,
@@ -488,7 +487,7 @@
                                                                                                        column.getFactIndex(),
                                                                                                        notNode ) );
 
-        BetaNodeConstraints identityBinder = new BetaNodeConstraints( new InstanceEqualsConstraint( column ) );
+        BetaConstraints identityBinder = new DefaultBetaConstraints( new InstanceEqualsConstraint( column ) );
         notNode = (NotNode) attachNode( new NotNode( this.id++,
                                                      tupleSource,
                                                      adapter,
@@ -501,7 +500,7 @@
             attachNot( tupleSource,
                        (Not) exists.getChild(),
                        adapter,
-                       new BetaNodeConstraints(),
+                       EmptyBetaConstraints.getInstance(),
                        column );
         } else if ( exists.getChild() instanceof Exists ) {
             adapter = (RightInputAdapterNode) attachNode( new RightInputAdapterNode( this.id++,
@@ -510,7 +509,7 @@
             attachExists( tupleSource,
                           (Exists) exists.getChild(),
                           adapter,
-                          new BetaNodeConstraints(),
+                          EmptyBetaConstraints.getInstance(),
                           column );
         } else {
             this.tupleSource = notNode;
@@ -586,8 +585,8 @@
                                    declaration );
         }
 
-        final List predicateConstraints = new ArrayList();
-        final List alphaNodeConstraints = new ArrayList();
+        final List betaConstraints = new ArrayList();
+        final List alphaConstraints = new ArrayList();
 
         for ( final Iterator it = constraints.iterator(); it.hasNext(); ) {
             final Object object = it.next();
@@ -602,25 +601,19 @@
 
             final AlphaNodeFieldConstraint fieldConstraint = (AlphaNodeFieldConstraint) object;
             if ( fieldConstraint instanceof LiteralConstraint ) {
-                alphaNodeConstraints.add( fieldConstraint );
+                alphaConstraints.add( fieldConstraint );
             } else {
                 checkUnboundDeclarations( fieldConstraint.getRequiredDeclarations() );
-                predicateConstraints.add( fieldConstraint );
+                betaConstraints.add( fieldConstraint );
             }
         }
 
-        BetaNodeConstraints binder;
+        BetaConstraints binder = createBetaNodeConstraint( betaConstraints );
 
-        if ( !predicateConstraints.isEmpty() ) {
-            binder = new BetaNodeConstraints( (BetaNodeFieldConstraint[]) predicateConstraints.toArray( new BetaNodeFieldConstraint[predicateConstraints.size()] ) );
-        } else {
-            binder = new BetaNodeConstraints();
-        }
-
         this.tupleSource = attachNode( new FromNode( id++,
                                                      from.getDataProvider(),
                                                      this.tupleSource,
-                                                     (AlphaNodeFieldConstraint[]) alphaNodeConstraints.toArray( new AlphaNodeFieldConstraint[alphaNodeConstraints.size()] ),
+                                                     (AlphaNodeFieldConstraint[]) alphaConstraints.toArray( new AlphaNodeFieldConstraint[alphaConstraints.size()] ),
                                                      binder ) );
 
     }
@@ -643,7 +636,7 @@
         }
 
         final Column sourceColumn = accumulate.getSourceColumn();
-        final BetaNodeConstraints sourceBinder = attachColumn( sourceColumn,
+        final BetaConstraints sourceBinder = attachColumn( sourceColumn,
                                                           parent,
                                                           true );
 
@@ -661,8 +654,8 @@
                                    declaration );
         }
 
-        final List predicateConstraints = new ArrayList();
-        final List alphaNodeConstraints = new ArrayList();
+        final List betaConstraints = new ArrayList();
+        final List alphaConstraints = new ArrayList();
 
         for ( final Iterator it = constraints.iterator(); it.hasNext(); ) {
             final Object object = it.next();
@@ -677,24 +670,19 @@
 
             final AlphaNodeFieldConstraint fieldConstraint = (AlphaNodeFieldConstraint) object;
             if ( fieldConstraint instanceof LiteralConstraint ) {
-                alphaNodeConstraints.add( fieldConstraint );
+                alphaConstraints.add( fieldConstraint );
             } else {
                 checkUnboundDeclarations( fieldConstraint.getRequiredDeclarations() );
-                predicateConstraints.add( fieldConstraint );
+                betaConstraints.add( fieldConstraint );
             }
         }
 
-        BetaNodeConstraints resultsBinder = null;
-        if ( !predicateConstraints.isEmpty() ) {
-            resultsBinder = new BetaNodeConstraints( (BetaNodeFieldConstraint[]) predicateConstraints.toArray( new BetaNodeFieldConstraint[predicateConstraints.size()] ) );
-        } else {
-            resultsBinder = new BetaNodeConstraints();
-        }
+        BetaConstraints resultsBinder = createBetaNodeConstraint( betaConstraints );
 
         this.tupleSource = attachNode( new AccumulateNode( id++,
                                                            this.tupleSource,
                                                            this.objectSource,
-                                                           (AlphaNodeFieldConstraint[]) alphaNodeConstraints.toArray( new AlphaNodeFieldConstraint[alphaNodeConstraints.size()] ),
+                                                           (AlphaNodeFieldConstraint[]) alphaConstraints.toArray( new AlphaNodeFieldConstraint[alphaConstraints.size()] ),
                                                            sourceBinder,
                                                            resultsBinder,
                                                            accumulate ) );
@@ -718,7 +706,7 @@
         }
 
         final Column sourceColumn = collect.getSourceColumn();
-        final BetaNodeConstraints sourceBinder = attachColumn( sourceColumn,
+        final BetaConstraints sourceBinder = attachColumn( sourceColumn,
                                                           parent,
                                                           true );
 
@@ -736,8 +724,8 @@
                                    declaration );
         }
 
-        final List predicateConstraints = new ArrayList();
-        final List alphaNodeConstraints = new ArrayList();
+        final List betaConstraints = new ArrayList();
+        final List alphaConstraints = new ArrayList();
 
         for ( final Iterator it = constraints.iterator(); it.hasNext(); ) {
             final Object object = it.next();
@@ -752,24 +740,19 @@
 
             final AlphaNodeFieldConstraint fieldConstraint = (AlphaNodeFieldConstraint) object;
             if ( fieldConstraint instanceof LiteralConstraint ) {
-                alphaNodeConstraints.add( fieldConstraint );
+                alphaConstraints.add( fieldConstraint );
             } else {
                 checkUnboundDeclarations( fieldConstraint.getRequiredDeclarations() );
-                predicateConstraints.add( fieldConstraint );
+                betaConstraints.add( fieldConstraint );
             }
         }
 
-        BetaNodeConstraints resultsBinder = null;
-        if ( !predicateConstraints.isEmpty() ) {
-            resultsBinder = new BetaNodeConstraints( (BetaNodeFieldConstraint[]) predicateConstraints.toArray( new BetaNodeFieldConstraint[predicateConstraints.size()] ) );
-        } else {
-            resultsBinder = new BetaNodeConstraints();
-        }
+        BetaConstraints resultsBinder = createBetaNodeConstraint( betaConstraints );  
 
         this.tupleSource = attachNode( new CollectNode( id++,
                                                         this.tupleSource,
                                                         this.objectSource,
-                                                        (AlphaNodeFieldConstraint[]) alphaNodeConstraints.toArray( new AlphaNodeFieldConstraint[alphaNodeConstraints.size()] ),
+                                                        (AlphaNodeFieldConstraint[]) alphaConstraints.toArray( new AlphaNodeFieldConstraint[alphaConstraints.size()] ),
                                                         sourceBinder,
                                                         resultsBinder,
                                                         collect ) );
@@ -842,7 +825,27 @@
 
             throw new InvalidPatternException( "Required Declarations not bound: '" + buffer );
         }
-
     }
+    
+    public static BetaConstraints createBetaNodeConstraint(List list){
+        BetaConstraints constraints;
+        switch (list.size()) {
+            case 0:
+                constraints = EmptyBetaConstraints.getInstance();
+                break;
+            case 1:
+                constraints = new SingleBetaConstraints( (BetaNodeFieldConstraint) list.get( 0 ) );                
+                break;
+            case 2:
+                constraints = new DoubleBetaConstraints( (BetaNodeFieldConstraint[]) list.toArray( new BetaNodeFieldConstraint[list.size()] ) );
+                break;
+            case 3:
+                constraints = new TripleBetaConstraints( (BetaNodeFieldConstraint[]) list.toArray( new BetaNodeFieldConstraint[list.size()] ) );
+                break;
+                default:
+                    constraints = new DefaultBetaConstraints( (BetaNodeFieldConstraint[]) list.toArray( new BetaNodeFieldConstraint[list.size()] ) );
+        }
+        return constraints;
+    }
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSource.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSource.java	2006-10-12 11:41:24 UTC (rev 6752)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSource.java	2006-10-12 12:04:00 UTC (rev 6753)
@@ -21,7 +21,7 @@
 import java.util.List;
 
 import org.drools.common.BaseNode;
-import org.drools.common.BetaNodeConstraints;
+import org.drools.common.DefaultBetaConstraints;
 import org.drools.common.DefaultFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.spi.PropagationContext;

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/JoinNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/JoinNodeTest.java	2006-10-12 11:41:24 UTC (rev 6752)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/JoinNodeTest.java	2006-10-12 12:04:00 UTC (rev 6753)
@@ -22,7 +22,7 @@
 
 import org.drools.DroolsTestCase;
 import org.drools.RuleBaseFactory;
-import org.drools.common.BetaNodeConstraints;
+import org.drools.common.DefaultBetaConstraints;
 import org.drools.common.DefaultFactHandle;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.PropagationContextImpl;
@@ -64,7 +64,7 @@
         this.node = new JoinNode( 15,
                                   this.tupleSource,
                                   this.objectSource,
-                                  new BetaNodeConstraints( new AlphaNodeFieldConstraint[]{this.constraint} ) );
+                                  new DefaultBetaConstraints( new AlphaNodeFieldConstraint[]{this.constraint} ) );
 
         this.node.addTupleSink( this.sink );
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/NotNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/NotNodeTest.java	2006-10-12 11:41:24 UTC (rev 6752)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/NotNodeTest.java	2006-10-12 12:04:00 UTC (rev 6753)
@@ -24,7 +24,7 @@
 import org.drools.DroolsTestCase;
 import org.drools.FactException;
 import org.drools.RuleBaseFactory;
-import org.drools.common.BetaNodeConstraints;
+import org.drools.common.DefaultBetaConstraints;
 import org.drools.common.DefaultFactHandle;
 import org.drools.common.PropagationContextImpl;
 import org.drools.rule.Rule;
@@ -60,7 +60,7 @@
         this.node = new NotNode( 15,
                                  new MockTupleSource( 5 ),
                                  new MockObjectSource( 8 ),
-                                 new BetaNodeConstraints( this.constraint ) );
+                                 new DefaultBetaConstraints( this.constraint ) );
 
         this.sink = new MockTupleSink();
         this.node.addTupleSink( this.sink );




More information about the jboss-svn-commits mailing list