[jboss-svn-commits] JBL Code SVN: r7158 - in labs/jbossrules/trunk/drools-core/src/main/java/org/drools: base/evaluators common spi util

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Oct 26 21:12:50 EDT 2006


Author: tirelli
Date: 2006-10-26 21:12:32 -0400 (Thu, 26 Oct 2006)
New Revision: 7158

Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ArrayFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BigDecimalFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BigIntegerFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BooleanFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ByteFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CharacterFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DateFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DoubleFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FactTemplateFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FloatFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/IntegerFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/LongFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ObjectFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ShortFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/StringFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Evaluator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHandleIndexHashTable.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleIndexHashTable.java
Log:
JBRULES-527: adding primitive support to indexing

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ArrayFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ArrayFactory.java	2006-10-27 01:03:45 UTC (rev 7157)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ArrayFactory.java	2006-10-27 01:12:32 UTC (rev 7158)
@@ -101,9 +101,21 @@
             return ((ObjectVariableContextEntry) context).left.equals( value );
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final Object value1 = extractor.getValue( object1 );
+            final Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.equals( value2 );
+        }
+
         public String toString() {
             return "Array ==";
         }
+
     }
 
     static class ArrayNotEqualEvaluator extends BaseEvaluator {
@@ -124,7 +136,7 @@
             final Object value1 = extractor.getValue( object1 );
             final Object value2 = object2.getValue();
             if ( value1 == null ) {
-                return value2 == null;
+                return value2 != null;
             }
             return !value1.equals( value2 );
         }
@@ -133,7 +145,7 @@
                                            final Object left) {
             final Object value = context.declaration.getExtractor().getValue( left );
             if ( value == null ) {
-                return ((ObjectVariableContextEntry) context).right == null;
+                return ((ObjectVariableContextEntry) context).right != null;
             }
             return !value.equals( ((ObjectVariableContextEntry) context).right );
         }
@@ -142,11 +154,22 @@
                                           final Object right) {
             final Object value = context.extractor.getValue( right );
             if ( ((ObjectVariableContextEntry) context).left == null ) {
-                return value == null;
+                return value != null;
             }
             return !((ObjectVariableContextEntry) context).left.equals( value );
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final Object value1 = extractor.getValue( object1 );
+            final Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            return !value1.equals( value2 );
+        }
+
         public String toString() {
             return "Array !=";
         }
@@ -169,36 +192,36 @@
                                 final FieldValue object2) {
             final Object value = object2.getValue();
             final Object[] array = (Object[]) extractor.getValue( object1 );
-
-            if ( Arrays.binarySearch( array,
-                                      value ) == -1 ) {
-                return false;
-            }
-            return true;
+            return Arrays.binarySearch( array,
+                                        value ) != -1;
         }
 
         public boolean evaluateCachedRight(final VariableContextEntry context,
                                            final Object left) {
             final Object value = context.declaration.getExtractor().getValue( left );
             final Object[] array = (Object[]) ((ObjectVariableContextEntry) context).right;
-            if ( Arrays.binarySearch( array,
-                                      value ) == -1 ) {
-                return false;
-            }
-            return true;
+            return Arrays.binarySearch( array,
+                                        value ) != -1;
         }
 
         public boolean evaluateCachedLeft(final VariableContextEntry context,
                                           final Object right) {
             final Object value = ((ObjectVariableContextEntry) context).left;
             final Object[] array = (Object[]) context.extractor.getValue( right );
-            if ( Arrays.binarySearch( array,
-                                      value ) == -1 ) {
-                return false;
-            }
-            return true;
+            return Arrays.binarySearch( array,
+                                        value ) != -1;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final Object value = extractor.getValue( object2 );
+            final Object[] array = (Object[]) extractor.getValue( object1 );
+
+            return Arrays.binarySearch( array,
+                                        value ) != -1 ; 
+        }
+
         public String toString() {
             return "Array contains";
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BigDecimalFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BigDecimalFactory.java	2006-10-27 01:03:45 UTC (rev 7157)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BigDecimalFactory.java	2006-10-27 01:12:32 UTC (rev 7158)
@@ -103,9 +103,21 @@
             return ((ObjectVariableContextEntry) context).left.equals( value );
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final Object value1 = extractor.getValue( object1 );
+            final Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.equals( value2 );
+        }
+
         public String toString() {
             return "BigDecimal ==";
         }
+
     }
 
     static class BigDecimalNotEqualEvaluator extends BaseEvaluator {
@@ -149,6 +161,17 @@
             return !((ObjectVariableContextEntry) context).left.equals( value );
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final Object value1 = extractor.getValue( object1 );
+            final Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            return !value1.equals( value2 );
+        }
+
         public String toString() {
             return "BigDecimal !=";
         }
@@ -185,6 +208,13 @@
             return comp.compareTo( ((ObjectVariableContextEntry) context).left ) < 0;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final BigDecimal comp = (BigDecimal) extractor.getValue( object1 );
+            return comp.compareTo( extractor.getValue( object2 ) ) < 0;
+        }
+        
         public String toString() {
             return "BigDecimal <";
         }
@@ -221,6 +251,13 @@
             return comp.compareTo( ((ObjectVariableContextEntry) context).left ) <= 0;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final BigDecimal comp = (BigDecimal) extractor.getValue( object1 );
+            return comp.compareTo( extractor.getValue( object2 ) ) <= 0;
+        }
+        
         public String toString() {
             return "BigDecimal <=";
         }
@@ -257,6 +294,13 @@
             return comp.compareTo( ((ObjectVariableContextEntry) context).left ) > 0;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final BigDecimal comp = (BigDecimal) extractor.getValue( object1 );
+            return comp.compareTo( extractor.getValue( object2 ) ) > 0;
+        }
+        
         public String toString() {
             return "BigDecimal >";
         }
@@ -293,6 +337,13 @@
             return comp.compareTo( ((ObjectVariableContextEntry) context).left ) >= 0;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final BigDecimal comp = (BigDecimal) extractor.getValue( object1 );
+            return comp.compareTo( extractor.getValue( object2 ) ) >= 0;
+        }
+        
         public String toString() {
             return "BigDecimal >=";
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BigIntegerFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BigIntegerFactory.java	2006-10-27 01:03:45 UTC (rev 7157)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BigIntegerFactory.java	2006-10-27 01:12:32 UTC (rev 7158)
@@ -103,6 +103,17 @@
             return ((ObjectVariableContextEntry) context).left.equals( value );
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final Object value1 = extractor.getValue( object1 );
+            final Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.equals( value2 );
+        }
+        
         public String toString() {
             return "BigInteger ==";
         }
@@ -149,6 +160,17 @@
             return !((ObjectVariableContextEntry) context).left.equals( value );
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final Object value1 = extractor.getValue( object1 );
+            final Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.equals( value2 );
+        }
+        
         public String toString() {
             return "BigInteger !=";
         }
@@ -185,6 +207,13 @@
             return comp.compareTo( ((ObjectVariableContextEntry) context).left ) < 0;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final BigInteger comp = (BigInteger) extractor.getValue( object1 );
+            return comp.compareTo( extractor.getValue( object2 ) ) < 0;
+        }
+        
         public String toString() {
             return "BigInteger <";
         }
@@ -221,6 +250,13 @@
             return comp.compareTo( ((ObjectVariableContextEntry) context).left ) <= 0;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final BigInteger comp = (BigInteger) extractor.getValue( object1 );
+            return comp.compareTo( extractor.getValue( object2 ) ) <= 0;
+        }
+        
         public String toString() {
             return "BigInteger <=";
         }
@@ -257,6 +293,13 @@
             return comp.compareTo( ((ObjectVariableContextEntry) context).left ) > 0;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final BigInteger comp = (BigInteger) extractor.getValue( object1 );
+            return comp.compareTo( extractor.getValue( object2 ) ) > 0;
+        }
+        
         public String toString() {
             return "BigInteger >";
         }
@@ -293,6 +336,13 @@
             return comp.compareTo( ((ObjectVariableContextEntry) context).left ) >= 0;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final BigInteger comp = (BigInteger) extractor.getValue( object1 );
+            return comp.compareTo( extractor.getValue( object2 ) ) >= 0;
+        }
+        
         public String toString() {
             return "BigInteger >=";
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BooleanFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BooleanFactory.java	2006-10-27 01:03:45 UTC (rev 7157)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BooleanFactory.java	2006-10-27 01:12:32 UTC (rev 7158)
@@ -80,9 +80,16 @@
             return context.extractor.getBooleanValue( object2 ) == ((BooleanVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getBooleanValue( object1 ) == extractor.getBooleanValue( object2 );
+        }
+
         public String toString() {
             return "Boolean ==";
         }
+
     }
 
     static class BooleanNotEqualEvaluator extends BaseEvaluator {
@@ -113,6 +120,12 @@
             return context.extractor.getBooleanValue( object2 ) != ((BooleanVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getBooleanValue( object1 ) != extractor.getBooleanValue( object2 );
+        }
+
         public String toString() {
             return "Boolean !=";
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ByteFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ByteFactory.java	2006-10-27 01:03:45 UTC (rev 7157)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ByteFactory.java	2006-10-27 01:12:32 UTC (rev 7158)
@@ -88,9 +88,16 @@
             return ((LongVariableContextEntry) context).left == context.extractor.getByteValue( right );
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getByteValue( object1 ) == extractor.getByteValue( object2 );
+        }
+
         public String toString() {
             return "Byte ==";
         }
+
     }
 
     static class ByteNotEqualEvaluator extends BaseEvaluator {
@@ -121,6 +128,12 @@
             return ((LongVariableContextEntry) context).left != context.extractor.getByteValue( right );
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getByteValue( object1 ) != extractor.getByteValue( object2 );
+        }
+
         public String toString() {
             return "Byte !=";
         }
@@ -154,6 +167,12 @@
             return context.extractor.getByteValue( right ) < ((LongVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getByteValue( object1 ) < extractor.getByteValue( object2 );
+        }
+
         public String toString() {
             return "Byte <";
         }
@@ -187,6 +206,12 @@
             return context.extractor.getByteValue( right ) <= ((LongVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getByteValue( object1 ) <= extractor.getByteValue( object2 );
+        }
+
         public String toString() {
             return "Byte <=";
         }
@@ -220,6 +245,12 @@
             return context.extractor.getByteValue( right ) > ((LongVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getByteValue( object1 ) > extractor.getByteValue( object2 );
+        }
+
         public String toString() {
             return "Byte >";
         }
@@ -253,6 +284,12 @@
             return context.extractor.getByteValue( right ) >= ((LongVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getByteValue( object1 ) >= extractor.getByteValue( object2 );
+        }
+
         public String toString() {
             return "Byte >=";
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CharacterFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CharacterFactory.java	2006-10-27 01:03:45 UTC (rev 7157)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CharacterFactory.java	2006-10-27 01:12:32 UTC (rev 7158)
@@ -88,6 +88,12 @@
             return ((LongVariableContextEntry) context).left == context.extractor.getCharValue( right );
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getCharValue( object1 ) == extractor.getCharValue( object2 );
+        }
+
         public String toString() {
             return "Character ==";
         }
@@ -121,6 +127,12 @@
             return ((LongVariableContextEntry) context).left != context.extractor.getCharValue( right );
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getCharValue( object1 ) != extractor.getCharValue( object2 );
+        }
+
         public String toString() {
             return "Character !=";
         }
@@ -154,6 +166,12 @@
             return context.extractor.getCharValue( right ) <((LongVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getCharValue( object1 ) < extractor.getCharValue( object2 );
+        }
+
         public String toString() {
             return "Character <";
         }
@@ -187,6 +205,12 @@
             return context.extractor.getCharValue( right ) <= ((LongVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getCharValue( object1 ) <= extractor.getCharValue( object2 );
+        }
+
         public String toString() {
             return "Character <=";
         }
@@ -220,6 +244,12 @@
             return context.extractor.getCharValue( right ) > ((LongVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getCharValue( object1 ) > extractor.getCharValue( object2 );
+        }
+
         public String toString() {
             return "Character >";
         }
@@ -253,6 +283,12 @@
             return context.extractor.getCharValue( right ) >= ((LongVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getCharValue( object1 ) >= extractor.getCharValue( object2 );
+        }
+
         public String toString() {
             return "Character >=";
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DateFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DateFactory.java	2006-10-27 01:03:45 UTC (rev 7157)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DateFactory.java	2006-10-27 01:12:32 UTC (rev 7158)
@@ -131,9 +131,21 @@
             return value1.compareTo( getRightDate( value2 ) ) == 0;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final Date value1 = (Date) extractor.getValue( object1 );
+            final Date value2 = (Date) extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.compareTo( value2 ) == 0;
+        }
+
         public String toString() {
             return "Date ==";
         }
+
     }
 
     static class DateNotEqualEvaluator extends BaseEvaluator {
@@ -188,6 +200,17 @@
             return value1.compareTo( getRightDate( value2 ) ) != 0;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final Date value1 = (Date) extractor.getValue( object1 );
+            final Date value2 = (Date) extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.compareTo( value2 ) != 0;
+        }
+
         public String toString() {
             return "Date !=";
         }
@@ -227,6 +250,17 @@
             return getRightDate( value2 ).compareTo( value1 ) < 0;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final Date value1 = (Date) extractor.getValue( object1 );
+            final Date value2 = (Date) extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.compareTo( value2 ) < 0;
+        }
+
         public String toString() {
             return "Date <";
         }
@@ -266,6 +300,17 @@
             return getRightDate( value2 ).compareTo( value1 ) <= 0;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final Date value1 = (Date) extractor.getValue( object1 );
+            final Date value2 = (Date) extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.compareTo( value2 ) <= 0;
+        }
+
         public String toString() {
             return "Date <=";
         }
@@ -305,6 +350,17 @@
             return getRightDate( value2 ).compareTo( value1 ) > 0;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final Date value1 = (Date) extractor.getValue( object1 );
+            final Date value2 = (Date) extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.compareTo( value2 ) > 0;
+        }
+
         public String toString() {
             return "Date >";
         }
@@ -344,6 +400,17 @@
             return getRightDate( value2 ).compareTo( value1 ) >= 0;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final Date value1 = (Date) extractor.getValue( object1 );
+            final Date value2 = (Date) extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.compareTo( value2 ) >= 0;
+        }
+
         public String toString() {
             return "Date >=";
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DoubleFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DoubleFactory.java	2006-10-27 01:03:45 UTC (rev 7157)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DoubleFactory.java	2006-10-27 01:12:32 UTC (rev 7158)
@@ -91,6 +91,13 @@
             return ((DoubleVariableContextEntry) context).left == context.extractor.getDoubleValue( right );
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getDoubleValue( object1 ) == extractor.getDoubleValue( object2 );
+        }
+
         public String toString() {
             return "Double ==";
         }
@@ -127,6 +134,13 @@
             return ((DoubleVariableContextEntry) context).left != context.extractor.getDoubleValue( right );
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getDoubleValue( object1 ) != extractor.getDoubleValue( object2 );
+        }
+
         public String toString() {
             return "Double !=";
         }
@@ -163,6 +177,13 @@
             return context.extractor.getDoubleValue( right ) < ((DoubleVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getDoubleValue( object1 ) < extractor.getDoubleValue( object2 );
+        }
+
         public String toString() {
             return "Double <";
         }
@@ -199,6 +220,13 @@
             return context.extractor.getDoubleValue( right ) <= ((DoubleVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getDoubleValue( object1 ) <= extractor.getDoubleValue( object2 );
+        }
+
         public String toString() {
             return "Double <=";
         }
@@ -235,6 +263,13 @@
             return context.extractor.getDoubleValue( right ) > ((DoubleVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getDoubleValue( object1 ) > extractor.getDoubleValue( object2 );
+        }
+
         public String toString() {
             return "Double >";
         }
@@ -271,6 +306,13 @@
             return context.extractor.getDoubleValue( right ) >= ((DoubleVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getDoubleValue( object1 ) >= extractor.getDoubleValue( object2 );
+        }
+
         public String toString() {
             return "Double >=";
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FactTemplateFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FactTemplateFactory.java	2006-10-27 01:03:45 UTC (rev 7157)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FactTemplateFactory.java	2006-10-27 01:12:32 UTC (rev 7158)
@@ -82,17 +82,6 @@
             return value1.equals( value2 );
         }
 
-        public boolean evaluate(final FieldValue object1,
-                                final Extractor extractor,
-                                final Object object2) {
-            final Object value1 = object1.getValue();
-            final Object value2 = extractor.getValue( object2 );
-            if ( value1 == null ) {
-                return value2 == null;
-            }
-            return value1.equals( value2 );
-        }
-
         public boolean evaluateCachedRight(final VariableContextEntry context,
                                            final Object left) {
             final Object value = context.declaration.getExtractor().getValue( left );
@@ -111,9 +100,21 @@
             return ((ObjectVariableContextEntry) context).left.equals( value );
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final Object value1 = extractor.getValue( object1 );
+            final Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.equals( value2 );
+        }
+
         public String toString() {
             return "FactTemplate ==";
         }
+
     }
 
     static class FactTemplateNotEqualEvaluator extends BaseEvaluator {
@@ -139,17 +140,6 @@
             return !value1.equals( value2 );
         }
 
-        public boolean evaluate(final FieldValue object1,
-                                final Extractor extractor,
-                                final Object object2) {
-            final Object value1 = object1.getValue();
-            final Object value2 = extractor.getValue( object2 );
-            if ( value1 == null ) {
-                return value2 != null;
-            }
-            return !value1.equals( value2 );
-        }
-
         public boolean evaluateCachedRight(final VariableContextEntry context,
                                            final Object left) {
             final Object value = context.declaration.getExtractor().getValue( left );
@@ -168,6 +158,17 @@
             return !((ObjectVariableContextEntry) context).left.equals( value );
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final Object value1 = extractor.getValue( object1 );
+            final Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            return !value1.equals( value2 );
+        }
+
         public String toString() {
             return "FactTemplate !=";
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FloatFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FloatFactory.java	2006-10-27 01:03:45 UTC (rev 7157)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FloatFactory.java	2006-10-27 01:12:32 UTC (rev 7158)
@@ -89,6 +89,13 @@
             return ((DoubleVariableContextEntry) context).left == context.extractor.getFloatValue( right );
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getFloatValue( object1 ) == extractor.getFloatValue( object2 );
+        }
+
         public String toString() {
             return "Float ==";
         }
@@ -125,6 +132,13 @@
             return ((DoubleVariableContextEntry) context).left != context.extractor.getFloatValue( right );
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getFloatValue( object1 ) != extractor.getFloatValue( object2 );
+        }
+
         public String toString() {
             return "Float !=";
         }
@@ -161,6 +175,13 @@
             return context.extractor.getFloatValue( right ) < ((DoubleVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getFloatValue( object1 ) < extractor.getFloatValue( object2 );
+        }
+
         public String toString() {
             return "Float <";
         }
@@ -197,6 +218,13 @@
             return context.extractor.getFloatValue( right ) <= ((DoubleVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getFloatValue( object1 ) <= extractor.getFloatValue( object2 );
+        }
+
         public String toString() {
             return "Float <=";
         }
@@ -233,6 +261,13 @@
             return context.extractor.getFloatValue( right ) > ((DoubleVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getFloatValue( object1 ) > extractor.getFloatValue( object2 );
+        }
+
         public String toString() {
             return "Float >";
         }
@@ -269,6 +304,13 @@
             return context.extractor.getFloatValue( right ) >= ((DoubleVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getFloatValue( object1 ) >= extractor.getFloatValue( object2 );
+        }
+
         public String toString() {
             return "Float >=";
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/IntegerFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/IntegerFactory.java	2006-10-27 01:03:45 UTC (rev 7157)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/IntegerFactory.java	2006-10-27 01:12:32 UTC (rev 7158)
@@ -88,6 +88,12 @@
             return context.extractor.getIntValue( object2 ) == ((LongVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getIntValue( object1 ) == extractor.getIntValue( object2 );
+        }
+
         public String toString() {
             return "Integer ==";
         }
@@ -122,6 +128,12 @@
             return context.extractor.getIntValue( object2 ) != ((LongVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getIntValue( object1 ) != extractor.getIntValue( object2 );
+        }
+
         public String toString() {
             return "Integer !=";
         }
@@ -155,6 +167,12 @@
             return context.extractor.getIntValue( right ) < ((LongVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getIntValue( object1 ) < extractor.getIntValue( object2 );
+        }
+
         public String toString() {
             return "Integer <";
         }
@@ -188,6 +206,12 @@
             return context.extractor.getIntValue( right ) <= ((LongVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getIntValue( object1 ) <= extractor.getIntValue( object2 );
+        }
+
         public String toString() {
             return "Integer <=";
         }
@@ -221,6 +245,12 @@
             return context.extractor.getIntValue( right ) > ((LongVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getIntValue( object1 ) > extractor.getIntValue( object2 );
+        }
+
         public String toString() {
             return "Integer >";
         }
@@ -254,6 +284,12 @@
             return context.extractor.getIntValue( right ) >= ((LongVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getIntValue( object1 ) >= extractor.getIntValue( object2 );
+        }
+
         public String toString() {
             return "Integer >=";
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/LongFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/LongFactory.java	2006-10-27 01:03:45 UTC (rev 7157)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/LongFactory.java	2006-10-27 01:12:32 UTC (rev 7158)
@@ -88,6 +88,12 @@
             return ((LongVariableContextEntry) context).left == context.extractor.getLongValue( right );
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getLongValue( object1 ) == extractor.getLongValue( object2 );
+        }
+
         public String toString() {
             return "Long ==";
         }
@@ -121,6 +127,12 @@
             return ((LongVariableContextEntry) context).left != context.extractor.getLongValue( right );
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getLongValue( object1 ) != extractor.getLongValue( object2 );
+        }
+
         public String toString() {
             return "Long !=";
         }
@@ -154,6 +166,12 @@
             return context.extractor.getLongValue( right ) < ((LongVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getLongValue( object1 ) < extractor.getLongValue( object2 );
+        }
+
         public String toString() {
             return "Long <";
         }
@@ -187,6 +205,12 @@
             return context.extractor.getLongValue( right ) <= ((LongVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getLongValue( object1 ) <= extractor.getLongValue( object2 );
+        }
+
         public String toString() {
             return "Long <=";
         }
@@ -220,6 +244,12 @@
             return context.extractor.getLongValue( right ) > ((LongVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getLongValue( object1 ) > extractor.getLongValue( object2 );
+        }
+
         public String toString() {
             return "Long >";
         }
@@ -253,6 +283,12 @@
             return context.extractor.getLongValue( right ) >= ((LongVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getLongValue( object1 ) >= extractor.getLongValue( object2 );
+        }
+
         public String toString() {
             return "Long >=";
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ObjectFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ObjectFactory.java	2006-10-27 01:03:45 UTC (rev 7157)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ObjectFactory.java	2006-10-27 01:12:32 UTC (rev 7158)
@@ -118,6 +118,17 @@
             return ((ObjectVariableContextEntry) context).left.equals( value );
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final Object value1 = extractor.getValue( object1 );
+            final Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.equals( value2 );
+        }
+
         public String toString() {
             return "Object ==";
         }
@@ -165,6 +176,17 @@
             return !((ObjectVariableContextEntry) context).left.equals( value );
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final Object value1 = extractor.getValue( object1 );
+            final Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            return !value1.equals( value2 );
+        }
+
         public String toString() {
             return "Object !=";
         }
@@ -198,6 +220,13 @@
             return comp.compareTo( ((ObjectVariableContextEntry) context).left ) < 0;
         }
 
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final Object object2) {
+            final Comparable comp = (Comparable) extractor.getValue( object1 );
+            return comp.compareTo( extractor.getValue( object2 ) ) < 0;
+        }
+
         public String toString() {
             return "Object <";
         }
@@ -234,6 +263,13 @@
             return comp.compareTo( ((ObjectVariableContextEntry) context).left ) <= 0;
         }
 
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final Object object2) {
+            final Comparable comp = (Comparable) extractor.getValue( object1 );
+            return comp.compareTo( extractor.getValue( object2 ) ) <= 0;
+        }
+
         public String toString() {
             return "Object <=";
         }
@@ -270,6 +306,13 @@
             return comp.compareTo( ((ObjectVariableContextEntry) context).left ) > 0;
         }
 
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final Object object2) {
+            final Comparable comp = (Comparable) extractor.getValue( object1 );
+            return comp.compareTo( extractor.getValue( object2 ) ) > 0;
+        }
+
         public String toString() {
             return "Object >";
         }
@@ -306,6 +349,13 @@
             return comp.compareTo( ((ObjectVariableContextEntry) context).left ) >= 0;
         }
 
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final Object object2) {
+            final Comparable comp = (Comparable) extractor.getValue( object1 );
+            return comp.compareTo( extractor.getValue( object2 ) ) >= 0;
+        }
+
         public String toString() {
             return "Object >=";
         }
@@ -345,6 +395,14 @@
             return col.contains( value );
         }
 
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final Object object2) {
+            final Object value = extractor.getValue( object2 );
+            final Collection col = (Collection) extractor.getValue( object1 );
+            return col.contains( value );
+        }
+
         public String toString() {
             return "Object contains";
         }
@@ -384,6 +442,14 @@
             return !col.contains( value );
         }
 
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final Object object2) {
+            final Object value = extractor.getValue( object2 );
+            final Collection col = (Collection) extractor.getValue( object1 );
+            return !col.contains( value );
+        }
+
         public String toString() {
             return "Object excludes";
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ShortFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ShortFactory.java	2006-10-27 01:03:45 UTC (rev 7157)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ShortFactory.java	2006-10-27 01:12:32 UTC (rev 7158)
@@ -88,6 +88,12 @@
             return ((LongVariableContextEntry) context).left == context.extractor.getShortValue( right );
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getShortValue( object1 ) == extractor.getShortValue( object2 );
+        }
+
         public String toString() {
             return "Short ==";
         }
@@ -121,6 +127,12 @@
             return ((LongVariableContextEntry) context).left != context.extractor.getShortValue( right );
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getShortValue( object1 ) != extractor.getShortValue( object2 );
+        }
+
         public String toString() {
             return "Short !=";
         }
@@ -154,6 +166,12 @@
             return  context.extractor.getShortValue( right ) < ((LongVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getShortValue( object1 ) < extractor.getShortValue( object2 );
+        }
+
         public String toString() {
             return "Short <";
         }
@@ -187,6 +205,12 @@
             return  context.extractor.getShortValue( right ) <= ((LongVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getShortValue( object1 ) <= extractor.getShortValue( object2 );
+        }
+
         public String toString() {
             return "Boolean <=";
         }
@@ -220,6 +244,12 @@
             return context.extractor.getShortValue( right ) > ((LongVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getShortValue( object1 ) > extractor.getShortValue( object2 );
+        }
+
         public String toString() {
             return "Short >";
         }
@@ -253,6 +283,12 @@
             return context.extractor.getShortValue( right ) >= ((LongVariableContextEntry) context).left;
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            return extractor.getShortValue( object1 ) >= extractor.getShortValue( object2 );
+        }
+
         public String toString() {
             return "Short >=";
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/StringFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/StringFactory.java	2006-10-27 01:03:45 UTC (rev 7157)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/StringFactory.java	2006-10-27 01:12:32 UTC (rev 7158)
@@ -102,9 +102,21 @@
             return ((ObjectVariableContextEntry) context).left.equals( value );
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final Object value1 = extractor.getValue( object1 );
+            final Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.equals( value2 );
+        }
+
         public String toString() {
             return "String ==";
         }
+
     }
 
     static class StringNotEqualEvaluator extends BaseEvaluator {
@@ -148,6 +160,17 @@
             return !((ObjectVariableContextEntry) context).left.equals( value );
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final Object value1 = extractor.getValue( object1 );
+            final Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            return !value1.equals( value2 );
+        }
+
         public String toString() {
             return "String !=";
         }
@@ -194,6 +217,17 @@
             return value.matches( (String) ((ObjectVariableContextEntry) context).left);
         }
 
+        public boolean evaluate(Extractor extractor,
+                                Object object1,
+                                Object object2) {
+            final Object value1 = extractor.getValue( object1 );
+            final Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return false;
+            }
+            return ((String) value1).matches( (String) value2 );
+        }
+
         public String toString() {
             return "String !=";
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java	2006-10-27 01:03:45 UTC (rev 7157)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java	2006-10-27 01:12:32 UTC (rev 7158)
@@ -185,7 +185,8 @@
                 final Constraint constraint = (Constraint) entry.getObject();
                 final VariableConstraint variableConstraint = (VariableConstraint) constraint;
                 final FieldIndex index = new FieldIndex( variableConstraint.getFieldExtractor(),
-                                                         variableConstraint.getRequiredDeclarations()[0] );
+                                                         variableConstraint.getRequiredDeclarations()[0],
+                                                         variableConstraint.getEvaluator());
                 list.add( index );
                 entry = (LinkedListEntry) entry.getNext();
             }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Evaluator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Evaluator.java	2006-10-27 01:03:45 UTC (rev 7157)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Evaluator.java	2006-10-27 01:12:32 UTC (rev 7158)
@@ -46,6 +46,10 @@
     public boolean evaluate(Extractor extractor,
                             Object object1,
                             FieldValue value);
+    
+    public boolean evaluate(Extractor extractor,
+                            Object object1,
+                            Object object2);
 
     public boolean evaluateCachedLeft(VariableContextEntry context,
                                       Object object1);

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java	2006-10-27 01:03:45 UTC (rev 7157)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java	2006-10-27 01:12:32 UTC (rev 7158)
@@ -8,6 +8,7 @@
 import org.drools.common.InternalFactHandle;
 import org.drools.reteoo.ReteTuple;
 import org.drools.rule.Declaration;
+import org.drools.spi.Evaluator;
 import org.drools.spi.FieldExtractor;
 
 public abstract class AbstractHashTable
@@ -72,7 +73,7 @@
                 next = entry.getNext();
 
                 final int index = indexOf( entry.hashCode(),
-                                     newTable.length );
+                                           newTable.length );
                 entry.setNext( newTable[index] );
                 newTable[index] = entry;
 
@@ -179,7 +180,9 @@
 
     public abstract Entry getBucket(Object object);
 
-    public interface ObjectComparator extends Serializable {
+    public interface ObjectComparator
+        extends
+        Serializable {
         public int hashCodeOf(Object object);
 
         public int rehash(int hashCode);
@@ -242,6 +245,8 @@
     public static class InstanceEquals
         implements
         ObjectComparator {
+
+        private static final long serialVersionUID = 1835792402650440794L;
         public static ObjectComparator INSTANCE = new InstanceEquals();
 
         public static ObjectComparator getInstance() {
@@ -273,6 +278,8 @@
     public static class EqualityEquals
         implements
         ObjectComparator {
+
+        private static final long serialVersionUID = 8004812231695147987L;
         public static ObjectComparator INSTANCE = new EqualityEquals();
 
         public static ObjectComparator getInstance() {
@@ -297,9 +304,9 @@
 
         public boolean equal(final Object object1,
                              final Object object2) {
-        	if ( object1 == null ) {
-        		return object2 == null;
-        	}
+            if ( object1 == null ) {
+                return object2 == null;
+            }
             return object1.equals( object2 );
         }
     }
@@ -307,6 +314,9 @@
     public static class FactEntry
         implements
         Entry {
+
+        private static final long serialVersionUID = 1776798977330980128L;
+
         public InternalFactHandle handle;
 
         public int                hashCode;
@@ -356,13 +366,15 @@
             return (object == this) || (this.handle == ((FactEntry) object).handle);
         }
     }
-    
+
     public static class FieldIndex {
         public FieldExtractor extractor;
         public Declaration    declaration;
+        public Evaluator      evaluator;
 
         public FieldIndex(final FieldExtractor extractor,
-                          final Declaration declaration) {
+                          final Declaration declaration,
+                          final Evaluator evaluator) {
             super();
             this.extractor = extractor;
             this.declaration = declaration;
@@ -375,8 +387,12 @@
         public FieldExtractor getExtractor() {
             return this.extractor;
         }
+
+        public Evaluator getEvaluator() {
+            return this.evaluator;
+        }
     }
-    
+
     public static interface Index {
         public int hashCodeOf(ReteTuple tuple);
 
@@ -387,200 +403,176 @@
 
         public boolean equal(ReteTuple tuple1,
                              ReteTuple tuple2);
-        
+
         public boolean equal(Object object1,
-                             Object object2);        
+                             Object object2);
     }
 
     public static class SingleIndex
         implements
         Index {
-        private FieldExtractor   extractor;
-        private Declaration      declaration;
 
-        private int              startResult;
+        private FieldExtractor extractor;
+        private Declaration    declaration;
+        private Evaluator      evaluator;
 
-        private ObjectComparator comparator;
+        private int            startResult;
 
         public SingleIndex(final FieldIndex[] indexes,
-                           final int startResult,
-                           final ObjectComparator comparator) {
+                           final int startResult) {
             this.startResult = startResult;
 
             this.extractor = indexes[0].extractor;
             this.declaration = indexes[0].declaration;
+            this.evaluator = indexes[0].evaluator;
 
-            this.comparator = comparator;
         }
 
         public int hashCodeOf(final Object object) {
             int hashCode = this.startResult;
             hashCode = TupleIndexHashTable.PRIME * hashCode + this.extractor.getHashCode( object );
-            return this.comparator.rehash( hashCode );
+            return rehash( hashCode );
         }
 
         public int hashCodeOf(final ReteTuple tuple) {
             int hashCode = this.startResult;
             hashCode = TupleIndexHashTable.PRIME * hashCode + this.declaration.getHashCode( tuple.get( this.declaration ).getObject() );
-            return this.comparator.rehash( hashCode );
+            return rehash( hashCode );
         }
 
         public boolean equal(final Object object1,
                              final ReteTuple tuple) {
-            final Object value1 = this.extractor.getValue( object1 );
-            final Object value2 = this.declaration.getValue( tuple.get( this.declaration ).getObject() );
+            final Object object2 = tuple.get( this.declaration ).getObject();
 
-            return this.comparator.equal( value1,
-                                          value2 );
+            return this.evaluator.evaluate( this.extractor,
+                                            object1,
+                                            object2 );
         }
-        
+
         public boolean equal(final Object object1,
                              final Object object2) {
 
-            final Object value1 = this.extractor.getValue( object1 );
-            final Object value2 = this.extractor.getValue( object2 );
+            return this.evaluator.evaluate( this.extractor,
+                                            object1,
+                                            object2 );
+        }
 
-            return this.comparator.equal( value1,
-                                          value2 );
-        }        
-
         public boolean equal(final ReteTuple tuple1,
                              final ReteTuple tuple2) {
-            final Object value1 = this.declaration.getValue( tuple1.get( this.declaration ).getObject() );
-            final Object value2 = this.declaration.getValue( tuple2.get( this.declaration ).getObject() );
-            return this.comparator.equal( value1,
-                                          value2 );
+            final Object object1 = tuple1.get( this.declaration ).getObject();
+            final Object object2 = tuple2.get( this.declaration ).getObject();
+            return this.evaluator.evaluate( this.extractor,
+                                            object1,
+                                            object2 );
         }
+
+        public int rehash(int h) {
+            h += ~(h << 9);
+            h ^= (h >>> 14);
+            h += (h << 4);
+            h ^= (h >>> 10);
+            return h;
+        }
+
     }
 
     public static class DoubleCompositeIndex
         implements
         Index {
-        private FieldIndex  index0;
-        private FieldIndex  index1;
+        private FieldIndex index0;
+        private FieldIndex index1;
 
-        private int              startResult;
+        private int        startResult;
 
-        private ObjectComparator comparator;
-
         public DoubleCompositeIndex(final FieldIndex[] indexes,
-                                    final int startResult,
-                                    final ObjectComparator comparator) {
+                                    final int startResult) {
             this.startResult = startResult;
 
             this.index0 = indexes[0];
             this.index1 = indexes[1];
 
-            this.comparator = comparator;
         }
 
         public int hashCodeOf(final Object object) {
             int hashCode = this.startResult;
 
-            int hash = this.index0.extractor.getHashCode( object );
-            hashCode = TupleIndexHashTable.PRIME * hashCode + hash;
+            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index0.extractor.getHashCode( object );
+            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index1.extractor.getHashCode( object );
 
-            hash = this.index1.extractor.getHashCode( object );
-            hashCode = TupleIndexHashTable.PRIME * hashCode + hash;
-
-            return this.comparator.rehash( hashCode );
+            return rehash( hashCode );
         }
 
         public int hashCodeOf(final ReteTuple tuple) {
             int hashCode = this.startResult;
 
             hashCode = TupleIndexHashTable.PRIME * hashCode + this.index0.declaration.getHashCode( tuple.get( this.index0.declaration ).getObject() );
-
             hashCode = TupleIndexHashTable.PRIME * hashCode + this.index1.declaration.getHashCode( tuple.get( this.index1.declaration ).getObject() );
 
-            return this.comparator.rehash( hashCode );
+            return rehash( hashCode );
         }
 
         public boolean equal(final Object object1,
                              final ReteTuple tuple) {
-            Object value1 = this.index0.extractor.getValue( object1 );
-            Object value2 = this.index0.declaration.getValue( tuple.get( this.index0.declaration ).getObject() );
+            Object object12 = tuple.get( this.index0.declaration ).getObject();
+            Object object22 = tuple.get( this.index1.declaration ).getObject();
 
-            if ( !this.comparator.equal( value1,
-                                         value2 ) ) {
-                return false;
-            }
-
-            value1 = this.index1.extractor.getValue( object1 );
-            value2 = this.index1.declaration.getValue( tuple.get( this.index1.declaration ).getObject() );
-
-            if ( !this.comparator.equal( value1,
-                                         value2 ) ) {
-                return false;
-            }
-
-            return true;
+            return this.index0.evaluator.evaluate( this.index0.extractor,
+                                                   object1,
+                                                   object12 ) && this.index1.evaluator.evaluate( this.index1.extractor,
+                                                                                                 object1,
+                                                                                                 object22 );
         }
 
         public boolean equal(final ReteTuple tuple1,
                              final ReteTuple tuple2) {
-            Object value1 = this.index0.declaration.getValue( tuple1.get( this.index0.declaration ).getObject() );
-            Object value2 = this.index0.declaration.getValue( tuple2.get( this.index0.declaration ).getObject() );
+            Object object11 = tuple1.get( this.index0.declaration ).getObject();
+            Object object12 = tuple2.get( this.index0.declaration ).getObject();
 
-            if ( !this.comparator.equal( value1,
-                                         value2 ) ) {
-                return false;
-            }
+            Object object21 = tuple1.get( this.index1.declaration ).getObject();
+            Object object22 = tuple2.get( this.index1.declaration ).getObject();
 
-            value1 = this.index1.declaration.getValue( tuple1.get( this.index1.declaration ).getObject() );
-            value2 = this.index1.declaration.getValue( tuple2.get( this.index1.declaration ).getObject() );
-
-            if ( !this.comparator.equal( value1,
-                                         value2 ) ) {
-                return false;
-            }
-
-            return true;
+            return this.index0.evaluator.evaluate( this.index0.extractor,
+                                                   object11,
+                                                   object12 ) && this.index1.evaluator.evaluate( this.index1.extractor,
+                                                                                                 object21,
+                                                                                                 object22 );
         }
-        
+
         public boolean equal(final Object object1,
                              final Object object2) {
-            Object value1 = this.index0.extractor.getValue( object1 );
-            Object value2 = this.index0.extractor.getValue( object2 );
+            return this.index0.evaluator.evaluate( this.index0.extractor,
+                                                   object1,
+                                                   object2 ) && this.index1.evaluator.evaluate( this.index1.extractor,
+                                                                                                object1,
+                                                                                                object2 );
+        }
 
-            if ( !this.comparator.equal( value1,
-                                         value2 ) ) {
-                return false;
-            }
-
-            value1 = this.index1.extractor.getValue( object1 );
-            value2 = this.index1.extractor.getValue( object2 );
-
-            if ( !this.comparator.equal( value1,
-                                         value2 ) ) {
-                return false;
-            }
-
-            return true;
-        }        
+        public int rehash(int h) {
+            h += ~(h << 9);
+            h ^= (h >>> 14);
+            h += (h << 4);
+            h ^= (h >>> 10);
+            return h;
+        }
     }
 
     public static class TripleCompositeIndex
         implements
         Index {
-        private FieldIndex  index0;
-        private FieldIndex  index1;
-        private FieldIndex  index2;
+        private FieldIndex       index0;
+        private FieldIndex       index1;
+        private FieldIndex       index2;
 
         private int              startResult;
 
-        private ObjectComparator comparator;
-
         public TripleCompositeIndex(final FieldIndex[] indexes,
-                                    final int startResult,
-                                    final ObjectComparator comparator) {
+                                    final int startResult) {
             this.startResult = startResult;
 
             this.index0 = indexes[0];
             this.index1 = indexes[1];
             this.index2 = indexes[2];
 
-            this.comparator = comparator;
         }
 
         public int hashCodeOf(final Object object) {
@@ -590,7 +582,7 @@
             hashCode = TupleIndexHashTable.PRIME * hashCode + this.index1.extractor.getHashCode( object );;
             hashCode = TupleIndexHashTable.PRIME * hashCode + this.index2.extractor.getHashCode( object );;
 
-            return this.comparator.rehash( hashCode );
+            return rehash( hashCode );
         }
 
         public int hashCodeOf(final ReteTuple tuple) {
@@ -600,94 +592,60 @@
             hashCode = TupleIndexHashTable.PRIME * hashCode + this.index1.declaration.getHashCode( tuple.get( this.index1.declaration ).getObject() );
             hashCode = TupleIndexHashTable.PRIME * hashCode + this.index2.declaration.getHashCode( tuple.get( this.index2.declaration ).getObject() );
 
-            return this.comparator.rehash( hashCode );
+            return rehash( hashCode );
         }
 
         public boolean equal(final Object object1,
                              final ReteTuple tuple) {
-            Object value1 = this.index0.extractor.getValue( object1 );
-            Object value2 = this.index0.declaration.getValue( tuple.get( this.index0.declaration ).getObject() );
+            Object object12 = tuple.get( this.index0.declaration ).getObject();
+            Object object22 = tuple.get( this.index1.declaration ).getObject();
+            Object object32 = tuple.get( this.index2.declaration ).getObject();
 
-            if ( !this.comparator.equal( value1,
-                                         value2 ) ) {
-                return false;
-            }
-
-            value1 = this.index1.extractor.getValue( object1 );
-            value2 = this.index1.declaration.getValue( tuple.get( this.index1.declaration ).getObject() );
-
-            if ( !this.comparator.equal( value1,
-                                         value2 ) ) {
-                return false;
-            }
-
-            value1 = this.index2.extractor.getValue( object1 );
-            value2 = this.index2.declaration.getValue( tuple.get( this.index2.declaration ).getObject() );
-
-            if ( !this.comparator.equal( value1,
-                                         value2 ) ) {
-                return false;
-            }
-
-            return true;
+            return this.index0.evaluator.evaluate( this.index0.extractor,
+                                                   object1,
+                                                   object12 ) && this.index1.evaluator.evaluate( this.index1.extractor,
+                                                                                                 object1,
+                                                                                                 object22 ) && this.index2.evaluator.evaluate( this.index2.extractor,
+                                                                                                                                               object1,
+                                                                                                                                               object32 );
         }
 
         public boolean equal(final ReteTuple tuple1,
                              final ReteTuple tuple2) {
-            Object value1 = this.index0.declaration.getValue( tuple1.get( this.index0.declaration ).getObject() );
-            Object value2 = this.index0.declaration.getValue( tuple2.get( this.index0.declaration ).getObject() );
+            Object object11 = tuple1.get( this.index0.declaration ).getObject();
+            Object object12 = tuple2.get( this.index0.declaration ).getObject();
+            Object object21 = tuple1.get( this.index1.declaration ).getObject();
+            Object object22 = tuple2.get( this.index1.declaration ).getObject();
+            Object object31 = tuple1.get( this.index2.declaration ).getObject();
+            Object object32 = tuple2.get( this.index2.declaration ).getObject();
 
-            if ( !this.comparator.equal( value1,
-                                         value2 ) ) {
-                return false;
-            }
-
-            value1 = this.index1.declaration.getValue( tuple1.get( this.index1.declaration ).getObject() );
-            value2 = this.index1.declaration.getValue( tuple2.get( this.index1.declaration ).getObject() );
-
-            if ( !this.comparator.equal( value1,
-                                         value2 ) ) {
-                return false;
-            }
-
-            value1 = this.index2.declaration.getValue( tuple1.get( this.index2.declaration ).getObject() );
-            value2 = this.index2.declaration.getValue( tuple2.get( this.index2.declaration ).getObject() );
-
-            if ( !this.comparator.equal( value1,
-                                         value2 ) ) {
-                return false;
-            }
-
-            return true;
+            return this.index0.evaluator.evaluate( this.index0.extractor,
+                                                   object11,
+                                                   object12 ) && this.index1.evaluator.evaluate( this.index1.extractor,
+                                                                                                 object21,
+                                                                                                 object22 ) && this.index2.evaluator.evaluate( this.index2.extractor,
+                                                                                                                                               object31,
+                                                                                                                                               object32 );
         }
-        
+
         public boolean equal(final Object object1,
                              final Object object2) {
-            Object value1 = this.index0.extractor.getValue( object1 );
-            Object value2 = this.index0.extractor.getValue( object2 );
+            return this.index0.evaluator.evaluate( this.index0.extractor,
+                                                   object1,
+                                                   object2 ) && this.index1.evaluator.evaluate( this.index1.extractor,
+                                                                                                 object1,
+                                                                                                 object2 ) && this.index2.evaluator.evaluate( this.index2.extractor,
+                                                                                                                                               object1,
+                                                                                                                                               object2 );
+        }
 
-            if ( !this.comparator.equal( value1,
-                                         value2 ) ) {
-                return false;
-            }
+        public int rehash(int h) {
+            h += ~(h << 9);
+            h ^= (h >>> 14);
+            h += (h << 4);
+            h ^= (h >>> 10);
+            return h;
+        }
 
-            value1 = this.index1.extractor.getValue( object1 );
-            value2 = this.index1.extractor.getValue( object2 );
-
-            if ( !this.comparator.equal( value1,
-                                         value2 ) ) {
-                return false;
-            }
-
-            value1 = this.index2.extractor.getValue( object1 );
-            value2 = this.index2.extractor.getValue( object2 );
-
-            if ( !this.comparator.equal( value1,
-                                         value2 ) ) {
-                return false;
-            }
-
-            return true;
-        }        
-    }    
+    }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHandleIndexHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHandleIndexHashTable.java	2006-10-27 01:03:45 UTC (rev 7157)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHandleIndexHashTable.java	2006-10-27 01:12:32 UTC (rev 7158)
@@ -6,13 +6,13 @@
 import org.drools.common.InternalFactHandle;
 import org.drools.reteoo.FactHandleMemory;
 import org.drools.reteoo.ReteTuple;
-import org.drools.rule.Declaration;
-import org.drools.spi.FieldExtractor;
-import org.drools.util.ObjectHashMap.ObjectEntry;
 
 public class FactHandleIndexHashTable extends AbstractHashTable
     implements
     FactHandleMemory {
+
+    private static final long serialVersionUID = -6033183838054653227L;
+
     public static final int             PRIME = 31;
 
     private int                         startResult;
@@ -37,7 +37,7 @@
 
         this.startResult = FactHandleIndexHashTable.PRIME;
         for ( int i = 0, length = index.length; i < length; i++ ) {
-            this.startResult += FactHandleIndexHashTable.PRIME * this.startResult + index[i].getExtractor().getIndex();
+            this.startResult = FactHandleIndexHashTable.PRIME * this.startResult + index[i].getExtractor().getIndex();
         }
 
         switch ( index.length ) {
@@ -45,18 +45,15 @@
                 throw new IllegalArgumentException( "FieldIndexHashTable cannot use an index[] of length  0" );
             case 1 :
                 this.index = new SingleIndex( index,
-                                              this.startResult,
-                                              this.comparator );
+                                              this.startResult);
                 break;
             case 2 :
                 this.index = new DoubleCompositeIndex( index,
-                                                       this.startResult,
-                                                       this.comparator );
+                                                       this.startResult );
                 break;
             case 3 :
                 this.index = new TripleCompositeIndex( index,
-                                                       this.startResult,
-                                                       this.comparator );
+                                                       this.startResult );
                 break;
             default :
                 throw new IllegalArgumentException( "FieldIndexHashTable cannot use an index[] of length  great than 3" );
@@ -250,6 +247,8 @@
     public static class FieldIndexEntry
         implements
         Entry {
+
+        private static final long serialVersionUID = -577270475161063671L;
         private Entry     next;
         private FactEntry first;
         private final int hashCode;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleIndexHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleIndexHashTable.java	2006-10-27 01:03:45 UTC (rev 7157)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleIndexHashTable.java	2006-10-27 01:12:32 UTC (rev 7158)
@@ -4,17 +4,15 @@
 package org.drools.util;
 
 import org.drools.common.InternalFactHandle;
-import org.drools.reteoo.FactHandleMemory;
 import org.drools.reteoo.ReteTuple;
 import org.drools.reteoo.TupleMemory;
-import org.drools.rule.Column;
-import org.drools.rule.Declaration;
-import org.drools.spi.FieldExtractor;
-import org.drools.util.ObjectHashMap.ObjectEntry;
 
 public class TupleIndexHashTable extends AbstractHashTable
     implements
     TupleMemory {
+
+    private static final long serialVersionUID = -6214772340195061306L;
+
     public static final int             PRIME = 31;
 
     private int                         startResult;
@@ -47,18 +45,15 @@
                 throw new IllegalArgumentException( "FieldIndexHashTable cannot use an index[] of length  0" );
             case 1 :
                 this.index = new SingleIndex( index,
-                                              this.startResult,
-                                              this.comparator );
+                                              this.startResult);
                 break;
             case 2 :
                 this.index = new DoubleCompositeIndex( index,
-                                                       this.startResult,
-                                                       this.comparator );
+                                                       this.startResult);
                 break;
             case 3 :
                 this.index = new TripleCompositeIndex( index,
-                                                       this.startResult,
-                                                       this.comparator );
+                                                       this.startResult);
                 break;
             default :
                 throw new IllegalArgumentException( "FieldIndexHashTable cannot use an index[] of length  great than 3" );
@@ -243,6 +238,8 @@
     public static class FieldIndexEntry
         implements
         Entry {
+
+        private static final long serialVersionUID = 8160842495541574574L;
         private Entry     next;
         private ReteTuple first;
         private final int hashCode;




More information about the jboss-svn-commits mailing list