[jboss-svn-commits] JBL Code SVN: r6903 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools/base main/java/org/drools/base/evaluators main/java/org/drools/base/extractors main/java/org/drools/base/field main/java/org/drools/facttemplates main/java/org/drools/reteoo main/java/org/drools/rule main/java/org/drools/spi test/java/org/drools/base test/java/org/drools/base/extractors test/java/org/drools/examples/manners test/java/org/drools/rule

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Oct 18 18:17:22 EDT 2006


Author: tirelli
Date: 2006-10-18 18:13:06 -0400 (Wed, 18 Oct 2006)
New Revision: 6903

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseBooleanClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseByteClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseDoubleClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseFloatClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseIntClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseLongClassFieldExtractors.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseShortClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/BooleanFieldImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/DoubleFieldImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/LongFieldImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/ObjectFieldImpl.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ValueTypeTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/BooleanClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ByteClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/CharClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ClassFieldExtractorsBaseTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/DoubleClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/FloatClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/IntClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/LongClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ObjectClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ShortClassFieldExtractorTest.java
Removed:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FieldImpl.java
Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseEvaluator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FieldFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ValueType.java
   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/facttemplates/FactTemplateFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.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/LiteralRestriction.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/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/ColumnExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Evaluator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Extractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/FieldValue.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Restriction.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ClassFieldExtractorFactoryTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/TestBean.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/manners/Chosen.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Context.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Count.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Hobby.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/LastSeat.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Path.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Seating.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Sex.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/FieldConstraintTest.java
Log:
JBRULES-527: adding primitive handling support to the core engine.



Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldExtractor.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldExtractor.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -38,7 +38,7 @@
         try {
             final ClassFieldInspector inspector = new ClassFieldInspector( clazz );
             this.index = ((Integer) inspector.getFieldNames().get( fieldName ) ).intValue();
-            this.fieldType = wrapPrimitive(  (Class) inspector.getFieldTypes().get( fieldName ) );
+            this.fieldType = (Class) inspector.getFieldTypes().get( fieldName ) ;
             this.valueType = ValueType.determineValueType( this.fieldType );
         } catch ( final Exception e ) {
             throw new RuntimeDroolsException( e );
@@ -57,37 +57,6 @@
         return this.valueType;
     }
 
-    /** This will be implemented by the dynamic classes */
-    abstract public Object getValue(Object object);
-    
-    protected static Class wrapPrimitive(final Class fieldType) {
-        Class returnClass = null;
-        // autobox primitives
-        if ( fieldType.isPrimitive() ) {
-            if ( fieldType == char.class ) {
-                returnClass = Character.class;
-            } else if ( fieldType == byte.class ) {
-                returnClass = Byte.class;
-            } else if ( fieldType == short.class ) {
-                returnClass = Short.class;
-            } else if ( fieldType == int.class ) {
-                returnClass = Integer.class;
-            } else if ( fieldType == long.class ) {
-                returnClass = Long.class;
-            } else if ( fieldType == float.class ) {
-                returnClass = Float.class;
-            } else if ( fieldType == double.class ) {
-                returnClass = Double.class;
-            } else if ( fieldType == boolean.class ) {
-                returnClass = Boolean.class;
-            }
-        } else {
-            returnClass = fieldType;
-        }
-
-        return returnClass;
-    }
-
     public int hashCode() {
         final int PRIME = 31;
         int result = 1;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseEvaluator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseEvaluator.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseEvaluator.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -47,9 +47,6 @@
         return this.type;
     }
 
-    public abstract boolean evaluate(Object object1,
-                                     Object object2);
-
     public boolean equals(final Object object) {
         if ( this == object ) {
             return true;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -107,4 +107,36 @@
 
         return this.extractor.getValueType() == other.getValueType() && this.extractor.getIndex() == other.getIndex();
     }
+
+    public boolean getBooleanValue(Object object) {
+        return this.extractor.getBooleanValue( object );
+    }
+
+    public byte getByteValue(Object object) {
+        return this.extractor.getByteValue( object );
+    }
+
+    public char getCharValue(Object object) {
+        return this.extractor.getCharValue( object );
+    }
+
+    public double getDoubleValue(Object object) {
+        return this.extractor.getDoubleValue( object );
+    }
+
+    public float getFloatValue(Object object) {
+        return this.extractor.getFloatValue( object );
+    }
+
+    public int getIntValue(Object object) {
+        return this.extractor.getIntValue( object );
+    }
+
+    public long getLongValue(Object object) {
+        return this.extractor.getLongValue( object );
+    }
+
+    public short getShortValue(Object object) {
+        return this.extractor.getShortValue( object );
+    }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorFactory.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorFactory.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -23,6 +23,16 @@
 import org.drools.asm.Label;
 import org.drools.asm.MethodVisitor;
 import org.drools.asm.Opcodes;
+import org.drools.asm.Type;
+import org.drools.base.extractors.BaseBooleanClassFieldExtractor;
+import org.drools.base.extractors.BaseByteClassFieldExtractor;
+import org.drools.base.extractors.BaseCharClassFieldExtractor;
+import org.drools.base.extractors.BaseDoubleClassFieldExtractor;
+import org.drools.base.extractors.BaseFloatClassFieldExtractor;
+import org.drools.base.extractors.BaseIntClassFieldExtractor;
+import org.drools.base.extractors.BaseLongClassFieldExtractors;
+import org.drools.base.extractors.BaseObjectClassFieldExtractor;
+import org.drools.base.extractors.BaseShortClassFieldExtractor;
 import org.drools.util.asm.ClassFieldInspector;
 
 /**
@@ -36,29 +46,20 @@
 
 public class ClassFieldExtractorFactory {
 
-    private static final String GETTER         = "get";
+    private static final String BASE_PACKAGE = "org/drools/base";
 
-    private static final String BOOLEAN_GETTER = "is";
-
-    private static final String BASE_PACKAGE   = "org/drools/base";
-
-    private static final String BASE_EXTRACTOR = "org/drools/base/BaseClassFieldExtractor";
-
     public static BaseClassFieldExtractor getClassFieldExtractor(final Class clazz,
                                                                  final String fieldName) {
         try {
             final ClassFieldInspector inspector = new ClassFieldInspector( clazz );
             final Class fieldType = (Class) inspector.getFieldTypes().get( fieldName );
-            final String originalClassName = clazz.getName().replace( '.',
-                                                                      '/' );
-            final String getterName = ((Method) inspector.getGetterMethods().get( fieldName )).getName();
-            final String className = ClassFieldExtractorFactory.BASE_PACKAGE + "/" + originalClassName + "$" + getterName;
-            final String typeName = getTypeName( fieldType );
+            final Method getterMethod = (Method) inspector.getGetterMethods().get( fieldName );
+            final String className = ClassFieldExtractorFactory.BASE_PACKAGE + "/" + Type.getInternalName( clazz ) + "$" + getterMethod.getName();
+
             // generating byte array to create target class
-            final byte[] bytes = dump( originalClassName,
+            final byte[] bytes = dump( clazz,
                                        className,
-                                       getterName,
-                                       typeName,
+                                       getterMethod,
                                        fieldType,
                                        clazz.isInterface() );
             // use bytes to get a class 
@@ -74,38 +75,73 @@
         }
     }
 
-    private static byte[] dump(final String originalClassName,
+    private static byte[] dump(final Class originalClass,
                                final String className,
-                               final String getterName,
-                               final String typeName,
+                               final Method getterMethod,
                                final Class fieldType,
                                final boolean isInterface) throws Exception {
 
         final ClassWriter cw = new ClassWriter( true );
-        MethodVisitor mv;
 
+        Class superClass = getSuperClassFor( fieldType );
+        buildClassHeader( superClass,
+                          className,
+                          cw );
+
+        buildConstructor( superClass,
+                          className,
+                          cw );
+        
+        buildGetMethod( originalClass, className, superClass, getterMethod, cw );
+
+        cw.visitEnd();
+
+        return cw.toByteArray();
+    }
+
+    /**
+     * Builds the class header
+     *  
+     * @param clazz The class to build the extractor for
+     * @param className The extractor class name
+     * @param cw
+     */
+    protected static void buildClassHeader(final Class superClass,
+                                           final String className,
+                                           final ClassWriter cw) {
         cw.visit( Opcodes.V1_2,
                   Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER,
                   className,
                   null,
-                  ClassFieldExtractorFactory.BASE_EXTRACTOR,
+                  Type.getInternalName( superClass ),
                   null );
 
         cw.visitSource( null,
                         null );
+    }
 
-        // constractor
+    /**
+     * Creates a constructor for the shadow proxy receiving
+     * the actual delegate class as parameter
+     * 
+     * @param originalClassName
+     * @param className
+     * @param cw
+     */
+    private static void buildConstructor(final Class superClazz,
+                                         final String className,
+                                         final ClassWriter cw) {
+        MethodVisitor mv;
         {
             mv = cw.visitMethod( Opcodes.ACC_PUBLIC,
                                  "<init>",
-                                 "(Ljava/lang/Class;Ljava/lang/String;)V",
+                                 Type.getMethodDescriptor( Type.VOID_TYPE,
+                                                           new Type[]{ Type.getType( Class.class ), Type.getType( String.class )} ),
                                  null,
                                  null );
             mv.visitCode();
             final Label l0 = new Label();
             mv.visitLabel( l0 );
-            mv.visitLineNumber( 10,
-                                l0 );
             mv.visitVarInsn( Opcodes.ALOAD,
                              0 );
             mv.visitVarInsn( Opcodes.ALOAD,
@@ -113,13 +149,12 @@
             mv.visitVarInsn( Opcodes.ALOAD,
                              2 );
             mv.visitMethodInsn( Opcodes.INVOKESPECIAL,
-                                ClassFieldExtractorFactory.BASE_EXTRACTOR,
+                                Type.getInternalName( superClazz ),
                                 "<init>",
-                                "(Ljava/lang/Class;Ljava/lang/String;)V" );
+                                Type.getMethodDescriptor( Type.VOID_TYPE,
+                                                          new Type[]{ Type.getType( Class.class ), Type.getType( String.class )} ));
             final Label l1 = new Label();
             mv.visitLabel( l1 );
-            mv.visitLineNumber( 11,
-                                l1 );
             mv.visitInsn( Opcodes.RETURN );
             final Label l2 = new Label();
             mv.visitLabel( l2 );
@@ -130,179 +165,147 @@
                                    l2,
                                    0 );
             mv.visitLocalVariable( "clazz",
-                                   "Ljava/lang/Class;",
+                                   Type.getDescriptor( Class.class ),
                                    null,
                                    l0,
                                    l2,
                                    1 );
             mv.visitLocalVariable( "fieldName",
-                                   "Ljava/lang/String;",
+                                   Type.getDescriptor( String.class ),
                                    null,
                                    l0,
                                    l2,
                                    2 );
-            mv.visitMaxs( 3,
-                          3 );
+            mv.visitMaxs( 0,
+                          0 );
             mv.visitEnd();
         }
+    }
 
-        // for primitive it's different because we special characters for 
-        // return types and create corresponding Objects (e.g. int -> Integer, boolean -> Boolean, ..)
-        if ( fieldType.isPrimitive() ) {
-            final String primitiveTypeTag = getPrimitiveTag( fieldType );
-
-            mv = cw.visitMethod( Opcodes.ACC_PUBLIC,
-                                 "getValue",
-                                 "(Ljava/lang/Object;)Ljava/lang/Object;",
-                                 null,
-                                 null );
-            mv.visitCode();
-            final Label l0 = new Label();
-            mv.visitLabel( l0 );
-            mv.visitLineNumber( 14,
-                                l0 );
-            mv.visitTypeInsn( Opcodes.NEW,
-                              typeName );
-            mv.visitInsn( Opcodes.DUP );
-            mv.visitVarInsn( Opcodes.ALOAD,
-                             1 );
-            mv.visitTypeInsn( Opcodes.CHECKCAST,
-                              originalClassName );
-
-            if ( isInterface ) {
-                mv.visitMethodInsn( Opcodes.INVOKEINTERFACE,
-                                    originalClassName,
-                                    getterName,
-                                    "()" + primitiveTypeTag );
-
-            } else {
-                mv.visitMethodInsn( Opcodes.INVOKEVIRTUAL,
-                                    originalClassName,
-                                    getterName,
-                                    "()" + primitiveTypeTag );
-            }
-            mv.visitMethodInsn( Opcodes.INVOKESPECIAL,
-                                typeName,
-                                "<init>",
-                                "(" + primitiveTypeTag + ")V" );
-            mv.visitInsn( Opcodes.ARETURN );
-            final Label l1 = new Label();
-            mv.visitLabel( l1 );
-            mv.visitLocalVariable( "this",
-                                   "L" + className + ";",
-                                   null,
-                                   l0,
-                                   l1,
-                                   0 );
-            mv.visitLocalVariable( "object",
-                                   "Ljava/lang/Object;",
-                                   null,
-                                   l0,
-                                   l1,
-                                   1 );
-            mv.visitMaxs( 3,
-                          2 );
-            mv.visitEnd();
+    /**
+     * Creates the proxy reader method for the given method
+     * 
+     * @param fieldName
+     * @param fieldFlag
+     * @param method
+     * @param cw
+     */
+    protected static void buildGetMethod(Class originalClass,
+                                         String className,
+                                         Class superClass,
+                                         Method getterMethod,
+                                         ClassWriter cw) {
+        
+        Class fieldType = getterMethod.getReturnType();
+        Method overridingMethod;
+        try {
+            overridingMethod = superClass.getMethod( getOverridingMethodName( fieldType ), 
+                                                            new Class[] { Object.class } );
+        } catch ( Exception e ) {
+            throw new RuntimeDroolsException("This is a bug. Please report back to JBRules team.", e);
+        }
+        MethodVisitor mv = cw.visitMethod( Opcodes.ACC_PUBLIC,
+                                           overridingMethod.getName(),
+                                           Type.getMethodDescriptor( overridingMethod ),
+                                           null,
+                                           null );
+        
+        mv.visitCode();
+        
+        final Label l0 = new Label();
+        mv.visitLabel( l0 );
+        mv.visitVarInsn( Opcodes.ALOAD,
+                         1 );
+        mv.visitTypeInsn( Opcodes.CHECKCAST,
+                          Type.getInternalName( originalClass ) );
+        
+        if ( originalClass.isInterface() ) {
+            mv.visitMethodInsn( Opcodes.INVOKEINTERFACE,
+                                Type.getInternalName( originalClass ),
+                                getterMethod.getName(),
+                                Type.getMethodDescriptor( getterMethod ) );
         } else {
-            String typeNotation = fieldType.isArray() ? typeName : "L"+typeName+";";
-            mv = cw.visitMethod( Opcodes.ACC_PUBLIC,
-                                 "getValue",
-                                 "(Ljava/lang/Object;)Ljava/lang/Object;",
-                                 null,
-                                 null );
-            mv.visitCode();
-            final Label l0 = new Label();
-            mv.visitLabel( l0 );
-            mv.visitLineNumber( 15,
-                                l0 );
-            mv.visitVarInsn( Opcodes.ALOAD,
-                             1 );
-            mv.visitTypeInsn( Opcodes.CHECKCAST,
-                              originalClassName );
-            if ( isInterface ) {
-                mv.visitMethodInsn( Opcodes.INVOKEINTERFACE,
-                                    originalClassName,
-                                    getterName,
-                                    "()" + typeNotation );
-            } else {
-                mv.visitMethodInsn( Opcodes.INVOKEVIRTUAL,
-                                    originalClassName,
-                                    getterName,
-                                    "()" + typeNotation );
-            }
-            mv.visitInsn( Opcodes.ARETURN );
-            final Label l1 = new Label();
-            mv.visitLabel( l1 );
-            mv.visitLocalVariable( "this",
-                                   "L" + className + ";",
-                                   null,
-                                   l0,
-                                   l1,
-                                   0 );
-            mv.visitLocalVariable( "object",
-                                   "Ljava/lang/Object;",
-                                   null,
-                                   l0,
-                                   l1,
-                                   1 );
-            mv.visitMaxs( 1,
-                          2 );
-            mv.visitEnd();
+            mv.visitMethodInsn( Opcodes.INVOKEVIRTUAL,
+                                Type.getInternalName( originalClass ),
+                                getterMethod.getName(),
+                                Type.getMethodDescriptor( getterMethod ) );
         }
-        cw.visitEnd();
-
-        return cw.toByteArray();
+        mv.visitInsn( Type.getType( fieldType ).getOpcode( Opcodes.IRETURN ) );
+        final Label l1 = new Label();
+        mv.visitLabel( l1 );
+        mv.visitLocalVariable( "this",
+                               "L" + className + ";",
+                               null,
+                               l0,
+                               l1,
+                               0 );
+        mv.visitLocalVariable( "object",
+                               Type.getDescriptor( Object.class ),
+                               null,
+                               l0,
+                               l1,
+                               1 );
+        mv.visitMaxs( 0,
+                      0 );
+        mv.visitEnd();
     }
 
-    private static String getTypeName(final Class fieldType) {
+    private static String getOverridingMethodName( Class fieldType ) {
         String ret = null;
-
         if ( fieldType.isPrimitive() ) {
             if ( fieldType == char.class ) {
-                ret = "java/lang/Character";
+                ret = "getCharValue";
             } else if ( fieldType == byte.class ) {
-                ret = "java/lang/Byte";
+                ret = "getByteValue";
             } else if ( fieldType == short.class ) {
-                ret = "java/lang/Short";
+                ret = "getShortValue";
             } else if ( fieldType == int.class ) {
-                ret = "java/lang/Integer";
+                ret = "getIntValue";
             } else if ( fieldType == long.class ) {
-                ret = "java/lang/Long";
+                ret = "getLongValue";
             } else if ( fieldType == float.class ) {
-                ret = "java/lang/Float";
+                ret = "getFloatValue";
             } else if ( fieldType == double.class ) {
-                ret = "java/lang/Double";
+                ret = "getDoubleValue";
             } else if ( fieldType == boolean.class ) {
-                ret = "java/lang/Boolean";
+                ret = "getBooleanValue";
             }
         } else {
-            ret = fieldType.getName().replace( '.',
-                                               '/' );
+            ret = "getValue";
         }
-
         return ret;
     }
 
-    private static String getPrimitiveTag(final Class fieldType) {
-        String ret = null;
-        if ( fieldType == char.class ) {
-            ret = "C";
-        } else if ( fieldType == byte.class ) {
-            ret = "B";
-        } else if ( fieldType == short.class ) {
-            ret = "S";
-        } else if ( fieldType == int.class ) {
-            ret = "I";
-        } else if ( fieldType == long.class ) {
-            ret = "J";
-        } else if ( fieldType == float.class ) {
-            ret = "F";
-        } else if ( fieldType == double.class ) {
-            ret = "D";
-        } else if ( fieldType == boolean.class ) {
-            ret = "Z";
+    /**
+     * Returns the appropriate Base class field extractor class
+     * for the given fieldType
+     * 
+     * @param fieldType
+     * @return
+     */
+    private static Class getSuperClassFor(Class fieldType) {
+        Class ret = null;
+        if ( fieldType.isPrimitive() ) {
+            if ( fieldType == char.class ) {
+                ret = BaseCharClassFieldExtractor.class;
+            } else if ( fieldType == byte.class ) {
+                ret = BaseByteClassFieldExtractor.class;
+            } else if ( fieldType == short.class ) {
+                ret = BaseShortClassFieldExtractor.class;
+            } else if ( fieldType == int.class ) {
+                ret = BaseIntClassFieldExtractor.class;
+            } else if ( fieldType == long.class ) {
+                ret = BaseLongClassFieldExtractors.class;
+            } else if ( fieldType == float.class ) {
+                ret = BaseFloatClassFieldExtractor.class;
+            } else if ( fieldType == double.class ) {
+                ret = BaseDoubleClassFieldExtractor.class;
+            } else if ( fieldType == boolean.class ) {
+                ret = BaseBooleanClassFieldExtractor.class;
+            }
+        } else {
+            ret = BaseObjectClassFieldExtractor.class;
         }
-
         return ret;
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FieldFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FieldFactory.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FieldFactory.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -19,6 +19,10 @@
 import java.math.BigDecimal;
 import java.math.BigInteger;
 
+import org.drools.base.field.BooleanFieldImpl;
+import org.drools.base.field.DoubleFieldImpl;
+import org.drools.base.field.LongFieldImpl;
+import org.drools.base.field.ObjectFieldImpl;
 import org.drools.spi.FieldValue;
 
 public class FieldFactory {
@@ -40,37 +44,37 @@
         }
 
         if ( valueType == ValueType.NULL_TYPE ) {
-            field = new FieldImpl( null );
+            field = new ObjectFieldImpl( null );
         } else if ( valueType == ValueType.CHAR_TYPE ) {
-            field = new FieldImpl( new Character( value.charAt( 0 ) ) );
+            field = new LongFieldImpl( value.charAt( 0 ) );
         } else if ( valueType == ValueType.BYTE_TYPE ) {
-            field = new FieldImpl( new Byte( value ) );
+            field = new LongFieldImpl( Long.parseLong( value ) );
         } else if ( valueType == ValueType.SHORT_TYPE ) {
-            field = new FieldImpl( new Short( value ) );
+            field = new LongFieldImpl( Long.parseLong( value )  );
         } else if ( valueType == ValueType.INTEGER_TYPE ) {
-            field = new FieldImpl( new Integer( stripNumericType( value ) ) );
+            field = new LongFieldImpl( Long.parseLong( stripNumericType( value ) ) );
         } else if ( valueType == ValueType.LONG_TYPE ) {
-            field = new FieldImpl( new Long( stripNumericType( value ) ) );
+            field = new LongFieldImpl( Long.parseLong( stripNumericType( value ) ) );
         } else if ( valueType == ValueType.FLOAT_TYPE ) {
-            field = new FieldImpl( new Float( stripNumericType( value ) ) );
+            field = new DoubleFieldImpl( Float.parseFloat( stripNumericType( value ) ) );
         } else if ( valueType == ValueType.DOUBLE_TYPE ) {
-            field = new FieldImpl( new Double( stripNumericType( value ) ) );
+            field = new DoubleFieldImpl( Double.parseDouble( stripNumericType( value ) ) );
         } else if ( valueType == ValueType.BOOLEAN_TYPE ) {
-            field = new FieldImpl( new Boolean( value ) );
+            field = new BooleanFieldImpl( Boolean.valueOf( value ).booleanValue() );
         } else if ( valueType == ValueType.STRING_TYPE ) {
-            field = new FieldImpl( value.intern() );
+            field = new ObjectFieldImpl( value.intern() );
         } else if ( valueType == ValueType.DATE_TYPE ) {
             //MN: I think its fine like this, seems to work !
-            field = new FieldImpl( value );
+            field = new ObjectFieldImpl( value );
         } else if ( valueType == ValueType.ARRAY_TYPE ) {
             //MN: I think its fine like this.
-            field = new FieldImpl( value );
+            field = new ObjectFieldImpl( value );
         } else if ( valueType == ValueType.OBJECT_TYPE ) {
-            field = new FieldImpl( value );
+            field = new ObjectFieldImpl( value );
         } else if ( valueType == ValueType.BIG_DECIMAL_TYPE ) {
-        	field = new FieldImpl( new BigDecimal(value) );
+        	field = new ObjectFieldImpl( new BigDecimal(value) );
         } else if ( valueType == ValueType.BIG_INTEGER_TYPE ) {
-        	field = new FieldImpl( new BigInteger(value) );
+        	field = new ObjectFieldImpl( new BigInteger(value) );
         }
 
         return field;

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FieldImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FieldImpl.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FieldImpl.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -1,61 +0,0 @@
-package org.drools.base;
-
-/*
- * 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.spi.FieldValue;
-
-public class FieldImpl
-    implements
-    FieldValue {
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 320;
-    private Object            value;
-
-    public FieldImpl(final Object value) {
-        this.value = value;
-    }
-
-    public Object getValue() {
-        return this.value;
-    }
-
-    public String toString() {
-        return this.value.toString();
-    }
-
-    public boolean equals(final Object object) {
-        if ( this == object ) {
-            return true;
-        }
-        if ( object == null || !(object instanceof FieldValue) ) {
-            return false;
-        }
-        final FieldImpl other = (FieldImpl) object;
-
-        return (((this.value == null) && (other.value == null)) || ((this.value != null) && (this.value.equals( other.value ))));
-    }
-
-    public int hashCode() {
-        if ( this.value != null ) {
-            return this.value.hashCode();
-        } else {
-            return 0;
-        }
-    }
-}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ValueType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ValueType.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ValueType.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -25,110 +25,204 @@
 import org.drools.facttemplates.FactTemplate;
 import org.drools.spi.Evaluator;
 
-public class ValueType implements Serializable {
-    
-    private static final long        serialVersionUID = 320;
-    
-    public static final ValueType NULL_TYPE = new  ValueType( "null", null, null );
-    public static final ValueType CHAR_TYPE = new  ValueType( "Character", Character.class, CharacterFactory.getInstance() );   
-    public static final ValueType BYTE_TYPE = new  ValueType( "Byte", Byte.class, ByteFactory.getInstance() );
-    public static final ValueType SHORT_TYPE = new  ValueType( "Short", Short.class, ShortFactory.getInstance() );
-    public static final ValueType INTEGER_TYPE = new  ValueType( "Integer", Integer.class, IntegerFactory.getInstance() );
-    public static final ValueType LONG_TYPE = new  ValueType( "Long", Long.class, LongFactory.getInstance() );
-    public static final ValueType FLOAT_TYPE = new  ValueType( "Float", Float.class, FloatFactory.getInstance() );
-    public static final ValueType DOUBLE_TYPE = new  ValueType( "Double", Double.class, DoubleFactory.getInstance() );
-    public static final ValueType BOOLEAN_TYPE = new  ValueType( "Boolean", Boolean.class, BooleanFactory.getInstance() );    
-    public static final ValueType DATE_TYPE = new  ValueType( "Date", Date.class, DateFactory.getInstance() );    
-    public static final ValueType ARRAY_TYPE = new  ValueType( "Array", Object[].class, ArrayFactory.getInstance() );
-    public static final ValueType STRING_TYPE = new  ValueType( "String", String.class, StringFactory.getInstance() );    
-    public static final ValueType OBJECT_TYPE = new  ValueType( "Object", Object.class, ObjectFactory.getInstance() );
-    public static final ValueType FACTTEMPLATE_TYPE = new  ValueType( "FactTemplate", FactTemplate.class, ObjectFactory.getInstance() );    
-    public static final ValueType BIG_DECIMAL_TYPE = new  ValueType( "BigDecimal", BigDecimal.class, BigDecimalFactory.getInstance() );
-    public static final ValueType BIG_INTEGER_TYPE = new  ValueType( "BigInteger", BigInteger.class, BigIntegerFactory.getInstance() );
-    
-    private final String name;
-    private final Class classType;
+public class ValueType
+    implements
+    Serializable {
+
+    private static final long      serialVersionUID  = 320;
+
+    public static final ValueType  NULL_TYPE         = new ValueType( "null",
+                                                                      null,
+                                                                      null );
+    // wrapper types
+    public static final ValueType  CHAR_TYPE         = new ValueType( "Character",
+                                                                      Character.class,
+                                                                      ObjectFactory.getInstance() );
+    public static final ValueType  BYTE_TYPE         = new ValueType( "Byte",
+                                                                      Byte.class,
+                                                                      ObjectFactory.getInstance() );
+    public static final ValueType  SHORT_TYPE        = new ValueType( "Short",
+                                                                      Short.class,
+                                                                      ObjectFactory.getInstance() );
+    public static final ValueType  INTEGER_TYPE      = new ValueType( "Integer",
+                                                                      Integer.class,
+                                                                      ObjectFactory.getInstance() );
+    public static final ValueType  LONG_TYPE         = new ValueType( "Long",
+                                                                      Long.class,
+                                                                      ObjectFactory.getInstance() );
+    public static final ValueType  FLOAT_TYPE        = new ValueType( "Float",
+                                                                      Float.class,
+                                                                      ObjectFactory.getInstance() );
+    public static final ValueType  DOUBLE_TYPE       = new ValueType( "Double",
+                                                                      Double.class,
+                                                                      ObjectFactory.getInstance() );
+    public static final ValueType  BOOLEAN_TYPE      = new ValueType( "Boolean",
+                                                                      Boolean.class,
+                                                                      ObjectFactory.getInstance() );
+    // primitive types
+    public static final ValueType  PCHAR_TYPE        = new ValueType( "char",
+                                                                      Character.TYPE,
+                                                                      CharacterFactory.getInstance() );
+    public static final ValueType  PBYTE_TYPE        = new ValueType( "byte",
+                                                                      Byte.TYPE,
+                                                                      ByteFactory.getInstance() );
+    public static final ValueType  PSHORT_TYPE       = new ValueType( "short",
+                                                                      Short.TYPE,
+                                                                      ShortFactory.getInstance() );
+    public static final ValueType  PINTEGER_TYPE     = new ValueType( "int",
+                                                                      Integer.TYPE,
+                                                                      IntegerFactory.getInstance() );
+    public static final ValueType  PLONG_TYPE        = new ValueType( "long",
+                                                                      Long.TYPE,
+                                                                      LongFactory.getInstance() );
+    public static final ValueType  PFLOAT_TYPE       = new ValueType( "float",
+                                                                      Float.TYPE,
+                                                                      FloatFactory.getInstance() );
+    public static final ValueType  PDOUBLE_TYPE      = new ValueType( "double",
+                                                                      Double.TYPE,
+                                                                      DoubleFactory.getInstance() );
+    public static final ValueType  PBOOLEAN_TYPE     = new ValueType( "boolean",
+                                                                      Boolean.TYPE,
+                                                                      BooleanFactory.getInstance() );
+    // other types
+    public static final ValueType  DATE_TYPE         = new ValueType( "Date",
+                                                                      Date.class,
+                                                                      DateFactory.getInstance() );
+    public static final ValueType  ARRAY_TYPE        = new ValueType( "Array",
+                                                                      Object[].class,
+                                                                      ArrayFactory.getInstance() );
+    public static final ValueType  STRING_TYPE       = new ValueType( "String",
+                                                                      String.class,
+                                                                      StringFactory.getInstance() );
+    public static final ValueType  OBJECT_TYPE       = new ValueType( "Object",
+                                                                      Object.class,
+                                                                      ObjectFactory.getInstance() );
+    public static final ValueType  FACTTEMPLATE_TYPE = new ValueType( "FactTemplate",
+                                                                      FactTemplate.class,
+                                                                      ObjectFactory.getInstance() );
+    public static final ValueType  BIG_DECIMAL_TYPE  = new ValueType( "BigDecimal",
+                                                                      BigDecimal.class,
+                                                                      BigDecimalFactory.getInstance() );
+    public static final ValueType  BIG_INTEGER_TYPE  = new ValueType( "BigInteger",
+                                                                      BigInteger.class,
+                                                                      BigIntegerFactory.getInstance() );
+
+    private final String           name;
+    private final Class            classType;
     private final EvaluatorFactory evaluatorFactory;
-    
-    private ValueType(String name, Class classType, EvaluatorFactory evaluatorFactory) {
-        this.name  = name;
-        this.classType  = classType;
+
+    private ValueType(String name,
+                      Class classType,
+                      EvaluatorFactory evaluatorFactory) {
+        this.name = name;
+        this.classType = classType;
         this.evaluatorFactory = evaluatorFactory;
     }
-    
-    private Object readResolve () throws java.io.ObjectStreamException
-    {
+
+    private Object readResolve() throws java.io.ObjectStreamException {
         return determineValueType( this.classType );
     }
-    
+
     public String getName() {
         return this.name;
     }
-    
+
     public Class getClassType() {
         return this.classType;
     }
-    
-    public Evaluator getEvaluator(Operator operator)  {
+
+    public Evaluator getEvaluator(Operator operator) {
         return this.evaluatorFactory.getEvaluator( operator );
     }
-    
+
     public static ValueType determineValueType(Class clazz) {
         if ( clazz == null ) {
-            return  ValueType .NULL_TYPE;
-        } if ( clazz == FactTemplate.class ) {
-          return ValueType.FACTTEMPLATE_TYPE;  
+            return ValueType.NULL_TYPE;
+        }
+        if ( clazz == FactTemplate.class ) {
+            return ValueType.FACTTEMPLATE_TYPE;
+        } else if ( clazz == Character.TYPE ) {
+            return ValueType.PCHAR_TYPE;
+        } else if ( clazz == Byte.TYPE ) {
+            return ValueType.PBYTE_TYPE;
+        } else if ( clazz == Short.TYPE ) {
+            return ValueType.PSHORT_TYPE;
+        } else if ( clazz == Integer.TYPE ) {
+            return ValueType.PINTEGER_TYPE;
+        } else if ( clazz == Long.TYPE ) {
+            return ValueType.PLONG_TYPE;
+        } else if ( clazz == Float.TYPE ) {
+            return ValueType.PFLOAT_TYPE;
+        } else if ( clazz == Double.TYPE ) {
+            return ValueType.PDOUBLE_TYPE;
+        } else if ( clazz == Boolean.TYPE ) {
+            return ValueType.PBOOLEAN_TYPE;
         } else if ( clazz == Character.class ) {
-            return  ValueType.CHAR_TYPE;
+            return ValueType.CHAR_TYPE;
         } else if ( clazz == Byte.class ) {
-            return  ValueType .BYTE_TYPE;
+            return ValueType.BYTE_TYPE;
         } else if ( clazz == Short.class ) {
-            return  ValueType .SHORT_TYPE;
+            return ValueType.SHORT_TYPE;
         } else if ( clazz == Integer.class ) {
-            return  ValueType .INTEGER_TYPE;
+            return ValueType.INTEGER_TYPE;
         } else if ( clazz == Long.class ) {
-            return  ValueType .LONG_TYPE;
+            return ValueType.LONG_TYPE;
         } else if ( clazz == Float.class ) {
-            return  ValueType .FLOAT_TYPE;
+            return ValueType.FLOAT_TYPE;
         } else if ( clazz == Double.class ) {
-            return  ValueType .DOUBLE_TYPE;
+            return ValueType.DOUBLE_TYPE;
         } else if ( clazz == Boolean.class ) {
-            return  ValueType .BOOLEAN_TYPE;
+            return ValueType.BOOLEAN_TYPE;
         } else if ( clazz == java.sql.Date.class ) {
-            return  ValueType .DATE_TYPE;
+            return ValueType.DATE_TYPE;
         } else if ( clazz == java.util.Date.class ) {
-            return  ValueType .DATE_TYPE;
+            return ValueType.DATE_TYPE;
         } else if ( clazz.isAssignableFrom( Object[].class ) ) {
-            return  ValueType .ARRAY_TYPE;
-        } else if ( clazz == BigDecimal.class )  {
-            return  ValueType .BIG_DECIMAL_TYPE;
-            
-        }
-        else if ( clazz == BigInteger.class )  {
-            return  ValueType .BIG_INTEGER_TYPE;            
-        } 
-        else if ( clazz == String.class ) {
-            return  ValueType .STRING_TYPE;
+            return ValueType.ARRAY_TYPE;
+        } else if ( clazz == BigDecimal.class ) {
+            return ValueType.BIG_DECIMAL_TYPE;
+        } else if ( clazz == BigInteger.class ) {
+            return ValueType.BIG_INTEGER_TYPE;
+        } else if ( clazz == String.class ) {
+            return ValueType.STRING_TYPE;
         } else if ( clazz instanceof Object ) {
-            return  ValueType .OBJECT_TYPE;
+            return ValueType.OBJECT_TYPE;
         }
-        throw new RuntimeDroolsException( "unable to determine ValueType for Class [" + clazz + "]" );        
+        throw new RuntimeDroolsException( "unable to determine ValueType for Class [" + clazz + "]" );
     }
-    
+
     public String toString() {
         return "ValueType = '" + this.name + "'";
-    }    
-    
+    }
+
     public int hashCode() {
         return this.name.hashCode();
     }
-    
+
     public boolean equals(Object object) {
         if ( object == this ) {
-            return  true;
+            return true;
         }
-        
-        return false;        
+
+        return false;
     }
-    
+
+    public boolean isBoolean() {
+        return ((this.classType == Boolean.class) || (this.classType == Boolean.TYPE));
+    }
+
+    public boolean isNumber() {
+        return (Number.class.isAssignableFrom( this.classType )) || 
+               (this.classType == Byte.TYPE) || 
+               (this.classType == Short.TYPE) || 
+               (this.classType == Integer.TYPE) || 
+               (this.classType == Long.TYPE) || 
+               (this.classType == Float.TYPE) || 
+               (this.classType == Double.TYPE);
+    }
+
+    public boolean isChar() {
+        return ((this.classType == Character.class) || (this.classType == Character.TYPE));
+    }
+
 }

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-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ArrayFactory.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -20,25 +20,27 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
-import org.drools.base.evaluators.ShortFactory.ShortEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortGreaterEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortGreaterOrEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortLessEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortLessOrEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortNotEqualEvaluator;
+import org.drools.rule.VariableConstraint.ObjectVariableContextEntry;
+import org.drools.rule.VariableConstraint.VariableContextEntry;
 import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
+import org.drools.spi.FieldValue;
 
 /**
  * For handling simple (non collection) array types.
  * @author Michael Neale
  */
-public class ArrayFactory implements EvaluatorFactory {
-    private static EvaluatorFactory INSTANCE = new ArrayFactory();
-    
+public class ArrayFactory
+    implements
+    EvaluatorFactory {
+
+    private static final long       serialVersionUID = -5485618486269637287L;
+    private static EvaluatorFactory INSTANCE         = new ArrayFactory();
+
     private ArrayFactory() {
-        
+
     }
-    
+
     public static EvaluatorFactory getInstance() {
         if ( INSTANCE == null ) {
             INSTANCE = new ArrayFactory();
@@ -53,13 +55,12 @@
             return ArrayNotEqualEvaluator.INSTANCE;
         } else if ( operator == Operator.LESS ) {
             return ArrayContainsEvaluator.INSTANCE;
-        } else if ( operator == Operator.CONTAINS) {
+        } else if ( operator == Operator.CONTAINS ) {
             return ArrayContainsEvaluator.INSTANCE;
         } else {
             throw new RuntimeException( "Operator '" + operator + "' does not exist for ArrayEvaluator" );
-        }    
+        }
     }
-    
 
     static class ArrayEqualEvaluator extends BaseEvaluator {
         /**
@@ -73,14 +74,46 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            Object value1 = extractor.getValue( object1 );
+            Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.equals( value2 );
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return object2 == null;
+            Object value1 = object1.getValue();
+            Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 == null;
             }
-            return object1.equals( object2 );
+            return value1.equals( value2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            Object value = context.declaration.getExtractor().getValue( left );
+            if ( value == null ) {
+                return ((ObjectVariableContextEntry) context).right == null;
+            }
+            return value.equals( ((ObjectVariableContextEntry) context).right );
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            Object value = context.extractor.getValue( right );
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return value == null;
+            }
+            return ((ObjectVariableContextEntry) context).left.equals( value );
+        }
+
         public String toString() {
             return "Array ==";
         }
@@ -98,12 +131,46 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            Object value1 = extractor.getValue( object1 );
+            Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return !value1.equals( value2 );
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return !Arrays.equals( (Object[]) object1,
-                                   (Object[]) object2 );
+            Object value1 = object1.getValue();
+            Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return !value1.equals( value2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            Object value = context.declaration.getExtractor().getValue( left );
+            if ( value == null ) {
+                return ((ObjectVariableContextEntry) context).right == null;
+            }
+            return !value.equals( ((ObjectVariableContextEntry) context).right );
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            Object value = context.extractor.getValue( right );
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return value == null;
+            }
+            return !((ObjectVariableContextEntry) context).left.equals( value );
+        }
+
         public String toString() {
             return "Array !=";
         }
@@ -121,19 +188,53 @@
                    Operator.CONTAINS );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            Object value = object2.getValue();
+            final Object[] array = (Object[]) extractor.getValue( object1 );
+
+            if ( Arrays.binarySearch( array,
+                                      value ) == -1 ) {
+                return false;
+            }
+            return true;
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object2 == null ) {
+            Object value = extractor.getValue( object2 );
+            final Object[] array = (Object[]) object1.getValue();
+            if ( Arrays.binarySearch( array,
+                                      value ) == -1 ) {
                 return false;
             }
-            if ( Arrays.binarySearch( (Object[]) object1,
-                                      object2 ) == -1 ) {
+            return true;
+        }
+
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            Object value = ((ObjectVariableContextEntry) context).right;
+            final Object[] array = (Object[]) context.declaration.getExtractor().getValue( left );
+            if ( Arrays.binarySearch( array,
+                                      value ) == -1 ) {
                 return false;
-            } else {
-                return true;
             }
+            return true;
         }
 
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            Object value = context.extractor.getValue( right );
+            final Object[] array = (Object[]) ((ObjectVariableContextEntry) context).left;
+            if ( Arrays.binarySearch( array,
+                                      value ) == -1 ) {
+                return false;
+            }
+            return true;
+        }
+
         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-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BigDecimalFactory.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -20,15 +20,23 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
+import org.drools.rule.VariableConstraint.ObjectVariableContextEntry;
+import org.drools.rule.VariableConstraint.VariableContextEntry;
 import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
+import org.drools.spi.FieldValue;
 
-public class BigDecimalFactory implements EvaluatorFactory {
-    private static EvaluatorFactory INSTANCE = new BigDecimalFactory();
-    
+public class BigDecimalFactory
+    implements
+    EvaluatorFactory {
+
+    private static final long       serialVersionUID = -3272957023711251983L;
+    private static EvaluatorFactory INSTANCE         = new BigDecimalFactory();
+
     private BigDecimalFactory() {
-        
+
     }
-    
+
     public static EvaluatorFactory getInstance() {
         if ( INSTANCE == null ) {
             INSTANCE = new BigDecimalFactory();
@@ -49,7 +57,7 @@
             return BigDecimalGreaterEvaluator.INSTANCE;
         } else if ( operator == Operator.GREATER_OR_EQUAL ) {
             return BigDecimalGreaterOrEqualEvaluator.INSTANCE;
-        }  else {
+        } else {
             throw new RuntimeException( "Operator '" + operator + "' does not exist for BigDecimalEvaluator" );
         }
     }
@@ -66,14 +74,46 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            Object value1 = extractor.getValue( object1 );
+            Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.equals( value2 );
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return object2 == null;
+            Object value1 = object1.getValue();
+            Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 == null;
             }
-            return ((Number) object1).equals( object2 );
+            return value1.equals( value2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            Object value = context.declaration.getExtractor().getValue( left );
+            if ( value == null ) {
+                return ((ObjectVariableContextEntry) context).right == null;
+            }
+            return value.equals( ((ObjectVariableContextEntry) context).right );
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            Object value = context.extractor.getValue( right );
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return value == null;
+            }
+            return ((ObjectVariableContextEntry) context).left.equals( value );
+        }
+
         public String toString() {
             return "BigDecimal ==";
         }
@@ -91,14 +131,46 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            Object value1 = extractor.getValue( object1 );
+            Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            return !value1.equals( value2 );
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return object2 != null;
+            Object value1 = object1.getValue();
+            Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 != null;
             }
-            return !((BigDecimal) object1).equals( object2 );
+            return !value1.equals( value2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            Object value = context.declaration.getExtractor().getValue( left );
+            if ( value == null ) {
+                return ((ObjectVariableContextEntry) context).right != null;
+            }
+            return !value.equals( ((ObjectVariableContextEntry) context).right );
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            Object value = context.extractor.getValue( right );
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return value != null;
+            }
+            return !((ObjectVariableContextEntry) context).left.equals( value );
+        }
+
         public String toString() {
             return "BigDecimal !=";
         }
@@ -116,11 +188,32 @@
                    Operator.LESS );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            final BigDecimal comp = (BigDecimal) extractor.getValue( object1 );
+            return comp.compareTo( object2.getValue() ) < 0;
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-        	return ((BigDecimal) object1).compareTo( (BigDecimal) object2) < 0;            
+            final BigDecimal comp = (BigDecimal) object1.getValue();
+            return comp.compareTo( extractor.getValue( object2 ) ) < 0;
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            final BigDecimal comp = (BigDecimal) context.declaration.getExtractor().getValue( left );
+            return comp.compareTo( ((ObjectVariableContextEntry) context).right ) < 0;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            final BigDecimal comp = (BigDecimal) ((ObjectVariableContextEntry) context).left;
+            return comp.compareTo( context.extractor.getValue( right ) ) < 0;
+        }
+
         public String toString() {
             return "BigDecimal <";
         }
@@ -138,11 +231,32 @@
                    Operator.LESS_OR_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            final BigDecimal comp = (BigDecimal) extractor.getValue( object1 );
+            return comp.compareTo( object2.getValue() ) <= 0;
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-        	return ((BigDecimal) object1).compareTo((BigDecimal)object2) <= 0;            
+            final BigDecimal comp = (BigDecimal) object1.getValue();
+            return comp.compareTo( extractor.getValue( object2 ) ) <= 0;
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            final BigDecimal comp = (BigDecimal) context.declaration.getExtractor().getValue( left );
+            return comp.compareTo( ((ObjectVariableContextEntry) context).right ) <= 0;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            final BigDecimal comp = (BigDecimal) ((ObjectVariableContextEntry) context).left;
+            return comp.compareTo( context.extractor.getValue( right ) ) <= 0;
+        }
+
         public String toString() {
             return "BigDecimal <=";
         }
@@ -160,11 +274,32 @@
                    Operator.GREATER );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            final BigDecimal comp = (BigDecimal) extractor.getValue( object1 );
+            return comp.compareTo( object2.getValue() ) > 0;
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-        	return ((BigDecimal) object1).compareTo((BigDecimal)object2) > 0;               
+            final BigDecimal comp = (BigDecimal) object1.getValue();
+            return comp.compareTo( extractor.getValue( object2 ) ) > 0;
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            final BigDecimal comp = (BigDecimal) context.declaration.getExtractor().getValue( left );
+            return comp.compareTo( ((ObjectVariableContextEntry) context).right ) > 0;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            final BigDecimal comp = (BigDecimal) ((ObjectVariableContextEntry) context).left;
+            return comp.compareTo( context.extractor.getValue( right ) ) > 0;
+        }
+
         public String toString() {
             return "BigDecimal >";
         }
@@ -182,11 +317,32 @@
                    Operator.GREATER_OR_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            final BigDecimal comp = (BigDecimal) extractor.getValue( object1 );
+            return comp.compareTo( object2.getValue() ) >= 0;
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-        	return ((BigDecimal) object1).compareTo((BigDecimal)object2) >= 0;   
+            final BigDecimal comp = (BigDecimal) object1.getValue();
+            return comp.compareTo( extractor.getValue( object2 ) ) >= 0;
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            final BigDecimal comp = (BigDecimal) context.declaration.getExtractor().getValue( left );
+            return comp.compareTo( ((ObjectVariableContextEntry) context).right ) >= 0;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            final BigDecimal comp = (BigDecimal) ((ObjectVariableContextEntry) context).left;
+            return comp.compareTo( context.extractor.getValue( right ) ) >= 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-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BigIntegerFactory.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -20,9 +20,15 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
+import org.drools.rule.VariableConstraint.ObjectVariableContextEntry;
+import org.drools.rule.VariableConstraint.VariableContextEntry;
 import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
+import org.drools.spi.FieldValue;
 
 public class BigIntegerFactory implements EvaluatorFactory {
+
+    private static final long serialVersionUID = 4180922947425495749L;
     private static EvaluatorFactory INSTANCE = new BigIntegerFactory();
     
     private BigIntegerFactory() {
@@ -66,14 +72,46 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            Object value1 = extractor.getValue( object1 );
+            Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.equals( value2 );
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return object2 == null;
+            Object value1 = object1.getValue();
+            Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 == null;
             }
-            return ((Number) object1).equals( object2 );
+            return value1.equals( value2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            Object value = context.declaration.getExtractor().getValue( left );
+            if ( value == null ) {
+                return ((ObjectVariableContextEntry) context).right == null;
+            }
+            return value.equals( ((ObjectVariableContextEntry) context).right );
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            Object value = context.extractor.getValue( right );
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return value == null;
+            }
+            return ((ObjectVariableContextEntry) context).left.equals( value );
+        }
+
         public String toString() {
             return "BigInteger ==";
         }
@@ -91,14 +129,46 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            Object value1 = extractor.getValue( object1 );
+            Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            return !value1.equals( value2 );
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return object2 != null;
+            Object value1 = object1.getValue();
+            Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 != null;
             }
-            return !((BigInteger) object1).equals( object2 );
+            return !value1.equals( value2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            Object value = context.declaration.getExtractor().getValue( left );
+            if ( value == null ) {
+                return ((ObjectVariableContextEntry) context).right != null;
+            }
+            return !value.equals( ((ObjectVariableContextEntry) context).right );
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            Object value = context.extractor.getValue( right );
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return value != null;
+            }
+            return !((ObjectVariableContextEntry) context).left.equals( value );
+        }
+
         public String toString() {
             return "BigInteger !=";
         }
@@ -116,11 +186,32 @@
                    Operator.LESS );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            final BigInteger comp = (BigInteger) extractor.getValue( object1 );
+            return comp.compareTo( object2.getValue() ) < 0;
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-        	return ((BigInteger) object1).compareTo( (BigInteger) object2) < 0;            
+            final BigInteger comp = (BigInteger) object1.getValue();
+            return comp.compareTo( extractor.getValue( object2 ) ) < 0;
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            final BigInteger comp = (BigInteger) context.declaration.getExtractor().getValue( left );
+            return comp.compareTo( ((ObjectVariableContextEntry) context).right ) < 0;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            final BigInteger comp = (BigInteger) ((ObjectVariableContextEntry) context).left;
+            return comp.compareTo( context.extractor.getValue( right ) ) < 0;
+        }
+
         public String toString() {
             return "BigInteger <";
         }
@@ -138,11 +229,32 @@
                    Operator.LESS_OR_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            final BigInteger comp = (BigInteger) extractor.getValue( object1 );
+            return comp.compareTo( object2.getValue() ) <= 0;
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-        	return ((BigInteger) object1).compareTo((BigInteger)object2) <= 0;            
+            final BigInteger comp = (BigInteger) object1.getValue();
+            return comp.compareTo( extractor.getValue( object2 ) ) <= 0;
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            final BigInteger comp = (BigInteger) context.declaration.getExtractor().getValue( left );
+            return comp.compareTo( ((ObjectVariableContextEntry) context).right ) <= 0;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            final BigInteger comp = (BigInteger) ((ObjectVariableContextEntry) context).left;
+            return comp.compareTo( context.extractor.getValue( right ) ) <= 0;
+        }
+
         public String toString() {
             return "BigInteger <=";
         }
@@ -160,11 +272,32 @@
                    Operator.GREATER );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            final BigInteger comp = (BigInteger) extractor.getValue( object1 );
+            return comp.compareTo( object2.getValue() ) > 0;
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-        	return ((BigInteger) object1).compareTo((BigInteger)object2) > 0;               
+            final BigInteger comp = (BigInteger) object1.getValue();
+            return comp.compareTo( extractor.getValue( object2 ) ) > 0;
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            final BigInteger comp = (BigInteger) context.declaration.getExtractor().getValue( left );
+            return comp.compareTo( ((ObjectVariableContextEntry) context).right ) > 0;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            final BigInteger comp = (BigInteger) ((ObjectVariableContextEntry) context).left;
+            return comp.compareTo( context.extractor.getValue( right ) ) > 0;
+        }
+
         public String toString() {
             return "BigInteger >";
         }
@@ -182,11 +315,32 @@
                    Operator.GREATER_OR_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            final BigInteger comp = (BigInteger) extractor.getValue( object1 );
+            return comp.compareTo( object2.getValue() ) >= 0;
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-        	return ((BigInteger) object1).compareTo((BigInteger)object2) >= 0;   
+            final BigInteger comp = (BigInteger) object1.getValue();
+            return comp.compareTo( extractor.getValue( object2 ) ) >= 0;
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            final BigInteger comp = (BigInteger) context.declaration.getExtractor().getValue( left );
+            return comp.compareTo( ((ObjectVariableContextEntry) context).right ) >= 0;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            final BigInteger comp = (BigInteger) ((ObjectVariableContextEntry) context).left;
+            return comp.compareTo( context.extractor.getValue( right ) ) >= 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-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BooleanFactory.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -18,38 +18,39 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
-import org.drools.base.evaluators.ShortFactory.ShortEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortGreaterEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortGreaterOrEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortLessEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortLessOrEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortNotEqualEvaluator;
+import org.drools.rule.VariableConstraint.BooleanVariableContextEntry;
+import org.drools.rule.VariableConstraint.VariableContextEntry;
 import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
+import org.drools.spi.FieldValue;
 
-public class BooleanFactory implements EvaluatorFactory {
+public class BooleanFactory
+    implements
+    EvaluatorFactory {
+
+    private static final long serialVersionUID = -1463529133869380215L;
     private static EvaluatorFactory INSTANCE = new BooleanFactory();
-    
+
     private BooleanFactory() {
-        
+
     }
-    
+
     public static EvaluatorFactory getInstance() {
         if ( INSTANCE == null ) {
             INSTANCE = new BooleanFactory();
         }
         return INSTANCE;
     }
-    
+
     public Evaluator getEvaluator(final Operator operator) {
         if ( operator == Operator.EQUAL ) {
             return BooleanEqualEvaluator.INSTANCE;
         } else if ( operator == Operator.NOT_EQUAL ) {
             return BooleanNotEqualEvaluator.INSTANCE;
-        }  else {
+        } else {
             throw new RuntimeException( "Operator '" + operator + "' does not exist for BooleanEvaluator" );
-        }    
+        }
     }
-    
 
     static class BooleanEqualEvaluator extends BaseEvaluator {
         /**
@@ -63,14 +64,28 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getBooleanValue( object1 ) == object2.getBooleanValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return object2 == null;
-            }
-            return ((Boolean) object1).equals( object2 );
+            return extractor.getBooleanValue( object2 ) == object1.getBooleanValue();
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getBooleanValue( left ) == ((BooleanVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object object2) {
+            return context.extractor.getBooleanValue( object2 ) == ((BooleanVariableContextEntry) context).left;
+        }
+
         public String toString() {
             return "Boolean ==";
         }
@@ -88,14 +103,28 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getBooleanValue( object1 ) != object2.getBooleanValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return object2 != null;
-            }
-            return !((Boolean) object1).equals( object2 );
+            return extractor.getBooleanValue( object2 ) != object1.getBooleanValue();
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getBooleanValue( left ) != ((BooleanVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object object2) {
+            return context.extractor.getBooleanValue( object2 ) != ((BooleanVariableContextEntry) context).left;
+        }
+
         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-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ByteFactory.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -18,21 +18,23 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
-import org.drools.base.evaluators.ShortFactory.ShortEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortGreaterEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortGreaterOrEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortLessEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortLessOrEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortNotEqualEvaluator;
+import org.drools.rule.VariableConstraint.LongVariableContextEntry;
+import org.drools.rule.VariableConstraint.VariableContextEntry;
 import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
+import org.drools.spi.FieldValue;
 
-public class ByteFactory implements EvaluatorFactory {
-    private static EvaluatorFactory INSTANCE = new ByteFactory();
-    
+public class ByteFactory
+    implements
+    EvaluatorFactory {
+
+    private static final long       serialVersionUID = -2213953461197502182L;
+    private static EvaluatorFactory INSTANCE         = new ByteFactory();
+
     private ByteFactory() {
-        
+
     }
-    
+
     public static EvaluatorFactory getInstance() {
         if ( INSTANCE == null ) {
             INSTANCE = new ByteFactory();
@@ -53,12 +55,11 @@
             return ByteGreaterEvaluator.INSTANCE;
         } else if ( operator == Operator.GREATER_OR_EQUAL ) {
             return ByteGreaterOrEqualEvaluator.INSTANCE;
-        }  else {
+        } else {
             throw new RuntimeException( "Operator '" + operator + "' does not exist for ByteEvaluator" );
-        }    
+        }
     }
 
-
     static class ByteEqualEvaluator extends BaseEvaluator {
         /**
          * 
@@ -71,14 +72,28 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getByteValue( object1 ) == object2.getByteValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return object2 == null;
-            }
-            return ((Byte) object1).equals( object2 );
+            return object1.getByteValue() == extractor.getByteValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getByteValue( left ) == ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left == context.extractor.getByteValue( right );
+        }
+
         public String toString() {
             return "Byte ==";
         }
@@ -96,14 +111,28 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getByteValue( object1 ) != object2.getByteValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return object2 != null;
-            }
-            return !((Byte) object1).equals( object2 );
+            return object1.getByteValue() != extractor.getByteValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getByteValue( left ) != ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left != context.extractor.getByteValue( right );
+        }
+
         public String toString() {
             return "Byte !=";
         }
@@ -121,11 +150,28 @@
                    Operator.LESS );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getByteValue( object1 ) < object2.getByteValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Byte) object1).byteValue() < ((Byte) object2).byteValue();
+            return object1.getByteValue() < extractor.getByteValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getByteValue( left ) < ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left < context.extractor.getByteValue( right );
+        }
+
         public String toString() {
             return "Byte <";
         }
@@ -143,11 +189,28 @@
                    Operator.LESS_OR_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getByteValue( object1 ) <= object2.getByteValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Byte) object1).byteValue() <= ((Byte) object2).byteValue();
+            return object1.getByteValue() <= extractor.getByteValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getByteValue( left ) <= ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left <= context.extractor.getByteValue( right );
+        }
+
         public String toString() {
             return "Byte <=";
         }
@@ -165,11 +228,28 @@
                    Operator.GREATER );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getByteValue( object1 ) > object2.getByteValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Byte) object1).byteValue() > ((Byte) object2).byteValue();
+            return object1.getByteValue() > extractor.getByteValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getByteValue( left ) > ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left > context.extractor.getByteValue( right );
+        }
+
         public String toString() {
             return "Byte >";
         }
@@ -187,11 +267,28 @@
                    Operator.GREATER_OR_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getByteValue( object1 ) >= object2.getByteValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Byte) object1).byteValue() >= ((Byte) object2).byteValue();
+            return object1.getByteValue() >= extractor.getByteValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getByteValue( left ) >= ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left >= context.extractor.getByteValue( right );
+        }
+
         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-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CharacterFactory.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -18,21 +18,23 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
-import org.drools.base.evaluators.ShortFactory.ShortEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortGreaterEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortGreaterOrEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortLessEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortLessOrEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortNotEqualEvaluator;
+import org.drools.rule.VariableConstraint.LongVariableContextEntry;
+import org.drools.rule.VariableConstraint.VariableContextEntry;
 import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
+import org.drools.spi.FieldValue;
 
-public class CharacterFactory implements EvaluatorFactory {
-    private static EvaluatorFactory INSTANCE = new CharacterFactory();
-    
+public class CharacterFactory
+    implements
+    EvaluatorFactory {
+
+    private static final long       serialVersionUID = -8006570416583057447L;
+    private static EvaluatorFactory INSTANCE         = new CharacterFactory();
+
     private CharacterFactory() {
-        
+
     }
-    
+
     public static EvaluatorFactory getInstance() {
         if ( INSTANCE == null ) {
             INSTANCE = new CharacterFactory();
@@ -53,12 +55,11 @@
             return CharacterGreaterEvaluator.INSTANCE;
         } else if ( operator == Operator.GREATER_OR_EQUAL ) {
             return CharacterGreaterOrEqualEvaluator.INSTANCE;
-        }  else {
+        } else {
             throw new RuntimeException( "Operator '" + operator + "' does not exist for CharacterEvaluator" );
-        }    
+        }
     }
 
-
     static class CharacterEqualEvaluator extends BaseEvaluator {
         /**
          * 
@@ -71,14 +72,28 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getCharValue( object1 ) == object2.getCharValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return object2 == null;
-            }
-            return ((Character) object1).equals( object2 );
+            return object1.getCharValue() == extractor.getCharValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getCharValue( left ) == ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left == context.extractor.getCharValue( right );
+        }
+
         public String toString() {
             return "Character ==";
         }
@@ -96,14 +111,28 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getCharValue( object1 ) != object2.getCharValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return object2 != null;
-            }
-            return !((Character) object1).equals( object2 );
+            return object1.getCharValue() != extractor.getCharValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getCharValue( left ) != ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left != context.extractor.getCharValue( right );
+        }
+
         public String toString() {
             return "Character !=";
         }
@@ -121,11 +150,28 @@
                    Operator.LESS );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getCharValue( object1 ) < object2.getCharValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Character) object1).charValue() < ((Character) object2).charValue();
+            return object1.getCharValue() < extractor.getCharValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getCharValue( left ) < ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left < context.extractor.getCharValue( right );
+        }
+
         public String toString() {
             return "Character <";
         }
@@ -143,11 +189,28 @@
                    Operator.LESS_OR_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getCharValue( object1 ) <= object2.getCharValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Character) object1).charValue() <= ((Character) object2).charValue();
+            return object1.getCharValue() <= extractor.getCharValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getCharValue( left ) <= ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left <= context.extractor.getCharValue( right );
+        }
+
         public String toString() {
             return "Character <=";
         }
@@ -165,11 +228,28 @@
                    Operator.GREATER );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getCharValue( object1 ) > object2.getCharValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Character) object1).charValue() > ((Character) object2).charValue();
+            return object1.getCharValue() > extractor.getCharValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getCharValue( left ) > ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left > context.extractor.getCharValue( right );
+        }
+
         public String toString() {
             return "Character >";
         }
@@ -187,11 +267,28 @@
                    Operator.GREATER_OR_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getCharValue( object1 ) >= object2.getCharValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Character) object1).charValue() >= ((Character) object2).charValue();
+            return object1.getCharValue() >= extractor.getCharValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getCharValue( left ) >= ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left >= context.extractor.getCharValue( right );
+        }
+
         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-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DateFactory.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -22,7 +22,11 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
+import org.drools.rule.VariableConstraint.ObjectVariableContextEntry;
+import org.drools.rule.VariableConstraint.VariableContextEntry;
 import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
+import org.drools.spi.FieldValue;
 
 /**
  * This will generate evaluators that handle dates.
@@ -40,6 +44,7 @@
     implements
     EvaluatorFactory {
 
+    private static final long       serialVersionUID    = -9190991797780589450L;
     private static final String     DEFAULT_FORMAT_MASK = "dd-MMM-yyyy";
     private static final String     DATE_FORMAT_MASK    = getDateFormatMask();
 
@@ -86,23 +91,60 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            Date value1 = (Date) extractor.getValue( object1 );
+            Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            if ( value2 == null ) {
+                return false;
+            }
+            return value1.compareTo( getRightDate( value2 ) ) == 0;
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return object2 == null;
+            Date value1 = (Date) object1.getValue();
+            Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 == null;
             }
-            if ( object2 == null ) {
+            if ( value2 == null ) {
                 return false;
             }
-            final Date left = (Date) object1;
+            return value1.compareTo( getRightDate( value2 ) ) == 0;
+        }
 
-            if ( left.compareTo( getRightDate( object2 ) ) == 0 ) {
-                return true;
-            } else {
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            Date value1 = (Date) context.declaration.getExtractor().getValue( left );
+            Object value2 = ((ObjectVariableContextEntry) context).right;
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            if ( value2 == null ) {
                 return false;
             }
+            return value1.compareTo( getRightDate( value2 ) ) == 0;
         }
 
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            Date value1 = (Date) ((ObjectVariableContextEntry) context).left;
+            Object value2 = context.extractor.getValue( right );
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            if ( value2 == null ) {
+                return false;
+            }
+            return value1.compareTo( getRightDate( value2 ) ) == 0;
+        }
+
         public String toString() {
             return "Date ==";
         }
@@ -120,22 +162,60 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            Date value1 = (Date) extractor.getValue( object1 );
+            Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            if ( value2 == null ) {
+                return true;
+            }
+            return value1.compareTo( getRightDate( value2 ) ) != 0;
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return object2 != null;
+            Date value1 = (Date) object1.getValue();
+            Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 != null;
             }
-            if ( object2 == null ) {
+            if ( value2 == null ) {
                 return true;
             }
-            final Date left = (Date) object1;
-            if ( left.compareTo( getRightDate( object2 ) ) != 0 ) {
+            return value1.compareTo( getRightDate( value2 ) ) != 0;
+        }
+
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            Date value1 = (Date) context.declaration.getExtractor().getValue( left );
+            Object value2 = ((ObjectVariableContextEntry) context).right;
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            if ( value2 == null ) {
                 return true;
-            } else {
-                return false;
             }
+            return value1.compareTo( getRightDate( value2 ) ) != 0;
         }
 
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            Date value1 = (Date) ((ObjectVariableContextEntry) context).left;
+            Object value2 = context.extractor.getValue( right );
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            if ( value2 == null ) {
+                return true;
+            }
+            return value1.compareTo( getRightDate( value2 ) ) != 0;
+        }
+
         public String toString() {
             return "Date !=";
         }
@@ -153,16 +233,36 @@
                    Operator.LESS );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            Date value1 = (Date) extractor.getValue( object1 );
+            Object value2 = object2.getValue();
+            return value1.compareTo( getRightDate( value2 ) ) < 0;
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            final Date left = (Date) object1;
-            if ( left.compareTo( getRightDate( object2 ) ) < 0 ) {
-                return true;
-            } else {
-                return false;
-            }
+            Date value1 = (Date) object1.getValue();
+            Object value2 = extractor.getValue( object2 );
+            return value1.compareTo( getRightDate( value2 ) ) < 0;
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            Date value1 = (Date) context.declaration.getExtractor().getValue( left );
+            Object value2 = ((ObjectVariableContextEntry) context).right;
+            return value1.compareTo( getRightDate( value2 ) ) < 0;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            Date value1 = (Date) ((ObjectVariableContextEntry) context).left;
+            Object value2 = context.extractor.getValue( right );
+            return value1.compareTo( getRightDate( value2 ) ) < 0;
+        }
+
         public String toString() {
             return "Date <";
         }
@@ -180,16 +280,36 @@
                    Operator.LESS_OR_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            Date value1 = (Date) extractor.getValue( object1 );
+            Object value2 = object2.getValue();
+            return value1.compareTo( getRightDate( value2 ) ) <= 0;
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            final Date left = (Date) object1;
-            if ( left.compareTo( getRightDate( object2 ) ) <= 0 ) {
-                return true;
-            } else {
-                return false;
-            }
+            Date value1 = (Date) object1.getValue();
+            Object value2 = extractor.getValue( object2 );
+            return value1.compareTo( getRightDate( value2 ) ) <= 0;
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            Date value1 = (Date) context.declaration.getExtractor().getValue( left );
+            Object value2 = ((ObjectVariableContextEntry) context).right;
+            return value1.compareTo( getRightDate( value2 ) ) <= 0;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            Date value1 = (Date) ((ObjectVariableContextEntry) context).left;
+            Object value2 = context.extractor.getValue( right );
+            return value1.compareTo( getRightDate( value2 ) ) <= 0;
+        }
+
         public String toString() {
             return "Date <=";
         }
@@ -207,16 +327,36 @@
                    Operator.GREATER );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            Date value1 = (Date) extractor.getValue( object1 );
+            Object value2 = object2.getValue();
+            return value1.compareTo( getRightDate( value2 ) ) > 0;
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            final Date left = (Date) object1;
-            if ( left.compareTo( getRightDate( object2 ) ) > 0 ) {
-                return true;
-            } else {
-                return false;
-            }
+            Date value1 = (Date) object1.getValue();
+            Object value2 = extractor.getValue( object2 );
+            return value1.compareTo( getRightDate( value2 ) ) > 0;
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            Date value1 = (Date) context.declaration.getExtractor().getValue( left );
+            Object value2 = ((ObjectVariableContextEntry) context).right;
+            return value1.compareTo( getRightDate( value2 ) ) > 0;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            Date value1 = (Date) ((ObjectVariableContextEntry) context).left;
+            Object value2 = context.extractor.getValue( right );
+            return value1.compareTo( getRightDate( value2 ) ) > 0;
+        }
+
         public String toString() {
             return "Date >";
         }
@@ -234,16 +374,36 @@
                    Operator.GREATER_OR_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            Date value1 = (Date) extractor.getValue( object1 );
+            Object value2 = object2.getValue();
+            return value1.compareTo( getRightDate( value2 ) ) >= 0;
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            final Date left = (Date) object1;
-            if ( left.compareTo( getRightDate( object2 ) ) >= 0 ) {
-                return true;
-            } else {
-                return false;
-            }
+            Date value1 = (Date) object1.getValue();
+            Object value2 = extractor.getValue( object2 );
+            return value1.compareTo( getRightDate( value2 ) ) >= 0;
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            Date value1 = (Date) context.declaration.getExtractor().getValue( left );
+            Object value2 = ((ObjectVariableContextEntry) context).right;
+            return value1.compareTo( getRightDate( value2 ) ) >= 0;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            Date value1 = (Date) ((ObjectVariableContextEntry) context).left;
+            Object value2 = context.extractor.getValue( right );
+            return value1.compareTo( getRightDate( 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-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DoubleFactory.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -18,15 +18,23 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
+import org.drools.rule.VariableConstraint.DoubleVariableContextEntry;
+import org.drools.rule.VariableConstraint.VariableContextEntry;
 import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
+import org.drools.spi.FieldValue;
 
-public class DoubleFactory implements EvaluatorFactory {
-    private static EvaluatorFactory INSTANCE = new DoubleFactory();
-    
+public class DoubleFactory
+    implements
+    EvaluatorFactory {
+
+    private static final long       serialVersionUID = -3853062740291829023L;
+    private static EvaluatorFactory INSTANCE         = new DoubleFactory();
+
     private DoubleFactory() {
-        
+
     }
-    
+
     public static EvaluatorFactory getInstance() {
         if ( INSTANCE == null ) {
             INSTANCE = new DoubleFactory();
@@ -47,7 +55,7 @@
             return DoubleGreaterEvaluator.INSTANCE;
         } else if ( operator == Operator.GREATER_OR_EQUAL ) {
             return DoubleGreaterOrEqualEvaluator.INSTANCE;
-        }  else {
+        } else {
             throw new RuntimeException( "Operator '" + operator + "' does not exist for DoubleEvaluator" );
         }
     }
@@ -64,14 +72,32 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getDoubleValue( object1 ) == object2.getDoubleValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return object2 == null;
-            }
-            return ((Number) object1).equals( object2 );
+            // TODO: we are not handling delta right now... maybe we should
+            return object1.getDoubleValue() == extractor.getDoubleValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            // TODO: we are not handling delta right now... maybe we should
+            return context.declaration.getExtractor().getDoubleValue( left ) == ((DoubleVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            // TODO: we are not handling delta right now... maybe we should
+            return ((DoubleVariableContextEntry) context).left == context.extractor.getDoubleValue( right );
+        }
+
         public String toString() {
             return "Double ==";
         }
@@ -89,14 +115,32 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getDoubleValue( object1 ) != object2.getDoubleValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return object2 != null;
-            }
-            return !((Number) object1).equals( object2 );
+            // TODO: we are not handling delta right now... maybe we should
+            return object1.getDoubleValue() != extractor.getDoubleValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            // TODO: we are not handling delta right now... maybe we should
+            return context.declaration.getExtractor().getDoubleValue( left ) != ((DoubleVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            // TODO: we are not handling delta right now... maybe we should
+            return ((DoubleVariableContextEntry) context).left != context.extractor.getDoubleValue( right );
+        }
+
         public String toString() {
             return "Double !=";
         }
@@ -114,11 +158,32 @@
                    Operator.LESS );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getDoubleValue( object1 ) < object2.getDoubleValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Number) object1).doubleValue() < ((Number) object2).doubleValue();
+            // TODO: we are not handling delta right now... maybe we should
+            return object1.getDoubleValue() < extractor.getDoubleValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            // TODO: we are not handling delta right now... maybe we should
+            return context.declaration.getExtractor().getDoubleValue( left ) < ((DoubleVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            // TODO: we are not handling delta right now... maybe we should
+            return ((DoubleVariableContextEntry) context).left < context.extractor.getDoubleValue( right );
+        }
+
         public String toString() {
             return "Double <";
         }
@@ -136,11 +201,32 @@
                    Operator.LESS_OR_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getDoubleValue( object1 ) <= object2.getDoubleValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Number) object1).doubleValue() <= ((Number) object2).doubleValue();
+            // TODO: we are not handling delta right now... maybe we should
+            return object1.getDoubleValue() <= extractor.getDoubleValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            // TODO: we are not handling delta right now... maybe we should
+            return context.declaration.getExtractor().getDoubleValue( left ) <= ((DoubleVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            // TODO: we are not handling delta right now... maybe we should
+            return ((DoubleVariableContextEntry) context).left <= context.extractor.getDoubleValue( right );
+        }
+
         public String toString() {
             return "Double <=";
         }
@@ -158,11 +244,32 @@
                    Operator.GREATER );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getDoubleValue( object1 ) > object2.getDoubleValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Number) object1).doubleValue() > ((Number) object2).doubleValue();
+            // TODO: we are not handling delta right now... maybe we should
+            return object1.getDoubleValue() > extractor.getDoubleValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            // TODO: we are not handling delta right now... maybe we should
+            return context.declaration.getExtractor().getDoubleValue( left ) > ((DoubleVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            // TODO: we are not handling delta right now... maybe we should
+            return ((DoubleVariableContextEntry) context).left > context.extractor.getDoubleValue( right );
+        }
+
         public String toString() {
             return "Double >";
         }
@@ -180,11 +287,32 @@
                    Operator.GREATER_OR_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getDoubleValue( object1 ) >= object2.getDoubleValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Number) object1).doubleValue() >= ((Number) object2).doubleValue();
+            // TODO: we are not handling delta right now... maybe we should
+            return object1.getDoubleValue() >= extractor.getDoubleValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            // TODO: we are not handling delta right now... maybe we should
+            return context.declaration.getExtractor().getDoubleValue( left ) >= ((DoubleVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            // TODO: we are not handling delta right now... maybe we should
+            return ((DoubleVariableContextEntry) context).left >= context.extractor.getDoubleValue( right );
+        }
+
         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-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FactTemplateFactory.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -18,13 +18,11 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
-import org.drools.base.evaluators.DoubleFactory.DoubleEqualEvaluator;
-import org.drools.base.evaluators.DoubleFactory.DoubleGreaterEvaluator;
-import org.drools.base.evaluators.DoubleFactory.DoubleGreaterOrEqualEvaluator;
-import org.drools.base.evaluators.DoubleFactory.DoubleLessEvaluator;
-import org.drools.base.evaluators.DoubleFactory.DoubleLessOrEqualEvaluator;
-import org.drools.base.evaluators.DoubleFactory.DoubleNotEqualEvaluator;
+import org.drools.rule.VariableConstraint.ObjectVariableContextEntry;
+import org.drools.rule.VariableConstraint.VariableContextEntry;
 import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
+import org.drools.spi.FieldValue;
 
 /**
  * This is the misc "bucket" evaluator factory for objects.
@@ -33,13 +31,17 @@
  * 
  * @author Michael Neale
  */
-public class FactTemplateFactory implements EvaluatorFactory {
-    private static EvaluatorFactory INSTANCE = new FactTemplateFactory();
-    
+public class FactTemplateFactory
+    implements
+    EvaluatorFactory {
+
+    private static final long       serialVersionUID = 1384322764502834134L;
+    private static EvaluatorFactory INSTANCE         = new FactTemplateFactory();
+
     private FactTemplateFactory() {
-        
+
     }
-    
+
     public static EvaluatorFactory getInstance() {
         if ( INSTANCE == null ) {
             INSTANCE = new FactTemplateFactory();
@@ -52,9 +54,9 @@
             return FactTemplateEqualEvaluator.INSTANCE;
         } else if ( operator == Operator.NOT_EQUAL ) {
             return FactTemplateNotEqualEvaluator.INSTANCE;
-        }  else {
+        } else {
             throw new RuntimeException( "Operator '" + operator + "' does not exist for FactTemplateEvaluator" );
-        }    
+        }
     }
 
     static class FactTemplateEqualEvaluator extends BaseEvaluator {
@@ -69,14 +71,46 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            Object value1 = extractor.getValue( object1 );
+            Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.equals( value2 );
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return object2 == null;
+            Object value1 = object1.getValue();
+            Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 == null;
             }
-            return object1.equals( object2 );
+            return value1.equals( value2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            Object value = context.declaration.getExtractor().getValue( left );
+            if ( value == null ) {
+                return ((ObjectVariableContextEntry) context).right == null;
+            }
+            return value.equals( ((ObjectVariableContextEntry) context).right );
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            Object value = context.extractor.getValue( right );
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return value == null;
+            }
+            return ((ObjectVariableContextEntry) context).left.equals( value );
+        }
+
         public String toString() {
             return "FactTemplate ==";
         }
@@ -94,15 +128,46 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            Object value1 = extractor.getValue( object1 );
+            Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            return !value1.equals( value2 );
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return !(object2 == null);
+            Object value1 = object1.getValue();
+            Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 != null;
             }
+            return !value1.equals( value2 );
+        }
 
-            return !object1.equals( object2 );
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            Object value = context.declaration.getExtractor().getValue( left );
+            if ( value == null ) {
+                return ((ObjectVariableContextEntry) context).right != null;
+            }
+            return !value.equals( ((ObjectVariableContextEntry) context).right );
         }
 
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            Object value = context.extractor.getValue( right );
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return value != null;
+            }
+            return !((ObjectVariableContextEntry) context).left.equals( value );
+        }
+
         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-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FloatFactory.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -18,21 +18,23 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
-import org.drools.base.evaluators.ShortFactory.ShortEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortGreaterEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortGreaterOrEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortLessEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortLessOrEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortNotEqualEvaluator;
+import org.drools.rule.VariableConstraint.DoubleVariableContextEntry;
+import org.drools.rule.VariableConstraint.VariableContextEntry;
 import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
+import org.drools.spi.FieldValue;
 
-public class FloatFactory implements EvaluatorFactory {
-    private static EvaluatorFactory INSTANCE = new FloatFactory();
-    
+public class FloatFactory
+    implements
+    EvaluatorFactory {
+
+    private static final long       serialVersionUID = -4254964760901343619L;
+    private static EvaluatorFactory INSTANCE         = new FloatFactory();
+
     private FloatFactory() {
-        
+
     }
-    
+
     public static EvaluatorFactory getInstance() {
         if ( INSTANCE == null ) {
             INSTANCE = new FloatFactory();
@@ -53,16 +55,13 @@
             return FloatGreaterEvaluator.INSTANCE;
         } else if ( operator == Operator.GREATER_OR_EQUAL ) {
             return FloatGreaterOrEqualEvaluator.INSTANCE;
-        }  else {
+        } else {
             throw new RuntimeException( "Operator '" + operator + "' does not exist for FloatEvaluator" );
-        }    
+        }
     }
 
+    static class FloatEqualEvaluator extends BaseEvaluator {
 
-    static class FloatEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
         private static final long     serialVersionUID = 320;
         public final static Evaluator INSTANCE         = new FloatEqualEvaluator();
 
@@ -71,14 +70,32 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getFloatValue( object1 ) == object2.getFloatValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return object2 == null;
-            }
-            return ((Number) object1).equals( object2 );
+            // TODO: we are not handling delta right now... maybe we should
+            return object1.getFloatValue() == extractor.getFloatValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            // TODO: we are not handling delta right now... maybe we should
+            return context.declaration.getExtractor().getFloatValue( left ) == ((DoubleVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            // TODO: we are not handling delta right now... maybe we should
+            return ((DoubleVariableContextEntry) context).left == context.extractor.getFloatValue( right );
+        }
+
         public String toString() {
             return "Float ==";
         }
@@ -96,14 +113,32 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getFloatValue( object1 ) != object2.getFloatValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return object2 != null;
-            }
-            return !((Number) object1).equals( object2 );
+            // TODO: we are not handling delta right now... maybe we should
+            return object1.getFloatValue() != extractor.getFloatValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            // TODO: we are not handling delta right now... maybe we should
+            return context.declaration.getExtractor().getFloatValue( left ) != ((DoubleVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            // TODO: we are not handling delta right now... maybe we should
+            return ((DoubleVariableContextEntry) context).left != context.extractor.getFloatValue( right );
+        }
+
         public String toString() {
             return "Float !=";
         }
@@ -121,11 +156,32 @@
                    Operator.LESS );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getFloatValue( object1 ) < object2.getFloatValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Number) object1).floatValue() < ((Number) object2).floatValue();
+            // TODO: we are not handling delta right now... maybe we should
+            return object1.getFloatValue() < extractor.getFloatValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            // TODO: we are not handling delta right now... maybe we should
+            return context.declaration.getExtractor().getFloatValue( left ) < ((DoubleVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            // TODO: we are not handling delta right now... maybe we should
+            return ((DoubleVariableContextEntry) context).left < context.extractor.getFloatValue( right );
+        }
+
         public String toString() {
             return "Float <";
         }
@@ -143,11 +199,32 @@
                    Operator.LESS_OR_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getFloatValue( object1 ) <= object2.getFloatValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Number) object1).floatValue() <= ((Number) object2).floatValue();
+            // TODO: we are not handling delta right now... maybe we should
+            return object1.getFloatValue() <= extractor.getFloatValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            // TODO: we are not handling delta right now... maybe we should
+            return context.declaration.getExtractor().getFloatValue( left ) <= ((DoubleVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            // TODO: we are not handling delta right now... maybe we should
+            return ((DoubleVariableContextEntry) context).left <= context.extractor.getFloatValue( right );
+        }
+
         public String toString() {
             return "Float <=";
         }
@@ -165,11 +242,32 @@
                    Operator.GREATER );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getFloatValue( object1 ) > object2.getFloatValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Number) object1).floatValue() > ((Number) object2).floatValue();
+            // TODO: we are not handling delta right now... maybe we should
+            return object1.getFloatValue() > extractor.getFloatValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            // TODO: we are not handling delta right now... maybe we should
+            return context.declaration.getExtractor().getFloatValue( left ) > ((DoubleVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            // TODO: we are not handling delta right now... maybe we should
+            return ((DoubleVariableContextEntry) context).left > context.extractor.getFloatValue( right );
+        }
+
         public String toString() {
             return "Float >";
         }
@@ -187,11 +285,32 @@
                    Operator.GREATER_OR_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getFloatValue( object1 ) >= object2.getFloatValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Number) object1).floatValue() >= ((Number) object2).floatValue();
+            // TODO: we are not handling delta right now... maybe we should
+            return object1.getFloatValue() >= extractor.getFloatValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            // TODO: we are not handling delta right now... maybe we should
+            return context.declaration.getExtractor().getFloatValue( left ) >= ((DoubleVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            // TODO: we are not handling delta right now... maybe we should
+            return ((DoubleVariableContextEntry) context).left >= context.extractor.getFloatValue( right );
+        }
+
         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-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/IntegerFactory.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -18,21 +18,23 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
-import org.drools.base.evaluators.ShortFactory.ShortEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortGreaterEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortGreaterOrEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortLessEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortLessOrEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortNotEqualEvaluator;
+import org.drools.rule.VariableConstraint.LongVariableContextEntry;
+import org.drools.rule.VariableConstraint.VariableContextEntry;
 import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
+import org.drools.spi.FieldValue;
 
-public class IntegerFactory implements EvaluatorFactory {
+public class IntegerFactory
+    implements
+    EvaluatorFactory {
+
+    private static final long serialVersionUID = -6863552870087722275L;
     private static EvaluatorFactory INSTANCE = new IntegerFactory();
-    
+
     private IntegerFactory() {
-        
+
     }
-    
+
     public static EvaluatorFactory getInstance() {
         if ( INSTANCE == null ) {
             INSTANCE = new IntegerFactory();
@@ -53,9 +55,9 @@
             return IntegerGreaterEvaluator.INSTANCE;
         } else if ( operator == Operator.GREATER_OR_EQUAL ) {
             return IntegerGreaterOrEqualEvaluator.INSTANCE;
-        }  else {
+        } else {
             throw new RuntimeException( "Operator '" + operator + "' does not exist for IntegerEvaluator" );
-        }    
+        }
     }
 
     static class IntegerEqualEvaluator extends BaseEvaluator {
@@ -70,17 +72,32 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
-                                final Object object2) {             
-            if ( object1 == null ) {
-                return object2 == null;
-            }
-            return object1.equals( object2 );
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getIntValue( object1 ) == object2.getIntValue();
         }
 
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
+                                final Object object2) {
+            return extractor.getIntValue( object2 ) == object1.getIntValue();
+        }
+
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getIntValue( left ) == ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object object2) {
+            return context.extractor.getIntValue( object2 ) == ((LongVariableContextEntry) context).left;
+        }
+
         public String toString() {
             return "Integer ==";
         }
+
     }
 
     static class IntegerNotEqualEvaluator extends BaseEvaluator {
@@ -95,14 +112,28 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
-                                final Object object2) {             
-            if ( object1 == null ) {
-                return (object2 != null);
-            }
-            return !object1.equals( object2 );
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getIntValue( object1 ) != object2.getIntValue();
         }
 
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
+                                final Object object2) {
+            return extractor.getIntValue( object2 ) != object1.getIntValue();
+        }
+
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getIntValue( left ) != ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object object2) {
+            return context.extractor.getIntValue( object2 ) != ((LongVariableContextEntry) context).left;
+        }
+
         public String toString() {
             return "Integer !=";
         }
@@ -120,11 +151,28 @@
                    Operator.LESS );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getIntValue( object1 ) < object2.getIntValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Number) object1).intValue() < ((Number) object2).intValue();
+            return object1.getIntValue() < extractor.getIntValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getIntValue( left ) < ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left < context.extractor.getIntValue( right );
+        }
+
         public String toString() {
             return "Integer <";
         }
@@ -142,11 +190,28 @@
                    Operator.LESS_OR_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getIntValue( object1 ) <= object2.getIntValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Number) object1).intValue() <= ((Number) object2).intValue();
+            return object1.getIntValue() <= extractor.getIntValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getIntValue( left ) <= ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left <= context.extractor.getIntValue( right );
+        }
+
         public String toString() {
             return "Integer <=";
         }
@@ -164,11 +229,28 @@
                    Operator.GREATER );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getIntValue( object1 ) > object2.getIntValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Number) object1).intValue() > ((Number) object2).intValue();
+            return object1.getIntValue() > extractor.getIntValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getIntValue( left ) > ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left > context.extractor.getIntValue( right );
+        }
+
         public String toString() {
             return "Integer >";
         }
@@ -186,11 +268,28 @@
                    Operator.GREATER_OR_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getIntValue( object1 ) >= object2.getIntValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Number) object1).intValue() >= ((Number) object2).intValue();
+            return object1.getIntValue() >= extractor.getIntValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getIntValue( left ) >= ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left >= context.extractor.getIntValue( right );
+        }
+
         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-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/LongFactory.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -18,21 +18,23 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
-import org.drools.base.evaluators.ShortFactory.ShortEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortGreaterEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortGreaterOrEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortLessEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortLessOrEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortNotEqualEvaluator;
+import org.drools.rule.VariableConstraint.LongVariableContextEntry;
+import org.drools.rule.VariableConstraint.VariableContextEntry;
 import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
+import org.drools.spi.FieldValue;
 
-public class LongFactory implements EvaluatorFactory {
-    private static EvaluatorFactory INSTANCE = new LongFactory();
+public class LongFactory
+    implements
+    EvaluatorFactory {
     
+    private static final long       serialVersionUID = 4184811148799115566L;
+    private static EvaluatorFactory INSTANCE         = new LongFactory();
+
     private LongFactory() {
-        
+
     }
-    
+
     public static EvaluatorFactory getInstance() {
         if ( INSTANCE == null ) {
             INSTANCE = new LongFactory();
@@ -53,12 +55,11 @@
             return LongGreaterEvaluator.INSTANCE;
         } else if ( operator == Operator.GREATER_OR_EQUAL ) {
             return LongGreaterOrEqualEvaluator.INSTANCE;
-        }  else {
+        } else {
             throw new RuntimeException( "Operator '" + operator + "' does not exist for LongEvaluator" );
-        }    
+        }
     }
 
-
     static class LongEqualEvaluator extends BaseEvaluator {
         /**
          * 
@@ -71,14 +72,28 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getLongValue( object1 ) == object2.getLongValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return object2 == null;
-            }
-            return ((Number) object1).equals( object2 );
+            return object1.getLongValue() == extractor.getLongValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getLongValue( left ) == ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left == context.extractor.getLongValue( right );
+        }
+
         public String toString() {
             return "Long ==";
         }
@@ -96,14 +111,28 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getLongValue( object1 ) != object2.getLongValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return object2 != null;
-            }
-            return !((Number) object1).equals( object2 );
+            return object1.getLongValue() != extractor.getLongValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getLongValue( left ) != ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left != context.extractor.getLongValue( right );
+        }
+
         public String toString() {
             return "Long !=";
         }
@@ -121,11 +150,28 @@
                    Operator.LESS );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getLongValue( object1 ) < object2.getLongValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Number) object1).longValue() < ((Number) object2).longValue();
+            return object1.getLongValue() < extractor.getLongValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getLongValue( left ) < ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left < context.extractor.getLongValue( right );
+        }
+
         public String toString() {
             return "Long <";
         }
@@ -143,11 +189,28 @@
                    Operator.LESS_OR_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getLongValue( object1 ) <= object2.getLongValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Number) object1).longValue() <= ((Number) object2).longValue();
+            return object1.getLongValue() <= extractor.getLongValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getLongValue( left ) <= ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left <= context.extractor.getLongValue( right );
+        }
+
         public String toString() {
             return "Long <=";
         }
@@ -165,11 +228,28 @@
                    Operator.GREATER );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getLongValue( object1 ) > object2.getLongValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Number) object1).longValue() > ((Number) object2).longValue();
+            return object1.getLongValue() > extractor.getLongValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getLongValue( left ) > ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left > context.extractor.getLongValue( right );
+        }
+
         public String toString() {
             return "Long >";
         }
@@ -187,11 +267,28 @@
                    Operator.GREATER_OR_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getLongValue( object1 ) >= object2.getLongValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Number) object1).longValue() >= ((Number) object2).longValue();
+            return object1.getLongValue() >= extractor.getLongValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getLongValue( left ) >= ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left >= context.extractor.getLongValue( right );
+        }
+
         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-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ObjectFactory.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -20,19 +20,11 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
-import org.drools.base.evaluators.IntegerFactory.IntegerEqualEvaluator;
-import org.drools.base.evaluators.IntegerFactory.IntegerGreaterEvaluator;
-import org.drools.base.evaluators.IntegerFactory.IntegerGreaterOrEqualEvaluator;
-import org.drools.base.evaluators.IntegerFactory.IntegerLessEvaluator;
-import org.drools.base.evaluators.IntegerFactory.IntegerLessOrEqualEvaluator;
-import org.drools.base.evaluators.IntegerFactory.IntegerNotEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortGreaterEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortGreaterOrEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortLessEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortLessOrEqualEvaluator;
-import org.drools.base.evaluators.ShortFactory.ShortNotEqualEvaluator;
+import org.drools.rule.VariableConstraint.ObjectVariableContextEntry;
+import org.drools.rule.VariableConstraint.VariableContextEntry;
 import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
+import org.drools.spi.FieldValue;
 
 /**
  * This is the misc "bucket" evaluator factory for objects.
@@ -45,20 +37,24 @@
  * 
  * @author Michael Neale
  */
-public class ObjectFactory implements EvaluatorFactory {
+public class ObjectFactory
+    implements
+    EvaluatorFactory {
+
+    private static final long serialVersionUID = -8547142029512452551L;
     private static EvaluatorFactory INSTANCE = new ObjectFactory();
-    
+
     private ObjectFactory() {
-        
+
     }
-    
+
     public static EvaluatorFactory getInstance() {
         if ( INSTANCE == null ) {
             INSTANCE = new ObjectFactory();
         }
         return INSTANCE;
     }
-    
+
     public Evaluator getEvaluator(final Operator operator) {
         if ( operator == Operator.EQUAL ) {
             return ObjectEqualEvaluator.INSTANCE;
@@ -76,11 +72,10 @@
             return ObjectContainsEvaluator.INSTANCE;
         } else if ( operator == Operator.EXCLUDES ) {
             return ObjectExcludesEvaluator.INSTANCE;
-        }  else {
+        } else {
             throw new RuntimeException( "Operator '" + operator + "' does not exist for ShortEvaluator" );
-        }    
+        }
     }
-    
 
     static class ObjectEqualEvaluator extends BaseEvaluator {
         /**
@@ -94,17 +89,50 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            Object value1 = extractor.getValue( object1 );
+            Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.equals( value2 );
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return object2 == null;
+            Object value1 = object1.getValue();
+            Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 == null;
             }
-            return object1.equals( object2 );
+            return value1.equals( value2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            Object value = context.declaration.getExtractor().getValue( left );
+            if ( value == null ) {
+                return ((ObjectVariableContextEntry) context).right == null;
+            }
+            return value.equals( ((ObjectVariableContextEntry) context).right );
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            Object value = context.extractor.getValue( right );
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return value == null;
+            }
+            return ((ObjectVariableContextEntry) context).left.equals( value );
+        }
+        
         public String toString() {
             return "Object ==";
         }
+
     }
 
     static class ObjectNotEqualEvaluator extends BaseEvaluator {
@@ -119,23 +147,52 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            Object value1 = extractor.getValue( object1 );
+            Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            return !value1.equals( value2 );
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return !(object2 == null);
+            Object value1 = object1.getValue();
+            Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 != null;
             }
-            return !object1.equals( object2 );
+            return !value1.equals( value2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            Object value = context.declaration.getExtractor().getValue( left );
+            if ( value == null ) {
+                return ((ObjectVariableContextEntry) context).right != null;
+            }
+            return !value.equals( ((ObjectVariableContextEntry) context).right );
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            Object value = context.extractor.getValue( right );
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return value != null;
+            }
+            return !((ObjectVariableContextEntry) context).left.equals( value );
+        }
+        
         public String toString() {
             return "Object !=";
         }
     }
 
     static class ObjectLessEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
         private static final long     serialVersionUID = 320;
         public final static Evaluator INSTANCE         = new ObjectLessEvaluator();
 
@@ -144,13 +201,32 @@
                    Operator.LESS );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            final Comparable comp = (Comparable) extractor.getValue( object1 );
+            return comp.compareTo( object2.getValue() ) < 0;
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            final Comparable comp = (Comparable) object1;
-            final int val = comp.compareTo( object2 );
-            return val < 0;
+            final Comparable comp = (Comparable) object1.getValue();
+            return comp.compareTo( extractor.getValue( object2 ) ) < 0;
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            final Comparable comp = (Comparable) context.declaration.getExtractor().getValue( left );
+            return comp.compareTo( ((ObjectVariableContextEntry) context).right ) < 0;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            final Comparable comp = (Comparable) ((ObjectVariableContextEntry) context).left;
+            return comp.compareTo( context.extractor.getValue( right ) ) < 0;
+        }
+        
         public String toString() {
             return "Object <";
         }
@@ -168,12 +244,32 @@
                    Operator.LESS_OR_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            final Comparable comp = (Comparable) extractor.getValue( object1 );
+            return comp.compareTo( object2.getValue() ) <= 0;
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            final Comparable comp = (Comparable) object1;
-            return comp.compareTo( object2 ) <= 0;
+            final Comparable comp = (Comparable) object1.getValue();
+            return comp.compareTo( extractor.getValue( object2 ) ) <= 0;
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            final Comparable comp = (Comparable) context.declaration.getExtractor().getValue( left );
+            return comp.compareTo( ((ObjectVariableContextEntry) context).right ) <= 0;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            final Comparable comp = (Comparable) ((ObjectVariableContextEntry) context).left;
+            return comp.compareTo( context.extractor.getValue( right ) ) <= 0;
+        }
+        
         public String toString() {
             return "Object <=";
         }
@@ -191,12 +287,32 @@
                    Operator.GREATER );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            final Comparable comp = (Comparable) extractor.getValue( object1 );
+            return comp.compareTo( object2.getValue() ) >= 0;
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            final Comparable comp = (Comparable) object1;
-            return comp.compareTo( object2 ) > 0;
+            final Comparable comp = (Comparable) object1.getValue();
+            return comp.compareTo( extractor.getValue( object2 ) ) >= 0;
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            final Comparable comp = (Comparable) context.declaration.getExtractor().getValue( left );
+            return comp.compareTo( ((ObjectVariableContextEntry) context).right ) >= 0;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            final Comparable comp = (Comparable) ((ObjectVariableContextEntry) context).left;
+            return comp.compareTo( context.extractor.getValue( right ) ) >= 0;
+        }
+        
         public String toString() {
             return "Object >";
         }
@@ -214,12 +330,32 @@
                    Operator.GREATER_OR_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            final Comparable comp = (Comparable) extractor.getValue( object1 );
+            return comp.compareTo( object2.getValue() ) >= 0;
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            final Comparable comp = (Comparable) object1;
-            return comp.compareTo( object2 ) >= 0;
+            final Comparable comp = (Comparable) object1.getValue();
+            return comp.compareTo( extractor.getValue( object2 ) ) >= 0;
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            final Comparable comp = (Comparable) context.declaration.getExtractor().getValue( left );
+            return comp.compareTo( ((ObjectVariableContextEntry) context).right ) >= 0;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            final Comparable comp = (Comparable) ((ObjectVariableContextEntry) context).left;
+            return comp.compareTo( context.extractor.getValue( right ) ) >= 0;
+        }
+        
         public String toString() {
             return "Object >=";
         }
@@ -237,15 +373,36 @@
                    Operator.CONTAINS );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            Object value = object2.getValue();
+            final Collection col = (Collection) extractor.getValue( object1 );
+            return col.contains( value );
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object2 == null ) {
-                return false;
-            }
-            final Collection col = (Collection) object1;
-            return col.contains( object2 );
+            Object value = extractor.getValue( object2);
+            final Collection col = (Collection) object1.getValue();
+            return col.contains( value );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            Object value = ((ObjectVariableContextEntry) context).right;
+            final Collection col = (Collection) context.declaration.getExtractor().getValue( left );
+            return col.contains( value );
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            Object value = context.extractor.getValue( right );
+            final Collection col = (Collection) ((ObjectVariableContextEntry) context).left;
+            return col.contains( value );
+        }
+        
         public String toString() {
             return "Object contains";
         }
@@ -263,15 +420,36 @@
                    Operator.EXCLUDES );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            Object value = object2.getValue();
+            final Collection col = (Collection) extractor.getValue( object1 );
+            return !col.contains( value );
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object2 == null ) {
-                return false;
-            }
-            final Collection col = (Collection) object1;
-            return !col.contains( object2 );
+            Object value = extractor.getValue( object2);
+            final Collection col = (Collection) object1.getValue();
+            return !col.contains( value );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            Object value = ((ObjectVariableContextEntry) context).right;
+            final Collection col = (Collection) context.declaration.getExtractor().getValue( left );
+            return !col.contains( value );
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            Object value = context.extractor.getValue( right );
+            final Collection col = (Collection) ((ObjectVariableContextEntry) context).left;
+            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-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ShortFactory.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -18,15 +18,15 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
-import org.drools.base.evaluators.DoubleFactory.DoubleEqualEvaluator;
-import org.drools.base.evaluators.DoubleFactory.DoubleGreaterEvaluator;
-import org.drools.base.evaluators.DoubleFactory.DoubleGreaterOrEqualEvaluator;
-import org.drools.base.evaluators.DoubleFactory.DoubleLessEvaluator;
-import org.drools.base.evaluators.DoubleFactory.DoubleLessOrEqualEvaluator;
-import org.drools.base.evaluators.DoubleFactory.DoubleNotEqualEvaluator;
+import org.drools.rule.VariableConstraint.LongVariableContextEntry;
+import org.drools.rule.VariableConstraint.VariableContextEntry;
 import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
+import org.drools.spi.FieldValue;
 
 public class ShortFactory implements EvaluatorFactory {
+
+    private static final long serialVersionUID = -1295210800055648796L;
     private static EvaluatorFactory INSTANCE = new ShortFactory();
     
     private ShortFactory() {
@@ -70,14 +70,28 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getShortValue( object1 ) == object2.getShortValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return object2 == null;
-            }
-            return ((Number) object1).equals( object2 );
+            return object1.getShortValue() == extractor.getShortValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getShortValue( left ) == ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left == context.extractor.getShortValue( right );
+        }
+
         public String toString() {
             return "Short ==";
         }
@@ -95,14 +109,28 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getShortValue( object1 ) != object2.getShortValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return !(object2 == null);
-            }
-            return !((Number) object1).equals( object2 );
+            return object1.getShortValue() != extractor.getShortValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getShortValue( left ) != ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left != context.extractor.getShortValue( right );
+        }
+
         public String toString() {
             return "Short !=";
         }
@@ -120,11 +148,28 @@
                    Operator.LESS );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getShortValue( object1 ) < object2.getShortValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Number) object1).shortValue() < ((Number) object2).shortValue();
+            return object1.getShortValue() < extractor.getShortValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getShortValue( left ) < ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left < context.extractor.getShortValue( right );
+        }
+
         public String toString() {
             return "Short <";
         }
@@ -142,11 +187,28 @@
                    Operator.LESS_OR_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getShortValue( object1 ) <= object2.getShortValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Number) object1).shortValue() <= ((Number) object2).shortValue();
+            return object1.getShortValue() <= extractor.getShortValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getShortValue( left ) <= ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left <= context.extractor.getShortValue( right );
+        }
+
         public String toString() {
             return "Boolean <=";
         }
@@ -164,11 +226,28 @@
                    Operator.GREATER );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getShortValue( object1 ) > object2.getShortValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Number) object1).shortValue() > ((Number) object2).shortValue();
+            return object1.getShortValue() > extractor.getShortValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getShortValue( left ) > ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left > context.extractor.getShortValue( right );
+        }
+
         public String toString() {
             return "Short >";
         }
@@ -186,11 +265,28 @@
                    Operator.GREATER_OR_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            return extractor.getShortValue( object1 ) >= object2.getShortValue();
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            return ((Number) object1).shortValue() >= ((Number) object2).shortValue();
+            return object1.getShortValue() >= extractor.getShortValue( object2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            return context.declaration.getExtractor().getShortValue( left ) >= ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            return ((LongVariableContextEntry) context).left >= context.extractor.getShortValue( right );
+        }
+
         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-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/StringFactory.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -18,13 +18,11 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
-import org.drools.base.evaluators.DoubleFactory.DoubleEqualEvaluator;
-import org.drools.base.evaluators.DoubleFactory.DoubleGreaterEvaluator;
-import org.drools.base.evaluators.DoubleFactory.DoubleGreaterOrEqualEvaluator;
-import org.drools.base.evaluators.DoubleFactory.DoubleLessEvaluator;
-import org.drools.base.evaluators.DoubleFactory.DoubleLessOrEqualEvaluator;
-import org.drools.base.evaluators.DoubleFactory.DoubleNotEqualEvaluator;
+import org.drools.rule.VariableConstraint.ObjectVariableContextEntry;
+import org.drools.rule.VariableConstraint.VariableContextEntry;
 import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
+import org.drools.spi.FieldValue;
 
 /**
  * This is the misc "bucket" evaluator factory for objects.
@@ -33,13 +31,17 @@
  * 
  * @author Michael Neale
  */
-public class StringFactory implements EvaluatorFactory {
-    private static EvaluatorFactory INSTANCE = new StringFactory();
-    
+public class StringFactory
+    implements
+    EvaluatorFactory {
+
+    private static final long       serialVersionUID = -1761752249672590658L;
+    private static EvaluatorFactory INSTANCE         = new StringFactory();
+
     private StringFactory() {
-        
+
     }
-    
+
     public static EvaluatorFactory getInstance() {
         if ( INSTANCE == null ) {
             INSTANCE = new StringFactory();
@@ -54,9 +56,9 @@
             return StringNotEqualEvaluator.INSTANCE;
         } else if ( operator == Operator.MATCHES ) {
             return StringMatchesEvaluator.INSTANCE;
-        }  else {
+        } else {
             throw new RuntimeException( "Operator '" + operator + "' does not exist for StringEvaluator" );
-        }    
+        }
     }
 
     static class StringEqualEvaluator extends BaseEvaluator {
@@ -71,14 +73,46 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            Object value1 = extractor.getValue( object1 );
+            Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.equals( value2 );
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return object2 == null;
+            Object value1 = object1.getValue();
+            Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 == null;
             }
-            return object1.equals( object2 );
+            return value1.equals( value2 );
         }
 
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            Object value = context.declaration.getExtractor().getValue( left );
+            if ( value == null ) {
+                return ((ObjectVariableContextEntry) context).right == null;
+            }
+            return value.equals( ((ObjectVariableContextEntry) context).right );
+        }
+
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            Object value = context.extractor.getValue( right );
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return value == null;
+            }
+            return ((ObjectVariableContextEntry) context).left.equals( value );
+        }
+
         public String toString() {
             return "String ==";
         }
@@ -96,15 +130,46 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            Object value1 = extractor.getValue( object1 );
+            Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            return !value1.equals( value2 );
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            if ( object1 == null ) {
-                return !(object2 == null);
+            Object value1 = object1.getValue();
+            Object value2 = extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return value2 != null;
             }
+            return !value1.equals( value2 );
+        }
 
-            return !object1.equals( object2 );
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            Object value = context.declaration.getExtractor().getValue( left );
+            if ( value == null ) {
+                return ((ObjectVariableContextEntry) context).right != null;
+            }
+            return value.equals( ((ObjectVariableContextEntry) context).right );
         }
 
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            Object value = context.extractor.getValue( right );
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return value != null;
+            }
+            return !((ObjectVariableContextEntry) context).left.equals( value );
+        }
+
         public String toString() {
             return "String !=";
         }
@@ -122,20 +187,44 @@
                    Operator.MATCHES );
         }
 
-        public boolean evaluate(final Object object1,
+        public boolean evaluate(final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            String value1 = (String) extractor.getValue( object1 );
+            String value2 = (String) object2.getValue();
+            if ( value1 == null ) {
+                return false;
+            }
+            return value1.matches( value2 );
+        }
+
+        public boolean evaluate(final FieldValue object1,
+                                final Extractor extractor,
                                 final Object object2) {
-            final String pattern = (String) object2;
-            final String target = (String) object1;
+            String value1 = (String) object1.getValue();
+            String value2 = (String) extractor.getValue( object2 );
+            if ( value1 == null ) {
+                return false;
+            }
+            return value1.matches( value2 );
+        }
 
-            if ( object1 == null ) {
+        public boolean evaluateCachedRight(VariableContextEntry context,
+                                           Object left) {
+            String value = (String) context.declaration.getExtractor().getValue( left );
+            if ( value == null ) {
                 return false;
             }
+            return value.matches( (String) ((ObjectVariableContextEntry) context).right );
+        }
 
-            //TODO: possibly use a WeakHashMap cache of regex expressions
-            //downside is could cause a lot of hashing if the patterns are dynamic
-            //if the patterns are static, then it will not be a problem. Perhaps compiler can recognise patterns
-            //in the input string using /pattern/ etc.. and precompile it, in which case object2 will be a Pattern.
-            return target.matches( pattern );
+        public boolean evaluateCachedLeft(VariableContextEntry context,
+                                          Object right) {
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return false;
+            }
+            String value = (String) context.extractor.getValue( right );
+            return ((String) ((ObjectVariableContextEntry) context).left).matches( value );
         }
 
         public String toString() {

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseBooleanClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseBooleanClassFieldExtractor.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseBooleanClassFieldExtractor.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -0,0 +1,72 @@
+/*
+ * 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.
+ */
+
+package org.drools.base.extractors;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldExtractor;
+
+/**
+ * A Base class for primitive boolean class field
+ * extractors. This class centralizes type conversions.
+ *  
+ * @author etirelli
+ */
+public abstract class BaseBooleanClassFieldExtractor extends BaseClassFieldExtractor {
+
+    private static final long serialVersionUID = 9104214567753008212L;
+    
+    public BaseBooleanClassFieldExtractor(Class clazz,
+                                          String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    public Object getValue(Object object) {
+        return getBooleanValue( object ) ? Boolean.TRUE : Boolean.FALSE;
+    }
+
+    public abstract boolean getBooleanValue(Object object);
+
+    public byte getByteValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to byte not supported from boolean");
+    }
+
+    public char getCharValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to char not supported from boolean");
+    }
+
+    public double getDoubleValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to double not supported from boolean");
+    }
+
+    public float getFloatValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to float not supported from boolean");
+    }
+
+    public int getIntValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to int not supported from boolean");
+    }
+
+    public long getLongValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to long not supported from boolean");
+    }
+
+    public short getShortValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to short not supported from boolean");
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseBooleanClassFieldExtractor.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseByteClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseByteClassFieldExtractor.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseByteClassFieldExtractor.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -0,0 +1,72 @@
+/*
+ * 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.
+ */
+
+package org.drools.base.extractors;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldExtractor;
+
+/**
+ * A Base class for primitive byte class field
+ * extractors. This class centralizes type conversions.
+ *  
+ * @author etirelli
+ */
+public abstract class BaseByteClassFieldExtractor extends BaseClassFieldExtractor {
+
+    private static final long serialVersionUID = 2031113412868487706L;
+    
+    public BaseByteClassFieldExtractor(Class clazz,
+                                       String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    public Object getValue(Object object) {
+        return new Long( getByteValue( object ) );
+    }
+
+    public boolean getBooleanValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to boolean not supported from byte");
+    }
+
+    public abstract byte getByteValue(Object object);
+
+    public char getCharValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to char not supported from byte");
+    }
+
+    public double getDoubleValue(Object object) {
+        return getByteValue( object );
+    }
+
+    public float getFloatValue(Object object) {
+        return getByteValue( object );
+    }
+
+    public int getIntValue(Object object) {
+        return getByteValue( object );
+    }
+
+    public long getLongValue(Object object) {
+        return getByteValue( object );
+    }
+
+    public short getShortValue(Object object) {
+        return getByteValue( object );
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseByteClassFieldExtractor.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldExtractor.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldExtractor.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -0,0 +1,50 @@
+package org.drools.base.extractors;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldExtractor;
+
+public abstract class BaseCharClassFieldExtractor extends BaseClassFieldExtractor {
+
+    private static final long serialVersionUID = 91214567753008212L;
+    
+    public BaseCharClassFieldExtractor(Class clazz,
+                                          String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    public Object getValue(Object object) {
+        return new Long( getCharValue( object ) );
+    }
+
+    public boolean getBooleanValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to boolean not supported from char");
+    }
+
+    public byte getByteValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to byte not supported from char");
+    }
+
+    public abstract char getCharValue(Object object);
+
+    public double getDoubleValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to double not supported from char");
+    }
+
+    public float getFloatValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to float not supported from char");
+    }
+
+    public int getIntValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to int not supported from char");
+    }
+
+    public long getLongValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to long not supported from char");
+    }
+
+    public short getShortValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to short not supported from char");
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldExtractor.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseDoubleClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseDoubleClassFieldExtractor.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseDoubleClassFieldExtractor.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -0,0 +1,51 @@
+package org.drools.base.extractors;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldExtractor;
+
+public abstract class BaseDoubleClassFieldExtractor extends BaseClassFieldExtractor {
+
+    private static final long serialVersionUID = 20311112843487706L;
+    
+    public BaseDoubleClassFieldExtractor(Class clazz,
+                                       String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    public Object getValue(Object object) {
+        return new Double( getDoubleValue( object ) );
+    }
+
+    public boolean getBooleanValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to boolean not supported from double");
+    }
+
+    public byte getByteValue(Object object) {
+        return (byte) getDoubleValue( object );
+        
+    }
+
+    public char getCharValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to char not supported from double");
+    }
+
+    public abstract double getDoubleValue(Object object);
+
+    public float getFloatValue(Object object) {
+        return (float) getDoubleValue( object );
+    }
+
+    public int getIntValue(Object object) {
+        return (int) getDoubleValue( object );
+    }
+
+    public long getLongValue(Object object) {
+        return (long) getDoubleValue( object );
+    }
+
+    public short getShortValue(Object object) {
+        return (short) getDoubleValue( object );
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseDoubleClassFieldExtractor.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseFloatClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseFloatClassFieldExtractor.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseFloatClassFieldExtractor.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -0,0 +1,51 @@
+package org.drools.base.extractors;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldExtractor;
+
+public abstract class BaseFloatClassFieldExtractor extends BaseClassFieldExtractor {
+
+    private static final long serialVersionUID = 20311112843487706L;
+    
+    public BaseFloatClassFieldExtractor(Class clazz,
+                                       String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    public Object getValue(Object object) {
+        return new Float( getFloatValue( object ) );
+    }
+
+    public boolean getBooleanValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to boolean not supported from float");
+    }
+
+    public byte getByteValue(Object object) {
+        return (byte) getFloatValue( object );
+        
+    }
+
+    public char getCharValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to char not supported from float");
+    }
+
+    public double getDoubleValue(Object object) {
+        return getFloatValue( object );
+    }
+
+    public abstract float getFloatValue(Object object);
+
+    public int getIntValue(Object object) {
+        return (int) getFloatValue( object );
+    }
+
+    public long getLongValue(Object object) {
+        return (long) getFloatValue( object );
+    }
+
+    public short getShortValue(Object object) {
+        return (short) getFloatValue( object );
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseFloatClassFieldExtractor.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseIntClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseIntClassFieldExtractor.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseIntClassFieldExtractor.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -0,0 +1,52 @@
+package org.drools.base.extractors;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldExtractor;
+
+public abstract class BaseIntClassFieldExtractor extends BaseClassFieldExtractor {
+
+
+    private static final long serialVersionUID = 203112843487706L;
+    
+    public BaseIntClassFieldExtractor(Class clazz,
+                                       String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    public Object getValue(Object object) {
+        return new Long( getIntValue( object ) );
+    }
+
+    public boolean getBooleanValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to boolean not supported from int");
+    }
+
+    public byte getByteValue(Object object) {
+        return (byte) getIntValue( object );
+        
+    }
+
+    public char getCharValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to char not supported from int");
+    }
+
+    public double getDoubleValue(Object object) {
+        return getIntValue( object );
+    }
+
+    public float getFloatValue(Object object) {
+        return getIntValue( object );
+    }
+
+    public abstract int getIntValue(Object object);
+
+    public long getLongValue(Object object) {
+        return getIntValue( object );
+    }
+
+    public short getShortValue(Object object) {
+        return (short) getIntValue( object );
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseIntClassFieldExtractor.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseLongClassFieldExtractors.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseLongClassFieldExtractors.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseLongClassFieldExtractors.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -0,0 +1,51 @@
+package org.drools.base.extractors;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldExtractor;
+
+public abstract class BaseLongClassFieldExtractors extends BaseClassFieldExtractor {
+
+    private static final long serialVersionUID = 2031113412843487706L;
+    
+    public BaseLongClassFieldExtractors(Class clazz,
+                                       String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    public Object getValue(Object object) {
+        return new Long( getLongValue( object ) );
+    }
+
+    public boolean getBooleanValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to boolean not supported from long");
+    }
+
+    public byte getByteValue(Object object) {
+        return (byte) getLongValue( object );
+        
+    }
+
+    public char getCharValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to char not supported from long");
+    }
+
+    public double getDoubleValue(Object object) {
+        return getLongValue( object );
+    }
+
+    public float getFloatValue(Object object) {
+        return getLongValue( object );
+    }
+
+    public int getIntValue(Object object) {
+        return (int) getLongValue( object );
+    }
+
+    public abstract long getLongValue(Object object);
+
+    public short getShortValue(Object object) {
+        return (short) getLongValue( object );
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseLongClassFieldExtractors.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -0,0 +1,98 @@
+package org.drools.base.extractors;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldExtractor;
+
+public abstract class BaseObjectClassFieldExtractor extends BaseClassFieldExtractor {
+
+    private static final long serialVersionUID = 91214567753008212L;
+    
+    public BaseObjectClassFieldExtractor(Class clazz,
+                                          String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    public abstract Object getValue(Object object);
+
+    public boolean getBooleanValue(Object object) {
+        // this can be improved by generating specific 
+        // bytecode generation in the subclass, avoiding the if instanceof
+        Object value = getValue( object );
+        if( value instanceof Boolean ) {
+            return ((Boolean) value).booleanValue();
+        }
+        throw new RuntimeDroolsException("Conversion to boolean not supported from "+value.getClass().getName());
+    }
+
+    public byte getByteValue(Object object) {
+        // this can be improved by generating specific 
+        // bytecode generation in the subclass, avoiding the if instanceof
+        Object value = getValue( object );
+        if( value instanceof Number ) {
+            return ((Number) value).byteValue();
+        }
+        throw new RuntimeDroolsException("Conversion to byte not supported from "+value.getClass().getName());
+    }
+
+    public char getCharValue(Object object) {
+        // this can be improved by generating specific 
+        // bytecode generation in the subclass, avoiding the if instanceof
+        Object value = getValue( object );
+        if( value instanceof Character ) {
+            return ((Character) value).charValue();
+        }
+        throw new RuntimeDroolsException("Conversion to char not supported from "+value.getClass().getName());
+    }
+
+    public double getDoubleValue(Object object) {
+        // this can be improved by generating specific 
+        // bytecode generation in the subclass, avoiding the if instanceof
+        Object value = getValue( object );
+        if( value instanceof Number ) {
+            return ((Number) value).doubleValue();
+        }
+        throw new RuntimeDroolsException("Conversion to double not supported from "+value.getClass().getName());
+    }
+
+    public float getFloatValue(Object object) {
+        // this can be improved by generating specific 
+        // bytecode generation in the subclass, avoiding the if instanceof
+        Object value = getValue( object );
+        if( value instanceof Number ) {
+            return ((Number) value).floatValue();
+        }
+        throw new RuntimeDroolsException("Conversion to float not supported from "+value.getClass().getName());
+    }
+
+    public int getIntValue(Object object) {
+        // this can be improved by generating specific 
+        // bytecode generation in the subclass, avoiding the if instanceof
+        Object value = getValue( object );
+        if( value instanceof Number ) {
+            return ((Number) value).intValue();
+        }
+        throw new RuntimeDroolsException("Conversion to int not supported from "+value.getClass().getName());
+    }
+
+    public long getLongValue(Object object) {
+        // this can be improved by generating specific 
+        // bytecode generation in the subclass, avoiding the if instanceof
+        Object value = getValue( object );
+        if( value instanceof Number ) {
+            return ((Number) value).longValue();
+        }
+        throw new RuntimeDroolsException("Conversion to long not supported from "+value.getClass().getName());
+    }
+
+    public short getShortValue(Object object) {
+        // this can be improved by generating specific 
+        // bytecode generation in the subclass, avoiding the if instanceof
+        Object value = getValue( object );
+        if( value instanceof Number ) {
+            return ((Number) value).shortValue();
+        }
+        throw new RuntimeDroolsException("Conversion to short not supported from "+value.getClass().getName());
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseShortClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseShortClassFieldExtractor.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseShortClassFieldExtractor.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -0,0 +1,51 @@
+package org.drools.base.extractors;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldExtractor;
+
+public abstract class BaseShortClassFieldExtractor extends BaseClassFieldExtractor {
+
+    private static final long serialVersionUID = 2031113412843487706L;
+    
+    public BaseShortClassFieldExtractor(Class clazz,
+                                       String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    public Object getValue(Object object) {
+        return new Long( getShortValue( object ) );
+    }
+
+    public boolean getBooleanValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to boolean not supported from short");
+    }
+
+    public byte getByteValue(Object object) {
+        return (byte) getShortValue( object );
+        
+    }
+
+    public char getCharValue(Object object) {
+        throw new RuntimeDroolsException("Conversion to char not supported from short");
+    }
+
+    public double getDoubleValue(Object object) {
+        return getShortValue( object );
+    }
+
+    public float getFloatValue(Object object) {
+        return getShortValue( object );
+    }
+
+    public int getIntValue(Object object) {
+        return getShortValue( object );
+    }
+
+    public long getLongValue(Object object) {
+        return getShortValue( object );
+    }
+
+    public abstract short getShortValue(Object object);
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseShortClassFieldExtractor.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/BooleanFieldImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/BooleanFieldImpl.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/BooleanFieldImpl.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -0,0 +1,93 @@
+/*
+ * 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.
+ */
+
+package org.drools.base.field;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.spi.FieldValue;
+
+/**
+ * @author etirelli
+ *
+ */
+public class BooleanFieldImpl
+    implements
+    FieldValue {
+
+    private static final long serialVersionUID = 320;
+    private boolean           value;
+
+    public BooleanFieldImpl(final boolean value) {
+        this.value = value;
+    }
+
+    public Object getValue() {
+        return this.value ? Boolean.TRUE : Boolean.FALSE;
+    }
+
+    public String toString() {
+        return this.value ? Boolean.TRUE.toString() : Boolean.FALSE.toString();
+    }
+
+    public boolean getBooleanValue() {
+        return this.value;
+    }
+
+    public byte getByteValue() {
+        throw new RuntimeDroolsException( "Conversion to byte not supported for type boolean");
+    }
+
+    public char getCharValue() {
+        throw new RuntimeDroolsException( "Conversion to char not supported for type boolean");
+    }
+
+    public double getDoubleValue() {
+        throw new RuntimeDroolsException( "Conversion to double not supported for type boolean");
+    }
+
+    public float getFloatValue() {
+        throw new RuntimeDroolsException( "Conversion to float not supported for type boolean");
+    }
+
+    public int getIntValue() {
+        throw new RuntimeDroolsException( "Conversion to int not supported for type boolean");
+    }
+
+    public long getLongValue() {
+        throw new RuntimeDroolsException( "Conversion to long not supported for type boolean");
+    }
+
+    public short getShortValue() {
+        throw new RuntimeDroolsException( "Conversion to short not supported for type boolean");
+    }
+
+    public boolean equals(final Object object) {
+        if ( this == object ) {
+            return true;
+        }
+        if ( object == null || !(object instanceof BooleanFieldImpl) ) {
+            return false;
+        }
+        final BooleanFieldImpl other = (BooleanFieldImpl) object;
+
+        return this.value == other.value;
+    }
+
+    public int hashCode() {
+        return this.value ? 1 : 0;
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/BooleanFieldImpl.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/DoubleFieldImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/DoubleFieldImpl.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/DoubleFieldImpl.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -0,0 +1,73 @@
+package org.drools.base.field;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.spi.FieldValue;
+
+public class DoubleFieldImpl
+    implements
+    FieldValue {
+
+    private static final long serialVersionUID = 320;
+    private double              value;
+
+    public DoubleFieldImpl(final double value) {
+        this.value = value;
+    }
+
+    public Object getValue() {
+        return new Double(this.value);
+    }
+
+    public String toString() {
+        return String.valueOf( this.value );
+    }
+
+    public boolean getBooleanValue() {
+        throw new RuntimeDroolsException( "Conversion to boolean not supported for type double");
+    }
+
+    public byte getByteValue() {
+        return (byte) this.value;
+    }
+
+    public char getCharValue() {
+        return (char) this.value;
+    }
+
+    public double getDoubleValue() {
+        return (double) this.value;
+    }
+
+    public float getFloatValue() {
+        return (float) this.value;
+    }
+
+    public int getIntValue() {
+        return (int) this.value;
+    }
+
+    public long getLongValue() {
+        return (long) this.value;
+    }
+
+    public short getShortValue() {
+        return (short) this.value;
+    }
+
+    public boolean equals(final Object object) {
+        if ( this == object ) {
+            return true;
+        }
+        if ( object == null || !(object instanceof DoubleFieldImpl) ) {
+            return false;
+        }
+        final DoubleFieldImpl other = (DoubleFieldImpl) object;
+
+        return this.value == other.value;
+    }
+
+    public int hashCode() {
+        return (int) this.value;
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/DoubleFieldImpl.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/LongFieldImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/LongFieldImpl.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/LongFieldImpl.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -0,0 +1,72 @@
+package org.drools.base.field;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.spi.FieldValue;
+
+public class LongFieldImpl
+    implements
+    FieldValue {
+
+    private static final long serialVersionUID = 320;
+    private long              value;
+
+    public LongFieldImpl(final long value) {
+        this.value = value;
+    }
+
+    public Object getValue() {
+        return new Long(this.value);
+    }
+
+    public String toString() {
+        return String.valueOf( this.value );
+    }
+
+    public boolean getBooleanValue() {
+        throw new RuntimeDroolsException( "Conversion to boolean not supported for type long");
+    }
+
+    public byte getByteValue() {
+        return (byte) this.value;
+    }
+
+    public char getCharValue() {
+        return (char) this.value;
+    }
+
+    public double getDoubleValue() {
+        return (double) this.value;
+    }
+
+    public float getFloatValue() {
+        return (float) this.value;
+    }
+
+    public int getIntValue() {
+        return (int) this.value;
+    }
+
+    public long getLongValue() {
+        return (long) this.value;
+    }
+
+    public short getShortValue() {
+        return (short) this.value;
+    }
+
+    public boolean equals(final Object object) {
+        if ( this == object ) {
+            return true;
+        }
+        if ( object == null || !(object instanceof LongFieldImpl) ) {
+            return false;
+        }
+        final LongFieldImpl other = (LongFieldImpl) object;
+
+        return this.value == other.value;
+    }
+
+    public int hashCode() {
+        return (int) this.value;
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/LongFieldImpl.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/ObjectFieldImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/ObjectFieldImpl.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/ObjectFieldImpl.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -0,0 +1,116 @@
+package org.drools.base.field;
+
+/*
+ * 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.RuntimeDroolsException;
+import org.drools.spi.FieldValue;
+
+public class ObjectFieldImpl
+    implements
+    FieldValue {
+
+    private static final long serialVersionUID = 320;
+    private Object            value;
+
+    public ObjectFieldImpl(final Object value) {
+        this.value = value;
+    }
+
+    public Object getValue() {
+        return this.value;
+    }
+
+    public String toString() {
+        return this.value.toString();
+    }
+
+    public boolean getBooleanValue() {
+        if( this.value instanceof Boolean ) {
+            return ((Boolean)this.value).booleanValue(); 
+        }
+        throw new RuntimeDroolsException("Conversion to boolean not supported for type: "+this.value.getClass());
+    }
+
+    public byte getByteValue() {
+        if( this.value instanceof Number ) {
+            return ((Number)this.value).byteValue(); 
+        }
+        throw new RuntimeDroolsException("Conversion to byte not supported for type: "+this.value.getClass());
+    }
+
+    public char getCharValue() {
+        if( this.value instanceof Character ) {
+            return ((Character)this.value).charValue(); 
+        }
+        throw new RuntimeDroolsException("Conversion to char not supported for type: "+this.value.getClass());
+    }
+
+    public double getDoubleValue() {
+        if( this.value instanceof Number ) {
+            return ((Number)this.value).doubleValue(); 
+        }
+        throw new RuntimeDroolsException("Conversion to double not supported for type: "+this.value.getClass());
+    }
+
+    public float getFloatValue() {
+        if( this.value instanceof Number ) {
+            return ((Number)this.value).floatValue(); 
+        }
+        throw new RuntimeDroolsException("Conversion to float not supported for type: "+this.value.getClass());
+    }
+
+    public int getIntValue() {
+        if( this.value instanceof Number ) {
+            return ((Number)this.value).intValue(); 
+        }
+        throw new RuntimeDroolsException("Conversion to int not supported for type: "+this.value.getClass());
+    }
+
+    public long getLongValue() {
+        if( this.value instanceof Number ) {
+            return ((Number)this.value).longValue(); 
+        }
+        throw new RuntimeDroolsException("Conversion to long not supported for type: "+this.value.getClass());
+    }
+
+    public short getShortValue() {
+        if( this.value instanceof Number ) {
+            return ((Number)this.value).shortValue(); 
+        }
+        throw new RuntimeDroolsException("Conversion to short not supported for type: "+this.value.getClass());
+    }
+    
+    public boolean equals(final Object object) {
+        if ( this == object ) {
+            return true;
+        }
+        if ( object == null || !(object instanceof ObjectFieldImpl) ) {
+            return false;
+        }
+        final ObjectFieldImpl other = (ObjectFieldImpl) object;
+
+        return (((this.value == null) && (other.value == null)) || ((this.value != null) && (this.value.equals( other.value ))));
+    }
+
+    public int hashCode() {
+        if ( this.value != null ) {
+            return this.value.hashCode();
+        } else {
+            return 0;
+        }
+    }
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/facttemplates/FactTemplateFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/facttemplates/FactTemplateFieldExtractor.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/facttemplates/FactTemplateFieldExtractor.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -33,4 +33,44 @@
     public Class getExtractToClass() {
         return Fact.class;//this.factTemplate.getFieldTemplate( fieldIndex ).getValueType().getClass();
     }
+
+
+    public boolean getBooleanValue(Object object) {
+        return ((Boolean)((Fact) object).getFieldValue( this.fieldIndex )).booleanValue();
+    }
+
+
+    public byte getByteValue(Object object) {
+        return ((Number)((Fact) object).getFieldValue( this.fieldIndex )).byteValue();
+    }
+
+
+    public char getCharValue(Object object) {
+        return ((Character)((Fact) object).getFieldValue( this.fieldIndex )).charValue();
+    }
+
+
+    public double getDoubleValue(Object object) {
+        return ((Number)((Fact) object).getFieldValue( this.fieldIndex )).doubleValue();
+    }
+
+
+    public float getFloatValue(Object object) {
+        return ((Number)((Fact) object).getFieldValue( this.fieldIndex )).floatValue();
+    }
+
+
+    public int getIntValue(Object object) {
+        return ((Number)((Fact) object).getFieldValue( this.fieldIndex )).intValue();
+    }
+
+
+    public long getLongValue(Object object) {
+        return ((Number)((Fact) object).getFieldValue( this.fieldIndex )).longValue();
+    }
+
+
+    public short getShortValue(Object object) {
+        return ((Number)((Fact) object).getFieldValue( this.fieldIndex )).shortValue();
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -6,14 +6,14 @@
 import org.drools.base.evaluators.Operator;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
+import org.drools.examples.manners.Context;
 import org.drools.rule.LiteralConstraint;
+import org.drools.spi.AlphaNodeFieldConstraint;
 import org.drools.spi.Evaluator;
-import org.drools.spi.AlphaNodeFieldConstraint;
 import org.drools.spi.FieldExtractor;
 import org.drools.spi.PropagationContext;
 import org.drools.util.Iterator;
 import org.drools.util.LinkedList;
-import org.drools.util.LinkedListEntry;
 import org.drools.util.LinkedListNode;
 import org.drools.util.ObjectHashMap;
 import org.drools.util.ObjectHashMap.ObjectEntry;
@@ -53,7 +53,7 @@
                         if ( !fieldIndex.isHashed() ) {
                             hashSinks( fieldIndex );
                         }
-                        Object value = literalConstraint.getField();
+                        Object value = literalConstraint.getField().getValue();
                         // no need to check, we know  the sink  does not exist
                         hashedSinkMap.put( new HashKey( index,
                                                         value ),
@@ -86,7 +86,7 @@
             if ( fieldConstraint.getClass() == LiteralConstraint.class ) {
                 LiteralConstraint literalConstraint = (LiteralConstraint) fieldConstraint;
                 Evaluator evaluator = literalConstraint.getEvaluator();
-                Object value = literalConstraint.getField();
+                Object value = literalConstraint.getField().getValue();
 
                 if ( evaluator.getOperator() == Operator.EQUAL ) {
                     int index = literalConstraint.getFieldExtractor().getIndex();
@@ -135,7 +135,7 @@
             LiteralConstraint literalConstraint = (LiteralConstraint) fieldConstraint;
             Evaluator evaluator = literalConstraint.getEvaluator();
             if ( evaluator.getOperator() == Operator.EQUAL && index == literalConstraint.getFieldExtractor().getIndex() ) {
-                Object value = literalConstraint.getField();
+                Object value = literalConstraint.getField().getValue();
                 list.add( sink );
                 hashedSinkMap.put( new HashKey( index,
                                                 value ),
@@ -245,6 +245,7 @@
                                       PropagationContext context,
                                       InternalWorkingMemory workingMemory) {
         Object object = handle.getObject();
+        
         if ( this.hashedFieldIndexes != null ) {
             // Iterate the FieldIndexes to see if any are hashed        
             for ( FieldIndex fieldIndex = (FieldIndex) this.hashedFieldIndexes.getFirst(); fieldIndex != null && fieldIndex.isHashed(); fieldIndex = (FieldIndex) fieldIndex.getNext() ) {

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-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -16,15 +16,11 @@
  * limitations under the License.
  */
 
-import org.drools.WorkingMemory;
-import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
-import org.drools.reteoo.ReteTuple;
-import org.drools.spi.Evaluator;
 import org.drools.spi.AlphaNodeFieldConstraint;
+import org.drools.spi.Evaluator;
 import org.drools.spi.FieldExtractor;
 import org.drools.spi.FieldValue;
-import org.drools.spi.Tuple;
 
 public class LiteralConstraint
     implements
@@ -58,7 +54,7 @@
         return this.restriction.getEvaluator();
     }
 
-    public Object getField() {
+    public FieldValue getField() {
         return this.restriction.getField();
     }
 
@@ -81,7 +77,8 @@
 
     public boolean isAllowed(final Object object,
                              final InternalWorkingMemory workingMemory) {
-        return this.restriction.isAllowed(  this.extractor.getValue( object ), 
+        return this.restriction.isAllowed(  this.extractor, 
+                                            object, 
                                             workingMemory );
     }
 

Modified: 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-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -21,6 +21,7 @@
 import org.drools.reteoo.ReteTuple;
 import org.drools.rule.VariableConstraint.VariableContextEntry;
 import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
 import org.drools.spi.FieldValue;
 import org.drools.spi.Restriction;
 import org.drools.spi.Tuple;
@@ -34,7 +35,7 @@
      */
     private static final long          serialVersionUID     = 320;
 
-    private final Object               field;
+    private final FieldValue           field;
 
     private final Evaluator            evaluator;
 
@@ -42,7 +43,7 @@
 
     public LiteralRestriction(final FieldValue field,
                               final Evaluator evaluator) {
-        this.field = field.getValue();
+        this.field = field;
         this.evaluator = evaluator;
     }
 
@@ -50,13 +51,14 @@
         return this.evaluator;
     }
 
-    public Object getField() {
+    public FieldValue getField() {
         return this.field;
     }
     
-    public boolean isAllowed(Object object,
+    public boolean isAllowed(Extractor extractor, 
+                             Object object,
                              InternalWorkingMemory workingMemoiry) {
-        return this.evaluator.evaluate( object, field );
+        return this.evaluator.evaluate( extractor, object, field );
     }
     
     public boolean isAllowedCachedLeft(ContextEntry context, Object object) {
@@ -86,7 +88,7 @@
         final int PRIME = 31;
         int result = 1;
         result = PRIME * result + this.evaluator.hashCode();
-        result = PRIME * result + this.field.hashCode();
+        result = PRIME * result + this.field.getValue().hashCode();
         return result;
     }
 

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-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -78,7 +78,8 @@
     public boolean isAllowed(final Object object,
                              final Tuple tuple,
                              final WorkingMemory workingMemory) {
-        return this.restriction.isAllowed( this.fieldExtractor.getValue( object ),
+        return this.restriction.isAllowed( this.fieldExtractor,
+                                           object,
                                            tuple,
                                            workingMemory );
     }

Modified: 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-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -21,6 +21,7 @@
 import org.drools.RuntimeDroolsException;
 import org.drools.WorkingMemory;
 import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
 import org.drools.spi.Restriction;
 import org.drools.spi.ReturnValueExpression;
 import org.drools.spi.Tuple;
@@ -89,11 +90,13 @@
         return this.evaluator;
     }
 
-    public boolean isAllowed(final Object object,
+    public boolean isAllowed(final Extractor extractor,
+                             final Object object,
                              final Tuple tuple,
                              final WorkingMemory workingMemory) {
         try {
-            return this.evaluator.evaluate( object,
+            return this.evaluator.evaluate( extractor,
+                                            object,
                                             this.expression.evaluate( tuple,
                                                                       this.requiredDeclarations,
                                                                       workingMemory ) );

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -34,6 +34,11 @@
     private final FieldExtractor      fieldExtractor;
     private final VariableRestriction restriction;
 
+    private static final byte         TYPE_BOOLEAN     = 0;
+    private static final byte         TYPE_FLOAT       = 1;
+    private static final byte         TYPE_INTEGER     = 2;
+    private static final byte         TYPE_OBJECT      = 3;
+
     public VariableConstraint(final FieldExtractor fieldExtractor,
                               final Declaration declaration,
                               final Evaluator evaluator) {
@@ -63,7 +68,7 @@
     public boolean isAllowedCachedLeft(ContextEntry context,
                                        Object object) {
         return this.restriction.isAllowedCachedLeft( context,
-                                                     this.fieldExtractor.getValue( object ) );
+                                                     object );
     }
 
     public boolean isAllowedCachedRight(ReteTuple tuple,
@@ -77,8 +82,22 @@
     }
 
     public ContextEntry getContextEntry() {
-        return new VariableContextEntry( this.fieldExtractor,
-                                         this.restriction.getRequiredDeclarations()[0] );
+        Class classType = this.fieldExtractor.getValueType().getClassType();
+        if ( classType.isPrimitive() ) {
+            if ( classType == Boolean.TYPE ) {
+                return new BooleanVariableContextEntry( this.fieldExtractor,
+                                                        this.restriction.getRequiredDeclarations()[0] );
+            } else if ( (classType == Double.TYPE) || (classType == Float.TYPE) ) {
+                return new DoubleVariableContextEntry( this.fieldExtractor,
+                                                       this.restriction.getRequiredDeclarations()[0] );
+            } else {
+                return new LongVariableContextEntry( this.fieldExtractor,
+                                                     this.restriction.getRequiredDeclarations()[0] );
+            }
+        } else {
+            return new ObjectVariableContextEntry( this.fieldExtractor,
+                                                   this.restriction.getRequiredDeclarations()[0] );
+        }
     }
 
     public int hashCode() {
@@ -103,16 +122,13 @@
         return this.fieldExtractor.equals( other.fieldExtractor ) && this.restriction.equals( other.restriction );
     }
 
-    public static class VariableContextEntry
+    public static abstract class VariableContextEntry
         implements
         ContextEntry {
-        public Object          left;
-        public Object          right;
+        public FieldExtractor extractor;
+        public Declaration    declaration;
+        private ContextEntry  entry;
 
-        private FieldExtractor extractor;
-        private Declaration    declaration;
-        private ContextEntry   entry;
-
         public VariableContextEntry(FieldExtractor extractor,
                                     Declaration declaration) {
             this.extractor = extractor;
@@ -126,15 +142,82 @@
         public void setNext(ContextEntry entry) {
             this.entry = entry;
         }
+    }
 
+    public static class ObjectVariableContextEntry extends VariableContextEntry {
+        public Object left;
+        public Object right;
+
+        public ObjectVariableContextEntry(FieldExtractor extractor,
+                                          Declaration declaration) {
+            super( extractor,
+                   declaration );
+        }
+
         public void updateFromTuple(ReteTuple tuple) {
-            this.left = this.declaration.getValue( tuple.get( this.declaration ).getObject() );
+            this.left = this.declaration.getExtractor().getValue( tuple.get( this.declaration ).getObject() );
         }
 
         public void updateFromFactHandle(InternalFactHandle handle) {
             this.right = this.extractor.getValue( handle.getObject() );
+        }
+    }
 
+    public static class LongVariableContextEntry extends VariableContextEntry {
+        public long left;
+        public long right;
+
+        public LongVariableContextEntry(FieldExtractor extractor,
+                                        Declaration declaration) {
+            super( extractor,
+                   declaration );
         }
+
+        public void updateFromTuple(ReteTuple tuple) {
+            this.left = this.declaration.getExtractor().getLongValue( tuple.get( this.declaration ).getObject() );
+        }
+
+        public void updateFromFactHandle(InternalFactHandle handle) {
+            this.right = this.extractor.getLongValue( handle.getObject() );
+        }
     }
 
+    public static class DoubleVariableContextEntry extends VariableContextEntry {
+        public double left;
+        public double right;
+
+        public DoubleVariableContextEntry(FieldExtractor extractor,
+                                          Declaration declaration) {
+            super( extractor,
+                   declaration );
+        }
+
+        public void updateFromTuple(ReteTuple tuple) {
+            this.left = this.declaration.getExtractor().getDoubleValue( tuple.get( this.declaration ).getObject() );
+        }
+
+        public void updateFromFactHandle(InternalFactHandle handle) {
+            this.right = this.extractor.getDoubleValue( handle.getObject() );
+        }
+    }
+
+    public static class BooleanVariableContextEntry extends VariableContextEntry {
+        public boolean left;
+        public boolean right;
+
+        public BooleanVariableContextEntry(FieldExtractor extractor,
+                                           Declaration declaration) {
+            super( extractor,
+                   declaration );
+        }
+
+        public void updateFromTuple(ReteTuple tuple) {
+            this.left = this.declaration.getExtractor().getBooleanValue( tuple.get( this.declaration ).getObject() );
+        }
+
+        public void updateFromFactHandle(InternalFactHandle handle) {
+            this.right = this.extractor.getBooleanValue( handle.getObject() );
+        }
+    }
+
 }
\ No newline at end of file

Modified: 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-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -18,13 +18,12 @@
 
 import java.util.Arrays;
 
-import org.drools.WorkingMemory;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.ReteTuple;
 import org.drools.rule.VariableConstraint.VariableContextEntry;
 import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
 import org.drools.spi.Restriction;
-import org.drools.spi.Tuple;
 
 public class VariableRestriction
     implements
@@ -57,11 +56,19 @@
     }    
     
     public boolean isAllowedCachedLeft(ContextEntry context, Object object) {
-        return this.evaluator.evaluate( ((VariableContextEntry) context).left, object );        
+//        return this.evaluator.evaluate( ((VariableContextEntry) context).left, 
+//                                        ((VariableContextEntry) context).extractor,
+//                                        object );        
+        return this.evaluator.evaluateCachedLeft( (VariableContextEntry) context,
+                                        object );        
     }    
     
     public boolean isAllowedCachedRight(ReteTuple tuple, ContextEntry context) {
-        return this.evaluator.evaluate( this.declaration.getValue( tuple.get( this.declaration ).getObject() ), ((VariableContextEntry) context).right );        
+//        return this.evaluator.evaluate( this.declaration.getExtractor(),
+//                                        tuple.get( this.declaration ).getObject(), 
+//                                        ((VariableContextEntry) context).right );        
+        return this.evaluator.evaluateCachedRight((VariableContextEntry) context, 
+                                        tuple.get( this.declaration ).getObject());        
     }  
 
     public String toString() {
@@ -95,7 +102,8 @@
                                                                                                                           other.requiredDeclarations );
     }
 
-    public boolean isAllowed(Object object,
+    public boolean isAllowed(Extractor extractor,
+                             Object object,
                              InternalWorkingMemory workingMemoiry) {
         throw new UnsupportedOperationException("does not support method  call  isAllowed(Object object, InternalWorkingMemory workingMemoiry)" );
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ColumnExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ColumnExtractor.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ColumnExtractor.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -1,5 +1,6 @@
 package org.drools.spi;
 
+import org.drools.RuntimeDroolsException;
 import org.drools.base.ClassObjectType;
 import org.drools.base.ValueType;
 import org.drools.facttemplates.Fact;
@@ -45,14 +46,70 @@
     public Class getExtractToClass() {
         // @todo : this is a bit nasty, but does the trick
         if ( objectType.getClass() == ClassObjectType.class ) {
-            return ( ( ClassObjectType ) objectType ).getClassType();
+            return ((ClassObjectType) objectType).getClassType();
         } else {
             return Fact.class;
-        } 
+        }
     }
 
     public ValueType getValueType() {
         return objectType.getValueType();
     }
 
+    public boolean getBooleanValue(Object object) {
+        if( this.objectType.getValueType().isBoolean() ) {
+            return ((Boolean)object).booleanValue(); 
+        }
+        throw new RuntimeDroolsException("Conversion to boolean not supported for type: "+object.getClass());
+    }
+
+    public byte getByteValue(Object object) {
+        if( this.objectType.getValueType().isNumber() ) {
+            return ((Number)object).byteValue(); 
+        }
+        throw new RuntimeDroolsException("Conversion to byte not supported for type: "+object.getClass());
+    }
+
+    public char getCharValue(Object object) {
+        if( this.objectType.getValueType().isChar() ) {
+            return ((Character)object).charValue(); 
+        }
+        throw new RuntimeDroolsException("Conversion to char not supported for type: "+object.getClass());
+    }
+
+    public double getDoubleValue(Object object) {
+        if( this.objectType.getValueType().isNumber() ) {
+            return ((Number)object).doubleValue(); 
+        }
+        throw new RuntimeDroolsException("Conversion to double not supported for type: "+object.getClass());
+    }
+
+    public float getFloatValue(Object object) {
+        if( this.objectType.getValueType().isNumber() ) {
+            return ((Number)object).floatValue(); 
+        }
+        throw new RuntimeDroolsException("Conversion to float not supported for type: "+object.getClass());
+    }
+
+    public int getIntValue(Object object) {
+        if( this.objectType.getValueType().isNumber() ) {
+            return ((Number)object).intValue(); 
+        }
+        throw new RuntimeDroolsException("Conversion to int not supported for type: "+object.getClass());
+    }
+
+    public long getLongValue(Object object) {
+        if( this.objectType.getValueType().isNumber() ) {
+            return ((Number)object).longValue(); 
+        }
+        throw new RuntimeDroolsException("Conversion to long not supported for type: "+object.getClass());
+    }
+
+    public short getShortValue(Object object) {
+        if( this.objectType.getValueType().isNumber() ) {
+            return ((Number)object).shortValue(); 
+        }
+        throw new RuntimeDroolsException("Conversion to short not supported for type: "+object.getClass());
+    }
+
 }
\ No newline at end of file

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-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Evaluator.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -20,53 +20,54 @@
 
 import org.drools.base.ValueType;
 import org.drools.base.evaluators.Operator;
+import org.drools.rule.VariableConstraint.VariableContextEntry;
 
 public interface Evaluator
     extends
     Serializable {
-//    // Operators
-//    public static final int EQUAL            = 1;
-//    public static final int NOT_EQUAL        = 10;
-//    public static final int LESS             = 20;
-//    public static final int LESS_OR_EQUAL    = 30;
-//    public static final int GREATER          = 40;
-//    public static final int GREATER_OR_EQUAL = 50;
-//    public static final int CONTAINS         = 60;
-//    public static final int MATCHES          = 70;
-//    public static final int EXCLUDES         = 80;
-//
-//    // Types
-//    public static final int CHAR_TYPE        = 100;
-//    public static final int BYTE_TYPE        = 110;
-//    public static final int SHORT_TYPE       = 120;
-//    public static final int INTEGER_TYPE     = 130;
-//    public static final int LONG_TYPE        = 140;
-//    public static final int FLOAT_TYPE       = 150;
-//    public static final int DOUBLE_TYPE      = 160;
-//    public static final int BOOLEAN_TYPE     = 170;
-//    public static final int STRING_TYPE      = 180;
-//    public static final int DATE_TYPE        = 190;
-//    public static final int ARRAY_TYPE       = 200;
-//    public static final int OBJECT_TYPE      = 210;
-//    public static final int NULL_TYPE        = 300;
 
     public ValueType getValueType();
 
     public Operator getOperator();
 
     /**
-     * This method will apply the evaluator on the objects.
+     * This method will extract the value from the object1 using the 
+     * extractor and compare it with the object2.
      * 
-     * Typically, they follow this form:
-     * Fact(object1 operator object2)
+     * @param extractor 
+     *        The extractor used to get the source value from the object
+     * @param object1
+     *        The source object to evaluate
+     * @param object2
+     *        The actual value to compare to
+     *        
+     * @return Returns true if evaluation is successfull. false otherwise.
+     */
+    public boolean evaluate(Extractor extractor,
+                            Object object1,
+                            FieldValue value);
+
+    /**
+     * This method will extract the value from the object2 using the 
+     * extractor and compare it with the object1.
      * 
-     * Where operator selects the appropraite concrete evaluator, and object1, and object2
-     * are parameters to this method.
-     * 
-     * So Person(age < 42) will have object1==age field (of the Person fact object)
-     * and "42" will be the object2 value.
+     * @param object1
+     *        The actual value to compare to
+     * @param extractor 
+     *        The extractor used to get the source value from the object
+     * @param object2
+     *        The source object to evaluate
+     *        
+     * @return Returns true if evaluation is successfull. false otherwise.
      */
-    public boolean evaluate(Object object1,
+    public boolean evaluate(FieldValue object1,
+                            Extractor extractor,
                             Object object2);
 
+    public boolean evaluateCachedLeft(VariableContextEntry context,
+                                      Object object1);
+
+    public boolean evaluateCachedRight(VariableContextEntry context,
+                                       Object object2);
+
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Extractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Extractor.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Extractor.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -23,10 +23,27 @@
 public interface Extractor
     extends
     Serializable {
-    
+
     public Object getValue(Object object);
 
+    public char getCharValue(Object object);
+
+    public int getIntValue(Object object);
+
+    public byte getByteValue(Object object);
+
+    public short getShortValue(Object object);
+
+    public long getLongValue(Object object);
+
+    public float getFloatValue(Object object);
+
+    public double getDoubleValue(Object object);
+
+    public boolean getBooleanValue(Object object);
+
     public ValueType getValueType();
-    
+
     public Class getExtractToClass();
+
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/FieldValue.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/FieldValue.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/FieldValue.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -22,6 +22,23 @@
     extends
     Serializable {
 
-    Object getValue();
+    public Object getValue();
 
+    public char getCharValue();
+
+    public int getIntValue();
+
+    public byte getByteValue();
+
+    public short getShortValue();
+
+    public long getLongValue();
+
+    public float getFloatValue();
+
+    public double getDoubleValue();
+
+    public boolean getBooleanValue();
+    
+
 }
\ No newline at end of file

Modified: 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-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Restriction.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -12,7 +12,7 @@
 public interface Restriction extends Serializable {
     Declaration[] getRequiredDeclarations();
     
-    public boolean isAllowed(Object object, InternalWorkingMemory workingMemoiry);
+    public boolean isAllowed(Extractor extractor, Object object, InternalWorkingMemory workingMemoiry);
     
     public boolean isAllowedCachedLeft(ContextEntry context, Object object);
     

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ClassFieldExtractorFactoryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ClassFieldExtractorFactoryTest.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ClassFieldExtractorFactoryTest.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -25,7 +25,7 @@
 import org.drools.util.asm.TestInterface;
 import org.drools.util.asm.TestInterfaceImpl;
 
-public class ClassFieldExtractorFactoryTest extends TestCase {
+public abstract class ClassFieldExtractorFactoryTest extends TestCase {
 
     public void testIt() throws Exception {
         FieldExtractor ex = ClassFieldExtractorFactory.getClassFieldExtractor( TestBean.class,
@@ -67,5 +67,5 @@
         assertEquals( "hola",
                       ex.getValue( new BeanInherit() ) );
     }
-
+    
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/TestBean.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/TestBean.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/TestBean.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -1,5 +1,8 @@
 package org.drools.base;
 
+import java.util.Collections;
+import java.util.List;
+
 /*
  * Copyright 2005 JBoss Inc
  * 
@@ -17,9 +20,19 @@
  */
 
 public class TestBean {
-    private final String name = "michael";
-    private final int    age  = 42;
+    private final String  name        = "michael";
+    private final int     age         = 42;
 
+    private final boolean booleanAttr = true;
+    private final byte    byteAttr    = 1;
+    private final char    charAttr    = 'a';
+    private final short   shortAttr   = 3;
+    private final int     intAttr     = 4;
+    private final long    longAttr    = 5;
+    private final float   floatAttr   = 6.0f;
+    private final double  doubleAttr  = 7.0;
+    private final List    listAttr    = Collections.EMPTY_LIST;
+
     public String getName() {
         return this.name;
     }
@@ -27,4 +40,40 @@
     public int getAge() {
         return this.age;
     }
+
+    public boolean isBooleanAttr() {
+        return booleanAttr;
+    }
+
+    public byte getByteAttr() {
+        return byteAttr;
+    }
+
+    public char getCharAttr() {
+        return charAttr;
+    }
+
+    public double getDoubleAttr() {
+        return doubleAttr;
+    }
+
+    public float getFloatAttr() {
+        return floatAttr;
+    }
+
+    public int getIntAttr() {
+        return intAttr;
+    }
+
+    public List getListAttr() {
+        return listAttr;
+    }
+
+    public long getLongAttr() {
+        return longAttr;
+    }
+
+    public short getShortAttr() {
+        return shortAttr;
+    }
 }
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ValueTypeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ValueTypeTest.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ValueTypeTest.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -0,0 +1,37 @@
+package org.drools.base;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+public class ValueTypeTest extends TestCase {
+
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    public void testIsBoolean() {
+        Assert.assertTrue(ValueType.BOOLEAN_TYPE.isBoolean());
+        Assert.assertTrue(ValueType.PBOOLEAN_TYPE.isBoolean());
+    }
+
+    public void testIsNumber() {
+        Assert.assertTrue(ValueType.PBYTE_TYPE.isNumber());
+        Assert.assertTrue(ValueType.PSHORT_TYPE.isNumber());
+        Assert.assertTrue(ValueType.PINTEGER_TYPE.isNumber());
+        Assert.assertTrue(ValueType.PLONG_TYPE.isNumber());
+        Assert.assertTrue(ValueType.PFLOAT_TYPE.isNumber());
+        Assert.assertTrue(ValueType.PDOUBLE_TYPE.isNumber());
+        Assert.assertTrue(ValueType.BYTE_TYPE.isNumber());
+        Assert.assertTrue(ValueType.SHORT_TYPE.isNumber());
+        Assert.assertTrue(ValueType.INTEGER_TYPE.isNumber());
+        Assert.assertTrue(ValueType.LONG_TYPE.isNumber());
+        Assert.assertTrue(ValueType.FLOAT_TYPE.isNumber());
+        Assert.assertTrue(ValueType.DOUBLE_TYPE.isNumber());
+        
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ValueTypeTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/BooleanClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/BooleanClassFieldExtractorTest.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/BooleanClassFieldExtractorTest.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -0,0 +1,96 @@
+package org.drools.base.extractors;
+
+import junit.framework.Assert;
+
+import org.drools.base.ClassFieldExtractorFactory;
+import org.drools.base.TestBean;
+import org.drools.spi.Extractor;
+
+public class BooleanClassFieldExtractorTest extends ClassFieldExtractorsBaseTest {
+    Extractor extractor = ClassFieldExtractorFactory.getClassFieldExtractor( TestBean.class, "booleanAttr" );
+    TestBean bean = new TestBean();
+    
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    public void testGetBooleanValue() {
+        try {
+            Assert.assertTrue( this.extractor.getBooleanValue( bean ) );
+        } catch (Exception e) {
+            fail("Should not throw exception");
+        }
+    }
+
+    public void testGetByteValue() {
+        try {
+            this.extractor.getByteValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetCharValue() {
+        try {
+            this.extractor.getCharValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetDoubleValue() {
+        try {
+            this.extractor.getDoubleValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetFloatValue() {
+        try {
+            this.extractor.getFloatValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetIntValue() {
+        try {
+            this.extractor.getIntValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetLongValue() {
+        try {
+            this.extractor.getLongValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetShortValue() {
+        try {
+            this.extractor.getShortValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetValue() {
+        try {
+            Assert.assertSame( Boolean.TRUE, this.extractor.getValue( bean ) );
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/BooleanClassFieldExtractorTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ByteClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ByteClassFieldExtractorTest.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ByteClassFieldExtractorTest.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -0,0 +1,92 @@
+package org.drools.base.extractors;
+
+import junit.framework.Assert;
+
+import org.drools.base.ClassFieldExtractorFactory;
+import org.drools.base.TestBean;
+import org.drools.spi.Extractor;
+
+public class ByteClassFieldExtractorTest extends ClassFieldExtractorsBaseTest {
+    Extractor extractor = ClassFieldExtractorFactory.getClassFieldExtractor( TestBean.class, "byteAttr" );
+    TestBean bean = new TestBean();
+    
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    public void testGetBooleanValue() {
+        try {
+            this.extractor.getBooleanValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetByteValue() {
+        try {
+            Assert.assertEquals( 1, this.extractor.getByteValue( bean ));
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetCharValue() {
+        try {
+            this.extractor.getCharValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetDoubleValue() {
+        try {
+            Assert.assertEquals( 1.0, this.extractor.getDoubleValue( bean ), 0.01);
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetFloatValue() {
+        try {
+            Assert.assertEquals( 1.0f, this.extractor.getFloatValue( bean ), 0.01);
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetIntValue() {
+        try {
+            Assert.assertEquals( 1, this.extractor.getIntValue( bean ));
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetLongValue() {
+        try {
+            Assert.assertEquals( 1, this.extractor.getLongValue( bean ));
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetShortValue() {
+        try {
+            Assert.assertEquals( 1, this.extractor.getShortValue( bean ));
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetValue() {
+        try {
+            Assert.assertEquals( new Byte((byte)1), this.extractor.getValue( bean ) );
+            Assert.assertTrue( this.extractor.getValue( bean ) instanceof Byte );
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ByteClassFieldExtractorTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/CharClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/CharClassFieldExtractorTest.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/CharClassFieldExtractorTest.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -0,0 +1,96 @@
+package org.drools.base.extractors;
+
+import junit.framework.Assert;
+
+import org.drools.base.ClassFieldExtractorFactory;
+import org.drools.base.TestBean;
+import org.drools.spi.Extractor;
+
+public class CharClassFieldExtractorTest extends ClassFieldExtractorsBaseTest {
+    Extractor extractor = ClassFieldExtractorFactory.getClassFieldExtractor( TestBean.class, "charAttr" );
+    TestBean bean = new TestBean();
+    
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    public void testGetBooleanValue() {
+        try {
+            this.extractor.getBooleanValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetByteValue() {
+        try {
+            this.extractor.getByteValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetCharValue() {
+        try {
+            Assert.assertEquals( 'a', this.extractor.getCharValue( bean ) );
+        } catch (Exception e) {
+            fail("Should not throw exception");
+        }
+    }
+
+    public void testGetDoubleValue() {
+        try {
+            this.extractor.getDoubleValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetFloatValue() {
+        try {
+            this.extractor.getFloatValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetIntValue() {
+        try {
+            this.extractor.getIntValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetLongValue() {
+        try {
+            this.extractor.getLongValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetShortValue() {
+        try {
+            this.extractor.getShortValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetValue() {
+        try {
+            Assert.assertEquals( new Character('a'), this.extractor.getValue( bean ) );
+            Assert.assertTrue( this.extractor.getValue( bean ) instanceof Character );
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/CharClassFieldExtractorTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ClassFieldExtractorsBaseTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ClassFieldExtractorsBaseTest.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ClassFieldExtractorsBaseTest.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -0,0 +1,26 @@
+package org.drools.base.extractors;
+
+import junit.framework.TestCase;
+
+public abstract class ClassFieldExtractorsBaseTest extends TestCase {
+    
+    public abstract void testGetBooleanValue();
+    
+    public abstract void testGetByteValue();
+    
+    public abstract void testGetCharValue();
+    
+    public abstract void testGetShortValue();
+    
+    public abstract void testGetIntValue();
+    
+    public abstract void testGetLongValue();
+    
+    public abstract void testGetFloatValue();
+    
+    public abstract void testGetDoubleValue();
+    
+    public abstract void testGetValue();
+    
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ClassFieldExtractorsBaseTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/DoubleClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/DoubleClassFieldExtractorTest.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/DoubleClassFieldExtractorTest.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -0,0 +1,93 @@
+package org.drools.base.extractors;
+
+import junit.framework.Assert;
+
+import org.drools.base.ClassFieldExtractorFactory;
+import org.drools.base.TestBean;
+import org.drools.spi.Extractor;
+
+public class DoubleClassFieldExtractorTest extends ClassFieldExtractorsBaseTest {
+    private static final double VALUE = 7;
+    
+    Extractor extractor = ClassFieldExtractorFactory.getClassFieldExtractor( TestBean.class, "doubleAttr" );
+    TestBean bean = new TestBean();
+    
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    public void testGetBooleanValue() {
+        try {
+            this.extractor.getBooleanValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetByteValue() {
+        try {
+            Assert.assertEquals( (byte) VALUE, this.extractor.getByteValue( bean ));
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetCharValue() {
+        try {
+            this.extractor.getCharValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetDoubleValue() {
+        try {
+            Assert.assertEquals( VALUE, this.extractor.getDoubleValue( bean ), 0.01);
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetFloatValue() {
+        try {
+            Assert.assertEquals( VALUE, this.extractor.getFloatValue( bean ), 0.01);
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetIntValue() {
+        try {
+            Assert.assertEquals( (int) VALUE, this.extractor.getIntValue( bean ));
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetLongValue() {
+        try {
+            Assert.assertEquals( (long) VALUE, this.extractor.getLongValue( bean ));
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetShortValue() {
+        try {
+            Assert.assertEquals( (short) VALUE, this.extractor.getShortValue( bean ));
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetValue() {
+        try {
+            Assert.assertEquals( new Double((double)VALUE), this.extractor.getValue( bean ) );
+            Assert.assertTrue( this.extractor.getValue( bean ) instanceof Double );
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/DoubleClassFieldExtractorTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/FloatClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/FloatClassFieldExtractorTest.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/FloatClassFieldExtractorTest.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -0,0 +1,93 @@
+package org.drools.base.extractors;
+
+import junit.framework.Assert;
+
+import org.drools.base.ClassFieldExtractorFactory;
+import org.drools.base.TestBean;
+import org.drools.spi.Extractor;
+
+public class FloatClassFieldExtractorTest extends ClassFieldExtractorsBaseTest {
+    private static final float VALUE = 6;
+    
+    Extractor extractor = ClassFieldExtractorFactory.getClassFieldExtractor( TestBean.class, "floatAttr" );
+    TestBean bean = new TestBean();
+    
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    public void testGetBooleanValue() {
+        try {
+            this.extractor.getBooleanValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetByteValue() {
+        try {
+            Assert.assertEquals( (byte) VALUE, this.extractor.getByteValue( bean ));
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetCharValue() {
+        try {
+            this.extractor.getCharValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetDoubleValue() {
+        try {
+            Assert.assertEquals( VALUE, this.extractor.getDoubleValue( bean ), 0.01);
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetFloatValue() {
+        try {
+            Assert.assertEquals( VALUE, this.extractor.getFloatValue( bean ), 0.01);
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetIntValue() {
+        try {
+            Assert.assertEquals( (int) VALUE, this.extractor.getIntValue( bean ));
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetLongValue() {
+        try {
+            Assert.assertEquals( (long) VALUE, this.extractor.getLongValue( bean ));
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetShortValue() {
+        try {
+            Assert.assertEquals( (short) VALUE, this.extractor.getShortValue( bean ));
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetValue() {
+        try {
+            Assert.assertEquals( new Float((float)VALUE), this.extractor.getValue( bean ) );
+            Assert.assertTrue( this.extractor.getValue( bean ) instanceof Float );
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/FloatClassFieldExtractorTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/IntClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/IntClassFieldExtractorTest.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/IntClassFieldExtractorTest.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -0,0 +1,94 @@
+package org.drools.base.extractors;
+
+import junit.framework.Assert;
+
+import org.drools.base.ClassFieldExtractorFactory;
+import org.drools.base.TestBean;
+import org.drools.spi.Extractor;
+
+public class IntClassFieldExtractorTest extends ClassFieldExtractorsBaseTest {
+    private static final int VALUE = 4;
+    
+    Extractor extractor = ClassFieldExtractorFactory.getClassFieldExtractor( TestBean.class, "intAttr" );
+    TestBean bean = new TestBean();
+    
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    public void testGetBooleanValue() {
+        try {
+            this.extractor.getBooleanValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetByteValue() {
+        try {
+            Assert.assertEquals( VALUE, this.extractor.getByteValue( bean ));
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetCharValue() {
+        try {
+            this.extractor.getCharValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetDoubleValue() {
+        try {
+            Assert.assertEquals( VALUE, this.extractor.getDoubleValue( bean ), 0.01);
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetFloatValue() {
+        try {
+            Assert.assertEquals( VALUE, this.extractor.getFloatValue( bean ), 0.01);
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetIntValue() {
+        try {
+            Assert.assertEquals( VALUE, this.extractor.getIntValue( bean ));
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetLongValue() {
+        try {
+            Assert.assertEquals( VALUE, this.extractor.getLongValue( bean ));
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetShortValue() {
+        try {
+            Assert.assertEquals( VALUE, this.extractor.getShortValue( bean ));
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetValue() {
+        try {
+            Assert.assertEquals( new Integer((int)VALUE), this.extractor.getValue( bean ) );
+            Assert.assertTrue( this.extractor.getValue( bean ) instanceof Integer );
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/IntClassFieldExtractorTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/LongClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/LongClassFieldExtractorTest.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/LongClassFieldExtractorTest.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -0,0 +1,93 @@
+package org.drools.base.extractors;
+
+import junit.framework.Assert;
+
+import org.drools.base.ClassFieldExtractorFactory;
+import org.drools.base.TestBean;
+import org.drools.spi.Extractor;
+
+public class LongClassFieldExtractorTest extends ClassFieldExtractorsBaseTest {
+    private static final long VALUE = 5;
+    
+    Extractor extractor = ClassFieldExtractorFactory.getClassFieldExtractor( TestBean.class, "longAttr" );
+    TestBean bean = new TestBean();
+    
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    public void testGetBooleanValue() {
+        try {
+            this.extractor.getBooleanValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetByteValue() {
+        try {
+            Assert.assertEquals( VALUE, this.extractor.getByteValue( bean ));
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetCharValue() {
+        try {
+            this.extractor.getCharValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetDoubleValue() {
+        try {
+            Assert.assertEquals( VALUE, this.extractor.getDoubleValue( bean ), 0.01);
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetFloatValue() {
+        try {
+            Assert.assertEquals( VALUE, this.extractor.getFloatValue( bean ), 0.01);
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetIntValue() {
+        try {
+            Assert.assertEquals( VALUE, this.extractor.getIntValue( bean ));
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetLongValue() {
+        try {
+            Assert.assertEquals( VALUE, this.extractor.getLongValue( bean ));
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetShortValue() {
+        try {
+            Assert.assertEquals( VALUE, this.extractor.getShortValue( bean ));
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetValue() {
+        try {
+            Assert.assertEquals( new Long((short)VALUE), this.extractor.getValue( bean ) );
+            Assert.assertTrue( this.extractor.getValue( bean ) instanceof Long );
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/LongClassFieldExtractorTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ObjectClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ObjectClassFieldExtractorTest.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ObjectClassFieldExtractorTest.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -0,0 +1,100 @@
+package org.drools.base.extractors;
+
+import java.util.Collections;
+import java.util.List;
+
+import junit.framework.Assert;
+
+import org.drools.base.ClassFieldExtractorFactory;
+import org.drools.base.TestBean;
+import org.drools.spi.Extractor;
+
+public class ObjectClassFieldExtractorTest extends ClassFieldExtractorsBaseTest {
+    Extractor extractor = ClassFieldExtractorFactory.getClassFieldExtractor( TestBean.class, "listAttr" );
+    TestBean bean = new TestBean();
+    
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    public void testGetBooleanValue() {
+        try {
+            this.extractor.getBooleanValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetByteValue() {
+        try {
+            this.extractor.getByteValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetCharValue() {
+        try {
+            this.extractor.getCharValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetDoubleValue() {
+        try {
+            this.extractor.getDoubleValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetFloatValue() {
+        try {
+            this.extractor.getFloatValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetIntValue() {
+        try {
+            this.extractor.getIntValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetLongValue() {
+        try {
+            this.extractor.getLongValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetShortValue() {
+        try {
+            this.extractor.getShortValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetValue() {
+        try {
+            Assert.assertEquals( Collections.EMPTY_LIST, this.extractor.getValue( bean ) );
+            Assert.assertTrue( this.extractor.getValue( bean ) instanceof List );
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ObjectClassFieldExtractorTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ShortClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ShortClassFieldExtractorTest.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ShortClassFieldExtractorTest.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -0,0 +1,93 @@
+package org.drools.base.extractors;
+
+import junit.framework.Assert;
+
+import org.drools.base.ClassFieldExtractorFactory;
+import org.drools.base.TestBean;
+import org.drools.spi.Extractor;
+
+public class ShortClassFieldExtractorTest extends ClassFieldExtractorsBaseTest {
+    private static final short VALUE = 3;
+    
+    Extractor extractor = ClassFieldExtractorFactory.getClassFieldExtractor( TestBean.class, "shortAttr" );
+    TestBean bean = new TestBean();
+    
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    public void testGetBooleanValue() {
+        try {
+            this.extractor.getBooleanValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetByteValue() {
+        try {
+            Assert.assertEquals( VALUE, this.extractor.getByteValue( bean ));
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetCharValue() {
+        try {
+            this.extractor.getCharValue( bean );
+            fail("Should have throw an exception");
+        } catch (Exception e) {
+            // success
+        }
+    }
+
+    public void testGetDoubleValue() {
+        try {
+            Assert.assertEquals( VALUE, this.extractor.getDoubleValue( bean ), 0.01);
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetFloatValue() {
+        try {
+            Assert.assertEquals( VALUE, this.extractor.getFloatValue( bean ), 0.01);
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetIntValue() {
+        try {
+            Assert.assertEquals( VALUE, this.extractor.getIntValue( bean ));
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetLongValue() {
+        try {
+            Assert.assertEquals( VALUE, this.extractor.getLongValue( bean ));
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetShortValue() {
+        try {
+            Assert.assertEquals( VALUE, this.extractor.getShortValue( bean ));
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+
+    public void testGetValue() {
+        try {
+            Assert.assertEquals( new Short((short)VALUE), this.extractor.getValue( bean ) );
+            Assert.assertTrue( this.extractor.getValue( bean ) instanceof Short );
+        } catch (Exception e) {
+            fail("Should not throw an exception");
+        }
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ShortClassFieldExtractorTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

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-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/BaseMannersTest.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -38,8 +38,8 @@
 import org.drools.base.ShadowProxyFactory;
 import org.drools.base.ValueType;
 import org.drools.base.evaluators.Operator;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.reteoo.MemoryVisitor;
+import org.drools.base.field.BooleanFieldImpl;
+import org.drools.base.field.LongFieldImpl;
 import org.drools.rule.Column;
 import org.drools.rule.Declaration;
 import org.drools.rule.InvalidRuleException;
@@ -48,15 +48,14 @@
 import org.drools.rule.Package;
 import org.drools.rule.Rule;
 import org.drools.rule.VariableConstraint;
+import org.drools.spi.AlphaNodeFieldConstraint;
 import org.drools.spi.BetaNodeFieldConstraint;
 import org.drools.spi.Consequence;
 import org.drools.spi.ConsequenceException;
 import org.drools.spi.Evaluator;
-import org.drools.spi.AlphaNodeFieldConstraint;
 import org.drools.spi.FieldExtractor;
 import org.drools.spi.FieldValue;
 import org.drools.spi.KnowledgeHelper;
-import org.drools.spi.MockField;
 import org.drools.spi.Tuple;
 
 public abstract class BaseMannersTest extends TestCase {
@@ -84,9 +83,9 @@
     private Evaluator       objectEqualEvaluator;
     private Evaluator       objectNotEqualEvaluator;
     private Evaluator       integerEqualEvaluator;
-    private Evaluator       integerNotEqualEvaluator;
+    //private Evaluator       integerNotEqualEvaluator;
     private Evaluator       booleanEqualEvaluator;
-    private Evaluator       booleanNotEqualEvaluator;
+    //private Evaluator       booleanNotEqualEvaluator;
 
     protected void setUp() throws Exception {
         Class shadow = ShadowProxyFactory.getProxy( Context.class );
@@ -117,12 +116,12 @@
         this.chosenType = new ClassObjectType( Chosen.class,
                                                shadow );
 
-        this.integerEqualEvaluator = ValueType.INTEGER_TYPE.getEvaluator( Operator.EQUAL );
-        this.integerNotEqualEvaluator = ValueType.INTEGER_TYPE.getEvaluator( Operator.NOT_EQUAL );
+        this.integerEqualEvaluator = ValueType.PINTEGER_TYPE.getEvaluator( Operator.EQUAL );
+        //this.integerNotEqualEvaluator = ValueType.INTEGER_TYPE.getEvaluator( Operator.NOT_EQUAL );
         this.objectEqualEvaluator = ValueType.OBJECT_TYPE.getEvaluator( Operator.EQUAL );
         this.objectNotEqualEvaluator = ValueType.OBJECT_TYPE.getEvaluator( Operator.NOT_EQUAL );
-        this.booleanEqualEvaluator = ValueType.BOOLEAN_TYPE.getEvaluator( Operator.EQUAL );
-        this.booleanNotEqualEvaluator = ValueType.BOOLEAN_TYPE.getEvaluator( Operator.NOT_EQUAL );
+        this.booleanEqualEvaluator = ValueType.PBOOLEAN_TYPE.getEvaluator( Operator.EQUAL );
+        //this.booleanNotEqualEvaluator = ValueType.BOOLEAN_TYPE.getEvaluator( Operator.NOT_EQUAL );
 
         this.pkg = new Package( "Miss Manners" );
         this.pkg.addRule( getAssignFirstSeatRule() );
@@ -220,22 +219,22 @@
                     String guestName = guest.getName();
 
                     Seating seating = new Seating( count.getValue(),
-                                                   new Integer(0),
+                                                   0,
                                                    true,
-                                                   new Integer(1),
+                                                   1,
                                                    guestName,
-                                                   new Integer(1),
+                                                   1,
                                                    guestName );
 
                     drools.assertObject( seating );
 
                     Path path = new Path( count.getValue(),
-                                          new Integer(1),
+                                          1,
                                           guestName );
 
                     drools.assertObject( path );
 
-                    count.setValue( new Integer(count.getValue().intValue() + 1) );
+                    count.setValue( count.getValue() );
                     drools.modifyObject( tuple.get( countDeclaration ),
                                          count );
 
@@ -333,7 +332,7 @@
 
         seatingColumn.addConstraint( getLiteralConstraint( seatingColumn,
                                                            "pathDone",
-                                                           new Boolean( true ),
+                                                           true,
                                                            this.booleanEqualEvaluator ) );
 
         setFieldDeclaration( seatingColumn,
@@ -481,8 +480,8 @@
 
                     Context context = (Context) drools.get( contextDeclaration );
                     Count count = (Count) drools.get( countDeclaration );
-                    Integer seatId = ((Integer) drools.get( seatingIdDeclaration ));
-                    Integer seatingRightSeat = ((Integer) drools.get( seatingRightSeatDeclaration ));
+                    int seatId = seatingIdDeclaration.getExtractor().getIntValue( tuple.get( seatingIdDeclaration ).getObject() );
+                    int seatingRightSeat = seatingRightSeatDeclaration.getExtractor().getIntValue( tuple.get( seatingRightSeatDeclaration ).getObject() );
 
                     String leftGuestName = (String) drools.get( leftGuestNameDeclaration );
                     String rightGuestName = (String) drools.get( seatingRightGuestNameDeclaration );
@@ -493,12 +492,12 @@
                                                    false,
                                                    seatingRightSeat,
                                                    rightGuestName,
-                                                   new Integer(seatingRightSeat.intValue() + 1),
+                                                   seatingRightSeat + 1,
                                                    leftGuestName );
                     drools.assertObject( seating );
 
                     Path path = new Path( count.getValue(),
-                                          new Integer(seatingRightSeat.intValue() + 1),
+                                          seatingRightSeat + 1,
                                           leftGuestName );
 
                     drools.assertObject( path );
@@ -508,7 +507,7 @@
                                                 rightGuestHobby );
 
                     drools.assertObject( chosen );
-                    count.setValue( new Integer(count.getValue().intValue() + 1) );
+                    count.setValue( count.getValue() + 1 );
 
                     //                    if ( count.getValue() == 5 ) {
                     //                        drools.retractObject( tuple.getFactHandleForDeclaration( countDeclaration ) );
@@ -594,7 +593,7 @@
 
         seatingColumn.addConstraint( getLiteralConstraint( seatingColumn,
                                                            "pathDone",
-                                                           new Boolean( false ),
+                                                           false,
                                                            this.booleanEqualEvaluator ) );
 
         rule.addPattern( seatingColumn );
@@ -657,8 +656,8 @@
                     Rule rule = drools.getRule();
                     Tuple tuple = drools.getTuple();
 
-                    Integer id = ((Integer) drools.get( seatingIdDeclaration ));
-                    Integer seat = ((Integer) drools.get( pathSeatDeclaration ));
+                    int id = seatingIdDeclaration.getExtractor().getIntValue( tuple.get( seatingIdDeclaration ).getObject() );
+                    int seat = pathSeatDeclaration.getExtractor().getIntValue( tuple.get( pathSeatDeclaration ).getObject() );
                     String guestName = (String) drools.get( pathGuestNameDeclaration );
 
                     Path path = new Path( id,
@@ -728,7 +727,7 @@
 
         seatingColumn.addConstraint( getLiteralConstraint( seatingColumn,
                                                            "pathDone",
-                                                           new Boolean( false ),
+                                                           false,
                                                            this.booleanEqualEvaluator ) );
 
         rule.addPattern( seatingColumn );
@@ -1030,7 +1029,7 @@
                 if ( !"seat".equals( st.nextToken() ) ) {
                     throw new IOException( "expected 'seat' in: " + line );
                 }
-                list.add( new LastSeat( new Integer( st.nextToken() ) ) );
+                list.add( new LastSeat( Integer.parseInt( st.nextToken() ) ) );
             }
 
             if ( "context".equals( type ) ) {
@@ -1109,20 +1108,36 @@
 
     private AlphaNodeFieldConstraint getLiteralConstraint(final Column column,
                                                           final String fieldName,
-                                                          final Object fieldValue,
+                                                          final int fieldValue,
                                                           final Evaluator evaluator) throws IntrospectionException {
         final Class clazz = ((ClassObjectType) column.getObjectType()).getClassType();
 
         final FieldExtractor extractor = new ClassFieldExtractor( clazz,
                                                                   fieldName );
 
-        final FieldValue field = new MockField( fieldValue );
+        final FieldValue field = new LongFieldImpl( fieldValue );
 
         return new LiteralConstraint( extractor,
                                       evaluator,
                                       field );
     }
 
+    private AlphaNodeFieldConstraint getLiteralConstraint(final Column column,
+                                                          final String fieldName,
+                                                          final boolean fieldValue,
+                                                          final Evaluator evaluator) throws IntrospectionException {
+        final Class clazz = ((ClassObjectType) column.getObjectType()).getClassType();
+
+        final FieldExtractor extractor = new ClassFieldExtractor( clazz,
+                                                                  fieldName );
+
+        final FieldValue field = new BooleanFieldImpl( fieldValue );
+
+        return new LiteralConstraint( extractor,
+                                      evaluator,
+                                      field );
+    }
+
     private void setFieldDeclaration(final Column column,
                                      final String fieldName,
                                      final String identifier) throws IntrospectionException {

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Chosen.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Chosen.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Chosen.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -26,7 +26,7 @@
      */
     private static final long serialVersionUID = -169447202790860427L;
 
-    private Integer         id;
+    private int         id;
 
     private String      guestName;
 
@@ -36,7 +36,7 @@
         
     }
     
-    public Chosen(final Integer id,
+    public Chosen(final int id,
                   final String guestName,
                   final Hobby hobby) {
         this.id = id;
@@ -44,7 +44,7 @@
         this.hobby = hobby;
     }
 
-    public Integer getId() {
+    public int getId() {
         return this.id;
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Context.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Context.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Context.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -25,15 +25,15 @@
      * 
      */
     private static final long    serialVersionUID = -5876473269153584875L;
-    public static final Integer      START_UP         = new Integer(0);
-    public static final Integer      ASSIGN_SEATS     = new Integer(1);
-    public static final Integer      MAKE_PATH        = new Integer(2);
-    public static final Integer      CHECK_DONE       = new Integer(3);
-    public static final Integer      PRINT_RESULTS    = new Integer(4);
+    public static final int      START_UP         = 0;
+    public static final int      ASSIGN_SEATS     = 1;
+    public static final int      MAKE_PATH        = 2;
+    public static final int      CHECK_DONE       = 3;
+    public static final int      PRINT_RESULTS    = 4;
 
     public static final String[] stateStrings     = {"START_UP", "ASSIGN_SEATS", "MAKE_PATH", "CHECK_DONE", "PRINT_RESULTS"};
 
-    private Integer                  state;
+    private int                  state;
     
     public Context() {
     }
@@ -46,24 +46,24 @@
         }
     }
 
-    public Context(final Integer state) {
+    public Context(final int state) {
         this.state = state;
     }
 
-    public void setState(final Integer state) {
+    public void setState(final int state) {
         this.state = state;
     }
 
-    public boolean isState(final Integer state) {
+    public boolean isState(final int state) {
         return this.state == state;
     }
 
-    public Integer getState() {
+    public int getState() {
         return this.state;
     }
 
     public String getStringValue() {
-        return Context.stateStrings[this.state.intValue()];
+        return Context.stateStrings[this.state];
     }
 
     public String toString() {

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Count.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Count.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Count.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -16,21 +16,21 @@
 package org.drools.examples.manners;
 
 public class Count {
-    private Integer value;
+    private int value;
     
     public Count() {
     }
 
-    public Count(final Integer value) {
+    public Count(final int value) {
         super();
         this.value = value;
     }
 
-    public Integer getValue() {
+    public int getValue() {
         return this.value;
     }
 
-    public void setValue(final Integer value) {
+    public void setValue(final int value) {
         this.value = value;
     }
 
@@ -51,7 +51,7 @@
     }
 
     public int hashCode() {
-        return this.value.intValue();
+        return this.value;
     }
 
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Hobby.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Hobby.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Hobby.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -24,21 +24,21 @@
 
     public static final String[] hobbyStrings = new String[]{Hobby.stringH1, Hobby.stringH2, Hobby.stringH3, Hobby.stringH4, Hobby.stringH5};
 
-    public static final Hobby    H1           = new Hobby( new Integer(1) );
-    public static final Hobby    H2           = new Hobby( new Integer(2) );
-    public static final Hobby    H3           = new Hobby( new Integer(3) );
-    public static final Hobby    H4           = new Hobby( new Integer(4) );
-    public static final Hobby    H5           = new Hobby( new Integer(5) );
+    public static final Hobby    H1           = new Hobby( 1 );
+    public static final Hobby    H2           = new Hobby( 2 );
+    public static final Hobby    H3           = new Hobby( 3 );
+    public static final Hobby    H4           = new Hobby( 4 );
+    public static final Hobby    H5           = new Hobby( 5 );
 
     private String         hobbyStr;
-    private Integer            hobbyIndex;
+    private int            hobbyIndex;
     
     public Hobby() {
     }
 
-    private Hobby(final Integer hobby) {
-        this.hobbyIndex = new Integer(hobby.intValue() - 1);
-        this.hobbyStr = Hobby.hobbyStrings[this.hobbyIndex.intValue()];
+    private Hobby(final int hobby) {
+        this.hobbyIndex = hobby - 1;
+        this.hobbyStr   = Hobby.hobbyStrings[this.hobbyIndex];
     }
 
     public String getHobby() {
@@ -70,7 +70,7 @@
     }
 
     public int hashCode() {
-        return this.hobbyIndex.intValue();
+        return this.hobbyIndex;
     }
 
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/LastSeat.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/LastSeat.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/LastSeat.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -24,16 +24,16 @@
      * 
      */
     private static final long serialVersionUID = -3331801742327121724L;
-    private Integer         seat;
+    private int         seat;
 
     public LastSeat() {
     }
     
-    public LastSeat(final Integer seat) {
+    public LastSeat(final int seat) {
         this.seat = seat;
     }
 
-    public Integer getSeat() {
+    public int getSeat() {
         return this.seat;
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Path.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Path.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Path.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -16,22 +16,22 @@
 package org.drools.examples.manners;
 
 public class Path {
-    private Integer    id;
+    private int    id;
     private String guestName;
-    private Integer    seat;
+    private int    seat;
 
     public Path() {
     }
     
-    public Path(final Integer id,
-                final Integer seat,
+    public Path(final int id,
+                final int seat,
                 final String guestName) {
         this.id = id;
         this.seat = seat;
         this.guestName = guestName;
     }
 
-    public Integer getSeat() {
+    public int getSeat() {
         return this.seat;
     }
 
@@ -39,7 +39,7 @@
         return this.guestName;
     }
 
-    public Integer getId() {
+    public int getId() {
         return this.id;
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -73,7 +73,7 @@
             workingMemory.assertObject( object );
         }
 
-        workingMemory.assertObject( new Count( new Integer(1) ) );
+        workingMemory.assertObject( new Count( 1 ) );
 
         final long start = System.currentTimeMillis();
         workingMemory.fireAllRules();

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Seating.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Seating.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Seating.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -25,9 +25,9 @@
      */
     private static final long serialVersionUID = -21267542036195318L;
 
-    private Integer         id, pid;
+    private int         id, pid;
 
-    private Integer         leftSeat, rightSeat;
+    private int         leftSeat, rightSeat;
 
     private String      leftGuestName, rightGuestName;
 
@@ -36,12 +36,12 @@
     public Seating() {
     }
     
-    public Seating(final Integer id,
-                   final Integer pid,
+    public Seating(final int id,
+                   final int pid,
                    final boolean pathDone,
-                   final Integer leftSeat,
+                   final int leftSeat,
                    final String leftGuestName,
-                   final Integer rightSeat,
+                   final int rightSeat,
                    final String rightGuestName) {
         super();
         this.id = id;
@@ -61,7 +61,7 @@
         this.pathDone = pathDone;
     }
 
-    public Integer getId() {
+    public int getId() {
         return this.id;
     }
 
@@ -69,11 +69,11 @@
         return this.leftGuestName;
     }
 
-    public Integer getLeftSeat() {
+    public int getLeftSeat() {
         return this.leftSeat;
     }
 
-    public Integer getPid() {
+    public int getPid() {
         return this.pid;
     }
 
@@ -81,7 +81,7 @@
         return this.rightGuestName;
     }
 
-    public Integer getRightSeat() {
+    public int getRightSeat() {
         return this.rightSeat;
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Sex.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Sex.java	2006-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Sex.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -16,24 +16,24 @@
 package org.drools.examples.manners;
 
 public class Sex {
-    public static final Sex      M       = new Sex( new Integer(0) );
-    public static final Sex      F       = new Sex( new Integer(1) );
+    public static final Sex      M       = new Sex( 0 );
+    public static final Sex      F       = new Sex( 1 );
 
     public static final String   stringM = "m";
     public static final String   stringF = "f";
     public static final String[] sexList = new String[]{Sex.stringM, Sex.stringF};
 
-    private Integer            sex;
+    private int            sex;
     
     public Sex() {
     }
 
-    private Sex(final Integer sex) {
+    private Sex(final int sex) {
         this.sex = sex;
     }
 
     public String getSex() {
-        return Sex.sexList[this.sex.intValue()];
+        return Sex.sexList[this.sex];
     }
 
     public final static Sex resolve(final String sex) {
@@ -55,7 +55,7 @@
     }
 
     public int hashCode() {
-        return this.sex.intValue();
+        return this.sex;
     }
 
 }
\ No newline at end of file

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-10-18 22:06:58 UTC (rev 6902)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/FieldConstraintTest.java	2006-10-18 22:13:06 UTC (rev 6903)
@@ -29,6 +29,7 @@
 import org.drools.base.ValueType;
 import org.drools.base.evaluators.Operator;
 import org.drools.common.InternalFactHandle;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.InstrumentedReteTuple;
 import org.drools.reteoo.ReteooRuleBase;
 import org.drools.spi.Evaluator;
@@ -60,7 +61,7 @@
      */
     public void testLiteralConstraint() throws IntrospectionException {
         final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
-        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+        final InternalWorkingMemory workingMemory = (InternalWorkingMemory) ruleBase.newWorkingMemory();
 
         final ClassFieldExtractor extractor = new ClassFieldExtractor( Cheese.class,
                                                                        "type" );
@@ -80,7 +81,6 @@
 
         // check constraint
         assertTrue( constraint.isAllowed( cheddarHandle.getObject(),
-                                          null,
                                           workingMemory ) );
 
         final Cheese stilton = new Cheese( "stilton",
@@ -90,7 +90,6 @@
 
         // check constraint
         assertFalse( constraint.isAllowed( stiltonHandle.getObject(),
-                                           null,
                                            workingMemory ) );
     }
 
@@ -98,6 +97,51 @@
      * <pre>
      *        
      *         
+     *                Cheese( price == 5 )
+     *          
+     *         
+     * </pre>
+     * 
+     * @throws IntrospectionException
+     */
+    public void testPrimitiveLiteralConstraint() throws IntrospectionException {
+        final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+        final InternalWorkingMemory workingMemory = (InternalWorkingMemory) ruleBase.newWorkingMemory();
+
+        final ClassFieldExtractor extractor = new ClassFieldExtractor( Cheese.class,
+                                                                       "price" );
+
+        final FieldValue field = new MockField( new Integer(5) );
+
+        Evaluator evaluator = ValueType.PINTEGER_TYPE.getEvaluator( Operator.EQUAL );
+        
+        final LiteralConstraint constraint = new LiteralConstraint( extractor,
+                                                                    evaluator,
+                                                                    field );
+
+        final Cheese cheddar = new Cheese( "cheddar",
+                                           5 );
+
+        final InternalFactHandle cheddarHandle = (InternalFactHandle) workingMemory.assertObject( cheddar );
+
+        // check constraint
+        assertTrue( constraint.isAllowed( cheddarHandle.getObject(),
+                                          workingMemory ) );
+
+        final Cheese stilton = new Cheese( "stilton",
+                                           10 );
+
+        final InternalFactHandle stiltonHandle = (InternalFactHandle) workingMemory.assertObject( stilton );
+
+        // check constraint
+        assertFalse( constraint.isAllowed( stiltonHandle.getObject(),
+                                           workingMemory ) );
+    }
+
+    /**
+     * <pre>
+     *        
+     *         
      *                (Cheese (price ?price1 ) 
      *                (Cheese (price ?price2&amp;:(= ?price2 (* 2 ?price1) )
      *          




More information about the jboss-svn-commits mailing list