[jboss-svn-commits] JBL Code SVN: r5192 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools/reteoo main/java/org/drools/reteoo/beta main/java/org/drools/rule main/java/org/drools/spi test/java/org/drools/examples/manners test/java/org/drools/examples/waltz test/java/org/drools/leaps test/java/org/drools/reteoo test/java/org/drools/rule

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Jul 20 10:48:37 EDT 2006


Author: mark.proctor at jboss.com
Date: 2006-07-20 10:48:11 -0400 (Thu, 20 Jul 2006)
New Revision: 5192

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AbstractCompositeRestriction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AndCompositeRestriction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/OrCompositeRestriction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Restriction.java
Removed:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/BoundVariableConstraint.java
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/beta/BetaMemoryFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Declaration.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LogicTransformer.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PackageCompilationData.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/BaseMannersTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/waltz/BaseWaltzTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/leaps/ColumnConstraintsTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/leaps/LeapsRuleBaseTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/leaps/QueryResultsTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/leaps/QueryTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeSwitchTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/HashedObjectSinkListTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/FieldConstraintTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/OrTest.java
Log:
JBRULES-333
-Added new Restriction paradigm, so each FieldConstraint can have multiple restrictions
-Compiler is currently broken, this is being committed so that Mic can fix the parser.

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-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -349,9 +349,9 @@
 
         final Evaluator evaluator = EvaluatorFactory.getEvaluator( Evaluator.STRING_TYPE,
                                                                    Evaluator.EQUAL );
-        final LiteralConstraint constraint = new LiteralConstraint( field,
-                                                                    extractor,
-                                                                    evaluator );
+        final LiteralConstraint constraint = new LiteralConstraint( extractor,
+                                                                    evaluator,
+                                                                    field );
 
         final AlphaNode alphaNode = new AlphaNode( this.id++,
                                                    this.sinklistFactory.newObjectSinkList( AlphaNode.class ),
@@ -435,7 +435,7 @@
             }
 
             final FieldConstraint fieldConstraint = (FieldConstraint) object;
-            if ( fieldConstraint instanceof LiteralConstraint ) {
+            if ( fieldConstraint.getRequiredDeclarations().length == 0 ) {
                 this.objectSource = attachNode( new AlphaNode( this.id++,
                                                                this.sinklistFactory.newObjectSinkList( AlphaNode.class ),
                                                                fieldConstraint,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/beta/BetaMemoryFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/beta/BetaMemoryFactory.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/beta/BetaMemoryFactory.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -20,7 +20,7 @@
 
 import org.drools.RuleBaseConfiguration;
 import org.drools.common.BetaNodeBinder;
-import org.drools.rule.BoundVariableConstraint;
+import org.drools.rule.VariableConstraint;
 import org.drools.spi.Evaluator;
 import org.drools.spi.FieldConstraint;
 
@@ -53,8 +53,8 @@
         final FieldConstraint[] constraints = (binder != null) ? binder.getConstraints() : null;
         if ( (constraints != null) && (config.getBooleanProperty( RuleBaseConfiguration.PROPERTY_INDEX_LEFT_BETA_MEMORY )) ) {
             for ( int i = 0; i < constraints.length; i++ ) {
-                if ( constraints[i] instanceof BoundVariableConstraint ) {
-                    final BoundVariableConstraint bvc = (BoundVariableConstraint) constraints[i];
+                if ( constraints[i] instanceof VariableConstraint ) {
+                    final VariableConstraint bvc = (VariableConstraint) constraints[i];
                     BetaLeftMemory innerMemory = null;
                     switch ( bvc.getEvaluator().getType() ) {
                         case Evaluator.BOOLEAN_TYPE :
@@ -118,8 +118,8 @@
         final FieldConstraint[] constraints = (binder != null) ? binder.getConstraints() : null;
         if ( (constraints != null) && (config.getBooleanProperty( RuleBaseConfiguration.PROPERTY_INDEX_RIGHT_BETA_MEMORY )) ) {
             for ( int i = 0; i < constraints.length; i++ ) {
-                if ( constraints[i] instanceof BoundVariableConstraint ) {
-                    final BoundVariableConstraint bvc = (BoundVariableConstraint) constraints[i];
+                if ( constraints[i] instanceof VariableConstraint ) {
+                    final VariableConstraint bvc = (VariableConstraint) constraints[i];
                     BetaRightMemory innerMemory = null;
                     switch ( bvc.getEvaluator().getType() ) {
                         case Evaluator.BOOLEAN_TYPE :

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AbstractCompositeRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AbstractCompositeRestriction.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AbstractCompositeRestriction.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -0,0 +1,68 @@
+package org.drools.rule;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.drools.spi.Restriction;
+
+public abstract class AbstractCompositeRestriction
+    implements
+    Restriction {
+
+    private static final long     serialVersionUID = 320;
+
+    protected final Restriction[] restrictions;
+
+    public AbstractCompositeRestriction(Restriction[] restriction) {
+        this.restrictions = restriction;
+    }
+
+    public Declaration[] getRequiredDeclarations() {
+        // Iterate all restrictions building up a unique list of declarations
+        // No need to cache, as this should only be called once at build time
+        Set set = new HashSet();
+        for ( int i = 0, ilength = this.restrictions.length; i < ilength; i++ ) {
+            Declaration[] declarations = this.restrictions[i].getRequiredDeclarations();
+            for ( int j = 0, jlength = declarations.length; j < jlength; j++ ) {
+                set.add( declarations[j] );
+            }
+        }
+
+        return (Declaration[]) set.toArray( new Declaration[set.size()] );
+    }
+
+    private static int hashCode(Object[] array) {
+        final int PRIME = 31;
+        if ( array == null ) return 0;
+        int result = 1;
+        for ( int index = 0; index < array.length; index++ ) {
+            result = PRIME * result + (array[index] == null ? 0 : array[index].hashCode());
+        }
+        return result;
+    }
+
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + AbstractCompositeRestriction.hashCode( this.restrictions );
+        return result;
+    }
+
+    public boolean equals(Object obj) {
+        if ( this == obj ) {
+            return true;
+        }
+
+        if ( obj == null || obj instanceof AbstractCompositeRestriction ) {
+            return false;
+        }
+
+        final AbstractCompositeRestriction other = (AbstractCompositeRestriction) obj;
+        if ( !Arrays.equals( this.restrictions,
+                             other.restrictions ) ) {
+            return false;
+        }
+        return true;
+    }
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AndCompositeRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AndCompositeRestriction.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AndCompositeRestriction.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -0,0 +1,35 @@
+package org.drools.rule;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.drools.WorkingMemory;
+import org.drools.common.InternalFactHandle;
+import org.drools.spi.Restriction;
+import org.drools.spi.Tuple;
+
+public class AndCompositeRestriction extends AbstractCompositeRestriction {
+
+    private static final long serialVersionUID = 320;
+
+    public AndCompositeRestriction(Restriction[] restriction) {
+        super( restriction );
+    }
+
+    public boolean isAllowed(final Object object,
+                             final InternalFactHandle handle,
+                             final Tuple tuple,
+                             final WorkingMemory workingMemory) {
+
+        for ( int i = 0, ilength = this.restrictions.length; i < ilength; i++ ) {
+            if ( !restrictions[i].isAllowed( object,
+                                             handle,
+                                             tuple,
+                                             workingMemory ) ) {
+                return false;
+            }
+        }
+        return true;
+
+    }
+}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/BoundVariableConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/BoundVariableConstraint.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/BoundVariableConstraint.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -1,118 +0,0 @@
-package org.drools.rule;
-
-/*
- * 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.util.Arrays;
-
-import org.drools.WorkingMemory;
-import org.drools.common.InternalFactHandle;
-import org.drools.spi.Evaluator;
-import org.drools.spi.FieldConstraint;
-import org.drools.spi.FieldExtractor;
-import org.drools.spi.Tuple;
-
-public class BoundVariableConstraint
-    implements
-    FieldConstraint {
-
-    /**
-     * 
-     */
-    private static final long    serialVersionUID = 8141052924257031767L;
-
-    private final FieldExtractor fieldExtractor;
-
-    private final Declaration    declaration;
-
-    private final int            column;
-
-    private final Declaration[]  requiredDeclarations;
-
-    private final Evaluator      evaluator;
-
-    public BoundVariableConstraint(final FieldExtractor fieldExtractor,
-                                   final Declaration declaration,
-                                   final Evaluator evaluator) {
-        this.fieldExtractor = fieldExtractor;
-        this.declaration = declaration;
-        this.column = declaration.getColumn();
-        this.requiredDeclarations = new Declaration[]{declaration};
-        this.evaluator = evaluator;
-    }
-
-    public Declaration[] getRequiredDeclarations() {
-        return this.requiredDeclarations;
-    }
-
-    public FieldExtractor getFieldExtractor() {
-        return this.fieldExtractor;
-    }
-
-    public Evaluator getEvaluator() {
-        return this.evaluator;
-    }
-
-    public boolean isAllowed(final InternalFactHandle handle,
-                             final Tuple tuple,
-                             final WorkingMemory workingMemory) {
-        //can't do this as null indexing breaks.        
-        //        Object left = workingMemory.getObject( tuple.get( this.declaration ) );
-        //        Object right = workingMemory.getObject( handle );
-        //        if ( left == right ) {
-        //            return  false;
-        //        } else {
-        //            return evaluator.evaluate( this.fieldExtractor.getValue( right ),
-        //                                       declaration.getValue( left ) );                
-        //        }
-        return this.evaluator.evaluate( this.fieldExtractor.getValue( handle.getObject() ),
-                                        this.declaration.getValue( tuple.get( this.column ).getObject() ) );
-    }
-
-    public String toString() {
-        return "[BoundVariableConstraint fieldExtractor=" + this.fieldExtractor + " declaration=" + this.declaration + "]";
-    }
-
-    /* (non-Javadoc)
-     * @see java.lang.Object#hashCode()
-     */
-    public int hashCode() {
-        final int PRIME = 31;
-        int result = 1;
-        result = PRIME * result + this.column;
-        result = PRIME * result + ((this.declaration == null) ? 0 : this.declaration.hashCode());
-        result = PRIME * result + ((this.evaluator == null) ? 0 : this.evaluator.hashCode());
-        result = PRIME * result + ((this.fieldExtractor == null) ? 0 : this.fieldExtractor.hashCode());
-        result = PRIME * result + this.requiredDeclarations[0].hashCode();
-        return result;
-    }
-
-    public boolean equals(final Object object) {
-        if ( this == object ) {
-            return true;
-        }
-
-        if ( object == null || getClass() != object.getClass() ) {
-            return false;
-        }
-
-        final BoundVariableConstraint other = (BoundVariableConstraint) object;
-
-        return (this.column == other.column) && this.fieldExtractor.equals( other.fieldExtractor ) && this.declaration.equals( other.declaration ) && this.evaluator.equals( other.evaluator ) && Arrays.equals( this.requiredDeclarations,
-                                                                                                                                                                                                                 other.requiredDeclarations );
-    }
-
-}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Declaration.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Declaration.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Declaration.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -159,13 +159,18 @@
     // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
     public String toString() {
-        return "[Declaration: " + this.identifier + "]";
+        return "[Declaration: type=" + this.extractor.getObjectType() + " identifier=" + this.identifier + "]";
     }
 
     public int hashCode() {
-        return this.identifier.hashCode();
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + this.column;
+        result = PRIME * this.extractor.hashCode();
+        result = PRIME * this.identifier.hashCode();
+        return result;
     }
-
+      
     public boolean equals(final Object object) {
         if ( this == object ) {
             return true;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -93,21 +93,20 @@
         }
 
         final EvalCondition other = (EvalCondition) object;
-        
+
         if ( this.requiredDeclarations.length != other.requiredDeclarations.length ) {
-        	return false;
+            return false;
         }
-        
+
         for ( int i = 0, length = this.requiredDeclarations.length; i < length; i++ ) {
-        	if ( this.requiredDeclarations[i].getColumn() != other.requiredDeclarations[i].getColumn() ) {
-        		return false;
-        	}
+            if ( this.requiredDeclarations[i].getColumn() != other.requiredDeclarations[i].getColumn() ) {
+                return false;
+            }
 
-        	if ( !this.requiredDeclarations[i].getExtractor().equals( other.requiredDeclarations[i].getExtractor() ) ) {
-        		return false;
-        	}        	
+            if ( !this.requiredDeclarations[i].getExtractor().equals( other.requiredDeclarations[i].getExtractor() ) ) {
+                return false;
+            }
         }
-        
 
         return this.expression.equals( other.expression );
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -26,35 +26,30 @@
 
 public class LiteralConstraint
     implements
-    FieldConstraint {
+    FieldConstraint{
 
     /**
      * 
      */
-    private static final long          serialVersionUID     = 257543929585046195L;
+    private static final long          serialVersionUID     = 320;
 
-    private final FieldValue           field;
-
     private final FieldExtractor       extractor;
+    
+    private final LiteralRestriction   restriction;
 
-    private final Evaluator            evaluator;
-
-    private static final Declaration[] requiredDeclarations = new Declaration[0];
-
-    public LiteralConstraint(final FieldValue field,
-                             final FieldExtractor extractor,
-                             final Evaluator evaluator) {
-        this.field = field;
+    public LiteralConstraint(final FieldExtractor extractor,
+                             final Evaluator evaluator,
+                             final FieldValue field) {
         this.extractor = extractor;
-        this.evaluator = evaluator;
+        this.restriction = new LiteralRestriction(field, evaluator);
     }
 
     public Evaluator getEvaluator() {
-        return this.evaluator;
+        return this.restriction.getEvaluator();
     }
 
     public FieldValue getField() {
-        return this.field;
+        return this.restriction.getField();
     }
 
     public FieldExtractor getFieldExtractor() {
@@ -67,23 +62,25 @@
      *      Return an empty <code>Declaration[]</code>
      */
     public Declaration[] getRequiredDeclarations() {
-        return LiteralConstraint.requiredDeclarations;
+        return this.restriction.getRequiredDeclarations();
     }
 
     public boolean isAllowed(final InternalFactHandle handle,
                              final Tuple tuple,
                              final WorkingMemory workingMemory) {
-        return this.evaluator.evaluate( this.extractor.getValue( handle.getObject() ),
-                                        this.field.getValue() );
+        return this.restriction.isAllowed( this.extractor.getValue( handle.getObject() ), handle, tuple, workingMemory );
     }
 
     public String toString() {
-        return "[LiteralConstraint fieldExtractor=" + this.extractor + " evaluator=" + this.evaluator + " value=" + this.field.getValue() + "]";
+        return "[LiteralConstraint fieldExtractor=" + this.extractor + " evaluator=" + getEvaluator() + " value=" + getField().getValue() + "]";
     }
 
     public int hashCode() {
-        return (this.field.hashCode() * 17) ^ (this.extractor.hashCode() * 11) ^ (this.evaluator.hashCode());
-
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + this.extractor.hashCode();
+        result = PRIME * result + this.restriction.hashCode();
+        return result;
     }
 
     public boolean equals(final Object object) {
@@ -95,7 +92,7 @@
         }
         final LiteralConstraint other = (LiteralConstraint) object;
 
-        return this.field.equals( other.field ) && this.extractor.equals( other.extractor ) && this.evaluator.equals( other.evaluator );
+        return this.extractor.equals( other.extractor ) && this.restriction.equals( other.restriction );
     }
 
-};
\ No newline at end of file
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -0,0 +1,98 @@
+package org.drools.rule;
+
+/*
+ * 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 org.drools.WorkingMemory;
+import org.drools.common.InternalFactHandle;
+import org.drools.spi.Evaluator;
+import org.drools.spi.FieldConstraint;
+import org.drools.spi.FieldExtractor;
+import org.drools.spi.FieldValue;
+import org.drools.spi.Restriction;
+import org.drools.spi.Tuple;
+
+public class LiteralRestriction
+    implements
+    Restriction {
+
+    /**
+     * 
+     */
+    private static final long          serialVersionUID     = 320;
+
+    private final FieldValue           field;
+
+    private final Evaluator            evaluator;
+
+    private static final Declaration[] requiredDeclarations = new Declaration[0];
+
+    public LiteralRestriction(final FieldValue field,
+                              final Evaluator evaluator) {
+        this.field = field;
+        this.evaluator = evaluator;
+    }
+
+    public Evaluator getEvaluator() {
+        return this.evaluator;
+    }
+
+    public FieldValue getField() {
+        return this.field;
+    }
+
+    /**
+     * Literal constraints cannot have required declarations, so always return an empty array.
+     * @return
+     *      Return an empty <code>Declaration[]</code>
+     */
+    public Declaration[] getRequiredDeclarations() {
+        return LiteralRestriction.requiredDeclarations;
+    }
+
+    public boolean isAllowed(final Object object,
+                             final InternalFactHandle handle,
+                             final Tuple tuple,
+                             final WorkingMemory workingMemory) {
+        return this.evaluator.evaluate( object,
+                                        this.field.getValue() );
+    }
+
+    public String toString() {
+        return "[LiteralRestriction evaluator=" + this.evaluator + " value=" + this.field.getValue() + "]";
+    }
+
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + this.evaluator.hashCode();
+        result = PRIME * result + this.field.hashCode();
+        return result;
+    }
+
+    public boolean equals(final Object object) {
+        if ( this == object ) {
+            return true;
+        }
+        if ( object == null || object.getClass() != LiteralRestriction.class ) {
+            return false;
+        }
+        final LiteralRestriction other = (LiteralRestriction) object;
+
+        return this.field.equals( other.field ) && this.evaluator.equals( other.evaluator );
+    }
+
+};
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LogicTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LogicTransformer.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LogicTransformer.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -127,7 +127,7 @@
         if ( or == null ) {
             // No or so just assign
             ands = new And[]{cloned};
-            checkForAndRemoveDuplicates( ands[0] );            
+            checkForAndRemoveDuplicates( ands[0] );
         } else {
             ands = new And[or.getChildren().size()];
             int i = 0;

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -0,0 +1,76 @@
+package org.drools.rule;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.drools.WorkingMemory;
+import org.drools.common.InternalFactHandle;
+import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
+import org.drools.spi.FieldConstraint;
+import org.drools.spi.FieldExtractor;
+import org.drools.spi.FieldValue;
+import org.drools.spi.Restriction;
+import org.drools.spi.Tuple;
+
+public class MultiRestrictionFieldConstraint
+    implements
+    FieldConstraint {
+
+    /**
+     * 
+     */
+    private static final long    serialVersionUID = 320;
+
+    private final FieldExtractor extractor;
+
+    private final Restriction    restrictions;
+
+    public MultiRestrictionFieldConstraint(final FieldExtractor extractor,
+                                           final Restriction restrictions) {
+        this.extractor = extractor;
+        this.restrictions = restrictions;
+    }
+
+    public FieldExtractor getFieldExtractor() {
+        return this.extractor;
+    }
+
+    public Declaration[] getRequiredDeclarations() {
+        return this.restrictions.getRequiredDeclarations();
+    }
+
+    public boolean isAllowed(final InternalFactHandle handle,
+                             final Tuple tuple,
+                             final WorkingMemory workingMemory) {
+        return this.restrictions.isAllowed( this.extractor.getValue( handle.getObject() ),
+                                            handle,
+                                            tuple,
+                                            workingMemory );
+    }
+
+    public String toString() {
+        return "[MultiRestrictionConstraint fieldExtractor=" + this.extractor + " restrictions =" + this.restrictions + "]";
+    }
+
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * this.extractor.hashCode();
+        result = PRIME * this.restrictions.hashCode();
+        return result;
+    }
+
+    public boolean equals(final Object object) {
+        if ( this == object ) {
+            return true;
+        }
+        if ( object == null || object.getClass() != MultiRestrictionFieldConstraint.class ) {
+            return false;
+        }
+        final MultiRestrictionFieldConstraint other = (MultiRestrictionFieldConstraint) object;
+
+        return this.extractor.equals( other.extractor ) && this.restrictions.equals( other.restrictions );
+    }
+
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/OrCompositeRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/OrCompositeRestriction.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/OrCompositeRestriction.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -0,0 +1,36 @@
+package org.drools.rule;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.drools.WorkingMemory;
+import org.drools.common.InternalFactHandle;
+import org.drools.spi.Restriction;
+import org.drools.spi.Tuple;
+
+public class OrCompositeRestriction extends AbstractCompositeRestriction {
+
+    private static final long serialVersionUID = 320;
+
+    public OrCompositeRestriction(Restriction[] restriction) {
+        super( restriction );
+    }
+
+    public boolean isAllowed(final Object object,
+                             final InternalFactHandle handle,
+                             final Tuple tuple,
+                             final WorkingMemory workingMemory) {
+
+        for ( int i = 0, ilength = this.restrictions.length; i < ilength; i++ ) {
+            if ( restrictions[i].isAllowed( object,
+                                            handle,
+                                            tuple,
+                                            workingMemory ) ) {
+                return true;
+            }
+        }
+        return false;
+
+    }
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PackageCompilationData.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PackageCompilationData.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PackageCompilationData.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -62,12 +62,12 @@
      * will result in an invalid state for the instance.
      */
     public PackageCompilationData() {
-        
+
     }
 
     public PackageCompilationData(final ClassLoader parentClassLoader) {
         initClassLoader( parentClassLoader );
-        this.invokerLookups   = new HashMap();
+        this.invokerLookups = new HashMap();
         this.store = new HashMap();
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -81,6 +81,10 @@
         return this.expression;
     }
 
+    public String toString() {
+        return "[PredicateConstraint declarations=" + this.requiredDeclarations  + "]";
+    }    
+    
     public boolean isAllowed(final InternalFactHandle handle,
                              final Tuple tuple,
                              final WorkingMemory workingMemory) {
@@ -110,28 +114,28 @@
         }
 
         final PredicateConstraint other = (PredicateConstraint) object;
-        
+
         if ( this.requiredDeclarations.length != other.requiredDeclarations.length ) {
-        	return false;
+            return false;
         }
-        
-    	if ( this.declaration.getColumn() != other.declaration.getColumn() ) {
-    		return false;
-    	}
 
-    	if ( !this.declaration.getExtractor().equals( other.declaration.getExtractor() ) ) {
-    		return false;
-    	}        
-        
+        if ( this.declaration.getColumn() != other.declaration.getColumn() ) {
+            return false;
+        }
+
+        if ( !this.declaration.getExtractor().equals( other.declaration.getExtractor() ) ) {
+            return false;
+        }
+
         for ( int i = 0, length = this.requiredDeclarations.length; i < length; i++ ) {
-        	if ( this.requiredDeclarations[i].getColumn() != other.requiredDeclarations[i].getColumn() ) {
-        		return false;
-        	}
+            if ( this.requiredDeclarations[i].getColumn() != other.requiredDeclarations[i].getColumn() ) {
+                return false;
+            }
 
-        	if ( !this.requiredDeclarations[i].getExtractor().equals( other.requiredDeclarations[i].getExtractor() ) ) {
-        		return false;
-        	}        	
-        }        
+            if ( !this.requiredDeclarations[i].getExtractor().equals( other.requiredDeclarations[i].getExtractor() ) ) {
+                return false;
+            }
+        }
 
         return this.expression.equals( other.expression );
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -32,71 +32,64 @@
     /**
      * 
      */
-    private static final long          serialVersionUID       = -3888281054472597050L;
+    private static final long            serialVersionUID = -3888281054472597050L;
 
-    private final FieldExtractor       fieldExtractor;
+    private final FieldExtractor         fieldExtractor;
+    private final ReturnValueRestriction restriction;
 
-    private ReturnValueExpression      expression;
-
-    private final Declaration[]        requiredDeclarations;
-
-    private final Evaluator            evaluator;
-
-    private static final Declaration[] noRequiredDeclarations = new Declaration[]{};
-
     public ReturnValueConstraint(final FieldExtractor fieldExtractor,
                                  final Declaration[] declarations,
                                  final Evaluator evaluator) {
-        this( fieldExtractor,
-              null,
-              declarations,
-              evaluator );
+        this.fieldExtractor = fieldExtractor;
+        this.restriction = new ReturnValueRestriction( declarations,
+                                                       evaluator );
     }
 
     public ReturnValueConstraint(final FieldExtractor fieldExtractor,
-                                 final ReturnValueExpression returnValueExpression,
+                                 final ReturnValueExpression expression,
                                  final Declaration[] declarations,
                                  final Evaluator evaluator) {
         this.fieldExtractor = fieldExtractor;
-
-        this.expression = returnValueExpression;
-
-        if ( declarations != null ) {
-            this.requiredDeclarations = declarations;
-        } else {
-            this.requiredDeclarations = ReturnValueConstraint.noRequiredDeclarations;
-        }
-
-        this.evaluator = evaluator;
+        this.restriction = new ReturnValueRestriction( expression,
+                                                       declarations,
+                                                       evaluator );
     }
 
     public Declaration[] getRequiredDeclarations() {
-        return this.requiredDeclarations;
+        return this.restriction.getRequiredDeclarations();
     }
 
     public void setReturnValueExpression(final ReturnValueExpression expression) {
-        this.expression = expression;
+        this.restriction.setReturnValueExpression( expression );
     }
 
     public ReturnValueExpression getExpression() {
-        return this.expression;
+        return this.restriction.getExpression();
     }
 
+    public Evaluator getEvaluator() {
+        return this.restriction.getEvaluator();
+    }
+
     public boolean isAllowed(final InternalFactHandle handle,
                              final Tuple tuple,
                              final WorkingMemory workingMemory) {
-        try {
-            return this.evaluator.evaluate( this.fieldExtractor.getValue( handle.getObject() ),
-                                            this.expression.evaluate( tuple,
-                                                                      this.requiredDeclarations,
-                                                                      workingMemory ) );
-        } catch ( final Exception e ) {
-            throw new RuntimeDroolsException( e );
-        }
+        return this.restriction.isAllowed( this.fieldExtractor.getValue( handle.getObject() ),
+                                           handle,
+                                           tuple,
+                                           workingMemory );
     }
 
+    public String toString() {
+        return "[ReturnValueConstraint fieldExtractor=" + this.fieldExtractor + " evaluator=" + getEvaluator() + " declarations=" + getRequiredDeclarations() + "]";
+    }
+
     public int hashCode() {
-        return this.expression.hashCode();
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + this.fieldExtractor.hashCode();
+        result = PRIME * result + this.restriction.hashCode();
+        return result;
     }
 
     public boolean equals(final Object object) {
@@ -109,21 +102,7 @@
         }
 
         final ReturnValueConstraint other = (ReturnValueConstraint) object;
-        
-        if ( this.requiredDeclarations.length != other.requiredDeclarations.length ) {
-        	return false;
-        }
-        
-        for ( int i = 0, length = this.requiredDeclarations.length; i < length; i++ ) {
-        	if ( this.requiredDeclarations[i].getColumn() != other.requiredDeclarations[i].getColumn() ) {
-        		return false;
-        	}
 
-        	if ( !this.requiredDeclarations[i].getExtractor().equals( other.requiredDeclarations[i].getExtractor() ) ) {
-        		return false;
-        	}        	
-        }        
-
-        return this.expression.equals( other.expression );
+        return this.fieldExtractor.equals( other.fieldExtractor ) && this.restriction.equals( other.restriction );
     }
 }
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -0,0 +1,140 @@
+package org.drools.rule;
+
+/*
+ * 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.util.Arrays;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.WorkingMemory;
+import org.drools.common.InternalFactHandle;
+import org.drools.spi.Evaluator;
+import org.drools.spi.FieldConstraint;
+import org.drools.spi.FieldExtractor;
+import org.drools.spi.Restriction;
+import org.drools.spi.ReturnValueExpression;
+import org.drools.spi.Tuple;
+
+public class ReturnValueRestriction
+    implements
+    Restriction {
+
+    private static int hashCode(Object[] array) {
+        final int PRIME = 31;
+        if ( array == null ) return 0;
+        int result = 1;
+        for ( int index = 0; index < array.length; index++ ) {
+            result = PRIME * result + (array[index] == null ? 0 : array[index].hashCode());
+        }
+        return result;
+    }
+
+    /**
+     * 
+     */
+    private static final long          serialVersionUID       = 320;
+
+    private ReturnValueExpression      expression;
+
+    private final Declaration[]        requiredDeclarations;
+
+    private final Evaluator            evaluator;
+
+    private static final Declaration[] noRequiredDeclarations = new Declaration[]{};
+
+    public ReturnValueRestriction(final Declaration[] declarations,
+                                  final Evaluator evaluator) {
+        this( null,
+              declarations,
+              evaluator );
+    }
+
+    public ReturnValueRestriction(final ReturnValueExpression returnValueExpression,
+                                  final Declaration[] declarations,
+                                  final Evaluator evaluator) {
+        this.expression = returnValueExpression;
+
+        if ( declarations != null ) {
+            this.requiredDeclarations = declarations;
+        } else {
+            this.requiredDeclarations = ReturnValueRestriction.noRequiredDeclarations;
+        }
+
+        this.evaluator = evaluator;
+    }
+
+    public Declaration[] getRequiredDeclarations() {
+        return this.requiredDeclarations;
+    }
+
+    public void setReturnValueExpression(final ReturnValueExpression expression) {
+        this.expression = expression;
+    }
+
+    public ReturnValueExpression getExpression() {
+        return this.expression;
+    }
+
+    public Evaluator getEvaluator() {
+        return this.evaluator;
+    }
+
+    public boolean isAllowed(final Object object,
+                             final InternalFactHandle handle,
+                             final Tuple tuple,
+                             final WorkingMemory workingMemory) {
+        try {
+            return this.evaluator.evaluate( object,
+                                            this.expression.evaluate( tuple,
+                                                                      this.requiredDeclarations,
+                                                                      workingMemory ) );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( e );
+        }
+    }
+
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = this.evaluator.hashCode();
+        result = this.expression.hashCode();
+        result = PRIME * result + ReturnValueRestriction.hashCode( this.requiredDeclarations );
+        return result;
+    }
+
+    public boolean equals(Object object) {
+        if ( object == this ) {
+            return true;
+        }
+
+        if ( object == null || object.getClass() != ReturnValueRestriction.class ) {
+            return false;
+        }
+
+        final ReturnValueRestriction other = (ReturnValueRestriction) object;
+
+        if ( this.requiredDeclarations.length != other.requiredDeclarations.length ) {
+            return false;
+        }
+
+        if ( !Arrays.equals( this.requiredDeclarations,
+                             other.requiredDeclarations ) ) {
+            return false;
+        }
+
+        return this.expression.equals( other.expression );
+    }
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -432,12 +432,8 @@
 
         final Rule other = (Rule) object;
 
-        return (this.name.equals( other.name ) && 
-                this.agendaGroup.equals( other.agendaGroup ) &&
-                (( this.ActivationGroup == null && other.ActivationGroup == null) ||
-                 ( this.ActivationGroup != null && this.ActivationGroup.equals( other.ActivationGroup ))) && 
-                this.salience == other.salience && 
-                this.noLoop == other.noLoop);
+        return (this.name.equals( other.name ) && this.agendaGroup.equals( other.agendaGroup )
+                && ((this.ActivationGroup == null && other.ActivationGroup == null) || (this.ActivationGroup != null && this.ActivationGroup.equals( other.ActivationGroup ))) && this.salience == other.salience && this.noLoop == other.noLoop);
     }
 
     public int hashCode() {

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java (from rev 5182, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/BoundVariableConstraint.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/BoundVariableConstraint.java	2006-07-19 16:23:42 UTC (rev 5182)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -0,0 +1,104 @@
+package org.drools.rule;
+
+/*
+ * 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.util.Arrays;
+
+import org.drools.WorkingMemory;
+import org.drools.common.InternalFactHandle;
+import org.drools.spi.Evaluator;
+import org.drools.spi.FieldConstraint;
+import org.drools.spi.FieldExtractor;
+import org.drools.spi.Tuple;
+
+public class VariableConstraint
+    implements
+    FieldConstraint {
+
+    /**
+     * 
+     */
+    private static final long         serialVersionUID = 320;
+
+    private final FieldExtractor      fieldExtractor;
+    private final VariableRestriction restriction;
+
+    public VariableConstraint(final FieldExtractor fieldExtractor,
+                              final Declaration declaration,
+                              final Evaluator evaluator) {
+        this.fieldExtractor = fieldExtractor;
+        this.restriction = new VariableRestriction( declaration,
+                                                    evaluator );
+    }
+
+    public Declaration[] getRequiredDeclarations() {
+        return this.restriction.getRequiredDeclarations();
+    }
+
+    public FieldExtractor getFieldExtractor() {
+        return this.fieldExtractor;
+    }
+
+    public Evaluator getEvaluator() {
+        return this.restriction.getEvaluator();
+    }
+
+    public boolean isAllowed(final InternalFactHandle handle,
+                             final Tuple tuple,
+                             final WorkingMemory workingMemory) {
+        //can't do this as null indexing breaks.        
+        //        Object left = workingMemory.getObject( tuple.get( this.declaration ) );
+        //        Object right = workingMemory.getObject( handle );
+        //        if ( left == right ) {
+        //            return  false;
+        //        } else {
+        //            return evaluator.evaluate( this.fieldExtractor.getValue( right ),
+        //                                       declaration.getValue( left ) );                
+        //        }
+        return this.restriction.isAllowed( this.fieldExtractor.getValue( handle.getObject() ),
+                                           handle,
+                                           tuple,
+                                           workingMemory );
+    }
+
+    public String toString() {
+        return "[VariableConstraint fieldExtractor=" + this.fieldExtractor + " declaration=" + getRequiredDeclarations() + "]";
+    }
+
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + this.fieldExtractor.hashCode();
+        result = PRIME * result + this.restriction.hashCode();
+        return result;
+    }
+
+    public boolean equals(final Object object) {
+        if ( this == object ) {
+            return true;
+        }
+
+        if ( object == null || getClass() != object.getClass() ) {
+            return false;
+        }
+
+        final VariableConstraint other = (VariableConstraint) object;
+
+        return this.fieldExtractor.equals( other.fieldExtractor ) && this.restriction.equals( other.restriction );
+    }
+
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -0,0 +1,109 @@
+package org.drools.rule;
+
+/*
+ * 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.util.Arrays;
+
+import org.drools.WorkingMemory;
+import org.drools.common.InternalFactHandle;
+import org.drools.spi.Evaluator;
+import org.drools.spi.FieldConstraint;
+import org.drools.spi.FieldExtractor;
+import org.drools.spi.Restriction;
+import org.drools.spi.Tuple;
+
+public class VariableRestriction implements Restriction {
+
+    /**
+     * 
+     */
+    private static final long   serialVersionUID = 320;
+
+    private final Declaration   declaration;
+
+    private final int           column;
+
+    private final Declaration[] requiredDeclarations;
+
+    private final Evaluator     evaluator;
+
+    public VariableRestriction(final Declaration declaration,
+                               final Evaluator evaluator) {
+        this.declaration = declaration;
+        this.column = declaration.getColumn();
+        this.requiredDeclarations = new Declaration[]{declaration};
+        this.evaluator = evaluator;
+    }
+
+    public Declaration[] getRequiredDeclarations() {
+        return this.requiredDeclarations;
+    }
+
+    public Evaluator getEvaluator() {
+        return this.evaluator;
+    }
+
+    public boolean isAllowed(final Object object,
+                             final InternalFactHandle handle,
+                             final Tuple tuple,
+                             final WorkingMemory workingMemory) {
+        //can't do this as null indexing breaks.        
+        //        Object left = workingMemory.getObject( tuple.get( this.declaration ) );
+        //        Object right = workingMemory.getObject( handle );
+        //        if ( left == right ) {
+        //            return  false;
+        //        } else {
+        //            return evaluator.evaluate( this.fieldExtractor.getValue( right ),
+        //                                       declaration.getValue( left ) );                
+        //        }
+        return this.evaluator.evaluate( object,
+                                        this.declaration.getValue( tuple.get( this.column ).getObject() ) );
+    }
+
+    public String toString() {
+        return "[VariableRestriction declaration=" + this.declaration + "]";
+    }
+
+    /* (non-Javadoc)
+     * @see java.lang.Object#hashCode()
+     */
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + this.column;
+        result = PRIME * result + ((this.declaration == null) ? 0 : this.declaration.hashCode());
+        result = PRIME * result + ((this.evaluator == null) ? 0 : this.evaluator.hashCode());
+        result = PRIME * result + this.requiredDeclarations[0].hashCode();
+        return result;
+    }
+
+    public boolean equals(final Object object) {
+        if ( this == object ) {
+            return true;
+        }
+
+        if ( object == null || getClass() != object.getClass() ) {
+            return false;
+        }
+
+        final VariableRestriction other = (VariableRestriction) object;
+
+        return (this.column == other.column) && this.declaration.equals( other.declaration ) && this.evaluator.equals( other.evaluator ) && Arrays.equals( this.requiredDeclarations,
+                                                                                                                                                           other.requiredDeclarations );
+    }
+
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Restriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Restriction.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Restriction.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -0,0 +1,16 @@
+package org.drools.spi;
+
+import java.io.Serializable;
+
+import org.drools.WorkingMemory;
+import org.drools.common.InternalFactHandle;
+import org.drools.rule.Declaration;
+
+public interface Restriction extends Serializable {
+    Declaration[] getRequiredDeclarations();
+    
+    public boolean isAllowed(Object object,
+                             InternalFactHandle handle,
+                             Tuple tuple,
+                             WorkingMemory workingMemory);
+}

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/BaseMannersTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/BaseMannersTest.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/BaseMannersTest.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -36,7 +36,7 @@
 import org.drools.base.ClassFieldExtractor;
 import org.drools.base.ClassObjectType;
 import org.drools.base.EvaluatorFactory;
-import org.drools.rule.BoundVariableConstraint;
+import org.drools.rule.VariableConstraint;
 import org.drools.rule.Column;
 import org.drools.rule.Declaration;
 import org.drools.rule.InvalidRuleException;
@@ -1097,9 +1097,9 @@
 
         final FieldValue field = new MockField( fieldValue );
 
-        return new LiteralConstraint( field,
-                                      extractor,
-                                      evaluator );
+        return new LiteralConstraint( extractor,
+                                      evaluator,
+                                      field );
     }
 
     private void setFieldDeclaration(final Column column,
@@ -1123,7 +1123,7 @@
         final FieldExtractor extractor = new ClassFieldExtractor( clazz,
                                                                   fieldName );
 
-        return new BoundVariableConstraint( extractor,
+        return new VariableConstraint( extractor,
                                             declaration,
                                             evaluator );
     }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/waltz/BaseWaltzTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/waltz/BaseWaltzTest.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/waltz/BaseWaltzTest.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -32,7 +32,7 @@
 import org.drools.base.ClassFieldExtractorFactory;
 import org.drools.base.ClassObjectType;
 import org.drools.base.EvaluatorFactory;
-import org.drools.rule.BoundVariableConstraint;
+import org.drools.rule.VariableConstraint;
 import org.drools.rule.Column;
 import org.drools.rule.Declaration;
 import org.drools.rule.InvalidRuleException;
@@ -3760,9 +3760,9 @@
 
         final MockField field = new MockField( fieldValue );
 
-        return new LiteralConstraint( field,
-                                      extractor,
-                                      evaluator );
+        return new LiteralConstraint( extractor,
+                                      evaluator,
+                                      field );
     }
 
     private void setFieldDeclaration(final Column column,
@@ -3786,7 +3786,7 @@
         final FieldExtractor extractor = ClassFieldExtractorFactory.getClassFieldExtractor( clazz,
                                                                                             fieldName );
 
-        return new BoundVariableConstraint( extractor,
+        return new VariableConstraint( extractor,
                                             declaration,
                                             evaluator );
     }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/leaps/ColumnConstraintsTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/leaps/ColumnConstraintsTest.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/leaps/ColumnConstraintsTest.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -146,9 +146,9 @@
         final FieldExtractor extractor = new ClassFieldExtractor( clazz,
                                                                   fieldName );
 
-        return new LiteralConstraint( field,
-                                      extractor,
-                                      evaluator );
+        return new LiteralConstraint( extractor,
+                                      evaluator,
+                                      field );
     }
 
     public static int getIndex(final Class clazz,

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/leaps/LeapsRuleBaseTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/leaps/LeapsRuleBaseTest.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/leaps/LeapsRuleBaseTest.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -393,8 +393,8 @@
 
         final FieldValue field = new MockField( fieldValue );
 
-        return new LiteralConstraint( field,
-                                      extractor,
-                                      evaluator );
+        return new LiteralConstraint( extractor,
+                                      evaluator,
+                                      field );
     }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/leaps/QueryResultsTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/leaps/QueryResultsTest.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/leaps/QueryResultsTest.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -196,8 +196,8 @@
 
         final FieldValue field = new MockField( fieldValue );
 
-        return new LiteralConstraint( field,
-                                      extractor,
-                                      evaluator );
+        return new LiteralConstraint( extractor,
+                                      evaluator,
+                                      field );
     }
 }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/leaps/QueryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/leaps/QueryTest.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/leaps/QueryTest.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -165,8 +165,8 @@
 
         final FieldValue field = new MockField( fieldValue );
 
-        return new LiteralConstraint( field,
-                                      extractor,
-                                      evaluator );
+        return new LiteralConstraint( extractor,
+                                      evaluator,
+                                      field );
     }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeSwitchTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeSwitchTest.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeSwitchTest.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -56,15 +56,15 @@
 
         final Evaluator evaluator = EvaluatorFactory.getEvaluator( Evaluator.OBJECT_TYPE,
                                                                    Evaluator.EQUAL );
-        this.constraint1 = new LiteralConstraint( field1,
-                                                  extractor,
-                                                  evaluator );
-        this.constraint2 = new LiteralConstraint( field2,
-                                                  extractor,
-                                                  evaluator );
-        this.constraint3 = new LiteralConstraint( field2,
-                                                  extractor2,
-                                                  evaluator );
+        this.constraint1 = new LiteralConstraint( extractor,
+                                                  evaluator,
+                                                  field1 );
+        this.constraint2 = new LiteralConstraint( extractor,
+                                                  evaluator,
+                                                  field2 );
+        this.constraint3 = new LiteralConstraint( extractor2,
+                                                  evaluator,
+                                                  field2 );
 
         this.alphaNode1 = new AlphaNode( 2,
                                          this.constraint1,

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeTest.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeTest.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -86,9 +86,9 @@
 
         final Evaluator evaluator = EvaluatorFactory.getEvaluator( Evaluator.OBJECT_TYPE,
                                                                    Evaluator.EQUAL );
-        final LiteralConstraint constraint = new LiteralConstraint( field,
-                                                                    extractor,
-                                                                    evaluator );
+        final LiteralConstraint constraint = new LiteralConstraint( extractor,
+                                                                    evaluator,
+                                                                    field );
 
         // With Memory
         final AlphaNode alphaNode = new AlphaNode( 2,
@@ -171,9 +171,9 @@
 
         final Evaluator evaluator = EvaluatorFactory.getEvaluator( Evaluator.OBJECT_TYPE,
                                                                    Evaluator.EQUAL );
-        final LiteralConstraint constraint = new LiteralConstraint( field,
-                                                                    extractor,
-                                                                    evaluator );
+        final LiteralConstraint constraint = new LiteralConstraint( extractor,
+                                                                    evaluator,
+                                                                    field );
 
         final AlphaNode alphaNode = new AlphaNode( 2,
                                                    constraint,
@@ -233,9 +233,9 @@
 
         final Evaluator evaluator = EvaluatorFactory.getEvaluator( Evaluator.OBJECT_TYPE,
                                                                    Evaluator.EQUAL );
-        final LiteralConstraint constraint = new LiteralConstraint( field,
-                                                                    extractor,
-                                                                    evaluator );
+        final LiteralConstraint constraint = new LiteralConstraint( extractor,
+                                                                    evaluator,
+                                                                    field );
 
         final AlphaNode alphaNode = new AlphaNode( 2,
                                                    constraint,
@@ -315,9 +315,9 @@
 
         final Evaluator evaluator = EvaluatorFactory.getEvaluator( Evaluator.OBJECT_TYPE,
                                                                    Evaluator.EQUAL );
-        final LiteralConstraint constraint = new LiteralConstraint( field,
-                                                                    extractor,
-                                                                    evaluator );
+        final LiteralConstraint constraint = new LiteralConstraint( extractor,
+                                                                    evaluator,
+                                                                    field );
 
         final AlphaNode alphaNode = new AlphaNode( 2,
                                                    constraint,

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/HashedObjectSinkListTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/HashedObjectSinkListTest.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/HashedObjectSinkListTest.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -167,15 +167,15 @@
 
         final Evaluator evaluator = EvaluatorFactory.getEvaluator( Evaluator.OBJECT_TYPE,
                                                                    Evaluator.EQUAL );
-        final LiteralConstraint constraint1 = new LiteralConstraint( field1,
-                                                                     extractor,
-                                                                     evaluator );
-        final LiteralConstraint constraint2 = new LiteralConstraint( field2,
-                                                                     extractor,
-                                                                     evaluator );
-        final LiteralConstraint constraint3 = new LiteralConstraint( field2,
-                                                                     extractor2,
-                                                                     evaluator );
+        final LiteralConstraint constraint1 = new LiteralConstraint( extractor,
+                                                                     evaluator,
+                                                                     field1 );
+        final LiteralConstraint constraint2 = new LiteralConstraint( extractor,
+                                                                     evaluator,
+                                                                     field2 );
+        final LiteralConstraint constraint3 = new LiteralConstraint( extractor2,
+                                                                     evaluator,
+                                                                     field2 );
 
         final AlphaNode alphaNode1 = new AlphaNode( 2,
                                                     constraint1,

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -53,9 +53,9 @@
 
         final Evaluator evaluator = EvaluatorFactory.getEvaluator( Evaluator.STRING_TYPE,
                                                                    Evaluator.EQUAL );
-        LiteralConstraint constraint = new LiteralConstraint( field,
-                                                              extractor,
-                                                              evaluator );
+        LiteralConstraint constraint = new LiteralConstraint( extractor,
+                                                              evaluator,
+                                                              field );
 
         AlphaNode alphaNode = new AlphaNode( 2,
                                              constraint,
@@ -77,9 +77,9 @@
 
         field = new MockField( "stilton" );
 
-        constraint = new LiteralConstraint( field,
-                                            extractor,
-                                            evaluator );
+        constraint = new LiteralConstraint( extractor,
+                                            evaluator,
+                                            field );
 
         alphaNode = new AlphaNode( 5,
                                    constraint,

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/FieldConstraintTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/FieldConstraintTest.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/FieldConstraintTest.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -67,9 +67,9 @@
 
         final Evaluator evaluator = EvaluatorFactory.getEvaluator( Evaluator.OBJECT_TYPE,
                                                                    Evaluator.EQUAL );
-        final LiteralConstraint constraint = new LiteralConstraint( field,
-                                                                    extractor,
-                                                                    evaluator );
+        final LiteralConstraint constraint = new LiteralConstraint( extractor,
+                                                                    evaluator,
+                                                                    field );
 
         final Cheese cheddar = new Cheese( "cheddar",
                                            5 );

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/OrTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/OrTest.java	2006-07-20 14:47:34 UTC (rev 5191)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/OrTest.java	2006-07-20 14:48:11 UTC (rev 5192)
@@ -393,9 +393,9 @@
         final FieldExtractor extractor = new ClassFieldExtractor( clazz,
                                                                   fieldName );
 
-        return new LiteralConstraint( field,
-                                      extractor,
-                                      evaluator );
+        return new LiteralConstraint( extractor,
+                                      evaluator,
+                                      field );
     }
 
     private FieldConstraint getBoundVariableConstraint(final Column column,
@@ -407,7 +407,7 @@
         final FieldExtractor extractor = new ClassFieldExtractor( clazz,
                                                                   fieldName );
 
-        return new BoundVariableConstraint( extractor,
+        return new VariableConstraint( extractor,
                                             declaration,
                                             evaluator );
     }




More information about the jboss-svn-commits mailing list