[jboss-svn-commits] JBL Code SVN: r12940 - in labs/jbossrules/trunk: drools-compiler/src/test/java/org/drools/integrationtests and 21 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Jun 28 18:27:19 EDT 2007


Author: tirelli
Date: 2007-06-28 18:27:18 -0400 (Thu, 28 Jun 2007)
New Revision: 12940

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_globalsAsConstraints.drl
Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel
   labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaRule.mvel
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/AccumulateTemplateTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResult.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/WorkingMemoryLogger.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldExtractor.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/DefaultKnowledgeHelper.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/BaseMemberOfEvaluator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BaseNotMemberOfEvaluator.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/base/extractors/ArrayExtractor.java
   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/extractors/MVELClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/SelfReferenceClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELLocalDeclarationVariable.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELPreviousDeclarationVariable.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/reteoo/builder/PatternBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Declaration.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralRestriction.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/VariableRestriction.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/GlobalExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/PatternExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/BaseClassFieldExtractorFactoryTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java
   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/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/MVELClassFieldExtractorTest.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
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/BaseMannersTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/facttemplates/FactTemplateFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CompositeObjectSinkAdapterTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/DeclarationTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/FieldConstraintTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/PatternTest.java
   labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ExternalSheetListenerTest.java
Log:
JBRULES-953: fixing global extractor

Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel	2007-06-28 22:27:18 UTC (rev 12940)
@@ -64,9 +64,9 @@
                             org.drools.rule.Declaration[] localDeclarations, 
                             org.drools.WorkingMemory workingMemory) throws Exception {                               
 
-        @foreach{declarationTypes, declarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) previousDeclarations[@{i0}].@{declr.extractor.nativeReadMethod.name}( ( (org.drools.common.InternalFactHandle) tuple.get( previousDeclarations[@{i0}] ) ).getObject() );
+        @foreach{declarationTypes, declarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) previousDeclarations[@{i0}].@{declr.extractor.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, ( (org.drools.common.InternalFactHandle) tuple.get( previousDeclarations[@{i0}] ) ).getObject() );
         @end{}                
-        @foreach{localDeclarationTypes, localDeclarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) localDeclarations[@{i0}].@{declr.extractor.nativeReadMethod.name}( object );
+        @foreach{localDeclarationTypes, localDeclarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) localDeclarations[@{i0}].@{declr.extractor.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, object );
         @end{}
         @foreach{globalTypes, globals as type, identifier} @{type} @{identifier} = ( @{type} ) workingMemory.getGlobal( "@{identifier}" );
         @end{}
@@ -101,9 +101,9 @@
                             org.drools.rule.Declaration[] localDeclarations, 
                             org.drools.WorkingMemory workingMemory) throws Exception {                               
 
-        @foreach{declarationTypes, declarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) previousDeclarations[@{i0}].@{declr.extractor.nativeReadMethod.name}( ( (org.drools.common.InternalFactHandle) tuple.get( previousDeclarations[@{i0}] ) ).getObject() );
+        @foreach{declarationTypes, declarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) previousDeclarations[@{i0}].@{declr.extractor.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, ( (org.drools.common.InternalFactHandle) tuple.get( previousDeclarations[@{i0}] ) ).getObject() );
         @end{}                
-        @foreach{localDeclarationTypes, localDeclarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) localDeclarations[@{i0}].@{declr.extractor.nativeReadMethod.name}( object );
+        @foreach{localDeclarationTypes, localDeclarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) localDeclarations[@{i0}].@{declr.extractor.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, object );
         @end{}
         @foreach{globalTypes, globals as type, identifier} @{type} @{identifier} = ( @{type} ) workingMemory.getGlobal( "@{identifier}" );
         @end{}
@@ -136,7 +136,7 @@
                             org.drools.rule.Declaration[] declarations, 
                             org.drools.WorkingMemory workingMemory) throws Exception {                             
 
-        @foreach{declarationTypes, declarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) declarations[@{i0}].@{declr.extractor.nativeReadMethod.name}( ( (org.drools.common.InternalFactHandle) tuple.get( declarations[@{i0}] ) ).getObject() );
+        @foreach{declarationTypes, declarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) declarations[@{i0}].@{declr.extractor.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, ( (org.drools.common.InternalFactHandle) tuple.get( declarations[@{i0}] ) ).getObject() );
         @end{}                
         @foreach{globalTypes, globals as type, identifier} @{type} @{identifier} = ( @{type} ) workingMemory.getGlobal( "@{identifier}" );
         @end{}
@@ -175,7 +175,7 @@
                      org.drools.spi.Tuple leftTuple,
                      org.drools.rule.Declaration[] declarations,
                      org.drools.WorkingMemory workingMemory) throws Exception {
-        @foreach{declarationTypes, declarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) declarations[@{i0}].@{declr.extractor.nativeReadMethod.name}( ( (org.drools.common.InternalFactHandle) leftTuple.get( declarations[@{i0}] ) ).getObject() );
+        @foreach{declarationTypes, declarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) declarations[@{i0}].@{declr.extractor.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, ( (org.drools.common.InternalFactHandle) leftTuple.get( declarations[@{i0}] ) ).getObject() );
         @end{}
         @foreach{globalTypes, globals as type, identifier} @{type} @{identifier} = ( @{type} ) workingMemory.getGlobal( "@{identifier}" );
         @end{}    
@@ -192,12 +192,13 @@
                            org.drools.rule.Declaration[] declarations,
                            org.drools.rule.Declaration[] innerDeclarations,
                            org.drools.WorkingMemory workingMemory) throws Exception {
-        @foreach{declarationTypes, declarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) declarations[@{i0}].@{declr.extractor.nativeReadMethod.name}( ( (org.drools.common.InternalFactHandle) leftTuple.get( declarations[@{i0}] ) ).getObject() );
+        @foreach{declarationTypes, declarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) declarations[@{i0}].@{declr.extractor.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, ( (org.drools.common.InternalFactHandle) leftTuple.get( declarations[@{i0}] ) ).getObject() );
         @end{}
         @foreach{globalTypes, globals as type, identifier} @{type} @{identifier} = ( @{type} ) workingMemory.getGlobal( "@{identifier}" );
         @end{}    
         
         ((@{ruleClassName}.@{className})context).accumulate(
+            workingMemory,
             innerDeclarations,
             handle.getObject()@if{declarations != empty}, at end{} 
             @foreach{declarations as declr} @{declr.identifier}@end{","}@if{globals != empty}, at end{}
@@ -210,12 +211,13 @@
                            org.drools.rule.Declaration[] declarations,
                            org.drools.rule.Declaration[] innerDeclarations,
                            org.drools.WorkingMemory workingMemory) throws Exception {
-        @foreach{declarationTypes, declarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) declarations[@{i0}].@{declr.extractor.nativeReadMethod.name}( ( (org.drools.common.InternalFactHandle) leftTuple.get( declarations[@{i0}] ) ).getObject() );
+        @foreach{declarationTypes, declarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) declarations[@{i0}].@{declr.extractor.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, ( (org.drools.common.InternalFactHandle) leftTuple.get( declarations[@{i0}] ) ).getObject() );
         @end{}
         @foreach{globalTypes, globals as type, identifier} @{type} @{identifier} = ( @{type} ) workingMemory.getGlobal( "@{identifier}" );
         @end{}    
         
         ((@{ruleClassName}.@{className})context).reverse(
+            workingMemory,
             innerDeclarations,
             handle.getObject()@if{declarations != empty}, at end{} 
             @foreach{declarations as declr} @{declr.identifier}@end{","}@if{globals != empty}, at end{}
@@ -226,7 +228,7 @@
                             org.drools.spi.Tuple leftTuple,
                             org.drools.rule.Declaration[] declarations,
                             org.drools.WorkingMemory workingMemory) throws Exception {
-        @foreach{declarationTypes, declarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) declarations[@{i0}].@{declr.extractor.nativeReadMethod.name}( ( (org.drools.common.InternalFactHandle) leftTuple.get( declarations[@{i0}] ) ).getObject() );
+        @foreach{declarationTypes, declarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) declarations[@{i0}].@{declr.extractor.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, ( (org.drools.common.InternalFactHandle) leftTuple.get( declarations[@{i0}] ) ).getObject() );
         @end{}
         @foreach{globalTypes, globals as type, identifier} @{type} @{identifier} = ( @{type} ) workingMemory.getGlobal( "@{identifier}" );
         @end{}    
@@ -281,7 +283,7 @@
 
         @foreach{declarationTypes, declarations, indexes, notPatterns as type, declr, index, notPattern}
           org.drools.common.InternalFactHandle @{declr.identifier}__Handle__ = ( org.drools.common.InternalFactHandle ) tuple.get( knowledgeHelper.getDeclaration( declarations[@{index}].getIdentifier() ) );        
-          @{type} @{declr.identifier} = ( @{type} )  declarations[@{index}].@{declr.extractor.nativeReadMethod.name}( @{declr.identifier}__Handle__.getObject() );
+          @{type} @{declr.identifier} = ( @{type} )  declarations[@{index}].@{declr.extractor.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, @{declr.identifier}__Handle__.getObject() );
           @if{notPattern}@{declr.identifier}__Handle__ =  (org.drools.common.InternalFactHandle) knowledgeHelper.getWorkingMemory().getFactHandle( @{declr.identifier} );@end{}
         @end{}
         

Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaRule.mvel
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaRule.mvel	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaRule.mvel	2007-06-28 22:27:18 UTC (rev 12940)
@@ -36,22 +36,24 @@
         @{initCode}
     }
     
-    public void accumulate(org.drools.rule.Declaration[] innerDeclarations, 
+    public void accumulate(org.drools.WorkingMemory workingMemory,
+                           org.drools.rule.Declaration[] innerDeclarations, 
                            Object object @if{declarations != empty}, @end{}
                            @foreach{declarationTypes, declarations as type, declr} @{type} @{declr.identifier}@end{","}@if{globals != empty}, at end{} 
                            @foreach{globalTypes, globals as type, identifier} @{type} @{identifier} @end{","}
                            ) throws Exception {
-        @foreach{innerDeclarations as declr} @{declr.extractor.extractToClass.getName()} @{declr.identifier} = (@{declr.extractor.extractToClass.getName()}) innerDeclarations[@{i0}].@{declr.extractor.nativeReadMethod.name}( object );
+        @foreach{innerDeclarations as declr} @{declr.extractor.extractToClass.getName()} @{declr.identifier} = (@{declr.extractor.extractToClass.getName()}) innerDeclarations[@{i0}].@{declr.extractor.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, object );
         @end{}
         @{actionCode}
     }
     
-    public void reverse(org.drools.rule.Declaration[] innerDeclarations, 
+    public void reverse(org.drools.WorkingMemory workingMemory,
+                           org.drools.rule.Declaration[] innerDeclarations, 
                            Object object @if{declarations != empty}, @end{}
                            @foreach{declarationTypes, declarations as type, declr} @{type} @{declr.identifier}@end{","}@if{globals != empty}, at end{} 
                            @foreach{globalTypes, globals as type, identifier} @{type} @{identifier} @end{","}
                            ) throws Exception {
-        @foreach{innerDeclarations as declr} @{declr.extractor.extractToClass.getName()} @{declr.identifier} = (@{declr.extractor.extractToClass.getName()}) innerDeclarations[@{i0}].@{declr.extractor.nativeReadMethod.name}( object );
+        @foreach{innerDeclarations as declr} @{declr.extractor.extractToClass.getName()} @{declr.identifier} = (@{declr.extractor.extractToClass.getName()}) innerDeclarations[@{i0}].@{declr.extractor.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, object );
         @end{}
         @{reverseCode}
     }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -2991,6 +2991,45 @@
         
     }
 
+    public void testGlobals2() throws Exception {
+
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_globalsAsConstraints.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+        final List results = new ArrayList();
+        workingMemory.setGlobal( "results",
+                                 results );
+
+        final List cheeseTypes = new ArrayList();
+        workingMemory.setGlobal( "cheeseTypes",
+                                 cheeseTypes );
+        cheeseTypes.add( "stilton" );
+        cheeseTypes.add( "muzzarela" );
+
+        final Cheese stilton = new Cheese( "stilton",
+                                           5 );
+        workingMemory.insert( stilton );
+
+        workingMemory.fireAllRules();
+
+        assertEquals( 1, results.size() );
+        assertEquals( "memberOf", results.get( 0 ));
+
+        final Cheese brie = new Cheese( "brie",
+                                           5 );
+        workingMemory.insert( brie );
+
+        workingMemory.fireAllRules();
+
+        assertEquals( 2, results.size() );
+        assertEquals( "not memberOf", results.get( 1 ));
+    }
+
     
     
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/AccumulateTemplateTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/AccumulateTemplateTest.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/AccumulateTemplateTest.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -81,14 +81,19 @@
                  inner );
 
         map.put( "attributes",
-                 new Attribute[]{new Attribute( "int",
-                                                "x" )} );
+                 new String[]{"x"} );
+        map.put( "attributesTypes",
+                 new String[]{"int"} );
         map.put( "initCode",
                  "x = 0;" );
         map.put( "actionCode",
                  "x += 1;" );
+        map.put( "reverseCode",
+                 "x -= 1;" );
         map.put( "resultCode",
                  "x + 10" );
+        map.put( "supportsReverse",
+                 "true" );
 
         map.put( "resultType",
                  Integer.class );
@@ -97,7 +102,7 @@
                  new Integer( 10 ) );
 
         TemplateRegistry registry = getRuleTemplateRegistry();
-        Object method = TemplateInterpreter.parse( registry.getTemplate( "accummulateInnerClass" ),
+        Object method = TemplateInterpreter.parse( registry.getTemplate( "accumulateInnerClass" ),
                                                    null,
                                                    map,
                                                    registry );

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_globalsAsConstraints.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_globalsAsConstraints.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_globalsAsConstraints.drl	2007-06-28 22:27:18 UTC (rev 12940)
@@ -0,0 +1,18 @@
+package org.drools;
+
+global java.util.List cheeseTypes;
+global java.util.List results;
+
+rule "member of cheese types"
+when
+	Cheese( type memberOf cheeseTypes )
+then
+    results.add( "memberOf" );
+end
+
+rule "not member of cheese types"
+when
+    Cheese( type not memberOf cheeseTypes )
+then
+    results.add( "not memberOf" );
+end

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResult.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResult.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/QueryResult.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -4,6 +4,7 @@
 
 import org.drools.base.ShadowProxy;
 import org.drools.common.InternalFactHandle;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.Declaration;
 import org.drools.spi.Tuple;
 
@@ -35,7 +36,7 @@
     }
 
     public Object get(final Declaration declaration) {
-        return declaration.getValue( getObject( this.tuple.get( declaration ) ) );
+        return declaration.getValue( (InternalWorkingMemory) workingMemory, getObject( this.tuple.get( declaration ) ) );
     }
 
     public FactHandle[] getFactHandles() {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/WorkingMemoryLogger.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/WorkingMemoryLogger.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/WorkingMemoryLogger.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -29,6 +29,7 @@
 import org.drools.audit.event.RuleFlowGroupLogEvent;
 import org.drools.audit.event.RuleFlowLogEvent;
 import org.drools.common.InternalFactHandle;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.event.ActivationCancelledEvent;
 import org.drools.event.ActivationCreatedEvent;
 import org.drools.event.AfterActivationFiredEvent;
@@ -243,7 +244,7 @@
                     // This handle is now invalid, probably due to an fact retraction
                     continue;
                 }
-                final Object value = declaration.getValue( this.workingMemory.getObject( handle ) );
+                final Object value = declaration.getValue( (InternalWorkingMemory) workingMemory, this.workingMemory.getObject( handle ) );
 
                 result.append( declaration.getIdentifier() );
                 result.append( "=" );

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldExtractor.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -78,6 +78,10 @@
         return this.valueType;
     }
     
+    public boolean isGlobal() {
+        return false;
+    }
+    
     public int hashCode() {
         final int PRIME = 31;
         int result = 1;

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -21,7 +21,7 @@
 import java.lang.reflect.Method;
 
 import org.drools.RuntimeDroolsException;
-import org.drools.common.DroolsObjectInputStream;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.spi.FieldExtractor;
 
 /**
@@ -90,8 +90,8 @@
         return this.fieldName;
     }
 
-    public Object getValue(final Object object) {
-        return this.extractor.getValue( object );
+    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
+        return this.extractor.getValue( workingMemory, object );
     }
 
     public ValueType getValueType() {
@@ -124,47 +124,51 @@
         return this.extractor.getValueType() == other.getValueType() && this.extractor.getIndex() == other.getIndex();
     }
 
-    public boolean getBooleanValue(final Object object) {
-        return this.extractor.getBooleanValue( object );
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
+        return this.extractor.getBooleanValue( workingMemory, object );
     }
 
-    public byte getByteValue(final Object object) {
-        return this.extractor.getByteValue( object );
+    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
+        return this.extractor.getByteValue( workingMemory, object );
     }
 
-    public char getCharValue(final Object object) {
-        return this.extractor.getCharValue( object );
+    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
+        return this.extractor.getCharValue( workingMemory, object );
     }
 
-    public double getDoubleValue(final Object object) {
-        return this.extractor.getDoubleValue( object );
+    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
+        return this.extractor.getDoubleValue( workingMemory, object );
     }
 
-    public float getFloatValue(final Object object) {
-        return this.extractor.getFloatValue( object );
+    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
+        return this.extractor.getFloatValue( workingMemory, object );
     }
 
-    public int getIntValue(final Object object) {
-        return this.extractor.getIntValue( object );
+    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
+        return this.extractor.getIntValue( workingMemory, object );
     }
 
-    public long getLongValue(final Object object) {
-        return this.extractor.getLongValue( object );
+    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
+        return this.extractor.getLongValue( workingMemory, object );
     }
 
-    public short getShortValue(final Object object) {
-        return this.extractor.getShortValue( object );
+    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
+        return this.extractor.getShortValue( workingMemory, object );
     }
     
-    public boolean isNullValue(final Object object) {
-        return this.extractor.isNullValue( object );
+    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
+        return this.extractor.isNullValue( workingMemory, object );
     }
    
     public Method getNativeReadMethod() {
         return this.extractor.getNativeReadMethod();
     }
 
-    public int getHashCode(final Object object) {
-        return this.extractor.getHashCode( object );
+    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
+        return this.extractor.getHashCode( workingMemory, object );
     }
+
+    public boolean isGlobal() {
+        return false;
+    }
 }
\ 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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorFactory.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -40,6 +40,7 @@
 import org.drools.base.extractors.BaseShortClassFieldExtractor;
 import org.drools.base.extractors.MVELClassFieldExtractor;
 import org.drools.base.extractors.SelfReferenceClassFieldExtractor;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.util.asm.ClassFieldInspector;
 
 /**
@@ -330,7 +331,7 @@
         Method overridingMethod;
         try {
             overridingMethod = superClass.getMethod( getOverridingMethodName( fieldType ),
-                                                     new Class[]{Object.class} );
+                                                     new Class[]{InternalWorkingMemory.class, Object.class} );
         } catch ( final Exception e ) {
             throw new RuntimeDroolsException( "This is a bug. Please report back to JBoss Rules team.",
                                               e );
@@ -346,7 +347,7 @@
         final Label l0 = new Label();
         mv.visitLabel( l0 );
         mv.visitVarInsn( Opcodes.ALOAD,
-                         1 );
+                         2 );
         mv.visitTypeInsn( Opcodes.CHECKCAST,
                           Type.getInternalName( originalClass ) );
 
@@ -370,12 +371,18 @@
                                l0,
                                l1,
                                0 );
+        mv.visitLocalVariable( "workingMemory",
+                               Type.getDescriptor( InternalWorkingMemory.class ),
+                               null,
+                               l0,
+                               l1,
+                               1 );
         mv.visitLocalVariable( "object",
                                Type.getDescriptor( Object.class ),
                                null,
                                l0,
                                l1,
-                               1 );
+                               2 );
         mv.visitMaxs( 0,
                       0 );
         mv.visitEnd();

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -163,7 +163,7 @@
     //    }
 
     public Object get(final Declaration declaration) {
-        return declaration.getValue( this.tuple.get( declaration ).getObject() );
+        return declaration.getValue( workingMemory, this.tuple.get( declaration ).getObject() );
     }
 
     public Tuple getTuple() {

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ArrayFactory.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -18,6 +18,7 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
@@ -78,10 +79,10 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            final Object value1 = extractor.getValue( object1 );
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
             if ( value1 == null ) {
                 return value2 == null;
@@ -89,30 +90,30 @@
             return value1.equals( value2 );
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( left );
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
             if ( value == null ) {
                 return ((ObjectVariableContextEntry) context).right == null;
             }
             return value.equals( ((ObjectVariableContextEntry) context).right );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            final Object value = context.extractor.getValue( right );
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final Object value = context.extractor.getValue( workingMemory, right );
             if ( ((ObjectVariableContextEntry) context).left == null ) {
                 return value == null;
             }
             return ((ObjectVariableContextEntry) context).left.equals( value );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object value1 = extractor1.getValue( object1 );
-            final Object value2 = extractor2.getValue( object2 );
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
                 return value2 == null;
             }
@@ -137,10 +138,10 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            final Object value1 = extractor.getValue( object1 );
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
             if ( value1 == null ) {
                 return value2 != null;
@@ -148,30 +149,30 @@
             return !value1.equals( value2 );
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( left );
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
             if ( value == null ) {
                 return ((ObjectVariableContextEntry) context).right != null;
             }
             return !value.equals( ((ObjectVariableContextEntry) context).right );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            final Object value = context.extractor.getValue( right );
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final Object value = context.extractor.getValue( workingMemory, right );
             if ( ((ObjectVariableContextEntry) context).left == null ) {
                 return value != null;
             }
             return !((ObjectVariableContextEntry) context).left.equals( value );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object value1 = extractor1.getValue( object1 );
-            final Object value2 = extractor2.getValue( object2 );
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
                 return value2 != null;
             }
@@ -195,20 +196,20 @@
                    Operator.CONTAINS );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
             final Object value = object2.getValue();
-            final Object[] array = (Object[]) extractor.getValue( object1 );
+            final Object[] array = (Object[]) extractor.getValue( workingMemory, object1 );
             if( array == null )
                 return false;
             return ArrayUtils.search( array,
                                         value ) >= 0;
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( left );
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
             final Object[] array = (Object[]) ((ObjectVariableContextEntry) context).right;
             if( array == null )
                 return false;
@@ -216,22 +217,22 @@
                                         value ) >= 0;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
             final Object value = ((ObjectVariableContextEntry) context).left;
-            final Object[] array = (Object[]) context.extractor.getValue( right );
+            final Object[] array = (Object[]) context.extractor.getValue( workingMemory, right );
             if( array == null )
                 return false;
             return ArrayUtils.search( array,
                                         value ) >= 0;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object value = extractor2.getValue( object2 );
-            final Object[] array = (Object[]) extractor1.getValue( object1 );
+                                final Extractor extractor2, final Object object2) {
+            final Object value = extractor2.getValue( workingMemory, object2 );
+            final Object[] array = (Object[]) extractor1.getValue( workingMemory, object1 );
 
             if( array == null )
                 return false;
@@ -256,20 +257,20 @@
                    Operator.EXCLUDES );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
             final Object value = object2.getValue();
-            final Object[] array = (Object[]) extractor.getValue( object1 );
+            final Object[] array = (Object[]) extractor.getValue( workingMemory, object1 );
             if( array == null )
                 return false;
             return ArrayUtils.search( array,
                                         value ) < 0;
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( left );
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
             final Object[] array = (Object[]) ((ObjectVariableContextEntry) context).right;
             if( array == null )
                 return false;
@@ -277,22 +278,22 @@
                                         value ) < 0;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
             final Object value = ((ObjectVariableContextEntry) context).left;
-            final Object[] array = (Object[]) context.extractor.getValue( right );
+            final Object[] array = (Object[]) context.extractor.getValue( workingMemory, right );
             if( array == null )
                 return false;
             return ArrayUtils.search( array,
                                         value ) < 0;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object value = extractor2.getValue( object2 );
-            final Object[] array = (Object[]) extractor1.getValue( object1 );
+                                final Extractor extractor2, final Object object2) {
+            final Object value = extractor2.getValue( workingMemory, object2 );
+            final Object[] array = (Object[]) extractor1.getValue( workingMemory, object1 );
 
             if( array == null )
                 return false;
@@ -317,20 +318,20 @@
                    Operator.MEMBEROF );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
             final Object[] array = (Object[]) object2.getValue();
-            final Object value = extractor.getValue( object1 );
+            final Object value = extractor.getValue( workingMemory, object1 );
             if( array == null )
                 return false;
             return ArrayUtils.search( array,
                                         value ) >= 0;
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            final Object[] array = (Object[]) context.declaration.getExtractor().getValue( left );
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object[] array = (Object[]) context.declaration.getExtractor().getValue( workingMemory, left );
             final Object value = ((ObjectVariableContextEntry) context).right;
             if( array == null )
                 return false;
@@ -338,22 +339,22 @@
                                         value ) >= 0;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
             final Object[] array = (Object[]) ((ObjectVariableContextEntry) context).left;
-            final Object value = context.extractor.getValue( right );
+            final Object value = context.extractor.getValue( workingMemory, right );
             if( array == null )
                 return false;
             return ArrayUtils.search( array,
                                         value ) >= 0;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object[] array = (Object[]) extractor2.getValue( object2 );
-            final Object value = extractor1.getValue( object1 );
+                                final Extractor extractor2, final Object object2) {
+            final Object[] array = (Object[]) extractor2.getValue( workingMemory, object2 );
+            final Object value = extractor1.getValue( workingMemory, object1 );
 
             if( array == null )
                 return false;
@@ -378,20 +379,20 @@
                    Operator.NOTMEMBEROF );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
             final Object[] array = (Object[]) object2.getValue();
-            final Object value = extractor.getValue( object1 );
+            final Object value = extractor.getValue( workingMemory, object1 );
             if( array == null )
                 return false;
             return ArrayUtils.search( array,
                                         value ) < 0;
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            final Object[] array = (Object[]) context.declaration.getExtractor().getValue( left );
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object[] array = (Object[]) context.declaration.getExtractor().getValue( workingMemory, left );
             final Object value = ((ObjectVariableContextEntry) context).right;
             if( array == null )
                 return false;
@@ -399,22 +400,22 @@
                                         value ) < 0;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
             final Object[] array = (Object[]) ((ObjectVariableContextEntry) context).left;
-            final Object value = context.extractor.getValue( right );
+            final Object value = context.extractor.getValue( workingMemory, right );
             if( array == null )
                 return false;
             return ArrayUtils.search( array,
                                         value ) < 0;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object[] array = (Object[]) extractor2.getValue( object2 );
-            final Object value = extractor1.getValue( object1 );
+                                final Extractor extractor2, final Object object2) {
+            final Object[] array = (Object[]) extractor2.getValue( workingMemory, object2 );
+            final Object value = extractor1.getValue( workingMemory, object1 );
 
             if( array == null )
                 return false;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BaseMemberOfEvaluator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BaseMemberOfEvaluator.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BaseMemberOfEvaluator.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -7,6 +7,7 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Extractor;
@@ -25,22 +26,22 @@
                operator );
     }
 
-    public boolean evaluate(final Extractor extractor,
-                            final Object object1,
-                            final FieldValue object2) {
+    public boolean evaluate(InternalWorkingMemory workingMemory,
+                            final Extractor extractor,
+                            final Object object1, final FieldValue object2) {
         if( object2.isNull() ) {
             return false;
         } else if( ! object2.isCollectionField() ) {
             throw new ClassCastException("Can't check if an attribute is member of an object of class "+object2.getValue().getClass() );
         }
         final Collection col = (Collection) object2.getValue();
-        final Object value = extractor.getValue( object1 ); 
+        final Object value = extractor.getValue( workingMemory, object1 ); 
         return col.contains( value );
     }
 
-    public boolean evaluateCachedRight(final VariableContextEntry context,
-                                       final Object left) {
-        final Object object = context.declaration.getExtractor().getValue( left );
+    public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                       final VariableContextEntry context, final Object left) {
+        final Object object = context.declaration.getExtractor().getValue( workingMemory, left );
         if( object == null ) {
             return false;  
         } else if( ! ( object instanceof Collection ) ) {
@@ -51,8 +52,8 @@
         return col.contains( value );
     }
 
-    public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                      final Object right) {
+    public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                      final VariableContextEntry context, final Object right) {
         final Object object = ((ObjectVariableContextEntry) context).left;
         if( object == null ) {
             return false;  
@@ -60,22 +61,22 @@
             throw new ClassCastException("Can't check if an attribute is member of an object of class "+object.getClass() );
         }
         final Collection col = (Collection) object;
-        final Object value = context.extractor.getValue( right ); 
+        final Object value = context.extractor.getValue( workingMemory, right ); 
         return col.contains( value );
     }
 
-    public boolean evaluate(final Extractor extractor1,
+    public boolean evaluate(InternalWorkingMemory workingMemory,
+                            final Extractor extractor1,
                             final Object object1,
-                            final Extractor extractor2,
-                            final Object object2) {
-        final Object object = extractor2.getValue( object2 );
+                            final Extractor extractor2, final Object object2) {
+        final Object object = extractor2.getValue( workingMemory, object2 );
         if( object == null ) {
             return false;  
         } else if( ! ( object instanceof Collection ) ) {
             throw new ClassCastException("Can't check if an attribute is member of an object of class "+object.getClass() );
         }
         final Collection col = (Collection) object;
-        final Object value = extractor1.getValue( object1 );
+        final Object value = extractor1.getValue( workingMemory, object1 );
         return col.contains( value );
     }
     

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BaseNotMemberOfEvaluator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BaseNotMemberOfEvaluator.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BaseNotMemberOfEvaluator.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -7,6 +7,7 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Extractor;
@@ -26,22 +27,22 @@
                operator );
     }
 
-    public boolean evaluate(final Extractor extractor,
-                            final Object object1,
-                            final FieldValue object2) {
+    public boolean evaluate(InternalWorkingMemory workingMemory,
+                            final Extractor extractor,
+                            final Object object1, final FieldValue object2) {
         if( object2.isNull() ) {
             return false;
         } else if( ! object2.isCollectionField() ) {
             throw new ClassCastException("Can't check if an attribute is not member of an object of class "+object2.getValue().getClass() );
         }
         final Collection col = (Collection) object2.getValue();
-        final Object value = extractor.getValue( object1 ); 
+        final Object value = extractor.getValue( workingMemory, object1 ); 
         return ! col.contains( value );
     }
 
-    public boolean evaluateCachedRight(final VariableContextEntry context,
-                                       final Object left) {
-        final Object object = context.declaration.getExtractor().getValue( left );
+    public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                       final VariableContextEntry context, final Object left) {
+        final Object object = context.declaration.getExtractor().getValue( workingMemory, left );
         if( object == null ) {
             return false;  
         } else if( ! ( object instanceof Collection ) ) {
@@ -52,8 +53,8 @@
         return ! col.contains( value );
     }
 
-    public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                      final Object right) {
+    public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                      final VariableContextEntry context, final Object right) {
         final Object object = ((ObjectVariableContextEntry) context).left;
         if( object == null ) {
             return false;  
@@ -61,22 +62,22 @@
             throw new ClassCastException("Can't check if an attribute is not member of an object of class "+object.getClass() );
         }
         final Collection col = (Collection) object;
-        final Object value = context.extractor.getValue( right ); 
+        final Object value = context.extractor.getValue( workingMemory, right ); 
         return ! col.contains( value );
     }
 
-    public boolean evaluate(final Extractor extractor1,
+    public boolean evaluate(InternalWorkingMemory workingMemory,
+                            final Extractor extractor1,
                             final Object object1,
-                            final Extractor extractor2,
-                            final Object object2) {
-        final Object object = extractor2.getValue( object2 );
+                            final Extractor extractor2, final Object object2) {
+        final Object object = extractor2.getValue( workingMemory, object2 );
         if( object == null ) {
             return false;  
         } else if( ! ( object instanceof Collection ) ) {
             throw new ClassCastException("Can't check if an attribute is not member of an object of class "+object.getClass() );
         }
         final Collection col = (Collection) object;
-        final Object value = extractor1.getValue( object1 );
+        final Object value = extractor1.getValue( workingMemory, object1 );
         return ! col.contains( value );
     }
 

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BigDecimalFactory.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -20,6 +20,7 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
@@ -78,10 +79,10 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            final Object value1 = extractor.getValue( object1 );
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
             if ( value1 == null ) {
                 return value2 == null;
@@ -89,30 +90,30 @@
             return value1.equals( value2 );
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( left );
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
             if ( value == null ) {
                 return ((ObjectVariableContextEntry) context).right == null;
             }
             return value.equals( ((ObjectVariableContextEntry) context).right );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            final Object value = context.extractor.getValue( right );
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final Object value = context.extractor.getValue( workingMemory, right );
             if ( ((ObjectVariableContextEntry) context).left == null ) {
                 return value == null;
             }
             return ((ObjectVariableContextEntry) context).left.equals( value );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object value1 = extractor1.getValue( object1 );
-            final Object value2 = extractor2.getValue( object2 );
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
                 return value2 == null;
             }
@@ -137,10 +138,10 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            final Object value1 = extractor.getValue( object1 );
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
             if ( value1 == null ) {
                 return value2 != null;
@@ -148,30 +149,30 @@
             return !value1.equals( value2 );
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( left );
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
             if ( value == null ) {
                 return ((ObjectVariableContextEntry) context).right != null;
             }
             return !value.equals( ((ObjectVariableContextEntry) context).right );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            final Object value = context.extractor.getValue( right );
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final Object value = context.extractor.getValue( workingMemory, right );
             if ( ((ObjectVariableContextEntry) context).left == null ) {
                 return value != null;
             }
             return !((ObjectVariableContextEntry) context).left.equals( value );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object value1 = extractor1.getValue( object1 );
-            final Object value2 = extractor2.getValue( object2 );
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
                 return value2 != null;
             }
@@ -195,43 +196,43 @@
                    Operator.LESS );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final BigDecimal comp = (BigDecimal) extractor.getValue( object1 );
+            final BigDecimal comp = (BigDecimal) extractor.getValue( workingMemory, object1 );
             return comp.compareTo( (BigDecimal) object2.getValue() ) < 0;
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
             final BigDecimal comp = (BigDecimal) ((ObjectVariableContextEntry) context).right;
-            return comp.compareTo( (BigDecimal) context.declaration.getExtractor().getValue( left ) ) < 0;
+            return comp.compareTo( (BigDecimal) context.declaration.getExtractor().getValue( workingMemory, left ) ) < 0;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            final BigDecimal comp = (BigDecimal) context.extractor.getValue( right );
+            final BigDecimal comp = (BigDecimal) context.extractor.getValue( workingMemory, right );
             return comp.compareTo( (BigDecimal) ((ObjectVariableContextEntry) context).left ) < 0;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final BigDecimal comp = (BigDecimal) extractor1.getValue( object1 );
-            return comp.compareTo( (BigDecimal) extractor2.getValue( object2 ) ) < 0;
+            final BigDecimal comp = (BigDecimal) extractor1.getValue( workingMemory, object1 );
+            return comp.compareTo( (BigDecimal) extractor2.getValue( workingMemory, object2 ) ) < 0;
         }
 
         public String toString() {
@@ -251,43 +252,43 @@
                    Operator.LESS_OR_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final BigDecimal comp = (BigDecimal) extractor.getValue( object1 );
+            final BigDecimal comp = (BigDecimal) extractor.getValue( workingMemory, object1 );
             return comp.compareTo( (BigDecimal) object2.getValue() ) <= 0;
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
             final BigDecimal comp = (BigDecimal) ((ObjectVariableContextEntry) context).right;
-            return comp.compareTo( (BigDecimal) context.declaration.getExtractor().getValue( left ) ) <= 0;
+            return comp.compareTo( (BigDecimal) context.declaration.getExtractor().getValue( workingMemory, left ) ) <= 0;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            final BigDecimal comp = (BigDecimal) context.extractor.getValue( right );
+            final BigDecimal comp = (BigDecimal) context.extractor.getValue( workingMemory, right );
             return comp.compareTo( (BigDecimal) ((ObjectVariableContextEntry) context).left ) <= 0;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final BigDecimal comp = (BigDecimal) extractor1.getValue( object1 );
-            return comp.compareTo( (BigDecimal) extractor2.getValue( object2 ) ) <= 0;
+            final BigDecimal comp = (BigDecimal) extractor1.getValue( workingMemory, object1 );
+            return comp.compareTo( (BigDecimal) extractor2.getValue( workingMemory, object2 ) ) <= 0;
         }
 
         public String toString() {
@@ -307,43 +308,43 @@
                    Operator.GREATER );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final BigDecimal comp = (BigDecimal) extractor.getValue( object1 );
+            final BigDecimal comp = (BigDecimal) extractor.getValue( workingMemory, object1 );
             return comp.compareTo( (BigDecimal) object2.getValue() ) > 0;
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
             final BigDecimal comp = (BigDecimal) ((ObjectVariableContextEntry) context).right;
-            return comp.compareTo( (BigDecimal) context.declaration.getExtractor().getValue( left ) ) > 0;
+            return comp.compareTo( (BigDecimal) context.declaration.getExtractor().getValue( workingMemory, left ) ) > 0;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            final BigDecimal comp = (BigDecimal) context.extractor.getValue( right );
+            final BigDecimal comp = (BigDecimal) context.extractor.getValue( workingMemory, right );
             return comp.compareTo( (BigDecimal) ((ObjectVariableContextEntry) context).left ) > 0;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final BigDecimal comp = (BigDecimal) extractor1.getValue( object1 );
-            return comp.compareTo( (BigDecimal) extractor2.getValue( object2 ) ) > 0;
+            final BigDecimal comp = (BigDecimal) extractor1.getValue( workingMemory, object1 );
+            return comp.compareTo( (BigDecimal) extractor2.getValue( workingMemory, object2 ) ) > 0;
         }
 
         public String toString() {
@@ -363,43 +364,43 @@
                    Operator.GREATER_OR_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final BigDecimal comp = (BigDecimal) extractor.getValue( object1 );
+            final BigDecimal comp = (BigDecimal) extractor.getValue( workingMemory, object1 );
             return comp.compareTo( (BigDecimal) object2.getValue() ) >= 0;
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
             final BigDecimal comp = (BigDecimal) ((ObjectVariableContextEntry) context).right;
-            return comp.compareTo( (BigDecimal) context.declaration.getExtractor().getValue( left ) ) >= 0;
+            return comp.compareTo( (BigDecimal) context.declaration.getExtractor().getValue( workingMemory, left ) ) >= 0;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            final BigDecimal comp = (BigDecimal) context.extractor.getValue( right );
+            final BigDecimal comp = (BigDecimal) context.extractor.getValue( workingMemory, right );
             return comp.compareTo( (BigDecimal) ((ObjectVariableContextEntry) context).left ) >= 0;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final BigDecimal comp = (BigDecimal) extractor1.getValue( object1 );
-            return comp.compareTo( (BigDecimal) extractor2.getValue( object2 ) ) >= 0;
+            final BigDecimal comp = (BigDecimal) extractor1.getValue( workingMemory, object1 );
+            return comp.compareTo( (BigDecimal) extractor2.getValue( workingMemory, object2 ) ) >= 0;
         }
 
         public String toString() {

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BigIntegerFactory.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -20,6 +20,7 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
@@ -78,10 +79,10 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            final Object value1 = extractor.getValue( object1 );
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
             if ( value1 == null ) {
                 return value2 == null;
@@ -89,30 +90,30 @@
             return value1.equals( value2 );
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( left );
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
             if ( value == null ) {
                 return ((ObjectVariableContextEntry) context).right == null;
             }
             return value.equals( ((ObjectVariableContextEntry) context).right );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            final Object value = context.extractor.getValue( right );
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final Object value = context.extractor.getValue( workingMemory, right );
             if ( ((ObjectVariableContextEntry) context).left == null ) {
                 return value == null;
             }
             return ((ObjectVariableContextEntry) context).left.equals( value );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object value1 = extractor1.getValue( object1 );
-            final Object value2 = extractor2.getValue( object2 );
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
                 return value2 == null;
             }
@@ -136,10 +137,10 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            final Object value1 = extractor.getValue( object1 );
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
             if ( value1 == null ) {
                 return value2 != null;
@@ -147,30 +148,30 @@
             return !value1.equals( value2 );
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( left );
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
             if ( value == null ) {
                 return ((ObjectVariableContextEntry) context).right != null;
             }
             return !value.equals( ((ObjectVariableContextEntry) context).right );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            final Object value = context.extractor.getValue( right );
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final Object value = context.extractor.getValue( workingMemory, right );
             if ( ((ObjectVariableContextEntry) context).left == null ) {
                 return value != null;
             }
             return !((ObjectVariableContextEntry) context).left.equals( value );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object value1 = extractor1.getValue( object1 );
-            final Object value2 = extractor2.getValue( object2 );
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
                 return value2 != null;
             }
@@ -194,43 +195,43 @@
                    Operator.LESS );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final BigInteger comp = (BigInteger) extractor.getValue( object1 );
+            final BigInteger comp = (BigInteger) extractor.getValue( workingMemory, object1 );
             return comp.compareTo( (BigInteger) object2.getValue() ) < 0;
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
             final BigInteger comp = (BigInteger) ((ObjectVariableContextEntry) context).right;
-            return comp.compareTo( (BigInteger) context.declaration.getExtractor().getValue( left ) ) < 0;
+            return comp.compareTo( (BigInteger) context.declaration.getExtractor().getValue( workingMemory, left ) ) < 0;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            final BigInteger comp = (BigInteger) context.extractor.getValue( right );
+            final BigInteger comp = (BigInteger) context.extractor.getValue( workingMemory, right );
             return comp.compareTo( (BigInteger) ((ObjectVariableContextEntry) context).left ) < 0;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final BigInteger comp = (BigInteger) extractor1.getValue( object1 );
-            return comp.compareTo( (BigInteger) extractor2.getValue( object2 ) ) < 0;
+            final BigInteger comp = (BigInteger) extractor1.getValue( workingMemory, object1 );
+            return comp.compareTo( (BigInteger) extractor2.getValue( workingMemory, object2 ) ) < 0;
         }
 
         public String toString() {
@@ -250,43 +251,43 @@
                    Operator.LESS_OR_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final BigInteger comp = (BigInteger) extractor.getValue( object1 );
+            final BigInteger comp = (BigInteger) extractor.getValue( workingMemory, object1 );
             return comp.compareTo( (BigInteger) object2.getValue() ) <= 0;
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
             final BigInteger comp = (BigInteger) ((ObjectVariableContextEntry) context).right;
-            return comp.compareTo( (BigInteger) context.declaration.getExtractor().getValue( left ) ) <= 0;
+            return comp.compareTo( (BigInteger) context.declaration.getExtractor().getValue( workingMemory, left ) ) <= 0;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            final BigInteger comp = (BigInteger) context.extractor.getValue( right );
+            final BigInteger comp = (BigInteger) context.extractor.getValue( workingMemory, right );
             return comp.compareTo( (BigInteger) ((ObjectVariableContextEntry) context).left ) <= 0;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final BigInteger comp = (BigInteger) extractor1.getValue( object1 );
-            return comp.compareTo( (BigInteger) extractor2.getValue( object2 ) ) <= 0;
+            final BigInteger comp = (BigInteger) extractor1.getValue( workingMemory, object1 );
+            return comp.compareTo( (BigInteger) extractor2.getValue( workingMemory, object2 ) ) <= 0;
         }
 
         public String toString() {
@@ -306,43 +307,43 @@
                    Operator.GREATER );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final BigInteger comp = (BigInteger) extractor.getValue( object1 );
+            final BigInteger comp = (BigInteger) extractor.getValue( workingMemory, object1 );
             return comp.compareTo( (BigInteger) object2.getValue() ) > 0;
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
             final BigInteger comp = (BigInteger) ((ObjectVariableContextEntry) context).right;
-            return comp.compareTo( (BigInteger) context.declaration.getExtractor().getValue( left ) ) > 0;
+            return comp.compareTo( (BigInteger) context.declaration.getExtractor().getValue( workingMemory, left ) ) > 0;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            final BigInteger comp = (BigInteger) context.extractor.getValue( right );
+            final BigInteger comp = (BigInteger) context.extractor.getValue( workingMemory, right );
             return comp.compareTo( (BigInteger) ((ObjectVariableContextEntry) context).left ) > 0;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final BigInteger comp = (BigInteger) extractor1.getValue( object1 );
-            return comp.compareTo( (BigInteger) extractor2.getValue( object2 ) ) > 0;
+            final BigInteger comp = (BigInteger) extractor1.getValue( workingMemory, object1 );
+            return comp.compareTo( (BigInteger) extractor2.getValue( workingMemory, object2 ) ) > 0;
         }
 
         public String toString() {
@@ -362,43 +363,43 @@
                    Operator.GREATER_OR_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final BigInteger comp = (BigInteger) extractor.getValue( object1 );
+            final BigInteger comp = (BigInteger) extractor.getValue( workingMemory, object1 );
             return comp.compareTo( (BigInteger) object2.getValue() ) >= 0;
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
             final BigInteger comp = (BigInteger) ((ObjectVariableContextEntry) context).right;
-            return comp.compareTo( (BigInteger) context.declaration.getExtractor().getValue( left ) ) >= 0;
+            return comp.compareTo( (BigInteger) context.declaration.getExtractor().getValue( workingMemory, left ) ) >= 0;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            final BigInteger comp = (BigInteger) context.extractor.getValue( right );
+            final BigInteger comp = (BigInteger) context.extractor.getValue( workingMemory, right );
             return comp.compareTo( (BigInteger) ((ObjectVariableContextEntry) context).left ) >= 0;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final BigInteger comp = (BigInteger) extractor1.getValue( object1 );
-            return comp.compareTo( (BigInteger) extractor2.getValue( object2 ) ) >= 0;
+            final BigInteger comp = (BigInteger) extractor1.getValue( workingMemory, object1 );
+            return comp.compareTo( (BigInteger) extractor2.getValue( workingMemory, object2 ) ) >= 0;
         }
 
         public String toString() {

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BooleanFactory.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -18,6 +18,7 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.VariableRestriction.BooleanVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
@@ -68,51 +69,51 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if ( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return object2.isNull();
             } else if ( object2.isNull() ) {
                 return false;
             }
             
-            return extractor.getBooleanValue( object1 ) == object2.getBooleanValue();
+            return extractor.getBooleanValue( workingMemory, object1 ) == object2.getBooleanValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
                 return context.isRightNull();
             } else if ( context.isRightNull() ) {
                 return false;
             }
             
-            return context.declaration.getExtractor().getBooleanValue( left ) == ((BooleanVariableContextEntry) context).right;
+            return context.declaration.getExtractor().getBooleanValue( workingMemory, left ) == ((BooleanVariableContextEntry) context).right;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object object2) {
-            if ( context.extractor.isNullValue( object2 )) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object object2) {
+            if ( context.extractor.isNullValue( workingMemory, object2 )) {
                 return context.isLeftNull();
             } else if ( context.isLeftNull() ) {
                 return false;
             }
             
-            return context.extractor.getBooleanValue( object2 ) == ((BooleanVariableContextEntry) context).left;
+            return context.extractor.getBooleanValue( workingMemory, object2 ) == ((BooleanVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if (extractor1.isNullValue( object1 )) {
-                return extractor2.isNullValue( object2 );
-            } else if (extractor2.isNullValue( object2 )) {
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
                 return false;
             }
             
-            return extractor1.getBooleanValue( object1 ) == extractor2.getBooleanValue( object2 );
+            return extractor1.getBooleanValue( workingMemory, object1 ) == extractor2.getBooleanValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -133,50 +134,50 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if ( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return !object2.isNull();
             } else if ( object2.isNull() ) {
                 return true;
             }
             
-            return extractor.getBooleanValue( object1 ) != object2.getBooleanValue();
+            return extractor.getBooleanValue( workingMemory, object1 ) != object2.getBooleanValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
                 return !context.isRightNull();
             } else if ( context.isRightNull() ) {
                 return true;
             }
-            return context.declaration.getExtractor().getBooleanValue( left ) != ((BooleanVariableContextEntry) context).right;
+            return context.declaration.getExtractor().getBooleanValue( workingMemory, left ) != ((BooleanVariableContextEntry) context).right;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object object2) {
-            if ( context.extractor.isNullValue( object2 )) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object object2) {
+            if ( context.extractor.isNullValue( workingMemory, object2 )) {
                 return !context.isLeftNull();
             } else if ( context.isLeftNull() ) {
                 return true;
             }
             
-            return context.extractor.getBooleanValue( object2 ) != ((BooleanVariableContextEntry) context).left;
+            return context.extractor.getBooleanValue( workingMemory, object2 ) != ((BooleanVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if (extractor1.isNullValue( object1 )) {
-                return !extractor2.isNullValue( object2 );
-            } else if (extractor2.isNullValue( object2 )) {
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return !extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
                 return true;
             }
             
-            return extractor1.getBooleanValue( object1 ) != extractor1.getBooleanValue( object2 );
+            return extractor1.getBooleanValue( workingMemory, object1 ) != extractor1.getBooleanValue( workingMemory, object2 );
         }
 
         public String toString() {

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ByteFactory.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -18,6 +18,7 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.VariableRestriction.LongVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
@@ -76,51 +77,51 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if ( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return object2.isNull();
             } else if ( object2.isNull() ) {
                 return false;
             }
             
-            return extractor.getByteValue( object1 ) == object2.getByteValue();
+            return extractor.getByteValue( workingMemory, object1 ) == object2.getByteValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
                 return context.isRightNull();
             } else if ( context.isRightNull() ) {
                 return false;
             }
             
-            return context.declaration.getExtractor().getByteValue( left ) == ((LongVariableContextEntry) context).right;
+            return context.declaration.getExtractor().getByteValue( workingMemory, left ) == ((LongVariableContextEntry) context).right;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if ( context.extractor.isNullValue( right )) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if ( context.extractor.isNullValue( workingMemory, right )) {
                 return context.isLeftNull();
             } else if ( context.isLeftNull() ) {
                 return false;
             }
             
-            return ((LongVariableContextEntry) context).left == context.extractor.getByteValue( right );
+            return ((LongVariableContextEntry) context).left == context.extractor.getByteValue( workingMemory, right );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if (extractor1.isNullValue( object1 )) {
-                return extractor2.isNullValue( object2 );
-            } else if (extractor2.isNullValue( object2 )) {
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
                 return false;
             }
             
-            return extractor1.getByteValue( object1 ) == extractor2.getByteValue( object2 );
+            return extractor1.getByteValue( workingMemory, object1 ) == extractor2.getByteValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -141,51 +142,51 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if ( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return !object2.isNull();
             } else if ( object2.isNull() ) {
                 return true;
             }
             
-            return extractor.getByteValue( object1 ) != object2.getByteValue();
+            return extractor.getByteValue( workingMemory, object1 ) != object2.getByteValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
                 return !context.isRightNull();
             } else if ( context.isRightNull() ) {
                 return true;
             }
             
-            return context.declaration.getExtractor().getByteValue( left ) != ((LongVariableContextEntry) context).right;
+            return context.declaration.getExtractor().getByteValue( workingMemory, left ) != ((LongVariableContextEntry) context).right;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object object2) {
-            if ( context.extractor.isNullValue( object2 ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object object2) {
+            if ( context.extractor.isNullValue( workingMemory, object2 ) ) {
                 return !context.isLeftNull();
             } else if ( context.isLeftNull() ) {
                 return true;
             }
             
-            return ((LongVariableContextEntry) context).left != context.extractor.getByteValue( object2 );
+            return ((LongVariableContextEntry) context).left != context.extractor.getByteValue( workingMemory, object2 );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if (extractor1.isNullValue( object1 )) {
-                return !extractor2.isNullValue( object2 );
-            } else if (extractor2.isNullValue( object2 )) {
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return !extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
                 return true;
             }
             
-            return extractor1.getByteValue( object1 ) != extractor2.getByteValue( object2 );
+            return extractor1.getByteValue( workingMemory, object1 ) != extractor2.getByteValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -205,39 +206,39 @@
                    Operator.LESS );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor.getByteValue( object1 ) < object2.getByteValue();
+            return extractor.getByteValue( workingMemory, object1 ) < object2.getByteValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
-            return ((LongVariableContextEntry) context).right < context.declaration.getExtractor().getByteValue( left );
+            return ((LongVariableContextEntry) context).right < context.declaration.getExtractor().getByteValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            return context.extractor.getByteValue( right ) < ((LongVariableContextEntry) context).left;
+            return context.extractor.getByteValue( workingMemory, right ) < ((LongVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor1.getByteValue( object1 ) < extractor2.getByteValue( object2 );
+            return extractor1.getByteValue( workingMemory, object1 ) < extractor2.getByteValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -257,39 +258,39 @@
                    Operator.LESS_OR_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor.getByteValue( object1 ) <= object2.getByteValue();
+            return extractor.getByteValue( workingMemory, object1 ) <= object2.getByteValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
-            return ((LongVariableContextEntry) context).right <= context.declaration.getExtractor().getByteValue( left );
+            return ((LongVariableContextEntry) context).right <= context.declaration.getExtractor().getByteValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            return context.extractor.getByteValue( right ) <= ((LongVariableContextEntry) context).left;
+            return context.extractor.getByteValue( workingMemory, right ) <= ((LongVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor1.getByteValue( object1 ) <= extractor2.getByteValue( object2 );
+            return extractor1.getByteValue( workingMemory, object1 ) <= extractor2.getByteValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -309,39 +310,39 @@
                    Operator.GREATER );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor.getByteValue( object1 ) > object2.getByteValue();
+            return extractor.getByteValue( workingMemory, object1 ) > object2.getByteValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
-            return ((LongVariableContextEntry) context).right > context.declaration.getExtractor().getByteValue( left );
+            return ((LongVariableContextEntry) context).right > context.declaration.getExtractor().getByteValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            return context.extractor.getByteValue( right ) > ((LongVariableContextEntry) context).left;
+            return context.extractor.getByteValue( workingMemory, right ) > ((LongVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor1.getByteValue( object1 ) > extractor2.getByteValue( object2 );
+            return extractor1.getByteValue( workingMemory, object1 ) > extractor2.getByteValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -361,39 +362,39 @@
                    Operator.GREATER_OR_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor.getByteValue( object1 ) >= object2.getByteValue();
+            return extractor.getByteValue( workingMemory, object1 ) >= object2.getByteValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
-            return ((LongVariableContextEntry) context).right >= context.declaration.getExtractor().getByteValue( left );
+            return ((LongVariableContextEntry) context).right >= context.declaration.getExtractor().getByteValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            return context.extractor.getByteValue( right ) >= ((LongVariableContextEntry) context).left;
+            return context.extractor.getByteValue( workingMemory, right ) >= ((LongVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor1.getByteValue( object1 ) >= extractor2.getByteValue( object2 );
+            return extractor1.getByteValue( workingMemory, object1 ) >= extractor2.getByteValue( workingMemory, object2 );
         }
 
         public String toString() {

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CharacterFactory.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -18,6 +18,7 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.VariableRestriction.LongVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
@@ -76,51 +77,51 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if ( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return object2.isNull();
             } else if ( object2.isNull() ) {
                 return false;
             }
             
-            return extractor.getCharValue( object1 ) == object2.getCharValue();
+            return extractor.getCharValue( workingMemory, object1 ) == object2.getCharValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
                 return context.isRightNull();
             } else if ( context.isRightNull() ) {
                 return false;
             }
             
-            return context.declaration.getExtractor().getCharValue( left ) == ((LongVariableContextEntry) context).right;
+            return context.declaration.getExtractor().getCharValue( workingMemory, left ) == ((LongVariableContextEntry) context).right;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if ( context.extractor.isNullValue( right )) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if ( context.extractor.isNullValue( workingMemory, right )) {
                 return context.isLeftNull();
             } else if ( context.isLeftNull() ) {
                 return false;
             }
             
-            return ((LongVariableContextEntry) context).left == context.extractor.getCharValue( right );
+            return ((LongVariableContextEntry) context).left == context.extractor.getCharValue( workingMemory, right );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if (extractor1.isNullValue( object1 )) {
-                return extractor2.isNullValue( object2 );
-            } else if (extractor2.isNullValue( object2 )) {
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
                 return false;
             }
             
-            return extractor1.getCharValue( object1 ) == extractor2.getCharValue( object2 );
+            return extractor1.getCharValue( workingMemory, object1 ) == extractor2.getCharValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -140,51 +141,51 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if ( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return !object2.isNull();
             } else if ( object2.isNull() ) {
                 return true;
             }
             
-            return extractor.getCharValue( object1 ) != object2.getCharValue();
+            return extractor.getCharValue( workingMemory, object1 ) != object2.getCharValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
                 return !context.isRightNull();
             } else if ( context.isRightNull() ) {
                 return true;
             }
             
-            return context.declaration.getExtractor().getCharValue( left ) != ((LongVariableContextEntry) context).right;
+            return context.declaration.getExtractor().getCharValue( workingMemory, left ) != ((LongVariableContextEntry) context).right;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if ( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if ( context.extractor.isNullValue( workingMemory, right ) ) {
                 return !context.isLeftNull();
             } else if ( context.isLeftNull() ) {
                 return true;
             }
             
-            return ((LongVariableContextEntry) context).left != context.extractor.getCharValue( right );
+            return ((LongVariableContextEntry) context).left != context.extractor.getCharValue( workingMemory, right );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if (extractor1.isNullValue( object1 )) {
-                return !extractor2.isNullValue( object2 );
-            } else if (extractor2.isNullValue( object2 )) {
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return !extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
                 return true;
             }
             
-            return extractor1.getCharValue( object1 ) != extractor2.getCharValue( object2 );
+            return extractor1.getCharValue( workingMemory, object1 ) != extractor2.getCharValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -204,39 +205,39 @@
                    Operator.LESS );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor.getCharValue( object1 ) < object2.getCharValue();
+            return extractor.getCharValue( workingMemory, object1 ) < object2.getCharValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
-            return ((LongVariableContextEntry) context).right < context.declaration.getExtractor().getCharValue( left );
+            return ((LongVariableContextEntry) context).right < context.declaration.getExtractor().getCharValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            return context.extractor.getCharValue( right ) < ((LongVariableContextEntry) context).left;
+            return context.extractor.getCharValue( workingMemory, right ) < ((LongVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor1.getCharValue( object1 ) < extractor2.getCharValue( object2 );
+            return extractor1.getCharValue( workingMemory, object1 ) < extractor2.getCharValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -256,39 +257,39 @@
                    Operator.LESS_OR_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor.getCharValue( object1 ) <= object2.getCharValue();
+            return extractor.getCharValue( workingMemory, object1 ) <= object2.getCharValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
-            return ((LongVariableContextEntry) context).right <= context.declaration.getExtractor().getCharValue( left );
+            return ((LongVariableContextEntry) context).right <= context.declaration.getExtractor().getCharValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            return context.extractor.getCharValue( right ) <= ((LongVariableContextEntry) context).left;
+            return context.extractor.getCharValue( workingMemory, right ) <= ((LongVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor1.getCharValue( object1 ) <= extractor2.getCharValue( object2 );
+            return extractor1.getCharValue( workingMemory, object1 ) <= extractor2.getCharValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -308,39 +309,39 @@
                    Operator.GREATER );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor.getCharValue( object1 ) > object2.getCharValue();
+            return extractor.getCharValue( workingMemory, object1 ) > object2.getCharValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
-            return ((LongVariableContextEntry) context).right > context.declaration.getExtractor().getCharValue( left );
+            return ((LongVariableContextEntry) context).right > context.declaration.getExtractor().getCharValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            return context.extractor.getCharValue( right ) > ((LongVariableContextEntry) context).left;
+            return context.extractor.getCharValue( workingMemory, right ) > ((LongVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor1.getCharValue( object1 ) > extractor2.getCharValue( object2 );
+            return extractor1.getCharValue( workingMemory, object1 ) > extractor2.getCharValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -360,39 +361,39 @@
                    Operator.GREATER_OR_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor.getCharValue( object1 ) >= object2.getCharValue();
+            return extractor.getCharValue( workingMemory, object1 ) >= object2.getCharValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
-            return ((LongVariableContextEntry) context).right >= context.declaration.getExtractor().getCharValue( left );
+            return ((LongVariableContextEntry) context).right >= context.declaration.getExtractor().getCharValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            return context.extractor.getCharValue( right ) >= ((LongVariableContextEntry) context).left;
+            return context.extractor.getCharValue( workingMemory, right ) >= ((LongVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor1.getCharValue( object1 ) >= extractor2.getCharValue( object2 );
+            return extractor1.getCharValue( workingMemory, object1 ) >= extractor2.getCharValue( workingMemory, object2 );
         }
 
         public String toString() {

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DateFactory.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -22,6 +22,7 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
@@ -96,10 +97,10 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            final Date value1 = (Date) extractor.getValue( object1 );
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Date value1 = (Date) extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
             if ( value1 == null ) {
                 return value2 == null;
@@ -110,9 +111,9 @@
             return value1.compareTo( getRightDate( value2 ) ) == 0;
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            final Date value1 = (Date) context.declaration.getExtractor().getValue( left );
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Date value1 = (Date) context.declaration.getExtractor().getValue( workingMemory, left );
             final Object value2 = ((ObjectVariableContextEntry) context).right;
             if ( value1 == null ) {
                 return value2 == null;
@@ -123,10 +124,10 @@
             return value1.compareTo( getRightDate( value2 ) ) == 0;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
             final Date value1 = (Date) ((ObjectVariableContextEntry) context).left;
-            final Object value2 = context.extractor.getValue( right );
+            final Object value2 = context.extractor.getValue( workingMemory, right );
             if ( value1 == null ) {
                 return value2 == null;
             }
@@ -136,12 +137,12 @@
             return value1.compareTo( getRightDate( value2 ) ) == 0;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Date value1 = (Date) extractor1.getValue( object1 );
-            final Date value2 = (Date) extractor2.getValue( object2 );
+                                final Extractor extractor2, final Object object2) {
+            final Date value1 = (Date) extractor1.getValue( workingMemory, object1 );
+            final Date value2 = (Date) extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
                 return value2 == null;
             }
@@ -169,10 +170,10 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            final Date value1 = (Date) extractor.getValue( object1 );
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Date value1 = (Date) extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
             if ( value1 == null ) {
                 return value2 != null;
@@ -183,9 +184,9 @@
             return value1.compareTo( getRightDate( value2 ) ) != 0;
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            final Date value1 = (Date) context.declaration.getExtractor().getValue( left );
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Date value1 = (Date) context.declaration.getExtractor().getValue( workingMemory, left );
             final Object value2 = ((ObjectVariableContextEntry) context).right;
             if ( value1 == null ) {
                 return value2 != null;
@@ -196,10 +197,10 @@
             return value1.compareTo( getRightDate( value2 ) ) != 0;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
             final Date value1 = (Date) ((ObjectVariableContextEntry) context).left;
-            final Object value2 = context.extractor.getValue( right );
+            final Object value2 = context.extractor.getValue( workingMemory, right );
             if ( value1 == null ) {
                 return value2 != null;
             }
@@ -209,12 +210,12 @@
             return value1.compareTo( getRightDate( value2 ) ) != 0;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Date value1 = (Date) extractor1.getValue( object1 );
-            final Date value2 = (Date) extractor2.getValue( object2 );
+                                final Extractor extractor2, final Object object2) {
+            final Date value1 = (Date) extractor1.getValue( workingMemory, object1 );
+            final Date value2 = (Date) extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
                 return value2 != null;
             }
@@ -241,46 +242,46 @@
                    Operator.LESS );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final Date value1 = (Date) extractor.getValue( object1 );
+            final Date value1 = (Date) extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
             return value1.compareTo( getRightDate( value2 ) ) < 0;
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
-            final Date value1 = (Date) context.declaration.getExtractor().getValue( left );
+            final Date value1 = (Date) context.declaration.getExtractor().getValue( workingMemory, left );
             final Object value2 = ((ObjectVariableContextEntry) context).right;
             return getRightDate( value2 ).compareTo( value1 ) < 0;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
             final Date value1 = (Date) ((ObjectVariableContextEntry) context).left;
-            final Object value2 = context.extractor.getValue( right );
+            final Object value2 = context.extractor.getValue( workingMemory, right );
             return getRightDate( value2 ).compareTo( value1 ) < 0;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final Date value1 = (Date) extractor1.getValue( object1 );
-            final Date value2 = (Date) extractor2.getValue( object2 );
+            final Date value1 = (Date) extractor1.getValue( workingMemory, object1 );
+            final Date value2 = (Date) extractor2.getValue( workingMemory, object2 );
             return value1.compareTo( value2 ) < 0;
         }
 
@@ -301,46 +302,46 @@
                    Operator.LESS_OR_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final Date value1 = (Date) extractor.getValue( object1 );
+            final Date value1 = (Date) extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
             return value1.compareTo( getRightDate( value2 ) ) <= 0;
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
-            final Date value1 = (Date) context.declaration.getExtractor().getValue( left );
+            final Date value1 = (Date) context.declaration.getExtractor().getValue( workingMemory, left );
             final Object value2 = ((ObjectVariableContextEntry) context).right;
             return getRightDate( value2 ).compareTo( value1 ) <= 0;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
             final Date value1 = (Date) ((ObjectVariableContextEntry) context).left;
-            final Object value2 = context.extractor.getValue( right );
+            final Object value2 = context.extractor.getValue( workingMemory, right );
             return getRightDate( value2 ).compareTo( value1 ) <= 0;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final Date value1 = (Date) extractor1.getValue( object1 );
-            final Date value2 = (Date) extractor2.getValue( object2 );
+            final Date value1 = (Date) extractor1.getValue( workingMemory, object1 );
+            final Date value2 = (Date) extractor2.getValue( workingMemory, object2 );
             return value1.compareTo( value2 ) <= 0;
         }
 
@@ -361,46 +362,46 @@
                    Operator.GREATER );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final Date value1 = (Date) extractor.getValue( object1 );
+            final Date value1 = (Date) extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
             return value1.compareTo( getRightDate( value2 ) ) > 0;
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
-            final Date value1 = (Date) context.declaration.getExtractor().getValue( left );
+            final Date value1 = (Date) context.declaration.getExtractor().getValue( workingMemory, left );
             final Object value2 = ((ObjectVariableContextEntry) context).right;
             return getRightDate( value2 ).compareTo( value1 ) > 0;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
             final Date value1 = (Date) ((ObjectVariableContextEntry) context).left;
-            final Object value2 = context.extractor.getValue( right );
+            final Object value2 = context.extractor.getValue( workingMemory, right );
             return getRightDate( value2 ).compareTo( value1 ) > 0;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final Date value1 = (Date) extractor1.getValue( object1 );
-            final Date value2 = (Date) extractor2.getValue( object2 );
+            final Date value1 = (Date) extractor1.getValue( workingMemory, object1 );
+            final Date value2 = (Date) extractor2.getValue( workingMemory, object2 );
             return value1.compareTo( value2 ) > 0;
         }
 
@@ -421,46 +422,46 @@
                    Operator.GREATER_OR_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final Date value1 = (Date) extractor.getValue( object1 );
+            final Date value1 = (Date) extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
             return value1.compareTo( getRightDate( value2 ) ) >= 0;
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
-            final Date value1 = (Date) context.declaration.getExtractor().getValue( left );
+            final Date value1 = (Date) context.declaration.getExtractor().getValue( workingMemory, left );
             final Object value2 = ((ObjectVariableContextEntry) context).right;
             return getRightDate( value2 ).compareTo( value1 ) >= 0;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
             final Date value1 = (Date) ((ObjectVariableContextEntry) context).left;
-            final Object value2 = context.extractor.getValue( right );
+            final Object value2 = context.extractor.getValue( workingMemory, right );
             return getRightDate( value2 ).compareTo( value1 ) >= 0;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final Date value1 = (Date) extractor1.getValue( object1 );
-            final Date value2 = (Date) extractor2.getValue( object2 );
+            final Date value1 = (Date) extractor1.getValue( workingMemory, object1 );
+            final Date value2 = (Date) extractor2.getValue( workingMemory, object2 );
             return value1.compareTo( value2 ) >= 0;
         }
 

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DoubleFactory.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -18,6 +18,7 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.VariableRestriction.DoubleVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
@@ -76,53 +77,53 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if ( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return object2.isNull();
             } else if ( object2.isNull() ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return extractor.getDoubleValue( object1 ) == object2.getDoubleValue();
+            return extractor.getDoubleValue( workingMemory, object1 ) == object2.getDoubleValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
                 return context.isRightNull();
             } else if ( context.isRightNull() ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return context.declaration.getExtractor().getDoubleValue( left ) == ((DoubleVariableContextEntry) context).right;
+            return context.declaration.getExtractor().getDoubleValue( workingMemory, left ) == ((DoubleVariableContextEntry) context).right;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if ( context.extractor.isNullValue( right )) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if ( context.extractor.isNullValue( workingMemory, right )) {
                 return context.isLeftNull();
             } else if ( context.isLeftNull() ) {
                 return false;
             }
             
             // TODO: we are not handling delta right now... maybe we should
-            return ((DoubleVariableContextEntry) context).left == context.extractor.getDoubleValue( right );
+            return ((DoubleVariableContextEntry) context).left == context.extractor.getDoubleValue( workingMemory, right );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if (extractor1.isNullValue( object1 )) {
-                return extractor2.isNullValue( object2 );
-            } else if (extractor2.isNullValue( object2 )) {
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
                 return false;
             }
             
             // TODO: we are not handling delta right now... maybe we should
-            return extractor1.getDoubleValue( object1 ) == extractor2.getDoubleValue( object2 );
+            return extractor1.getDoubleValue( workingMemory, object1 ) == extractor2.getDoubleValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -142,55 +143,55 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if ( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return !object2.isNull();
             } else if ( object2.isNull() ) {
                 return true;
             }
             
             // TODO: we are not handling delta right now... maybe we should
-            return extractor.getDoubleValue( object1 ) != object2.getDoubleValue();
+            return extractor.getDoubleValue( workingMemory, object1 ) != object2.getDoubleValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
                 return !context.isRightNull();
             } else if ( context.isRightNull() ) {
                 return true;
             }
             
             // TODO: we are not handling delta right now... maybe we should
-            return context.declaration.getExtractor().getDoubleValue( left ) != ((DoubleVariableContextEntry) context).right;
+            return context.declaration.getExtractor().getDoubleValue( workingMemory, left ) != ((DoubleVariableContextEntry) context).right;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if ( context.extractor.isNullValue( right )) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if ( context.extractor.isNullValue( workingMemory, right )) {
                 return !context.isLeftNull();
             } else if ( context.isLeftNull() ) {
                 return true;
             }
             
             // TODO: we are not handling delta right now... maybe we should
-            return ((DoubleVariableContextEntry) context).left != context.extractor.getDoubleValue( right );
+            return ((DoubleVariableContextEntry) context).left != context.extractor.getDoubleValue( workingMemory, right );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if (extractor1.isNullValue( object1 )) {
-                return !extractor2.isNullValue( object2 );
-            } else if (extractor2.isNullValue( object2 )) {
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return !extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
                 return true;
             }
             
             // TODO: we are not handling delta right now... maybe we should
-            return extractor1.getDoubleValue( object1 ) != extractor2.getDoubleValue( object2 );
+            return extractor1.getDoubleValue( workingMemory, object1 ) != extractor2.getDoubleValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -210,43 +211,43 @@
                    Operator.LESS );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return extractor.getDoubleValue( object1 ) < object2.getDoubleValue();
+            return extractor.getDoubleValue( workingMemory, object1 ) < object2.getDoubleValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return ((DoubleVariableContextEntry) context).right < context.declaration.getExtractor().getDoubleValue( left );
+            return ((DoubleVariableContextEntry) context).right < context.declaration.getExtractor().getDoubleValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return context.extractor.getDoubleValue( right ) < ((DoubleVariableContextEntry) context).left;
+            return context.extractor.getDoubleValue( workingMemory, right ) < ((DoubleVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return extractor1.getDoubleValue( object1 ) < extractor2.getDoubleValue( object2 );
+            return extractor1.getDoubleValue( workingMemory, object1 ) < extractor2.getDoubleValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -266,43 +267,43 @@
                    Operator.LESS_OR_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return extractor.getDoubleValue( object1 ) <= object2.getDoubleValue();
+            return extractor.getDoubleValue( workingMemory, object1 ) <= object2.getDoubleValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return ((DoubleVariableContextEntry) context).right <= context.declaration.getExtractor().getDoubleValue( left );
+            return ((DoubleVariableContextEntry) context).right <= context.declaration.getExtractor().getDoubleValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return context.extractor.getDoubleValue( right ) <= ((DoubleVariableContextEntry) context).left;
+            return context.extractor.getDoubleValue( workingMemory, right ) <= ((DoubleVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return extractor1.getDoubleValue( object1 ) <= extractor2.getDoubleValue( object2 );
+            return extractor1.getDoubleValue( workingMemory, object1 ) <= extractor2.getDoubleValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -322,43 +323,43 @@
                    Operator.GREATER );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return extractor.getDoubleValue( object1 ) > object2.getDoubleValue();
+            return extractor.getDoubleValue( workingMemory, object1 ) > object2.getDoubleValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return ((DoubleVariableContextEntry) context).right > context.declaration.getExtractor().getDoubleValue( left );
+            return ((DoubleVariableContextEntry) context).right > context.declaration.getExtractor().getDoubleValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return context.extractor.getDoubleValue( right ) > ((DoubleVariableContextEntry) context).left;
+            return context.extractor.getDoubleValue( workingMemory, right ) > ((DoubleVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return extractor1.getDoubleValue( object1 ) > extractor2.getDoubleValue( object2 );
+            return extractor1.getDoubleValue( workingMemory, object1 ) > extractor2.getDoubleValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -378,43 +379,43 @@
                    Operator.GREATER_OR_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return extractor.getDoubleValue( object1 ) >= object2.getDoubleValue();
+            return extractor.getDoubleValue( workingMemory, object1 ) >= object2.getDoubleValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return ((DoubleVariableContextEntry) context).right >= context.declaration.getExtractor().getDoubleValue( left );
+            return ((DoubleVariableContextEntry) context).right >= context.declaration.getExtractor().getDoubleValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return context.extractor.getDoubleValue( right ) >= ((DoubleVariableContextEntry) context).left;
+            return context.extractor.getDoubleValue( workingMemory, right ) >= ((DoubleVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return extractor1.getDoubleValue( object1 ) >= extractor2.getDoubleValue( object2 );
+            return extractor1.getDoubleValue( workingMemory, object1 ) >= extractor2.getDoubleValue( workingMemory, object2 );
         }
 
         public String toString() {

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FactTemplateFactory.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -18,6 +18,7 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
@@ -71,10 +72,10 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            final Object value1 = extractor.getValue( object1 );
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
             if ( value1 == null ) {
                 return value2 == null;
@@ -82,30 +83,30 @@
             return value1.equals( value2 );
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( left );
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
             if ( value == null ) {
                 return ((ObjectVariableContextEntry) context).right == null;
             }
             return value.equals( ((ObjectVariableContextEntry) context).right );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            final Object value = context.extractor.getValue( right );
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final Object value = context.extractor.getValue( workingMemory, right );
             if ( ((ObjectVariableContextEntry) context).left == null ) {
                 return value == null;
             }
             return ((ObjectVariableContextEntry) context).left.equals( value );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object value1 = extractor1.getValue( object1 );
-            final Object value2 = extractor2.getValue( object2 );
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
                 return value2 == null;
             }
@@ -130,10 +131,10 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            final Object value1 = extractor.getValue( object1 );
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
             if ( value1 == null ) {
                 return value2 != null;
@@ -141,30 +142,30 @@
             return !value1.equals( value2 );
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( left );
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
             if ( value == null ) {
                 return ((ObjectVariableContextEntry) context).right != null;
             }
             return !value.equals( ((ObjectVariableContextEntry) context).right );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            final Object value = context.extractor.getValue( right );
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final Object value = context.extractor.getValue( workingMemory, right );
             if ( ((ObjectVariableContextEntry) context).left == null ) {
                 return value != null;
             }
             return !((ObjectVariableContextEntry) context).left.equals( value );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object value1 = extractor1.getValue( object1 );
-            final Object value2 = extractor2.getValue( object2 );
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
                 return value2 != null;
             }

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FloatFactory.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -18,6 +18,7 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.VariableRestriction.DoubleVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
@@ -74,55 +75,55 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if ( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return object2.isNull();
             } else if ( object2.isNull() ) {
                 return false;
             }
             
             // TODO: we are not handling delta right now... maybe we should
-            return extractor.getFloatValue( object1 ) == object2.getFloatValue();
+            return extractor.getFloatValue( workingMemory, object1 ) == object2.getFloatValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
                 return context.isRightNull();
             } else if ( context.isRightNull() ) {
                 return false;
             }
             
             // TODO: we are not handling delta right now... maybe we should
-            return context.declaration.getExtractor().getFloatValue( left ) == ((DoubleVariableContextEntry) context).right;
+            return context.declaration.getExtractor().getFloatValue( workingMemory, left ) == ((DoubleVariableContextEntry) context).right;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if ( context.extractor.isNullValue( right )) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if ( context.extractor.isNullValue( workingMemory, right )) {
                 return context.isLeftNull();
             } else if ( context.isLeftNull() ) {
                 return false;
             }
             
             // TODO: we are not handling delta right now... maybe we should
-            return ((DoubleVariableContextEntry) context).left == context.extractor.getFloatValue( right );
+            return ((DoubleVariableContextEntry) context).left == context.extractor.getFloatValue( workingMemory, right );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if (extractor1.isNullValue( object1 )) {
-                return extractor2.isNullValue( object2 );
-            } else if (extractor2.isNullValue( object2 )) {
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
                 return false;
             }
             
             // TODO: we are not handling delta right now... maybe we should
-            return extractor1.getFloatValue( object1 ) == extractor2.getFloatValue( object2 );
+            return extractor1.getFloatValue( workingMemory, object1 ) == extractor2.getFloatValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -142,55 +143,55 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if ( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return !object2.isNull();
             } else if ( object2.isNull() ) {
                 return true;
             }
             
             // TODO: we are not handling delta right now... maybe we should
-            return extractor.getFloatValue( object1 ) != object2.getFloatValue();
+            return extractor.getFloatValue( workingMemory, object1 ) != object2.getFloatValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
                 return !context.isRightNull();
             } else if ( context.isRightNull() ) {
                 return true;
             }
             
             // TODO: we are not handling delta right now... maybe we should
-            return context.declaration.getExtractor().getFloatValue( left ) != ((DoubleVariableContextEntry) context).right;
+            return context.declaration.getExtractor().getFloatValue( workingMemory, left ) != ((DoubleVariableContextEntry) context).right;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if ( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if ( context.extractor.isNullValue( workingMemory, right ) ) {
                 return !context.isLeftNull();
             } else if ( context.isLeftNull() ) {
                 return true;
             }
             
             // TODO: we are not handling delta right now... maybe we should
-            return ((DoubleVariableContextEntry) context).left != context.extractor.getFloatValue( right );
+            return ((DoubleVariableContextEntry) context).left != context.extractor.getFloatValue( workingMemory, right );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if (extractor1.isNullValue( object1 )) {
-                return !extractor2.isNullValue( object2 );
-            } else if (extractor2.isNullValue( object2 )) {
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return !extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
                 return true;
             }
             
             // TODO: we are not handling delta right now... maybe we should
-            return extractor1.getFloatValue( object1 ) != extractor2.getFloatValue( object2 );
+            return extractor1.getFloatValue( workingMemory, object1 ) != extractor2.getFloatValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -210,43 +211,43 @@
                    Operator.LESS );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return extractor.getFloatValue( object1 ) < object2.getFloatValue();
+            return extractor.getFloatValue( workingMemory, object1 ) < object2.getFloatValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return ((DoubleVariableContextEntry) context).right < context.declaration.getExtractor().getFloatValue( left );
+            return ((DoubleVariableContextEntry) context).right < context.declaration.getExtractor().getFloatValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return context.extractor.getFloatValue( right ) < ((DoubleVariableContextEntry) context).left;
+            return context.extractor.getFloatValue( workingMemory, right ) < ((DoubleVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return extractor1.getFloatValue( object1 ) < extractor2.getFloatValue( object2 );
+            return extractor1.getFloatValue( workingMemory, object1 ) < extractor2.getFloatValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -266,43 +267,43 @@
                    Operator.LESS_OR_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return extractor.getFloatValue( object1 ) <= object2.getFloatValue();
+            return extractor.getFloatValue( workingMemory, object1 ) <= object2.getFloatValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return ((DoubleVariableContextEntry) context).right <= context.declaration.getExtractor().getFloatValue( left );
+            return ((DoubleVariableContextEntry) context).right <= context.declaration.getExtractor().getFloatValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return context.extractor.getFloatValue( right ) <= ((DoubleVariableContextEntry) context).left;
+            return context.extractor.getFloatValue( workingMemory, right ) <= ((DoubleVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return extractor1.getFloatValue( object1 ) <= extractor2.getFloatValue( object2 );
+            return extractor1.getFloatValue( workingMemory, object1 ) <= extractor2.getFloatValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -322,43 +323,43 @@
                    Operator.GREATER );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return extractor.getFloatValue( object1 ) > object2.getFloatValue();
+            return extractor.getFloatValue( workingMemory, object1 ) > object2.getFloatValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return ((DoubleVariableContextEntry) context).right > context.declaration.getExtractor().getFloatValue( left );
+            return ((DoubleVariableContextEntry) context).right > context.declaration.getExtractor().getFloatValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return context.extractor.getFloatValue( right ) > ((DoubleVariableContextEntry) context).left;
+            return context.extractor.getFloatValue( workingMemory, right ) > ((DoubleVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return extractor1.getFloatValue( object1 ) > extractor2.getFloatValue( object2 );
+            return extractor1.getFloatValue( workingMemory, object1 ) > extractor2.getFloatValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -378,43 +379,43 @@
                    Operator.GREATER_OR_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return extractor.getFloatValue( object1 ) >= object2.getFloatValue();
+            return extractor.getFloatValue( workingMemory, object1 ) >= object2.getFloatValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return ((DoubleVariableContextEntry) context).right >= context.declaration.getExtractor().getFloatValue( left );
+            return ((DoubleVariableContextEntry) context).right >= context.declaration.getExtractor().getFloatValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return context.extractor.getFloatValue( right ) >= ((DoubleVariableContextEntry) context).left;
+            return context.extractor.getFloatValue( workingMemory, right ) >= ((DoubleVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
             // TODO: we are not handling delta right now... maybe we should
-            return extractor1.getFloatValue( object1 ) >= extractor2.getFloatValue( object2 );
+            return extractor1.getFloatValue( workingMemory, object1 ) >= extractor2.getFloatValue( workingMemory, object2 );
         }
 
         public String toString() {

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/IntegerFactory.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -18,6 +18,7 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.VariableRestriction.LongVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
@@ -76,51 +77,51 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if ( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return object2.isNull();
             } else if ( object2.isNull() ) {
                 return false;
             }
             
-            return extractor.getIntValue( object1 ) == object2.getIntValue();
+            return extractor.getIntValue( workingMemory, object1 ) == object2.getIntValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
                 return context.isRightNull();
             } else if ( context.isRightNull() ) {
                 return false;
             }
             
-            return context.declaration.getExtractor().getIntValue( left ) == ((LongVariableContextEntry) context).right; 
+            return context.declaration.getExtractor().getIntValue( workingMemory, left ) == ((LongVariableContextEntry) context).right; 
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object object2) {
-            if ( context.extractor.isNullValue( object2 )) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object object2) {
+            if ( context.extractor.isNullValue( workingMemory, object2 )) {
                 return context.isLeftNull();
             } else if ( context.isLeftNull() ) {
                 return false;
             }
             
-            return context.extractor.getIntValue( object2 ) == ((LongVariableContextEntry) context).left;
+            return context.extractor.getIntValue( workingMemory, object2 ) == ((LongVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {            
-            if (extractor1.isNullValue( object1 )) {
-                return extractor2.isNullValue( object2 );
-            } else if (extractor2.isNullValue( object2 )) {
+                                final Extractor extractor2, final Object object2) {            
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
                 return false;
             }
             
-            return extractor1.getIntValue( object1 ) == extractor2.getIntValue( object2 );
+            return extractor1.getIntValue( workingMemory, object1 ) == extractor2.getIntValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -141,51 +142,51 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {        	          
-            if ( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {        	          
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return !object2.isNull();
             } else if ( object2.isNull() ) {
                 return true;
             }
             
-            return extractor.getIntValue( object1 ) != object2.getIntValue();
+            return extractor.getIntValue( workingMemory, object1 ) != object2.getIntValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
                 return !context.isRightNull();
             } else if ( context.isRightNull() ) {
                 return true;
             }
             
-            return context.declaration.getExtractor().getIntValue( left ) != ((LongVariableContextEntry) context).right;
+            return context.declaration.getExtractor().getIntValue( workingMemory, left ) != ((LongVariableContextEntry) context).right;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object object2) {
-            if ( context.extractor.isNullValue( object2 ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object object2) {
+            if ( context.extractor.isNullValue( workingMemory, object2 ) ) {
                 return !context.isLeftNull();
             } else if ( context.isLeftNull() ) {
                 return true;
             }
             
-            return context.extractor.getIntValue( object2 ) != ((LongVariableContextEntry) context).left;
+            return context.extractor.getIntValue( workingMemory, object2 ) != ((LongVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if (extractor1.isNullValue( object1 )) {
-                return !extractor2.isNullValue( object2 );
-            } else if (extractor2.isNullValue( object2 )) {
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return !extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
                 return true;
             }
             
-            return extractor1.getIntValue( object1 ) != extractor2.getIntValue( object2 );
+            return extractor1.getIntValue( workingMemory, object1 ) != extractor2.getIntValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -205,39 +206,39 @@
                    Operator.LESS );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor.getIntValue( object1 ) < object2.getIntValue();
+            return extractor.getIntValue( workingMemory, object1 ) < object2.getIntValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
-            return ((LongVariableContextEntry) context).right < context.declaration.getExtractor().getIntValue( left );
+            return ((LongVariableContextEntry) context).right < context.declaration.getExtractor().getIntValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            return context.extractor.getIntValue( right ) < ((LongVariableContextEntry) context).left;
+            return context.extractor.getIntValue( workingMemory, right ) < ((LongVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor1.getIntValue( object1 ) < extractor2.getIntValue( object2 );
+            return extractor1.getIntValue( workingMemory, object1 ) < extractor2.getIntValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -257,39 +258,39 @@
                    Operator.LESS_OR_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor.getIntValue( object1 ) <= object2.getIntValue();
+            return extractor.getIntValue( workingMemory, object1 ) <= object2.getIntValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
-            return ((LongVariableContextEntry) context).right <= context.declaration.getExtractor().getIntValue( left );
+            return ((LongVariableContextEntry) context).right <= context.declaration.getExtractor().getIntValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            return context.extractor.getIntValue( right ) <= ((LongVariableContextEntry) context).left;
+            return context.extractor.getIntValue( workingMemory, right ) <= ((LongVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor1.getIntValue( object1 ) <= extractor2.getIntValue( object2 );
+            return extractor1.getIntValue( workingMemory, object1 ) <= extractor2.getIntValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -309,39 +310,39 @@
                    Operator.GREATER );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor.getIntValue( object1 ) > object2.getIntValue();
+            return extractor.getIntValue( workingMemory, object1 ) > object2.getIntValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
-            return ((LongVariableContextEntry) context).right > context.declaration.getExtractor().getIntValue( left );
+            return ((LongVariableContextEntry) context).right > context.declaration.getExtractor().getIntValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            return context.extractor.getIntValue( right ) > ((LongVariableContextEntry) context).left;
+            return context.extractor.getIntValue( workingMemory, right ) > ((LongVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor1.getIntValue( object1 ) > extractor2.getIntValue( object2 );
+            return extractor1.getIntValue( workingMemory, object1 ) > extractor2.getIntValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -361,39 +362,39 @@
                    Operator.GREATER_OR_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor.getIntValue( object1 ) >= object2.getIntValue();
+            return extractor.getIntValue( workingMemory, object1 ) >= object2.getIntValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
-            return ((LongVariableContextEntry) context).right >= context.declaration.getExtractor().getIntValue( left );
+            return ((LongVariableContextEntry) context).right >= context.declaration.getExtractor().getIntValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            return context.extractor.getIntValue( right ) >= ((LongVariableContextEntry) context).left;
+            return context.extractor.getIntValue( workingMemory, right ) >= ((LongVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor1.getIntValue( object1 ) >= extractor2.getIntValue( object2 );
+            return extractor1.getIntValue( workingMemory, object1 ) >= extractor2.getIntValue( workingMemory, object2 );
         }
 
         public String toString() {

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/LongFactory.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -18,6 +18,7 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.VariableRestriction.LongVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
@@ -76,51 +77,51 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if ( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return object2.isNull();
             } else if ( object2.isNull() ) {
                 return false;
             }
             
-            return extractor.getLongValue( object1 ) == object2.getLongValue();
+            return extractor.getLongValue( workingMemory, object1 ) == object2.getLongValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
                 return context.isRightNull();
             } else if ( context.isRightNull() ) {
                 return false;
             }
             
-            return context.declaration.getExtractor().getLongValue( left ) == ((LongVariableContextEntry) context).right;
+            return context.declaration.getExtractor().getLongValue( workingMemory, left ) == ((LongVariableContextEntry) context).right;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if ( context.extractor.isNullValue( right )) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if ( context.extractor.isNullValue( workingMemory, right )) {
                 return context.isLeftNull();
             } else if ( context.isLeftNull() ) {
                 return false;
             }
             
-            return ((LongVariableContextEntry) context).left == context.extractor.getLongValue( right );
+            return ((LongVariableContextEntry) context).left == context.extractor.getLongValue( workingMemory, right );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if (extractor1.isNullValue( object1 )) {
-                return extractor2.isNullValue( object2 );
-            } else if (extractor2.isNullValue( object2 )) {
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
                 return false;
             }
             
-            return extractor1.getLongValue( object1 ) == extractor2.getLongValue( object2 );
+            return extractor1.getLongValue( workingMemory, object1 ) == extractor2.getLongValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -140,51 +141,51 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if ( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return !object2.isNull();
             } else if ( object2.isNull() ) {
                 return true;
             }
             
-            return extractor.getLongValue( object1 ) != object2.getLongValue();
+            return extractor.getLongValue( workingMemory, object1 ) != object2.getLongValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
                 return !context.isRightNull();
             } else if ( context.isRightNull() ) {
                 return true;
             }
             
-            return context.declaration.getExtractor().getLongValue( left ) != ((LongVariableContextEntry) context).right;
+            return context.declaration.getExtractor().getLongValue( workingMemory, left ) != ((LongVariableContextEntry) context).right;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if ( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if ( context.extractor.isNullValue( workingMemory, right ) ) {
                 return !context.isLeftNull();
             } else if ( context.isLeftNull() ) {
                 return true;
             }
             
-            return ((LongVariableContextEntry) context).left != context.extractor.getLongValue( right );
+            return ((LongVariableContextEntry) context).left != context.extractor.getLongValue( workingMemory, right );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if (extractor1.isNullValue( object1 )) {
-                return !extractor2.isNullValue( object2 );
-            } else if (extractor2.isNullValue( object2 )) {
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return !extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
                 return true;
             }
             
-            return extractor1.getLongValue( object1 ) != extractor2.getLongValue( object2 );
+            return extractor1.getLongValue( workingMemory, object1 ) != extractor2.getLongValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -204,39 +205,39 @@
                    Operator.LESS );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor.getLongValue( object1 ) < object2.getLongValue();
+            return extractor.getLongValue( workingMemory, object1 ) < object2.getLongValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
-            return ((LongVariableContextEntry) context).right < context.declaration.getExtractor().getLongValue( left );
+            return ((LongVariableContextEntry) context).right < context.declaration.getExtractor().getLongValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            return context.extractor.getLongValue( right ) < ((LongVariableContextEntry) context).left;
+            return context.extractor.getLongValue( workingMemory, right ) < ((LongVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor1.getLongValue( object1 ) < extractor2.getLongValue( object2 );
+            return extractor1.getLongValue( workingMemory, object1 ) < extractor2.getLongValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -256,39 +257,39 @@
                    Operator.LESS_OR_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor.getLongValue( object1 ) <= object2.getLongValue();
+            return extractor.getLongValue( workingMemory, object1 ) <= object2.getLongValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
-            return ((LongVariableContextEntry) context).right <= context.declaration.getExtractor().getLongValue( left );
+            return ((LongVariableContextEntry) context).right <= context.declaration.getExtractor().getLongValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            return context.extractor.getLongValue( right ) <= ((LongVariableContextEntry) context).left;
+            return context.extractor.getLongValue( workingMemory, right ) <= ((LongVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor1.getLongValue( object1 ) <= extractor2.getLongValue( object2 );
+            return extractor1.getLongValue( workingMemory, object1 ) <= extractor2.getLongValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -308,39 +309,39 @@
                    Operator.GREATER );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor.getLongValue( object1 ) > object2.getLongValue();
+            return extractor.getLongValue( workingMemory, object1 ) > object2.getLongValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
-            return ((LongVariableContextEntry) context).right > context.declaration.getExtractor().getLongValue( left );
+            return ((LongVariableContextEntry) context).right > context.declaration.getExtractor().getLongValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            return context.extractor.getLongValue( right ) > ((LongVariableContextEntry) context).left;
+            return context.extractor.getLongValue( workingMemory, right ) > ((LongVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor1.getLongValue( object1 ) > extractor2.getLongValue( object2 );
+            return extractor1.getLongValue( workingMemory, object1 ) > extractor2.getLongValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -360,39 +361,39 @@
                    Operator.GREATER_OR_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor.getLongValue( object1 ) >= object2.getLongValue();
+            return extractor.getLongValue( workingMemory, object1 ) >= object2.getLongValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
-            return ((LongVariableContextEntry) context).right >= context.declaration.getExtractor().getLongValue( left );
+            return ((LongVariableContextEntry) context).right >= context.declaration.getExtractor().getLongValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            return context.extractor.getLongValue( right ) >= ((LongVariableContextEntry) context).left;
+            return context.extractor.getLongValue( workingMemory, right ) >= ((LongVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor1.getLongValue( object1 ) >= extractor2.getLongValue( object2 );
+            return extractor1.getLongValue( workingMemory, object1 ) >= extractor2.getLongValue( workingMemory, object2 );
         }
 
         public String toString() {

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ObjectFactory.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -20,6 +20,7 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
@@ -95,10 +96,10 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            final Object value1 = extractor.getValue( object1 );
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
             if ( value1 == null ) {
                 return value2 == null;
@@ -106,30 +107,30 @@
             return value1.equals( value2 );
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( left );
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
             if ( value == null ) {
                 return ((ObjectVariableContextEntry) context).right == null;
             }
             return value.equals( ((ObjectVariableContextEntry) context).right );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            final Object value = context.extractor.getValue( right );
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final Object value = context.extractor.getValue( workingMemory, right );
             if ( ((ObjectVariableContextEntry) context).left == null ) {
                 return value == null;
             }
             return ((ObjectVariableContextEntry) context).left.equals( value );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object value1 = extractor1.getValue( object1 );
-            final Object value2 = extractor2.getValue( object2 );
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
                 return value2 == null;
             }
@@ -154,10 +155,10 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            final Object value1 = extractor.getValue( object1 );
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
             if ( value1 == null ) {
                 return value2 != null;
@@ -165,30 +166,30 @@
             return !value1.equals( value2 );
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( left );
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
             if ( value == null ) {
                 return ((ObjectVariableContextEntry) context).right != null;
             }
             return !value.equals( ((ObjectVariableContextEntry) context).right );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            final Object value = context.extractor.getValue( right );
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final Object value = context.extractor.getValue( workingMemory, right );
             if ( ((ObjectVariableContextEntry) context).left == null ) {
                 return value != null;
             }
             return !((ObjectVariableContextEntry) context).left.equals( value );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object value1 = extractor1.getValue( object1 );
-            final Object value2 = extractor2.getValue( object2 );
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
                 return value2 != null;
             }
@@ -209,43 +210,43 @@
                    Operator.LESS );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final Comparable comp = (Comparable) extractor.getValue( object1 );
+            final Comparable comp = (Comparable) extractor.getValue( workingMemory, object1 );
             return comp.compareTo( object2.getValue() ) < 0;
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
             final Comparable comp = (Comparable) ((ObjectVariableContextEntry) context).right;
-            return comp.compareTo( context.declaration.getExtractor().getValue( left ) ) < 0;
+            return comp.compareTo( context.declaration.getExtractor().getValue( workingMemory, left ) ) < 0;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            final Comparable comp = (Comparable) context.extractor.getValue( right );
+            final Comparable comp = (Comparable) context.extractor.getValue( workingMemory, right );
             return comp.compareTo( ((ObjectVariableContextEntry) context).left ) < 0;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final Comparable comp = (Comparable) extractor1.getValue( object1 );
-            return comp.compareTo( extractor2.getValue( object2 ) ) < 0;
+            final Comparable comp = (Comparable) extractor1.getValue( workingMemory, object1 );
+            return comp.compareTo( extractor2.getValue( workingMemory, object2 ) ) < 0;
         }
 
         public String toString() {
@@ -265,43 +266,43 @@
                    Operator.LESS_OR_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final Comparable comp = (Comparable) extractor.getValue( object1 );
+            final Comparable comp = (Comparable) extractor.getValue( workingMemory, object1 );
             return comp.compareTo( object2.getValue() ) <= 0;
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
             final Comparable comp = (Comparable) ((ObjectVariableContextEntry) context).right;
-            return comp.compareTo( context.declaration.getExtractor().getValue( left ) ) <= 0;
+            return comp.compareTo( context.declaration.getExtractor().getValue( workingMemory, left ) ) <= 0;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            final Comparable comp = (Comparable) context.extractor.getValue( right );
+            final Comparable comp = (Comparable) context.extractor.getValue( workingMemory, right );
             return comp.compareTo( ((ObjectVariableContextEntry) context).left ) <= 0;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final Comparable comp = (Comparable) extractor1.getValue( object1 );
-            return comp.compareTo( extractor2.getValue( object2 ) ) <= 0;
+            final Comparable comp = (Comparable) extractor1.getValue( workingMemory, object1 );
+            return comp.compareTo( extractor2.getValue( workingMemory, object2 ) ) <= 0;
         }
 
         public String toString() {
@@ -321,43 +322,43 @@
                    Operator.GREATER );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final Comparable comp = (Comparable) extractor.getValue( object1 );
+            final Comparable comp = (Comparable) extractor.getValue( workingMemory, object1 );
             return comp.compareTo( object2.getValue() ) > 0;
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
             final Comparable comp = (Comparable) ((ObjectVariableContextEntry) context).right;
-            return comp.compareTo( context.declaration.getExtractor().getValue( left ) ) > 0;
+            return comp.compareTo( context.declaration.getExtractor().getValue( workingMemory, left ) ) > 0;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            final Comparable comp = (Comparable) context.extractor.getValue( right );
+            final Comparable comp = (Comparable) context.extractor.getValue( workingMemory, right );
             return comp.compareTo( ((ObjectVariableContextEntry) context).left ) > 0;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final Comparable comp = (Comparable) extractor1.getValue( object1 );
-            return comp.compareTo( extractor2.getValue( object2 ) ) > 0;
+            final Comparable comp = (Comparable) extractor1.getValue( workingMemory, object1 );
+            return comp.compareTo( extractor2.getValue( workingMemory, object2 ) ) > 0;
         }
 
         public String toString() {
@@ -377,43 +378,43 @@
                    Operator.GREATER_OR_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final Comparable comp = (Comparable) extractor.getValue( object1 );
+            final Comparable comp = (Comparable) extractor.getValue( workingMemory, object1 );
             return comp.compareTo( object2.getValue() ) >= 0;
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
             final Comparable comp = (Comparable) ((ObjectVariableContextEntry) context).right;
-            return comp.compareTo( context.declaration.getExtractor().getValue( left ) ) >= 0;
+            return comp.compareTo( context.declaration.getExtractor().getValue( workingMemory, left ) ) >= 0;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            final Comparable comp = (Comparable) context.extractor.getValue( right );
+            final Comparable comp = (Comparable) context.extractor.getValue( workingMemory, right );
             return comp.compareTo( ((ObjectVariableContextEntry) context).left ) >= 0;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            final Comparable comp = (Comparable) extractor1.getValue( object1 );
-            return comp.compareTo( extractor2.getValue( object2 ) ) >= 0;
+            final Comparable comp = (Comparable) extractor1.getValue( workingMemory, object1 );
+            return comp.compareTo( extractor2.getValue( workingMemory, object2 ) ) >= 0;
         }
 
         public String toString() {
@@ -433,34 +434,34 @@
                    Operator.CONTAINS );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
             final Object value = object2.getValue();
-            final Collection col = (Collection) extractor.getValue( object1 );
+            final Collection col = (Collection) extractor.getValue( workingMemory, object1 );
             return col.contains( value );
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( left );
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
             final Collection col = (Collection) ((ObjectVariableContextEntry) context).right;
             return col.contains( value );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
             final Object value = ((ObjectVariableContextEntry) context).left;
-            final Collection col = (Collection) context.extractor.getValue( right );
+            final Collection col = (Collection) context.extractor.getValue( workingMemory, right );
             return col.contains( value );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object value = extractor2.getValue( object2 );
-            final Collection col = (Collection) extractor1.getValue( object1 );
+                                final Extractor extractor2, final Object object2) {
+            final Object value = extractor2.getValue( workingMemory, object2 );
+            final Collection col = (Collection) extractor1.getValue( workingMemory, object1 );
             return col.contains( value );
         }
 
@@ -481,34 +482,34 @@
                    Operator.EXCLUDES );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
             final Object value = object2.getValue();
-            final Collection col = (Collection) extractor.getValue( object1 );
+            final Collection col = (Collection) extractor.getValue( workingMemory, object1 );
             return !col.contains( value );
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( left );
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
             final Collection col = (Collection) ((ObjectVariableContextEntry) context).right;
             return !col.contains( value );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
             final Object value = ((ObjectVariableContextEntry) context).left;
-            final Collection col = (Collection) context.extractor.getValue( right );
+            final Collection col = (Collection) context.extractor.getValue( workingMemory, right );
             return !col.contains( value );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object value = extractor2.getValue( object2 );
-            final Collection col = (Collection) extractor1.getValue( object1 );
+                                final Extractor extractor2, final Object object2) {
+            final Object value = extractor2.getValue( workingMemory, object2 );
+            final Collection col = (Collection) extractor1.getValue( workingMemory, object1 );
             return !col.contains( value );
         }
 

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ShortFactory.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -18,6 +18,7 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.VariableRestriction.LongVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
@@ -76,51 +77,51 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if ( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return object2.isNull();
             } else if ( object2.isNull() ) {
                 return false;
             }
             
-            return extractor.getShortValue( object1 ) == object2.getShortValue();
+            return extractor.getShortValue( workingMemory, object1 ) == object2.getShortValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
                 return context.isRightNull();
             } else if ( context.isRightNull() ) {
                 return false;
             }
             
-            return context.declaration.getExtractor().getShortValue( left ) == ((LongVariableContextEntry) context).right;
+            return context.declaration.getExtractor().getShortValue( workingMemory, left ) == ((LongVariableContextEntry) context).right;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if ( context.extractor.isNullValue( right )) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if ( context.extractor.isNullValue( workingMemory, right )) {
                 return context.isLeftNull();
             } else if ( context.isLeftNull() ) {
                 return false;
             }
             
-            return ((LongVariableContextEntry) context).left == context.extractor.getShortValue( right );
+            return ((LongVariableContextEntry) context).left == context.extractor.getShortValue( workingMemory, right );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if (extractor1.isNullValue( object1 )) {
-                return extractor2.isNullValue( object2 );
-            } else if (extractor2.isNullValue( object2 )) {
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
                 return false;
             }
             
-            return extractor1.getShortValue( object1 ) == extractor2.getShortValue( object2 );
+            return extractor1.getShortValue( workingMemory, object1 ) == extractor2.getShortValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -140,51 +141,51 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if ( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return !object2.isNull();
             } else if ( object2.isNull() ) {
                 return true;
             }
             
-            return extractor.getShortValue( object1 ) != object2.getShortValue();
+            return extractor.getShortValue( workingMemory, object1 ) != object2.getShortValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( left ) ) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
                 return !context.isRightNull();
             } else if ( context.isRightNull() ) {
                 return true;
             }
             
-            return context.declaration.getExtractor().getShortValue( left ) != ((LongVariableContextEntry) context).right;
+            return context.declaration.getExtractor().getShortValue( workingMemory, left ) != ((LongVariableContextEntry) context).right;
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if ( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if ( context.extractor.isNullValue( workingMemory, right ) ) {
                 return !context.isLeftNull();
             } else if ( context.isLeftNull() ) {
                 return true;
             }
             
-            return ((LongVariableContextEntry) context).left != context.extractor.getShortValue( right );
+            return ((LongVariableContextEntry) context).left != context.extractor.getShortValue( workingMemory, right );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if (extractor1.isNullValue( object1 )) {
-                return !extractor2.isNullValue( object2 );
-            } else if (extractor2.isNullValue( object2 )) {
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return !extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
                 return true;
             }
             
-            return extractor1.getShortValue( object1 ) != extractor2.getShortValue( object2 );
+            return extractor1.getShortValue( workingMemory, object1 ) != extractor2.getShortValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -204,39 +205,39 @@
                    Operator.LESS );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor.getShortValue( object1 ) < object2.getShortValue();
+            return extractor.getShortValue( workingMemory, object1 ) < object2.getShortValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
-            return ((LongVariableContextEntry) context).right < context.declaration.getExtractor().getShortValue( left );
+            return ((LongVariableContextEntry) context).right < context.declaration.getExtractor().getShortValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            return context.extractor.getShortValue( right ) < ((LongVariableContextEntry) context).left;
+            return context.extractor.getShortValue( workingMemory, right ) < ((LongVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor1.getShortValue( object1 ) < extractor2.getShortValue( object2 );
+            return extractor1.getShortValue( workingMemory, object1 ) < extractor2.getShortValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -256,39 +257,39 @@
                    Operator.LESS_OR_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor.getShortValue( object1 ) <= object2.getShortValue();
+            return extractor.getShortValue( workingMemory, object1 ) <= object2.getShortValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
-            return ((LongVariableContextEntry) context).right <= context.declaration.getExtractor().getShortValue( left );
+            return ((LongVariableContextEntry) context).right <= context.declaration.getExtractor().getShortValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            return context.extractor.getShortValue( right ) <= ((LongVariableContextEntry) context).left;
+            return context.extractor.getShortValue( workingMemory, right ) <= ((LongVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor1.getShortValue( object1 ) <= extractor2.getShortValue( object2 );
+            return extractor1.getShortValue( workingMemory, object1 ) <= extractor2.getShortValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -308,39 +309,39 @@
                    Operator.GREATER );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor.getShortValue( object1 ) > object2.getShortValue();
+            return extractor.getShortValue( workingMemory, object1 ) > object2.getShortValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
-            return ((LongVariableContextEntry) context).right > context.declaration.getExtractor().getShortValue( left );
+            return ((LongVariableContextEntry) context).right > context.declaration.getExtractor().getShortValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            return context.extractor.getShortValue( right ) > ((LongVariableContextEntry) context).left;
+            return context.extractor.getShortValue( workingMemory, right ) > ((LongVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor1.getShortValue( object1 ) > extractor2.getShortValue( object2 );
+            return extractor1.getShortValue( workingMemory, object1 ) > extractor2.getShortValue( workingMemory, object2 );
         }
 
         public String toString() {
@@ -360,39 +361,39 @@
                    Operator.GREATER_OR_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            if( extractor.isNullValue( object1 ) ) {
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor.getShortValue( object1 ) >= object2.getShortValue();
+            return extractor.getShortValue( workingMemory, object1 ) >= object2.getShortValue();
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             if( context.rightNull ) {
                 return false;
             }
-            return ((LongVariableContextEntry) context).right >= context.declaration.getExtractor().getShortValue( left );
+            return ((LongVariableContextEntry) context).right >= context.declaration.getExtractor().getShortValue( workingMemory, left );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            if( context.extractor.isNullValue( right ) ) {
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
                 return false;
             }
-            return context.extractor.getShortValue( right ) >= ((LongVariableContextEntry) context).left;
+            return context.extractor.getShortValue( workingMemory, right ) >= ((LongVariableContextEntry) context).left;
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            if( extractor1.isNullValue( object1 ) ) {
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
-            return extractor1.getShortValue( object1 ) >= extractor2.getShortValue( object2 );
+            return extractor1.getShortValue( workingMemory, object1 ) >= extractor2.getShortValue( workingMemory, object2 );
         }
 
         public String toString() {

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/StringFactory.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -18,6 +18,7 @@
 
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
@@ -79,10 +80,10 @@
                    Operator.EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            final Object value1 = extractor.getValue( object1 );
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
             if ( value1 == null ) {
                 return value2 == null;
@@ -90,30 +91,30 @@
             return value1.equals( value2 );
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( left );
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
             if ( value == null ) {
                 return ((ObjectVariableContextEntry) context).right == null;
             }
             return value.equals( ((ObjectVariableContextEntry) context).right );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            final Object value = context.extractor.getValue( right );
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final Object value = context.extractor.getValue( workingMemory, right );
             if ( ((ObjectVariableContextEntry) context).left == null ) {
                 return value == null;
             }
             return ((ObjectVariableContextEntry) context).left.equals( value );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object value1 = extractor1.getValue( object1 );
-            final Object value2 = extractor2.getValue( object2 );
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
                 return value2 == null;
             }
@@ -138,10 +139,10 @@
                    Operator.NOT_EQUAL );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            final Object value1 = extractor.getValue( object1 );
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
             if ( value1 == null ) {
                 return value2 != null;
@@ -149,30 +150,30 @@
             return !value1.equals( value2 );
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( left );
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
             if ( value == null ) {
                 return ((ObjectVariableContextEntry) context).right != null;
             }
             return !value.equals( ((ObjectVariableContextEntry) context).right );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            final Object value = context.extractor.getValue( right );
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final Object value = context.extractor.getValue( workingMemory, right );
             if ( ((ObjectVariableContextEntry) context).left == null ) {
                 return value != null;
             }
             return !((ObjectVariableContextEntry) context).left.equals( value );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object value1 = extractor1.getValue( object1 );
-            final Object value2 = extractor2.getValue( object2 );
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
                 return value2 != null;
             }
@@ -196,10 +197,10 @@
                    Operator.MATCHES );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            final String value1 = (String) extractor.getValue( object1 );
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final String value1 = (String) extractor.getValue( workingMemory, object1 );
             final String value2 = (String) object2.getValue();
             if ( value1 == null ) {
                 return false;
@@ -207,30 +208,30 @@
             return value1.matches( value2 );
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             final String value = (String) ((ObjectVariableContextEntry) context).right;
             if ( value == null ) {
                 return false;
             }
-            return value.matches( (String) context.declaration.getExtractor().getValue( left ) );
+            return value.matches( (String) context.declaration.getExtractor().getValue( workingMemory, left ) );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            final String value = (String) context.extractor.getValue( right );
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final String value = (String) context.extractor.getValue( workingMemory, right );
             if ( value == null ) {
                 return false;
             }
             return value.matches( (String) ((ObjectVariableContextEntry) context).left );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object value1 = extractor1.getValue( object1 );
-            final Object value2 = extractor2.getValue( object2 );
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
                 return false;
             }
@@ -254,10 +255,10 @@
                    Operator.NOT_MATCHES );
         }
 
-        public boolean evaluate(final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            final String value1 = (String) extractor.getValue( object1 );
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final String value1 = (String) extractor.getValue( workingMemory, object1 );
             final String value2 = (String) object2.getValue();
             if ( value1 == null ) {
                 return false;
@@ -265,30 +266,30 @@
             return ! value1.matches( value2 );
         }
 
-        public boolean evaluateCachedRight(final VariableContextEntry context,
-                                           final Object left) {
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
             final String value = (String) ((ObjectVariableContextEntry) context).right;
             if ( value == null ) {
                 return false;
             }
-            return ! value.matches( (String) context.declaration.getExtractor().getValue( left ) );
+            return ! value.matches( (String) context.declaration.getExtractor().getValue( workingMemory, left ) );
         }
 
-        public boolean evaluateCachedLeft(final VariableContextEntry context,
-                                          final Object right) {
-            final String value = (String) context.extractor.getValue( right );
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final String value = (String) context.extractor.getValue( workingMemory, right );
             if ( value == null ) {
                 return false;
             }
             return ! value.matches( (String) ((ObjectVariableContextEntry) context).left );
         }
 
-        public boolean evaluate(final Extractor extractor1,
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object value1 = extractor1.getValue( object1 );
-            final Object value2 = extractor2.getValue( object2 );
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
                 return false;
             }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/ArrayExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/ArrayExtractor.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/ArrayExtractor.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -3,6 +3,7 @@
 import java.lang.reflect.Method;
 
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.spi.Extractor;
 
 public class ArrayExtractor implements Extractor {
@@ -20,57 +21,57 @@
         return type;        
     }
     
-    public boolean getBooleanValue(Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( object );
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, Object object) {
+        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
         return ( (Boolean)array[ this.index ]).booleanValue();
     }
-    public byte getByteValue(Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( object );
+    public byte getByteValue(InternalWorkingMemory workingMemory, Object object) {
+        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
         return ( (Byte)array[ this.index ]).byteValue();
     }
-    public char getCharValue(Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( object );
+    public char getCharValue(InternalWorkingMemory workingMemory, Object object) {
+        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
         return ( (Character)array[ this.index ]).charValue();
     }
-    public double getDoubleValue(Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( object );
+    public double getDoubleValue(InternalWorkingMemory workingMemory, Object object) {
+        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
         return ( (Double)array[ this.index ]).doubleValue();
     }
 
-    public float getFloatValue(Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( object );
+    public float getFloatValue(InternalWorkingMemory workingMemory, Object object) {
+        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
         return ( (Float)array[ this.index ]).floatValue();
     }
 
-    public int getIntValue(Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( object );
+    public int getIntValue(InternalWorkingMemory workingMemory, Object object) {
+        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
         return ( (Integer)array[ this.index ]).intValue();
     }
-    public long getLongValue(Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( object );
+    public long getLongValue(InternalWorkingMemory workingMemory, Object object) {
+        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
         return ( (Long) array[ this.index ]).longValue();
     }
     public Method getNativeReadMethod() {
         throw new UnsupportedOperationException("cannot call a method on an array extractor" );
     }
-    public short getShortValue(Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( object );
+    public short getShortValue(InternalWorkingMemory workingMemory, Object object) {
+        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
         return ( (Short)array[ this.index ]).shortValue();
     }
-    public Object getValue(Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( object );
+    public Object getValue(InternalWorkingMemory workingMemory, Object object) {
+        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
         return array[ this.index ];
     }
     public ValueType getValueType() {
         return ValueType.OBJECT_TYPE;
     }
-    public boolean isNullValue(Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( object );
+    public boolean isNullValue(InternalWorkingMemory workingMemory, Object object ) {
+        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
         return array[ this.index ] == null;
     }
     
-  public int getHashCode(Object object) {
-      Object[] array = ( Object[] ) this.arrayExtractor.getValue( object );
+  public int getHashCode(InternalWorkingMemory workingMemory, Object object) {
+      Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
       return array[ this.index ].hashCode();
   }    
 
@@ -93,9 +94,8 @@
         if ( index != other.index ) return false;
         return true;
     }
-    
 
-    
-    
-    
+    public boolean isGlobal() {
+        return false;
+    }
 }

Modified: 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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseBooleanClassFieldExtractor.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -21,6 +21,7 @@
 import org.drools.RuntimeDroolsException;
 import org.drools.base.BaseClassFieldExtractor;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 
 /**
  * A Base class for primitive boolean class field
@@ -53,56 +54,56 @@
                valueType );
     }
 
-    public Object getValue(final Object object) {
-        return getBooleanValue( object ) ? Boolean.TRUE : Boolean.FALSE;
+    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getBooleanValue( workingMemory, object ) ? Boolean.TRUE : Boolean.FALSE;
     }
 
-    public abstract boolean getBooleanValue(Object object);
+    public abstract boolean getBooleanValue(InternalWorkingMemory workingMemory, Object object);
 
-    public byte getByteValue(final Object object) {
+    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
         throw new RuntimeDroolsException( "Conversion to byte not supported from boolean" );
     }
 
-    public char getCharValue(final Object object) {
+    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
         throw new RuntimeDroolsException( "Conversion to char not supported from boolean" );
     }
 
-    public double getDoubleValue(final Object object) {
+    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
         throw new RuntimeDroolsException( "Conversion to double not supported from boolean" );
     }
 
-    public float getFloatValue(final Object object) {
+    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
         throw new RuntimeDroolsException( "Conversion to float not supported from boolean" );
     }
 
-    public int getIntValue(final Object object) {
+    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
         throw new RuntimeDroolsException( "Conversion to int not supported from boolean" );
     }
 
-    public long getLongValue(final Object object) {
+    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
         throw new RuntimeDroolsException( "Conversion to long not supported from boolean" );
     }
 
-    public short getShortValue(final Object object) {
+    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
         throw new RuntimeDroolsException( "Conversion to short not supported from boolean" );
     }
     
-    public boolean isNullValue(final Object object) {
+    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
         return false;
     }
 
     public Method getNativeReadMethod() {
         try {
             return this.getClass().getDeclaredMethod( "getBooleanValue",
-                                                      new Class[]{Object.class} );
+                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
         } catch ( final Exception e ) {
             throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
                                               e );
         }
     }
 
-    public int getHashCode(final Object object) {
-        return getBooleanValue( object ) ? 1231 : 1237;
+    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
+        return getBooleanValue( workingMemory, object ) ? 1231 : 1237;
     }
 
 }

Modified: 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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseByteClassFieldExtractor.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -21,6 +21,7 @@
 import org.drools.RuntimeDroolsException;
 import org.drools.base.BaseClassFieldExtractor;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 
 /**
  * A Base class for primitive byte class field
@@ -53,55 +54,55 @@
                valueType );
     }
 
-    public Object getValue(final Object object) {
-        return new Long( getByteValue( object ) );
+    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
+        return new Long( getByteValue( workingMemory, object ) );
     }
 
-    public boolean getBooleanValue(final Object object) {
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
         throw new RuntimeDroolsException( "Conversion to boolean not supported from byte" );
     }
 
-    public abstract byte getByteValue(Object object);
+    public abstract byte getByteValue(InternalWorkingMemory workingMemory, Object object);
 
-    public char getCharValue(final Object object) {
+    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
         throw new RuntimeDroolsException( "Conversion to char not supported from byte" );
     }
 
-    public double getDoubleValue(final Object object) {
-        return getByteValue( object );
+    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getByteValue( workingMemory, object );
     }
 
-    public float getFloatValue(final Object object) {
-        return getByteValue( object );
+    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getByteValue( workingMemory, object );
     }
 
-    public int getIntValue(final Object object) {
-        return getByteValue( object );
+    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getByteValue( workingMemory, object );
     }
 
-    public long getLongValue(final Object object) {
-        return getByteValue( object );
+    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getByteValue( workingMemory, object );
     }
 
-    public short getShortValue(final Object object) {
-        return getByteValue( object );
+    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getByteValue( workingMemory, object );
     }
 
-    public boolean isNullValue(final Object object) {
+    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
         return false;
     }
     
     public Method getNativeReadMethod() {
         try {
             return this.getClass().getDeclaredMethod( "getByteValue",
-                                                      new Class[]{Object.class} );
+                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
         } catch ( final Exception e ) {
             throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
                                               e );
         }
     }
 
-    public int getHashCode(final Object object) {
-        return getByteValue( object );
+    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
+        return getByteValue( workingMemory, object );
     }
 }

Modified: 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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldExtractor.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -5,6 +5,7 @@
 import org.drools.RuntimeDroolsException;
 import org.drools.base.BaseClassFieldExtractor;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 
 public abstract class BaseCharClassFieldExtractor extends BaseClassFieldExtractor {
 
@@ -31,55 +32,55 @@
                valueType );
     }
 
-    public Object getValue(final Object object) {
-        return new Long( getCharValue( object ) );
+    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
+        return new Long( getCharValue( workingMemory, object ) );
     }
 
-    public boolean getBooleanValue(final Object object) {
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
         throw new RuntimeDroolsException( "Conversion to boolean not supported from char" );
     }
 
-    public byte getByteValue(final Object object) {
-        return (byte) getCharValue( object );
+    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (byte) getCharValue( workingMemory, object );
     }
 
-    public abstract char getCharValue(Object object);
+    public abstract char getCharValue(InternalWorkingMemory workingMemory, Object object);
 
-    public double getDoubleValue(final Object object) {
-        return getCharValue( object );
+    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getCharValue( workingMemory, object );
     }
 
-    public float getFloatValue(final Object object) {
-        return getCharValue( object );
+    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getCharValue( workingMemory, object );
     }
 
-    public int getIntValue(final Object object) {
-        return getCharValue( object );
+    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getCharValue( workingMemory, object );
     }
 
-    public long getLongValue(final Object object) {
-        return getCharValue( object );
+    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getCharValue( workingMemory, object );
     }
 
-    public short getShortValue(final Object object) {
-        return (short) getCharValue( object );
+    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (short) getCharValue( workingMemory, object );
     }
 
-    public boolean isNullValue(final Object object) {
+    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
         return false;
     }
     
     public Method getNativeReadMethod() {
         try {
             return this.getClass().getDeclaredMethod( "getCharValue",
-                                                      new Class[]{Object.class} );
+                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
         } catch ( final Exception e ) {
             throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
                                               e );
         }
     }
 
-    public int getHashCode(final Object object) {
-        return getCharValue( object );
+    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
+        return getCharValue( workingMemory, object );
     }
 }

Modified: 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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseDoubleClassFieldExtractor.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -5,6 +5,7 @@
 import org.drools.RuntimeDroolsException;
 import org.drools.base.BaseClassFieldExtractor;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 
 public abstract class BaseDoubleClassFieldExtractor extends BaseClassFieldExtractor {
 
@@ -31,57 +32,57 @@
                valueType );
     }
 
-    public Object getValue(final Object object) {
-        return new Double( getDoubleValue( object ) );
+    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
+        return new Double( getDoubleValue( workingMemory, object ) );
     }
 
-    public boolean getBooleanValue(final Object object) {
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
         throw new RuntimeDroolsException( "Conversion to boolean not supported from double" );
     }
 
-    public byte getByteValue(final Object object) {
-        return (byte) getDoubleValue( object );
+    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (byte) getDoubleValue( workingMemory, object );
 
     }
 
-    public char getCharValue(final Object object) {
+    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
         throw new RuntimeDroolsException( "Conversion to char not supported from double" );
     }
 
-    public abstract double getDoubleValue(Object object);
+    public abstract double getDoubleValue(InternalWorkingMemory workingMemory, Object object);
 
-    public float getFloatValue(final Object object) {
-        return (float) getDoubleValue( object );
+    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (float) getDoubleValue( workingMemory, object );
     }
 
-    public int getIntValue(final Object object) {
-        return (int) getDoubleValue( object );
+    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (int) getDoubleValue( workingMemory, object );
     }
 
-    public long getLongValue(final Object object) {
-        return (long) getDoubleValue( object );
+    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (long) getDoubleValue( workingMemory, object );
     }
 
-    public short getShortValue(final Object object) {
-        return (short) getDoubleValue( object );
+    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (short) getDoubleValue( workingMemory, object );
     }
 
-    public boolean isNullValue(final Object object) {
+    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
         return false;
     }
 
     public Method getNativeReadMethod() {
         try {
             return this.getClass().getDeclaredMethod( "getDoubleValue",
-                                                      new Class[]{Object.class} );
+                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
         } catch ( final Exception e ) {
             throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
                                               e );
         }
     }
 
-    public int getHashCode(final Object object) {
-        final long temp = Double.doubleToLongBits( getDoubleValue( object ) );
+    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
+        final long temp = Double.doubleToLongBits( getDoubleValue( workingMemory, object ) );
         return (int) (temp ^ (temp >>> 32));
     }
 

Modified: 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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseFloatClassFieldExtractor.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -5,6 +5,7 @@
 import org.drools.RuntimeDroolsException;
 import org.drools.base.BaseClassFieldExtractor;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 
 public abstract class BaseFloatClassFieldExtractor extends BaseClassFieldExtractor {
 
@@ -31,57 +32,57 @@
                valueType );
     }
 
-    public Object getValue(final Object object) {
-        return new Float( getFloatValue( object ) );
+    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
+        return new Float( getFloatValue( workingMemory, object ) );
     }
 
-    public boolean getBooleanValue(final Object object) {
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
         throw new RuntimeDroolsException( "Conversion to boolean not supported from float" );
     }
 
-    public byte getByteValue(final Object object) {
-        return (byte) getFloatValue( object );
+    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (byte) getFloatValue( workingMemory, object );
 
     }
 
-    public char getCharValue(final Object object) {
+    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
         throw new RuntimeDroolsException( "Conversion to char not supported from float" );
     }
 
-    public double getDoubleValue(final Object object) {
-        return getFloatValue( object );
+    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getFloatValue( workingMemory, object );
     }
 
-    public abstract float getFloatValue(Object object);
+    public abstract float getFloatValue(InternalWorkingMemory workingMemory, Object object);
 
-    public int getIntValue(final Object object) {
-        return (int) getFloatValue( object );
+    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (int) getFloatValue( workingMemory, object );
     }
 
-    public long getLongValue(final Object object) {
-        return (long) getFloatValue( object );
+    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (long) getFloatValue( workingMemory, object );
     }
 
-    public short getShortValue(final Object object) {
-        return (short) getFloatValue( object );
+    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (short) getFloatValue( workingMemory, object );
     }
 
-    public boolean isNullValue(final Object object) {
+    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
         return false;
     }
 
     public Method getNativeReadMethod() {
         try {
             return this.getClass().getDeclaredMethod( "getFloatValue",
-                                                      new Class[]{Object.class} );
+                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
         } catch ( final Exception e ) {
             throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
                                               e );
         }
     }
 
-    public int getHashCode(final Object object) {
-        return Float.floatToIntBits( getFloatValue( object ) );
+    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
+        return Float.floatToIntBits( getFloatValue( workingMemory, object ) );
     }
 
 }

Modified: 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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseIntClassFieldExtractor.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -5,6 +5,7 @@
 import org.drools.RuntimeDroolsException;
 import org.drools.base.BaseClassFieldExtractor;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 
 public abstract class BaseIntClassFieldExtractor extends BaseClassFieldExtractor {
 
@@ -31,56 +32,56 @@
                valueType );
     }
 
-    public Object getValue(final Object object) {
-        return new Long( getIntValue( object ) );
+    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
+        return new Long( getIntValue( workingMemory, object ) );
     }
 
-    public boolean getBooleanValue(final Object object) {
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
         throw new RuntimeDroolsException( "Conversion to boolean not supported from int" );
     }
 
-    public byte getByteValue(final Object object) {
-        return (byte) getIntValue( object );
+    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (byte) getIntValue( workingMemory, object );
 
     }
 
-    public char getCharValue(final Object object) {
+    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
         throw new RuntimeDroolsException( "Conversion to char not supported from int" );
     }
 
-    public double getDoubleValue(final Object object) {
-        return getIntValue( object );
+    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getIntValue( workingMemory, object );
     }
 
-    public float getFloatValue(final Object object) {
-        return getIntValue( object );
+    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getIntValue( workingMemory, object );
     }
 
-    public abstract int getIntValue(Object object);
+    public abstract int getIntValue(InternalWorkingMemory workingMemory, Object object);
 
-    public long getLongValue(final Object object) {
-        return getIntValue( object );
+    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getIntValue( workingMemory, object );
     }
 
-    public short getShortValue(final Object object) {
-        return (short) getIntValue( object );
+    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (short) getIntValue( workingMemory, object );
     }
 
-    public boolean isNullValue(final Object object) {
+    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
         return false;
     }
 
     public Method getNativeReadMethod() {
         try {
             return this.getClass().getDeclaredMethod( "getIntValue",
-                                                      new Class[]{Object.class} );
+                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
         } catch ( final Exception e ) {
             throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
                                               e );
         }
     }
 
-    public int getHashCode(final Object object) {
-        return getIntValue( object );
+    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
+        return getIntValue( workingMemory, object );
     }
 }

Modified: 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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseLongClassFieldExtractors.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -5,6 +5,7 @@
 import org.drools.RuntimeDroolsException;
 import org.drools.base.BaseClassFieldExtractor;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 
 public abstract class BaseLongClassFieldExtractors extends BaseClassFieldExtractor {
 
@@ -31,57 +32,57 @@
                valueType );
     }
 
-    public Object getValue(final Object object) {
-        return new Long( getLongValue( object ) );
+    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
+        return new Long( getLongValue( workingMemory, object ) );
     }
 
-    public boolean getBooleanValue(final Object object) {
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
         throw new RuntimeDroolsException( "Conversion to boolean not supported from long" );
     }
 
-    public byte getByteValue(final Object object) {
-        return (byte) getLongValue( object );
+    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (byte) getLongValue( workingMemory, object );
 
     }
 
-    public char getCharValue(final Object object) {
+    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
         throw new RuntimeDroolsException( "Conversion to char not supported from long" );
     }
 
-    public double getDoubleValue(final Object object) {
-        return getLongValue( object );
+    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getLongValue( workingMemory, object );
     }
 
-    public float getFloatValue(final Object object) {
-        return getLongValue( object );
+    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getLongValue( workingMemory, object );
     }
 
-    public int getIntValue(final Object object) {
-        return (int) getLongValue( object );
+    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (int) getLongValue( workingMemory, object );
     }
 
-    public abstract long getLongValue(Object object);
+    public abstract long getLongValue(InternalWorkingMemory workingMemory, Object object);
 
-    public short getShortValue(final Object object) {
-        return (short) getLongValue( object );
+    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (short) getLongValue( workingMemory, object );
     }
 
-    public boolean isNullValue(final Object object) {
+    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
         return false;
     }
 
     public Method getNativeReadMethod() {
         try {
             return this.getClass().getDeclaredMethod( "getLongValue",
-                                                      new Class[]{Object.class} );
+                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
         } catch ( final Exception e ) {
             throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
                                               e );
         }
     }
 
-    public int getHashCode(final Object object) {
-        final long temp = getLongValue( object );
+    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
+        final long temp = getLongValue( workingMemory, object );
         return (int) (temp ^ (temp >>> 32));
     }
 

Modified: 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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -5,6 +5,7 @@
 import org.drools.RuntimeDroolsException;
 import org.drools.base.BaseClassFieldExtractor;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 
 public abstract class BaseObjectClassFieldExtractor extends BaseClassFieldExtractor {
 
@@ -24,12 +25,12 @@
                fieldName );
     }
 
-    public abstract Object getValue(Object object);
+    public abstract Object getValue(InternalWorkingMemory workingMemory, Object object);
 
-    public boolean getBooleanValue(final Object object) {
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
         // this can be improved by generating specific 
         // bytecode generation in the subclass, avoiding the if instanceof
-        final Object value = getValue( object );
+        final Object value = getValue( workingMemory, object );
         
         if ( value instanceof Boolean ) {
             return ((Boolean) value).booleanValue();
@@ -37,10 +38,10 @@
         throw new RuntimeDroolsException( "Conversion to boolean not supported from " + value.getClass().getName() );
     }
 
-    public byte getByteValue(final Object object) {
+    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
         // this can be improved by generating specific 
         // bytecode generation in the subclass, avoiding the if instanceof
-        final Object value = getValue( object );
+        final Object value = getValue( workingMemory, object );
         
         if ( value instanceof Number ) {
             return ((Number) value).byteValue();
@@ -48,10 +49,10 @@
         throw new RuntimeDroolsException( "Conversion to byte not supported from " + value.getClass().getName() );
     }
 
-    public char getCharValue(final Object object) {
+    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
         // this can be improved by generating specific 
         // bytecode generation in the subclass, avoiding the if instanceof
-        final Object value = getValue( object );
+        final Object value = getValue( workingMemory, object );
         
         if ( value instanceof Character ) {
             return ((Character) value).charValue();
@@ -59,10 +60,10 @@
         throw new RuntimeDroolsException( "Conversion to char not supported from " + value.getClass().getName() );
     }
 
-    public double getDoubleValue(final Object object) {
+    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
         // this can be improved by generating specific 
         // bytecode generation in the subclass, avoiding the if instanceof
-        final Object value = getValue( object );
+        final Object value = getValue( workingMemory, object );
         
         if ( value instanceof Number ) {
             return ((Number) value).doubleValue();
@@ -70,10 +71,10 @@
         throw new RuntimeDroolsException( "Conversion to double not supported from " + value.getClass().getName() );
     }
 
-    public float getFloatValue(final Object object) {
+    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
         // this can be improved by generating specific 
         // bytecode generation in the subclass, avoiding the if instanceof
-        final Object value = getValue( object );
+        final Object value = getValue( workingMemory, object );
         
         if ( value instanceof Number ) {
             return ((Number) value).floatValue();
@@ -81,10 +82,10 @@
         throw new RuntimeDroolsException( "Conversion to float not supported from " + value.getClass().getName() );
     }
 
-    public int getIntValue(final Object object) {
+    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
         // this can be improved by generating specific 
         // bytecode generation in the subclass, avoiding the if instanceof
-        final Object value = getValue( object );
+        final Object value = getValue( workingMemory, object );
         
         if ( value instanceof Number ) {
             return ((Number) value).intValue();
@@ -92,10 +93,10 @@
         throw new RuntimeDroolsException( "Conversion to int not supported from " + value.getClass().getName() );
     }
 
-    public long getLongValue(final Object object) {
+    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
         // this can be improved by generating specific 
         // bytecode generation in the subclass, avoiding the if instanceof
-        final Object value = getValue( object );
+        final Object value = getValue( workingMemory, object );
         
         if ( value instanceof Number ) {
             return ((Number) value).longValue();
@@ -103,10 +104,10 @@
         throw new RuntimeDroolsException( "Conversion to long not supported from " + value.getClass().getName() );
     }
 
-    public short getShortValue(final Object object) {
+    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
         // this can be improved by generating specific 
         // bytecode generation in the subclass, avoiding the if instanceof
-        final Object value = getValue( object );
+        final Object value = getValue( workingMemory, object );
 
         if ( value instanceof Number ) {
             return ((Number) value).shortValue();
@@ -114,26 +115,26 @@
         throw new RuntimeDroolsException( "Conversion to short not supported from " + value.getClass().getName() );
     }
     
-    public boolean isNullValue(final Object object) {
+    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
         if (object == null) {
             return true;
         } else {
-            return getValue( object ) == null;
+            return getValue( workingMemory, object ) == null;
         }
     }
 
     public Method getNativeReadMethod() {
         try {
             return this.getClass().getDeclaredMethod( "getValue",
-                                                      new Class[]{Object.class} );
+                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
         } catch ( final Exception e ) {
             throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
                                               e );
         }
     }
 
-    public int getHashCode(final Object object) {
-        final Object value = getValue( object );
+    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
+        final Object value = getValue( workingMemory, object );
         return (value != null) ? value.hashCode() : 0;
     }
 

Modified: 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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseShortClassFieldExtractor.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -5,6 +5,7 @@
 import org.drools.RuntimeDroolsException;
 import org.drools.base.BaseClassFieldExtractor;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 
 public abstract class BaseShortClassFieldExtractor extends BaseClassFieldExtractor {
 
@@ -31,56 +32,56 @@
                valueType );
     }
 
-    public Object getValue(final Object object) {
-        return new Long( getShortValue( object ) );
+    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
+        return new Long( getShortValue( workingMemory, object ) );
     }
 
-    public boolean getBooleanValue(final Object object) {
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
         throw new RuntimeDroolsException( "Conversion to boolean not supported from short" );
     }
 
-    public byte getByteValue(final Object object) {
-        return (byte) getShortValue( object );
+    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (byte) getShortValue( workingMemory, object );
 
     }
 
-    public char getCharValue(final Object object) {
+    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
         throw new RuntimeDroolsException( "Conversion to char not supported from short" );
     }
 
-    public double getDoubleValue(final Object object) {
-        return getShortValue( object );
+    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getShortValue( workingMemory, object );
     }
 
-    public float getFloatValue(final Object object) {
-        return getShortValue( object );
+    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getShortValue( workingMemory, object );
     }
 
-    public int getIntValue(final Object object) {
-        return getShortValue( object );
+    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getShortValue( workingMemory, object );
     }
 
-    public long getLongValue(final Object object) {
-        return getShortValue( object );
+    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getShortValue( workingMemory, object );
     }
 
-    public abstract short getShortValue(Object object);
+    public abstract short getShortValue(InternalWorkingMemory workingMemory, Object object);
     
-    public boolean isNullValue(final Object object) {
+    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
         return false;
     }
 
     public Method getNativeReadMethod() {
         try {
             return this.getClass().getDeclaredMethod( "getShortValue",
-                                                      new Class[]{Object.class} );
+                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
         } catch ( final Exception e ) {
             throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
                                               e );
         }
     }
 
-    public int getHashCode(final Object object) {
-        return getShortValue( object );
+    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
+        return getShortValue( workingMemory, object );
     }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/MVELClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/MVELClassFieldExtractor.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/MVELClassFieldExtractor.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -25,6 +25,7 @@
 import org.drools.base.ClassFieldExtractorCache;
 import org.drools.base.ClassFieldExtractorFactory;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.spi.Extractor;
 import org.drools.spi.FieldExtractor;
 import org.mvel.CompiledExpression;
@@ -69,13 +70,13 @@
     /* (non-Javadoc)
      * @see org.drools.base.extractors.BaseObjectClassFieldExtractor#getValue(java.lang.Object)
      */
-    public Object getValue(Object object) {
+    public Object getValue(InternalWorkingMemory workingMemory, Object object) {
         for( Iterator it = this.extractors.entrySet().iterator(); it.hasNext(); ) {
             Map.Entry entry = (Map.Entry) it.next();
             String var = (String) entry.getKey();
             FieldExtractor extr = (FieldExtractor) entry.getValue();
             
-            this.variables.put( var, extr.getValue( object ));
+            this.variables.put( var, extr.getValue( workingMemory, object ));
         }
         return MVEL.executeExpression( mvelExpression, this.variables );
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/SelfReferenceClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/SelfReferenceClassFieldExtractor.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/SelfReferenceClassFieldExtractor.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -18,6 +18,7 @@
 
 import org.drools.base.ShadowProxy;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 
 /**
  * A special field extractor for the self reference "this".
@@ -35,11 +36,11 @@
                ValueType.determineValueType( clazz ) ); // value type
     }
 
-    public Object getValue(final Object object) {
+    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
         return (object instanceof ShadowProxy) ? ((ShadowProxy) object).getShadowedObject() : object;
     }   
     
-    public boolean isNullValue(final Object object) {
-        return getValue( object ) == null;
+    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getValue( workingMemory, object ) == null;
     }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELLocalDeclarationVariable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELLocalDeclarationVariable.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELLocalDeclarationVariable.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -2,6 +2,7 @@
 
 import java.io.Serializable;
 
+import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.Declaration;
 import org.mvel.integration.VariableResolver;
 
@@ -28,7 +29,7 @@
     }
 
     public Object getValue() {
-        return this.declaration.getValue( this.factory.getObject() );
+        return this.declaration.getValue( (InternalWorkingMemory) this.factory.getWorkingMemory(), this.factory.getObject() );
     }
 
     public void setValue(final Object value) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELPreviousDeclarationVariable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELPreviousDeclarationVariable.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELPreviousDeclarationVariable.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -2,6 +2,7 @@
 
 import java.io.Serializable;
 
+import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.Declaration;
 import org.mvel.integration.VariableResolver;
 
@@ -28,7 +29,7 @@
     }
 
     public Object getValue() {
-        return this.declaration.getValue( this.factory.getValue( this.declaration ) );
+        return this.declaration.getValue( (InternalWorkingMemory) this.factory.getWorkingMemory(), this.factory.getValue( this.declaration ) );
     }    
 
     public void setValue(final Object value) {

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/facttemplates/FactTemplateFieldExtractor.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -4,6 +4,7 @@
 
 import org.drools.RuntimeDroolsException;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.spi.FieldExtractor;
 
 public class FactTemplateFieldExtractor
@@ -24,7 +25,7 @@
         return this.factTemplate.getFieldTemplate( this.fieldIndex ).getValueType();
     }
 
-    public Object getValue(final Object object) {
+    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
         return ((Fact) object).getFieldValue( this.fieldIndex );
     }
 
@@ -36,35 +37,35 @@
         return Fact.class;//this.factTemplate.getFieldTemplate( fieldIndex ).getValueType().getClass();
     }
 
-    public boolean getBooleanValue(final Object object) {
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
         return ((Boolean) ((Fact) object).getFieldValue( this.fieldIndex )).booleanValue();
     }
 
-    public byte getByteValue(final Object object) {
+    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
         return ((Number) ((Fact) object).getFieldValue( this.fieldIndex )).byteValue();
     }
 
-    public char getCharValue(final Object object) {
+    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
         return ((Character) ((Fact) object).getFieldValue( this.fieldIndex )).charValue();
     }
 
-    public double getDoubleValue(final Object object) {
+    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
         return ((Number) ((Fact) object).getFieldValue( this.fieldIndex )).doubleValue();
     }
 
-    public float getFloatValue(final Object object) {
+    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
         return ((Number) ((Fact) object).getFieldValue( this.fieldIndex )).floatValue();
     }
 
-    public int getIntValue(final Object object) {
+    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
         return ((Number) ((Fact) object).getFieldValue( this.fieldIndex )).intValue();
     }
 
-    public long getLongValue(final Object object) {
+    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
         return ((Number) ((Fact) object).getFieldValue( this.fieldIndex )).longValue();
     }
 
-    public short getShortValue(final Object object) {
+    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
         return ((Number) ((Fact) object).getFieldValue( this.fieldIndex )).shortValue();
     }
 
@@ -78,11 +79,16 @@
         }
     }
 
-    public int getHashCode(final Object object) {
-        return getValue( object ).hashCode();
+    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
+        return getValue( workingMemory, object ).hashCode();
     }
 
-    public boolean isNullValue(Object object) {
+    public boolean isGlobal() {
+        return false;
+    }
+
+    public boolean isNullValue(InternalWorkingMemory workingMemory,
+                               Object object) {
         return ((Fact) object).getFieldValue( this.fieldIndex ) == null;
     }
 }

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -460,20 +460,20 @@
             this.index = index;
             final ValueType vtype = extractor.getValueType();
             if ( vtype.isBoolean() ) {
-                this.bvalue = extractor.getBooleanValue( value );
+                this.bvalue = extractor.getBooleanValue( null, value );
                 this.type = BOOL;
                 this.setHashCode( this.bvalue ? 1231 : 1237 );
             } else if ( vtype.isIntegerNumber() ) {
-                this.lvalue = extractor.getLongValue( value );
+                this.lvalue = extractor.getLongValue( null, value );
                 this.type = LONG;
                 this.setHashCode( (int) (this.lvalue ^ (this.lvalue >>> 32)) );
             } else if ( vtype.isFloatNumber() ) {
-                this.dvalue = extractor.getDoubleValue( value );
+                this.dvalue = extractor.getDoubleValue( null, value );
                 this.type = DOUBLE;
                 final long temp = Double.doubleToLongBits( this.dvalue );
                 this.setHashCode( (int) (temp ^ (temp >>> 32)) );
             } else {
-                this.ovalue = extractor.getValue( value );
+                this.ovalue = extractor.getValue( null, value );
                 this.type = OBJECT;
                 this.setHashCode( this.ovalue.hashCode() );
             }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -125,7 +125,7 @@
 
             boolean isAlphaConstraint = true;
             for ( int i = 0; isAlphaConstraint && i < declarations.length; i++ ) {
-                if ( declarations[i].getPattern() != pattern ) {
+                if ( ! declarations[i].isGlobal() && declarations[i].getPattern() != pattern ) {
                     isAlphaConstraint = false;
                 }
             }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Declaration.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Declaration.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Declaration.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -43,6 +43,7 @@
 import java.io.Serializable;
 
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.spi.Extractor;
 
 /*
@@ -160,45 +161,49 @@
         return this.extractor;
     }
 
-    public Object getValue(final Object object) {
-        return this.extractor.getValue( object );
+    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
+        return this.extractor.getValue( workingMemory, object );
     }
 
-    public char getCharValue(final Object object) {
-        return this.extractor.getCharValue( object );
+    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
+        return this.extractor.getCharValue( workingMemory, object );
     }
 
-    public int getIntValue(final Object object) {
-        return this.extractor.getIntValue( object );
+    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
+        return this.extractor.getIntValue( workingMemory, object );
     }
 
-    public byte getByteValue(final Object object) {
-        return this.extractor.getByteValue( object );
+    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
+        return this.extractor.getByteValue( workingMemory, object );
     }
 
-    public short getShortValue(final Object object) {
-        return this.extractor.getShortValue( object );
+    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
+        return this.extractor.getShortValue( workingMemory, object );
     }
 
-    public long getLongValue(final Object object) {
-        return this.extractor.getLongValue( object );
+    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
+        return this.extractor.getLongValue( workingMemory, object );
     }
 
-    public float getFloatValue(final Object object) {
-        return this.extractor.getFloatValue( object );
+    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
+        return this.extractor.getFloatValue( workingMemory, object );
     }
 
-    public double getDoubleValue(final Object object) {
-        return this.extractor.getDoubleValue( object );
+    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
+        return this.extractor.getDoubleValue( workingMemory, object );
     }
 
-    public boolean getBooleanValue(final Object object) {
-        return this.extractor.getBooleanValue( object );
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
+        return this.extractor.getBooleanValue( workingMemory, object );
     }
 
-    public int getHashCode(final Object object) {
-        return this.extractor.getHashCode( object );
+    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
+        return this.extractor.getHashCode( workingMemory, object );
     }
+    
+    public boolean isGlobal() {
+        return this.extractor.isGlobal();
+    }
 
     // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -58,23 +58,23 @@
     public boolean isAllowed(final Extractor extractor,
                              final Object object,
                              final InternalWorkingMemory workingMemoiry) {
-        return this.evaluator.evaluate( extractor,
-                                        object,
-                                        this.field );
+        return this.evaluator.evaluate( null,
+                                        extractor,
+                                        object, this.field );
     }
 
     public boolean isAllowedCachedLeft(final ContextEntry context,
                                        final Object object) {
-        return this.evaluator.evaluate( ((LiteralContextEntry) context).getFieldExtractor(),
-                                        object,
-                                        this.field );
+        return this.evaluator.evaluate( null,
+                                        ((LiteralContextEntry) context).getFieldExtractor(),
+                                        object, this.field );
     }
 
     public boolean isAllowedCachedRight(final ReteTuple tuple,
                                         final ContextEntry context) {
-        return this.evaluator.evaluate( ((LiteralContextEntry) context).getFieldExtractor(),
-                                        ((LiteralContextEntry) context).getObject(),
-                                        this.field );
+        return this.evaluator.evaluate( null,
+                                        ((LiteralContextEntry) context).getFieldExtractor(),
+                                        ((LiteralContextEntry) context).getObject(), this.field );
     }
 
     /**

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -140,13 +140,13 @@
                              final Tuple tuple,
                              final WorkingMemory workingMemory) {
         try {
-            return this.evaluator.evaluate( extractor,
-                                            object,
-                                            this.expression.evaluate( object,
-                                                                      tuple,
-                                                                      this.previousDeclarations,
-                                                                      this.localDeclarations,
-                                                                      workingMemory ) );
+            return this.evaluator.evaluate( null,
+                                            extractor,
+                                            object, this.expression.evaluate( object,
+                                                                                              tuple,
+                                                                                              this.previousDeclarations,
+                                                                                              this.localDeclarations,
+                                                                                              workingMemory ) );
         } catch ( final Exception e ) {
             throw new RuntimeDroolsException( e );
         }

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -60,23 +60,23 @@
 
     public boolean isAllowed(final Extractor extractor,
                              final Object object,
-                             final InternalWorkingMemory workingMemoiry) {
-        return this.evaluator.evaluate( this.contextEntry.extractor,
+                             final InternalWorkingMemory workingMemory) {
+        return this.evaluator.evaluate( workingMemory,
+                                        this.contextEntry.extractor,
                                         object,
-                                        this.contextEntry.declaration.getExtractor(),
-                                        object );
+                                        this.contextEntry.declaration.getExtractor(), object );
     }
 
     public boolean isAllowedCachedLeft(final ContextEntry context,
                                        final Object object) {
-        return this.evaluator.evaluateCachedLeft( (VariableContextEntry) context,
-                                                  object );
+        return this.evaluator.evaluateCachedLeft( ((VariableContextEntry) context).workingMemory,
+                                                  (VariableContextEntry) context, object );
     }
 
     public boolean isAllowedCachedRight(final ReteTuple tuple,
                                         final ContextEntry context) {
-        return this.evaluator.evaluateCachedRight( (VariableContextEntry) context,
-                                                   tuple.get( this.declaration ).getObject() );
+        return this.evaluator.evaluateCachedRight( ((VariableContextEntry) context).workingMemory,
+                                                   (VariableContextEntry) context, tuple.get( this.declaration ).getObject() );
     }
 
     public String toString() {
@@ -146,6 +146,7 @@
         public ContextEntry   entry;
         public boolean     leftNull;
         public boolean     rightNull;
+        public InternalWorkingMemory workingMemory;
 
         public VariableContextEntry(final FieldExtractor extractor,
                                     final Declaration declaration) {
@@ -201,15 +202,17 @@
         public void updateFromTuple(final InternalWorkingMemory workingMemory,
                                     final ReteTuple tuple) {
             this.reteTuple = tuple;
-            this.leftNull = this.declaration.getExtractor().isNullValue( tuple.get( this.declaration ).getObject() );
-            this.left = this.declaration.getExtractor().getValue( tuple.get( this.declaration ).getObject() );
+            this.workingMemory = workingMemory;
+            this.leftNull = this.declaration.getExtractor().isNullValue( workingMemory, tuple.get( this.declaration ).getObject() );
+            this.left = this.declaration.getExtractor().getValue( workingMemory, tuple.get( this.declaration ).getObject() );
         }
 
         public void updateFromFactHandle(final InternalWorkingMemory workingMemory,
                                          final InternalFactHandle handle) {
             this.object = handle.getObject();
-            this.rightNull = this.extractor.isNullValue( handle.getObject() );
-            this.right = this.extractor.getValue( handle.getObject() );
+            this.workingMemory = workingMemory;
+            this.rightNull = this.extractor.isNullValue( workingMemory, handle.getObject() );
+            this.right = this.extractor.getValue( workingMemory, handle.getObject() );
         }
     }
 
@@ -229,10 +232,11 @@
         public void updateFromTuple(final InternalWorkingMemory workingMemory,
                                     final ReteTuple tuple) {
             this.reteTuple = tuple;
-            this.leftNull = this.declaration.getExtractor().isNullValue( tuple.get( this.declaration ).getObject() );
+            this.workingMemory = workingMemory;
+            this.leftNull = this.declaration.getExtractor().isNullValue( workingMemory, tuple.get( this.declaration ).getObject() );
             
             if (!leftNull) {
-                this.left = this.declaration.getExtractor().getLongValue( tuple.get( this.declaration ).getObject() );
+                this.left = this.declaration.getExtractor().getLongValue( workingMemory, tuple.get( this.declaration ).getObject() );
             } else {
                 this.left = 0;
             }
@@ -241,10 +245,11 @@
         public void updateFromFactHandle(final InternalWorkingMemory workingMemory,
                                          final InternalFactHandle handle) {
             this.object = handle.getObject();
-            this.rightNull = this.extractor.isNullValue( handle.getObject() );
+            this.workingMemory = workingMemory;
+            this.rightNull = this.extractor.isNullValue( workingMemory, handle.getObject() );
             
             if ( !rightNull ) { // avoid a NullPointerException
-                this.right = this.extractor.getLongValue( handle.getObject() );
+                this.right = this.extractor.getLongValue( workingMemory, handle.getObject() );
             } else {
                 this.right = 0;
             }
@@ -267,10 +272,11 @@
         public void updateFromTuple(final InternalWorkingMemory workingMemory,
                                     final ReteTuple tuple) {
             this.reteTuple = tuple;
-            this.leftNull = this.declaration.getExtractor().isNullValue( tuple.get( this.declaration ).getObject() );
+            this.workingMemory = workingMemory;
+            this.leftNull = this.declaration.getExtractor().isNullValue( workingMemory, tuple.get( this.declaration ).getObject() );
             
             if (!leftNull) {
-                this.left = this.declaration.getExtractor().getDoubleValue( tuple.get( this.declaration ).getObject() );
+                this.left = this.declaration.getExtractor().getDoubleValue( workingMemory, tuple.get( this.declaration ).getObject() );
             } else {
                 this.left = 0;
             }
@@ -279,10 +285,11 @@
         public void updateFromFactHandle(final InternalWorkingMemory workingMemory,
                                          final InternalFactHandle handle) {
             this.object = handle.getObject();
-            this.rightNull = this.extractor.isNullValue( handle.getObject() );
+            this.workingMemory = workingMemory;
+            this.rightNull = this.extractor.isNullValue( workingMemory, handle.getObject() );
             
             if ( !rightNull ) { // avoid a NullPointerException
-                this.right = this.extractor.getDoubleValue( handle.getObject() );
+                this.right = this.extractor.getDoubleValue( workingMemory, handle.getObject() );
             } else {
                 this.right = 0;
             }
@@ -304,10 +311,11 @@
         public void updateFromTuple(final InternalWorkingMemory workingMemory,
                                     final ReteTuple tuple) {
             this.reteTuple = tuple;
-            this.leftNull = this.declaration.getExtractor().isNullValue( tuple.get( this.declaration ).getObject() );
+            this.workingMemory = workingMemory;
+            this.leftNull = this.declaration.getExtractor().isNullValue( workingMemory, tuple.get( this.declaration ).getObject() );
             
             if ( !leftNull ) {
-                this.left = this.declaration.getExtractor().getBooleanValue( tuple.get( this.declaration ).getObject() );
+                this.left = this.declaration.getExtractor().getBooleanValue( workingMemory, tuple.get( this.declaration ).getObject() );
             } else {
                 this.left = false;
             }
@@ -316,10 +324,11 @@
         public void updateFromFactHandle(final InternalWorkingMemory workingMemory,
                                          final InternalFactHandle handle) {
             this.object = handle.getObject();
-            this.rightNull = this.extractor.isNullValue( handle.getObject() );
+            this.workingMemory = workingMemory;
+            this.rightNull = this.extractor.isNullValue( workingMemory, handle.getObject() );
             
             if ( !rightNull ) { // avoid a NullPointerException
-                this.right = this.extractor.getBooleanValue( handle.getObject() );
+                this.right = this.extractor.getBooleanValue( workingMemory, handle.getObject() );
             } else {
                 this.right = false;
             }

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Evaluator.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -20,6 +20,7 @@
 
 import org.drools.base.ValueType;
 import org.drools.base.evaluators.Operator;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 
 public interface Evaluator
@@ -33,29 +34,33 @@
     /**
      * This method will extract the value from the object1 using the 
      * extractor and compare it with the object2.
-     * 
+     * @param workingMemory TODO
      * @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,
+    public boolean evaluate(InternalWorkingMemory workingMemory,
+                            Extractor extractor,
                             Object object1,
                             FieldValue value);
 
-    public boolean evaluate(Extractor leftExtractor,
+    public boolean evaluate(InternalWorkingMemory workingMemory,
+                            Extractor leftExtractor,
                             Object left,
                             Extractor rightExtractor,
                             Object right);
 
-    public boolean evaluateCachedLeft(VariableContextEntry context,
+    public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                      VariableContextEntry context,
                                       Object object1);
 
-    public boolean evaluateCachedRight(VariableContextEntry context,
+    public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                       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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Extractor.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -20,30 +20,33 @@
 import java.lang.reflect.Method;
 
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 
 public interface Extractor
     extends
     Serializable {
 
-    public Object getValue(Object object);
+    public Object getValue(InternalWorkingMemory workingMemory, Object object);
 
-    public char getCharValue(Object object);
+    public char getCharValue(InternalWorkingMemory workingMemory, Object object);
 
-    public int getIntValue(Object object);
+    public int getIntValue(InternalWorkingMemory workingMemory, Object object);
 
-    public byte getByteValue(Object object);
+    public byte getByteValue(InternalWorkingMemory workingMemory, Object object);
 
-    public short getShortValue(Object object);
+    public short getShortValue(InternalWorkingMemory workingMemory, Object object);
 
-    public long getLongValue(Object object);
+    public long getLongValue(InternalWorkingMemory workingMemory, Object object);
 
-    public float getFloatValue(Object object);
+    public float getFloatValue(InternalWorkingMemory workingMemory, Object object);
 
-    public double getDoubleValue(Object object);
+    public double getDoubleValue(InternalWorkingMemory workingMemory, Object object);
 
-    public boolean getBooleanValue(Object object);
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, Object object);
     
-    public boolean isNullValue(Object object);
+    public boolean isNullValue(InternalWorkingMemory workingMemory, Object object);
+    
+    public boolean isGlobal();
 
     public ValueType getValueType();
 
@@ -51,6 +54,6 @@
 
     public Method getNativeReadMethod();
 
-    public int getHashCode(Object object);
+    public int getHashCode(InternalWorkingMemory workingMemory, Object object);
 
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/GlobalExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/GlobalExtractor.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/GlobalExtractor.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -19,13 +19,13 @@
 import java.lang.reflect.Method;
 import java.util.Map;
 
+import org.drools.RuntimeDroolsException;
 import org.drools.base.ClassObjectType;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 
 /**
- * This is a dummy extractor used during rule compilation and build. It is not
- * supposed to be used to extract real global values during runtime, so
- * all getValueXXX() methods will raise unsupported operation exceptions.
+ * This is a global variable extractor used to get a global variable value
  * 
  * @author etirelli
  */
@@ -43,8 +43,8 @@
         this.objectType = new ClassObjectType( (Class) map.get( this.key ));
     }
 
-    public Object getValue(final Object object) {
-        throw new UnsupportedOperationException("Operation not suported for globals");
+    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
+        return workingMemory.getGlobal( key );
     }
 
     public ObjectType getObjectType() {
@@ -59,44 +59,75 @@
         return this.objectType.getValueType();
     }
 
-    public boolean getBooleanValue(final Object object) {
-        throw new UnsupportedOperationException("Operation not suported for globals");
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
+        if( this.objectType.getValueType().isBoolean() ) {
+            return ((Boolean) workingMemory.getGlobal( key )).booleanValue();
+        }
+        throw new ClassCastException("Not possible to convert global '"+key+"' into a boolean.");
     }
 
-    public byte getByteValue(final Object object) {
-        throw new UnsupportedOperationException("Operation not suported for globals");
+    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
+        if( this.objectType.getValueType().isNumber() ) {
+            return ((Number) workingMemory.getGlobal( key )).byteValue();
+        }
+        throw new ClassCastException("Not possible to convert global '"+key+"' into a byte.");
     }
 
-    public char getCharValue(final Object object) {
-        throw new UnsupportedOperationException("Operation not suported for globals");
+    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
+        if( this.objectType.getValueType().isChar() ) {
+            return ((Character) workingMemory.getGlobal( key )).charValue();
+        }
+        throw new ClassCastException("Not possible to convert global '"+key+"' into a char.");
     }
 
-    public double getDoubleValue(final Object object) {
-        throw new UnsupportedOperationException("Operation not suported for globals");
+    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
+        if( this.objectType.getValueType().isNumber() ) {
+            return ((Number) workingMemory.getGlobal( key )).doubleValue();
+        }
+        throw new ClassCastException("Not possible to convert global '"+key+"' into a double.");
     }
 
-    public float getFloatValue(final Object object) {
-        throw new UnsupportedOperationException("Operation not suported for globals");
+    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
+        if( this.objectType.getValueType().isNumber() ) {
+            return ((Number) workingMemory.getGlobal( key )).floatValue();
+        }
+        throw new ClassCastException("Not possible to convert global '"+key+"' into a float.");
     }
 
-    public int getIntValue(final Object object) {
-        throw new UnsupportedOperationException("Operation not suported for globals");
+    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
+        if( this.objectType.getValueType().isNumber() ) {
+            return ((Number) workingMemory.getGlobal( key )).intValue();
+        }
+        throw new ClassCastException("Not possible to convert global '"+key+"' into an int.");
     }
 
-    public long getLongValue(final Object object) {
-        throw new UnsupportedOperationException("Operation not suported for globals");
+    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
+        if( this.objectType.getValueType().isNumber() ) {
+            return ((Number) workingMemory.getGlobal( key )).longValue();
+        }
+        throw new ClassCastException("Not possible to convert global '"+key+"' into a long.");
     }
 
-    public short getShortValue(final Object object) {
-        throw new UnsupportedOperationException("Operation not suported for globals");
+    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
+        if( this.objectType.getValueType().isNumber() ) {
+            return ((Number) workingMemory.getGlobal( key )).shortValue();
+        }
+        throw new ClassCastException("Not possible to convert global '"+key+"' into a short.");
     }
 
     public Method getNativeReadMethod() {
-        throw new UnsupportedOperationException("Operation not suported for globals");
+        try {
+            return this.getClass().getDeclaredMethod( "getValue",
+                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
+                                              e );
+        }
     }
 
-    public int getHashCode(final Object object) {
-        throw new UnsupportedOperationException("Operation not suported for globals");
+    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
+        final Object value = getValue( workingMemory, object );
+        return (value != null) ? value.hashCode() : 0;
     }
 
     public int hashCode() {
@@ -115,7 +146,12 @@
                ( this.objectType == null ? other.objectType == null : this.objectType.equals( other.objectType ));
     }
 
-    public boolean isNullValue(Object object) {
-        throw new UnsupportedOperationException("Operation not supported for globals");
+    public boolean isNullValue( InternalWorkingMemory workingMemory, Object object ) {
+        final Object value = getValue( workingMemory, object );
+        return value == null;
     }
+
+    public boolean isGlobal() {
+        return true;
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/PatternExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/PatternExtractor.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/PatternExtractor.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -6,6 +6,7 @@
 import org.drools.base.ClassObjectType;
 import org.drools.base.ShadowProxy;
 import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.facttemplates.Fact;
 
 /*
@@ -38,7 +39,7 @@
         this.objectType = objectType;
     }
 
-    public Object getValue(final Object object) {
+    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
         // need to use instanceof because an object may be created in nodes like accumulate and from
         // where no shadow is applied
         return (object instanceof ShadowProxy) ? ((ShadowProxy) object).getShadowedObject() : object;
@@ -61,56 +62,56 @@
         return this.objectType.getValueType();
     }
 
-    public boolean getBooleanValue(final Object object) {
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final 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(final Object object) {
+    public byte getByteValue(InternalWorkingMemory workingMemory, final 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(final Object object) {
+    public char getCharValue(InternalWorkingMemory workingMemory, final 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(final Object object) {
+    public double getDoubleValue(InternalWorkingMemory workingMemory, final 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(final Object object) {
+    public float getFloatValue(InternalWorkingMemory workingMemory, final 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(final Object object) {
+    public int getIntValue(InternalWorkingMemory workingMemory, final 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(final Object object) {
+    public long getLongValue(InternalWorkingMemory workingMemory, final 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(final Object object) {
+    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
         if ( this.objectType.getValueType().isNumber() ) {
             return ((Number) object).shortValue();
         }
@@ -120,19 +121,19 @@
     public Method getNativeReadMethod() {
         try {
             return this.getClass().getDeclaredMethod( "getValue",
-                                                      new Class[]{Object.class} );
+                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
         } catch ( final Exception e ) {
             throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
                                               e );
         }
     }
 
-    public boolean isNullValue(final Object object) {
-        return getValue( object ) == null;
+    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object ) {
+        return getValue( workingMemory, object ) == null;
     }
 
-    public int getHashCode(final Object object) {
-        return getValue( object ).hashCode();
+    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
+        return getValue( workingMemory, object ).hashCode();
     }
 
     public int hashCode() {
@@ -149,4 +150,8 @@
         final PatternExtractor other = (PatternExtractor) obj;
         return this.objectType.equals( other.objectType );
     }
+
+    public boolean isGlobal() {
+        return false;
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -463,13 +463,13 @@
 
         public int hashCodeOf(final Object object) {
             int hashCode = this.startResult;
-            hashCode = TupleIndexHashTable.PRIME * hashCode + this.extractor.getHashCode( object );
+            hashCode = TupleIndexHashTable.PRIME * hashCode + this.extractor.getHashCode( null, object );
             return rehash( hashCode );
         }
 
         public int hashCodeOf(final ReteTuple tuple) {
             int hashCode = this.startResult;
-            hashCode = TupleIndexHashTable.PRIME * hashCode + this.declaration.getHashCode( tuple.get( this.declaration ).getObject() );
+            hashCode = TupleIndexHashTable.PRIME * hashCode + this.declaration.getHashCode( null, tuple.get( this.declaration ).getObject() );
             return rehash( hashCode );
         }
 
@@ -477,29 +477,29 @@
                              final ReteTuple tuple) {
             final Object left = tuple.get( this.declaration ).getObject();
 
-            return this.evaluator.evaluate( this.declaration.getExtractor(),
+            return this.evaluator.evaluate( null,
+                                            this.declaration.getExtractor(),
                                             left,
-                                            this.extractor,
-                                            right );
+                                            this.extractor, right );
         }
 
         public boolean equal(final Object object1,
                              final Object object2) {
 
-            return this.evaluator.evaluate( this.extractor,
+            return this.evaluator.evaluate( null,
+                                            this.extractor,
                                             object1,
-                                            this.extractor,
-                                            object2 );
+                                            this.extractor, object2 );
         }
 
         public boolean equal(final ReteTuple tuple1,
                              final ReteTuple tuple2) {
             final Object object1 = tuple1.get( this.declaration ).getObject();
             final Object object2 = tuple2.get( this.declaration ).getObject();
-            return this.evaluator.evaluate( this.declaration.getExtractor(),
+            return this.evaluator.evaluate( null,
+                                            this.declaration.getExtractor(),
                                             object1,
-                                            this.declaration.getExtractor(),
-                                            object2 );
+                                            this.declaration.getExtractor(), object2 );
         }
 
         public int rehash(int h) {
@@ -532,8 +532,8 @@
         public int hashCodeOf(final Object object) {
             int hashCode = this.startResult;
 
-            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index0.extractor.getHashCode( object );
-            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index1.extractor.getHashCode( object );
+            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index0.extractor.getHashCode( null, object );
+            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index1.extractor.getHashCode( null, object );
 
             return rehash( hashCode );
         }
@@ -541,8 +541,8 @@
         public int hashCodeOf(final ReteTuple tuple) {
             int hashCode = this.startResult;
 
-            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index0.declaration.getHashCode( tuple.get( this.index0.declaration ).getObject() );
-            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index1.declaration.getHashCode( tuple.get( this.index1.declaration ).getObject() );
+            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index0.declaration.getHashCode( null, tuple.get( this.index0.declaration ).getObject() );
+            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index1.declaration.getHashCode( null, tuple.get( this.index1.declaration ).getObject() );
 
             return rehash( hashCode );
         }
@@ -552,13 +552,13 @@
             final Object left1 = tuple.get( this.index0.declaration ).getObject();
             final Object left2 = tuple.get( this.index1.declaration ).getObject();
 
-            return this.index0.evaluator.evaluate( this.index0.declaration.getExtractor(),
+            return this.index0.evaluator.evaluate( null,
+                                                   this.index0.declaration.getExtractor(),
                                                    left1,
-                                                   this.index0.extractor,
-                                                   right ) && this.index1.evaluator.evaluate( this.index1.declaration.getExtractor(),
+                                                   this.index0.extractor, right ) && this.index1.evaluator.evaluate( null,
+                                                                                              this.index1.declaration.getExtractor(),
                                                                                               left2,
-                                                                                              this.index1.extractor,
-                                                                                              right );
+                                                                                              this.index1.extractor, right );
         }
 
         public boolean equal(final ReteTuple tuple1,
@@ -569,24 +569,24 @@
             final Object object21 = tuple1.get( this.index1.declaration ).getObject();
             final Object object22 = tuple2.get( this.index1.declaration ).getObject();
 
-            return this.index0.evaluator.evaluate( this.index0.declaration.getExtractor(),
+            return this.index0.evaluator.evaluate( null,
+                                                   this.index0.declaration.getExtractor(),
                                                    object11,
-                                                   this.index0.declaration.getExtractor(),
-                                                   object12 ) && this.index1.evaluator.evaluate( this.index1.declaration.getExtractor(),
+                                                   this.index0.declaration.getExtractor(), object12 ) && this.index1.evaluator.evaluate( null,
+                                                                                                 this.index1.declaration.getExtractor(),
                                                                                                  object21,
-                                                                                                 this.index1.declaration.getExtractor(),
-                                                                                                 object22 );
+                                                                                                 this.index1.declaration.getExtractor(), object22 );
         }
 
         public boolean equal(final Object object1,
                              final Object object2) {
-            return this.index0.evaluator.evaluate( this.index0.extractor,
+            return this.index0.evaluator.evaluate( null,
+                                                   this.index0.extractor,
                                                    object1,
-                                                   this.index0.extractor,
-                                                   object2 ) && this.index1.evaluator.evaluate( this.index1.extractor,
+                                                   this.index0.extractor, object2 ) && this.index1.evaluator.evaluate( null,
+                                                                                                this.index1.extractor,
                                                                                                 object1,
-                                                                                                this.index1.extractor,
-                                                                                                object2 );
+                                                                                                this.index1.extractor, object2 );
         }
 
         public int rehash(int h) {
@@ -620,9 +620,9 @@
         public int hashCodeOf(final Object object) {
             int hashCode = this.startResult;
 
-            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index0.extractor.getHashCode( object );;
-            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index1.extractor.getHashCode( object );;
-            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index2.extractor.getHashCode( object );;
+            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index0.extractor.getHashCode( null, object );;
+            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index1.extractor.getHashCode( null, object );;
+            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index2.extractor.getHashCode( null, object );;
 
             return rehash( hashCode );
         }
@@ -630,9 +630,9 @@
         public int hashCodeOf(final ReteTuple tuple) {
             int hashCode = this.startResult;
 
-            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index0.declaration.getHashCode( tuple.get( this.index0.declaration ).getObject() );
-            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index1.declaration.getHashCode( tuple.get( this.index1.declaration ).getObject() );
-            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index2.declaration.getHashCode( tuple.get( this.index2.declaration ).getObject() );
+            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index0.declaration.getHashCode( null, tuple.get( this.index0.declaration ).getObject() );
+            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index1.declaration.getHashCode( null, tuple.get( this.index1.declaration ).getObject() );
+            hashCode = TupleIndexHashTable.PRIME * hashCode + this.index2.declaration.getHashCode( null, tuple.get( this.index2.declaration ).getObject() );
 
             return rehash( hashCode );
         }
@@ -643,16 +643,16 @@
             final Object left2 = tuple.get( this.index1.declaration ).getObject();
             final Object left3 = tuple.get( this.index2.declaration ).getObject();
 
-            return this.index0.evaluator.evaluate( this.index0.declaration.getExtractor(),
+            return this.index0.evaluator.evaluate( null,
+                                                   this.index0.declaration.getExtractor(),
                                                    left1,
-                                                   this.index0.extractor,
-                                                   right ) && this.index1.evaluator.evaluate( this.index1.declaration.getExtractor(),
+                                                   this.index0.extractor, right ) && this.index1.evaluator.evaluate( null,
+                                                                                              this.index1.declaration.getExtractor(),
                                                                                               left2,
-                                                                                              this.index1.extractor,
-                                                                                              right ) && this.index2.evaluator.evaluate( this.index2.declaration.getExtractor(),
+                                                                                              this.index1.extractor, right ) && this.index2.evaluator.evaluate( null,
+                                                                                                                                         this.index2.declaration.getExtractor(),
                                                                                                                                          left3,
-                                                                                                                                         this.index2.extractor,
-                                                                                                                                         right );
+                                                                                                                                         this.index2.extractor, right );
         }
 
         public boolean equal(final ReteTuple tuple1,
@@ -664,30 +664,30 @@
             final Object object31 = tuple1.get( this.index2.declaration ).getObject();
             final Object object32 = tuple2.get( this.index2.declaration ).getObject();
 
-            return this.index0.evaluator.evaluate( this.index0.declaration.getExtractor(),
+            return this.index0.evaluator.evaluate( null,
+                                                   this.index0.declaration.getExtractor(),
                                                    object11,
-                                                   this.index0.declaration.getExtractor(),
-                                                   object12 ) && this.index1.evaluator.evaluate( this.index1.declaration.getExtractor(),
+                                                   this.index0.declaration.getExtractor(), object12 ) && this.index1.evaluator.evaluate( null,
+                                                                                                 this.index1.declaration.getExtractor(),
                                                                                                  object21,
-                                                                                                 this.index1.declaration.getExtractor(),
-                                                                                                 object22 ) && this.index2.evaluator.evaluate( this.index2.declaration.getExtractor(),
+                                                                                                 this.index1.declaration.getExtractor(), object22 ) && this.index2.evaluator.evaluate( null,
+                                                                                                                                               this.index2.declaration.getExtractor(),
                                                                                                                                                object31,
-                                                                                                                                               this.index2.declaration.getExtractor(),
-                                                                                                                                               object32 );
+                                                                                                                                               this.index2.declaration.getExtractor(), object32 );
         }
 
         public boolean equal(final Object object1,
                              final Object object2) {
-            return this.index0.evaluator.evaluate( this.index0.extractor,
+            return this.index0.evaluator.evaluate( null,
+                                                   this.index0.extractor,
                                                    object1,
-                                                   this.index0.extractor,
-                                                   object2 ) && this.index1.evaluator.evaluate( this.index1.extractor,
+                                                   this.index0.extractor, object2 ) && this.index1.evaluator.evaluate( null,
+                                                                                                this.index1.extractor,
                                                                                                 object1,
-                                                                                                this.index1.extractor,
-                                                                                                object2 ) && this.index2.evaluator.evaluate( this.index2.extractor,
+                                                                                                this.index1.extractor, object2 ) && this.index2.evaluator.evaluate( null,
+                                                                                                                                             this.index2.extractor,
                                                                                                                                              object1,
-                                                                                                                                             this.index2.extractor,
-                                                                                                                                             object2 );
+                                                                                                                                             this.index2.extractor, object2 );
         }
 
         public int rehash(int h) {

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/BaseClassFieldExtractorFactoryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/BaseClassFieldExtractorFactoryTest.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/BaseClassFieldExtractorFactoryTest.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -34,14 +34,14 @@
         assertEquals( 0,
                       ex.getIndex() );
         assertEquals( "michael",
-                      ex.getValue( new TestBean() ) );
+                      ex.getValue( null, new TestBean() ) );
         ex = ClassFieldExtractorFactory.getClassFieldExtractor( TestBean.class,
                                                                 "age",
                                                                 Thread.currentThread().getContextClassLoader() );
         assertEquals( 1,
                       ex.getIndex() );
         assertEquals( 42,
-                      ((Number) ex.getValue( new TestBean() )).intValue() );
+                      ((Number) ex.getValue( null, new TestBean() )).intValue() );
 
     }
 
@@ -52,7 +52,7 @@
         assertEquals( 0,
                       ex.getIndex() );
         assertEquals( "foo",
-                      ex.getValue( new TestInterfaceImpl() ) );
+                      ex.getValue( null, new TestInterfaceImpl() ) );
     }
 
     public void testAbstract() throws Exception {
@@ -62,7 +62,7 @@
         assertEquals( 0,
                       ex.getIndex() );
         assertEquals( "foo",
-                      ex.getValue( new TestAbstractImpl() ) );
+                      ex.getValue( null, new TestAbstractImpl() ) );
     }
 
     public void testInherited() throws Exception {
@@ -70,7 +70,7 @@
                                                                          "text",
                                                                          getClass().getClassLoader() );
         assertEquals( "hola",
-                      ex.getValue( new BeanInherit() ) );
+                      ex.getValue( null, new BeanInherit() ) );
     }
 
     public void testSelfReference() throws Exception {
@@ -79,7 +79,7 @@
                                                                          getClass().getClassLoader() );
         final TestBean bean = new TestBean();
         assertEquals( bean,
-                      ex.getValue( bean ) );
+                      ex.getValue( null, bean ) );
     }
 
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ClassFieldExtractorTest.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ClassFieldExtractorTest.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -40,19 +40,19 @@
                                                                                "blah",
                                                                                getClass().getClassLoader() );
         assertEquals( false,
-                      ((Boolean) ext.getValue( obj )).booleanValue() );
+                      ((Boolean) ext.getValue( null, obj )).booleanValue() );
 
         final ClassFieldExtractor ext2 = ClassFieldExtractorCache.getExtractor( TestBean.class,
                                                                                 "fooBar",
                                                                                 getClass().getClassLoader() );
         assertEquals( "fooBar",
-                      ext2.getValue( obj ) );
+                      ext2.getValue( null, obj ) );
 
         final ClassFieldExtractor ext3 = ClassFieldExtractorCache.getExtractor( TestBean.class,
                                                                                 "objArray",
                                                                                 getClass().getClassLoader() );
         assertEquals( objArray,
-                      ext3.getValue( obj ) );
+                      ext3.getValue( null, obj ) );
 
     }
 
@@ -64,7 +64,7 @@
                                                                                getClass().getClassLoader() );
 
         assertEquals( "foo",
-                      (String) ext.getValue( obj ) );
+                      (String) ext.getValue( null, obj ) );
 
     }
 
@@ -75,7 +75,7 @@
                                                                                getClass().getClassLoader() );
         final TestAbstract obj = new TestAbstractImpl();
         assertEquals( "foo",
-                      (String) ext.getValue( obj ) );
+                      (String) ext.getValue( null, obj ) );
 
     }
 
@@ -85,7 +85,7 @@
                                                                                getClass().getClassLoader() );
         final BeanInherit obj = new BeanInherit();
         assertEquals( "hola",
-                      (String) ext.getValue( obj ) );
+                      (String) ext.getValue( null, obj ) );
 
     }
 
@@ -95,7 +95,7 @@
                                                                                "foo",
                                                                                getClass().getClassLoader() );
         assertEquals( 42,
-                      ((Number) ext.getValue( obj )).intValue() );
+                      ((Number) ext.getValue( null, obj )).intValue() );
     }
 
     public void testLong() throws Exception {
@@ -104,7 +104,7 @@
                                                                                getClass().getClassLoader() );
         final TestBean bean = new TestBean();
         assertEquals( 424242,
-                      ((Number) ext.getValue( bean )).longValue() );
+                      ((Number) ext.getValue( null, bean )).longValue() );
     }
 
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -30,6 +30,7 @@
 import junit.framework.TestCase;
 
 import org.drools.base.evaluators.Operator;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.Declaration;
 import org.drools.rule.VariableRestriction.BooleanVariableContextEntry;
 import org.drools.rule.VariableRestriction.DoubleVariableContextEntry;
@@ -614,9 +615,9 @@
                                                     final Object[] row,
                                                     final Evaluator evaluator) {
         final FieldValue value = FieldFactory.getFieldValue( row[2] );
-        final boolean result = evaluator.evaluate( extractor,
-                                                   row[0],
-                                                   value );
+        final boolean result = evaluator.evaluate( null,
+                                                   extractor,
+                                                   row[0], value );
         final String message = "The evaluator type: [" + valueType + "] with FieldValue incorrectly returned " + result + " for [" + row[0] + " " + row[1] + " " + row[2] + "]. It was asserted to return " + row[3];
 
         if ( row[3] == Boolean.TRUE ) {
@@ -642,8 +643,8 @@
                                                              (FieldExtractor) extractor,
                                                              valueType,
                                                              row );
-        final boolean result = evaluator.evaluateCachedRight( context,
-                                                              row[2] );
+        final boolean result = evaluator.evaluateCachedRight( null,
+                                                              context, row[2] );
         final String message = "The evaluator type: [" + valueType + "] with CachedRight incorrectly returned " + result + " for [" + row[0] + " " + row[1] + " " + row[2] + "]. It was asserted to return " + row[3];
 
         if ( row[3] == Boolean.TRUE ) {
@@ -669,8 +670,8 @@
                                                                    (FieldExtractor) extractor,
                                                              valueType,
                                                              row );
-        final boolean result = evaluator.evaluateCachedLeft( context,
-                                                             row[0] );
+        final boolean result = evaluator.evaluateCachedLeft( null,
+                                                             context, row[0] );
         final String message = "The evaluator type: [" + valueType + "] with CachedLeft incorrectly returned " + result + " for [" + row[0] + " " + row[1] + " " + row[2] + "]. It was asserted to return " + row[3];
 
         if ( row[3] == Boolean.TRUE ) {
@@ -692,10 +693,10 @@
                                                      final Extractor extractor,
                                                      final Object[] row,
                                                      final Evaluator evaluator) {
-        final boolean result = evaluator.evaluate( extractor,
+        final boolean result = evaluator.evaluate( null,
+                                                   extractor,
                                                    row[0],
-                                                   extractor,
-                                                   row[2] );
+                                                   extractor, row[2] );
         final String message = "The evaluator type: [" + valueType + "] with 2 extractors incorrectly returned " + result + " for [" + row[0] + " " + row[1] + " " + row[2] + "]. It was asserted to return " + row[3];
 
         if ( row[3] == Boolean.TRUE ) {
@@ -820,19 +821,19 @@
 
         private static final long serialVersionUID = 2759666130893301563L;
 
-        public boolean getBooleanValue(final Object object) {
+        public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
             return object != null ? ((Boolean) object).booleanValue() : false;
         }
 
-        public byte getByteValue(final Object object) {
+        public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
             return object != null ? ((Number) object).byteValue() : (byte) 0;
         }
 
-        public char getCharValue(final Object object) {
+        public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
             return object != null ? ((Character) object).charValue() : '\0';
         }
 
-        public double getDoubleValue(final Object object) {
+        public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
             return object != null ? ((Number) object).doubleValue() : 0.0;
         }
 
@@ -840,19 +841,19 @@
             return null;
         }
 
-        public float getFloatValue(final Object object) {
+        public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
             return object != null ? ((Number) object).floatValue() : (float) 0.0;
         }
 
-        public int getHashCode(final Object object) {
+        public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
             return 0;
         }
 
-        public int getIntValue(final Object object) {
+        public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
             return object != null ? ((Number) object).intValue() : 0;
         }
 
-        public long getLongValue(final Object object) {
+        public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
             return object != null ? ((Number) object).longValue() : 0;
         }
 
@@ -860,15 +861,15 @@
             return null;
         }
 
-        public short getShortValue(final Object object) {
+        public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
             return object != null ? ((Number) object).shortValue() : (short) 0;
         }
 
-        public Object getValue(final Object object) {
+        public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
             return object;
         }
         
-        public boolean isNullValue(final Object object) {
+        public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object ) {
             return object == null;
         }
 
@@ -881,6 +882,10 @@
             return 0;
         }
 
+        public boolean isGlobal() {
+            return false;
+        }
+
     }
 
     //    public void testRegexFoo() {

Modified: 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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/BooleanClassFieldExtractorTest.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -19,7 +19,7 @@
 
     public void testGetBooleanValue() {
         try {
-            Assert.assertTrue( this.extractor.getBooleanValue( this.bean ) );
+            Assert.assertTrue( this.extractor.getBooleanValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw exception" );
         }
@@ -27,7 +27,7 @@
 
     public void testGetByteValue() {
         try {
-            this.extractor.getByteValue( this.bean );
+            this.extractor.getByteValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -36,7 +36,7 @@
 
     public void testGetCharValue() {
         try {
-            this.extractor.getCharValue( this.bean );
+            this.extractor.getCharValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -45,7 +45,7 @@
 
     public void testGetDoubleValue() {
         try {
-            this.extractor.getDoubleValue( this.bean );
+            this.extractor.getDoubleValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -54,7 +54,7 @@
 
     public void testGetFloatValue() {
         try {
-            this.extractor.getFloatValue( this.bean );
+            this.extractor.getFloatValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -63,7 +63,7 @@
 
     public void testGetIntValue() {
         try {
-            this.extractor.getIntValue( this.bean );
+            this.extractor.getIntValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -72,7 +72,7 @@
 
     public void testGetLongValue() {
         try {
-            this.extractor.getLongValue( this.bean );
+            this.extractor.getLongValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -81,7 +81,7 @@
 
     public void testGetShortValue() {
         try {
-            this.extractor.getShortValue( this.bean );
+            this.extractor.getShortValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -91,7 +91,7 @@
     public void testGetValue() {
         try {
             Assert.assertSame( Boolean.TRUE,
-                               this.extractor.getValue( this.bean ) );
+                               this.extractor.getValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -99,7 +99,7 @@
 
     public void testIsNullValue() {
         try {
-            Assert.assertFalse( this.extractor.isNullValue( this.bean ) );
+            Assert.assertFalse( this.extractor.isNullValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }

Modified: 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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ByteClassFieldExtractorTest.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -19,7 +19,7 @@
 
     public void testGetBooleanValue() {
         try {
-            this.extractor.getBooleanValue( this.bean );
+            this.extractor.getBooleanValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -29,7 +29,7 @@
     public void testGetByteValue() {
         try {
             Assert.assertEquals( 1,
-                                 this.extractor.getByteValue( this.bean ) );
+                                 this.extractor.getByteValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -37,7 +37,7 @@
 
     public void testGetCharValue() {
         try {
-            this.extractor.getCharValue( this.bean );
+            this.extractor.getCharValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -47,7 +47,7 @@
     public void testGetDoubleValue() {
         try {
             Assert.assertEquals( 1.0,
-                                 this.extractor.getDoubleValue( this.bean ),
+                                 this.extractor.getDoubleValue( null, this.bean ),
                                  0.01 );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
@@ -57,7 +57,7 @@
     public void testGetFloatValue() {
         try {
             Assert.assertEquals( 1.0f,
-                                 this.extractor.getFloatValue( this.bean ),
+                                 this.extractor.getFloatValue( null, this.bean ),
                                  0.01 );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
@@ -67,7 +67,7 @@
     public void testGetIntValue() {
         try {
             Assert.assertEquals( 1,
-                                 this.extractor.getIntValue( this.bean ) );
+                                 this.extractor.getIntValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -76,7 +76,7 @@
     public void testGetLongValue() {
         try {
             Assert.assertEquals( 1,
-                                 this.extractor.getLongValue( this.bean ) );
+                                 this.extractor.getLongValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -85,7 +85,7 @@
     public void testGetShortValue() {
         try {
             Assert.assertEquals( 1,
-                                 this.extractor.getShortValue( this.bean ) );
+                                 this.extractor.getShortValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -94,7 +94,7 @@
     public void testGetValue() {
         try {
             Assert.assertEquals( 1,
-                                 ((Number) this.extractor.getValue( this.bean )).byteValue() );
+                                 ((Number) this.extractor.getValue( null, this.bean )).byteValue() );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -102,7 +102,7 @@
     
     public void testIsNullValue() {
         try {
-            Assert.assertFalse( this.extractor.isNullValue( this.bean ) );
+            Assert.assertFalse( this.extractor.isNullValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }

Modified: 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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/CharClassFieldExtractorTest.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -3,7 +3,6 @@
 import junit.framework.Assert;
 
 import org.drools.base.ClassFieldExtractorCache;
-import org.drools.base.ClassFieldExtractorFactory;
 import org.drools.base.TestBean;
 import org.drools.spi.Extractor;
 
@@ -19,7 +18,7 @@
 
     public void testGetBooleanValue() {
         try {
-            this.extractor.getBooleanValue( this.bean );
+            this.extractor.getBooleanValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -29,7 +28,7 @@
     public void testGetByteValue() {
         try {
             Assert.assertEquals( 'a',
-                                 this.extractor.getByteValue( this.bean ) );
+                                 this.extractor.getByteValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw exception" );
         }
@@ -38,7 +37,7 @@
     public void testGetCharValue() {
         try {
             Assert.assertEquals( 'a',
-                                 this.extractor.getCharValue( this.bean ) );
+                                 this.extractor.getCharValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw exception" );
         }
@@ -47,7 +46,7 @@
     public void testGetDoubleValue() {
         try {
             Assert.assertEquals( 'a',
-                                 (int) this.extractor.getDoubleValue( this.bean ) );
+                                 (int) this.extractor.getDoubleValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw exception" );
         }
@@ -56,7 +55,7 @@
     public void testGetFloatValue() {
         try {
             Assert.assertEquals( 'a',
-                                 (int) this.extractor.getFloatValue( this.bean ) );
+                                 (int) this.extractor.getFloatValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw exception" );
         }
@@ -65,7 +64,7 @@
     public void testGetIntValue() {
         try {
             Assert.assertEquals( 'a',
-                                 this.extractor.getIntValue( this.bean ) );
+                                 this.extractor.getIntValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw exception" );
         }
@@ -74,7 +73,7 @@
     public void testGetLongValue() {
         try {
             Assert.assertEquals( 'a',
-                                 (int) this.extractor.getLongValue( this.bean ) );
+                                 (int) this.extractor.getLongValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw exception" );
         }
@@ -83,7 +82,7 @@
     public void testGetShortValue() {
         try {
             Assert.assertEquals( 'a',
-                                 this.extractor.getShortValue( this.bean ) );
+                                 this.extractor.getShortValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw exception" );
         }
@@ -92,7 +91,7 @@
     public void testGetValue() {
         try {
             Assert.assertEquals( 'a',
-                                 ((Number) this.extractor.getValue( this.bean )).intValue() );
+                                 ((Number) this.extractor.getValue( null, this.bean )).intValue() );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -100,7 +99,7 @@
     
     public void testIsNullValue() {
         try {
-            Assert.assertFalse( this.extractor.isNullValue( this.bean ) );
+            Assert.assertFalse( this.extractor.isNullValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }

Modified: 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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/DoubleClassFieldExtractorTest.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -21,7 +21,7 @@
 
     public void testGetBooleanValue() {
         try {
-            this.extractor.getBooleanValue( this.bean );
+            this.extractor.getBooleanValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -31,7 +31,7 @@
     public void testGetByteValue() {
         try {
             Assert.assertEquals( (byte) DoubleClassFieldExtractorTest.VALUE,
-                                 this.extractor.getByteValue( this.bean ) );
+                                 this.extractor.getByteValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -39,7 +39,7 @@
 
     public void testGetCharValue() {
         try {
-            this.extractor.getCharValue( this.bean );
+            this.extractor.getCharValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -49,7 +49,7 @@
     public void testGetDoubleValue() {
         try {
             Assert.assertEquals( DoubleClassFieldExtractorTest.VALUE,
-                                 this.extractor.getDoubleValue( this.bean ),
+                                 this.extractor.getDoubleValue( null, this.bean ),
                                  0.01 );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
@@ -59,7 +59,7 @@
     public void testGetFloatValue() {
         try {
             Assert.assertEquals( DoubleClassFieldExtractorTest.VALUE,
-                                 this.extractor.getFloatValue( this.bean ),
+                                 this.extractor.getFloatValue( null, this.bean ),
                                  0.01 );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
@@ -69,7 +69,7 @@
     public void testGetIntValue() {
         try {
             Assert.assertEquals( (int) DoubleClassFieldExtractorTest.VALUE,
-                                 this.extractor.getIntValue( this.bean ) );
+                                 this.extractor.getIntValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -78,7 +78,7 @@
     public void testGetLongValue() {
         try {
             Assert.assertEquals( (long) DoubleClassFieldExtractorTest.VALUE,
-                                 this.extractor.getLongValue( this.bean ) );
+                                 this.extractor.getLongValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -87,7 +87,7 @@
     public void testGetShortValue() {
         try {
             Assert.assertEquals( (short) DoubleClassFieldExtractorTest.VALUE,
-                                 this.extractor.getShortValue( this.bean ) );
+                                 this.extractor.getShortValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -96,8 +96,8 @@
     public void testGetValue() {
         try {
             Assert.assertEquals( new Double( DoubleClassFieldExtractorTest.VALUE ),
-                                 this.extractor.getValue( this.bean ) );
-            Assert.assertTrue( this.extractor.getValue( this.bean ) instanceof Double );
+                                 this.extractor.getValue( null, this.bean ) );
+            Assert.assertTrue( this.extractor.getValue( null, this.bean ) instanceof Double );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -105,7 +105,7 @@
     
     public void testIsNullValue() {
         try {
-            Assert.assertFalse( this.extractor.isNullValue( this.bean ) );
+            Assert.assertFalse( this.extractor.isNullValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }

Modified: 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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/FloatClassFieldExtractorTest.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -21,7 +21,7 @@
 
     public void testGetBooleanValue() {
         try {
-            this.extractor.getBooleanValue( this.bean );
+            this.extractor.getBooleanValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -31,7 +31,7 @@
     public void testGetByteValue() {
         try {
             Assert.assertEquals( (byte) FloatClassFieldExtractorTest.VALUE,
-                                 this.extractor.getByteValue( this.bean ) );
+                                 this.extractor.getByteValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -39,7 +39,7 @@
 
     public void testGetCharValue() {
         try {
-            this.extractor.getCharValue( this.bean );
+            this.extractor.getCharValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -49,7 +49,7 @@
     public void testGetDoubleValue() {
         try {
             Assert.assertEquals( FloatClassFieldExtractorTest.VALUE,
-                                 this.extractor.getDoubleValue( this.bean ),
+                                 this.extractor.getDoubleValue( null, this.bean ),
                                  0.01 );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
@@ -59,7 +59,7 @@
     public void testGetFloatValue() {
         try {
             Assert.assertEquals( FloatClassFieldExtractorTest.VALUE,
-                                 this.extractor.getFloatValue( this.bean ),
+                                 this.extractor.getFloatValue( null, this.bean ),
                                  0.01 );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
@@ -69,7 +69,7 @@
     public void testGetIntValue() {
         try {
             Assert.assertEquals( (int) FloatClassFieldExtractorTest.VALUE,
-                                 this.extractor.getIntValue( this.bean ) );
+                                 this.extractor.getIntValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -78,7 +78,7 @@
     public void testGetLongValue() {
         try {
             Assert.assertEquals( (long) FloatClassFieldExtractorTest.VALUE,
-                                 this.extractor.getLongValue( this.bean ) );
+                                 this.extractor.getLongValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -87,7 +87,7 @@
     public void testGetShortValue() {
         try {
             Assert.assertEquals( (short) FloatClassFieldExtractorTest.VALUE,
-                                 this.extractor.getShortValue( this.bean ) );
+                                 this.extractor.getShortValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -96,8 +96,8 @@
     public void testGetValue() {
         try {
             Assert.assertEquals( new Float( FloatClassFieldExtractorTest.VALUE ),
-                                 this.extractor.getValue( this.bean ) );
-            Assert.assertTrue( this.extractor.getValue( this.bean ) instanceof Float );
+                                 this.extractor.getValue( null, this.bean ) );
+            Assert.assertTrue( this.extractor.getValue( null, this.bean ) instanceof Float );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -105,7 +105,7 @@
     
     public void testIsNullValue() {
         try {
-            Assert.assertFalse( this.extractor.isNullValue( this.bean ) );
+            Assert.assertFalse( this.extractor.isNullValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }

Modified: 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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/IntClassFieldExtractorTest.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -3,7 +3,6 @@
 import junit.framework.Assert;
 
 import org.drools.base.ClassFieldExtractorCache;
-import org.drools.base.ClassFieldExtractorFactory;
 import org.drools.base.TestBean;
 import org.drools.spi.Extractor;
 
@@ -21,7 +20,7 @@
 
     public void testGetBooleanValue() {
         try {
-            this.extractor.getBooleanValue( this.bean );
+            this.extractor.getBooleanValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -31,7 +30,7 @@
     public void testGetByteValue() {
         try {
             Assert.assertEquals( IntClassFieldExtractorTest.VALUE,
-                                 this.extractor.getByteValue( this.bean ) );
+                                 this.extractor.getByteValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -39,7 +38,7 @@
 
     public void testGetCharValue() {
         try {
-            this.extractor.getCharValue( this.bean );
+            this.extractor.getCharValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -49,7 +48,7 @@
     public void testGetDoubleValue() {
         try {
             Assert.assertEquals( IntClassFieldExtractorTest.VALUE,
-                                 this.extractor.getDoubleValue( this.bean ),
+                                 this.extractor.getDoubleValue( null, this.bean ),
                                  0.01 );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
@@ -59,7 +58,7 @@
     public void testGetFloatValue() {
         try {
             Assert.assertEquals( IntClassFieldExtractorTest.VALUE,
-                                 this.extractor.getFloatValue( this.bean ),
+                                 this.extractor.getFloatValue( null, this.bean ),
                                  0.01 );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
@@ -69,7 +68,7 @@
     public void testGetIntValue() {
         try {
             Assert.assertEquals( IntClassFieldExtractorTest.VALUE,
-                                 this.extractor.getIntValue( this.bean ) );
+                                 this.extractor.getIntValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -78,7 +77,7 @@
     public void testGetLongValue() {
         try {
             Assert.assertEquals( IntClassFieldExtractorTest.VALUE,
-                                 this.extractor.getLongValue( this.bean ) );
+                                 this.extractor.getLongValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -87,7 +86,7 @@
     public void testGetShortValue() {
         try {
             Assert.assertEquals( IntClassFieldExtractorTest.VALUE,
-                                 this.extractor.getShortValue( this.bean ) );
+                                 this.extractor.getShortValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -96,7 +95,7 @@
     public void testGetValue() {
         try {
             Assert.assertEquals( IntClassFieldExtractorTest.VALUE,
-                                 ((Number) this.extractor.getValue( this.bean )).intValue() );
+                                 ((Number) this.extractor.getValue( null, this.bean )).intValue() );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -104,7 +103,7 @@
 
     public void testIsNullValue() {
         try {
-            Assert.assertFalse( this.extractor.isNullValue( this.bean ) );
+            Assert.assertFalse( this.extractor.isNullValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }

Modified: 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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/LongClassFieldExtractorTest.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -3,7 +3,6 @@
 import junit.framework.Assert;
 
 import org.drools.base.ClassFieldExtractorCache;
-import org.drools.base.ClassFieldExtractorFactory;
 import org.drools.base.TestBean;
 import org.drools.spi.Extractor;
 
@@ -21,7 +20,7 @@
 
     public void testGetBooleanValue() {
         try {
-            this.extractor.getBooleanValue( this.bean );
+            this.extractor.getBooleanValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -31,7 +30,7 @@
     public void testGetByteValue() {
         try {
             Assert.assertEquals( LongClassFieldExtractorTest.VALUE,
-                                 this.extractor.getByteValue( this.bean ) );
+                                 this.extractor.getByteValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -39,7 +38,7 @@
 
     public void testGetCharValue() {
         try {
-            this.extractor.getCharValue( this.bean );
+            this.extractor.getCharValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -49,7 +48,7 @@
     public void testGetDoubleValue() {
         try {
             Assert.assertEquals( LongClassFieldExtractorTest.VALUE,
-                                 this.extractor.getDoubleValue( this.bean ),
+                                 this.extractor.getDoubleValue( null, this.bean ),
                                  0.01 );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
@@ -59,7 +58,7 @@
     public void testGetFloatValue() {
         try {
             Assert.assertEquals( LongClassFieldExtractorTest.VALUE,
-                                 this.extractor.getFloatValue( this.bean ),
+                                 this.extractor.getFloatValue( null, this.bean ),
                                  0.01 );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
@@ -69,7 +68,7 @@
     public void testGetIntValue() {
         try {
             Assert.assertEquals( LongClassFieldExtractorTest.VALUE,
-                                 this.extractor.getIntValue( this.bean ) );
+                                 this.extractor.getIntValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -78,7 +77,7 @@
     public void testGetLongValue() {
         try {
             Assert.assertEquals( LongClassFieldExtractorTest.VALUE,
-                                 this.extractor.getLongValue( this.bean ) );
+                                 this.extractor.getLongValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -87,7 +86,7 @@
     public void testGetShortValue() {
         try {
             Assert.assertEquals( LongClassFieldExtractorTest.VALUE,
-                                 this.extractor.getShortValue( this.bean ) );
+                                 this.extractor.getShortValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -96,8 +95,8 @@
     public void testGetValue() {
         try {
             Assert.assertEquals( new Long( (short) LongClassFieldExtractorTest.VALUE ),
-                                 this.extractor.getValue( this.bean ) );
-            Assert.assertTrue( this.extractor.getValue( this.bean ) instanceof Long );
+                                 this.extractor.getValue( null, this.bean ) );
+            Assert.assertTrue( this.extractor.getValue( null, this.bean ) instanceof Long );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -105,7 +104,7 @@
     
     public void testIsNullValue() {
         try {
-            Assert.assertFalse( this.extractor.isNullValue( this.bean ) );
+            Assert.assertFalse( this.extractor.isNullValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/MVELClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/MVELClassFieldExtractorTest.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/MVELClassFieldExtractorTest.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -6,7 +6,6 @@
 import org.drools.Address;
 import org.drools.Person;
 import org.drools.base.ClassFieldExtractorCache;
-import org.drools.base.ClassFieldExtractorFactory;
 import org.drools.spi.Extractor;
 
 public class MVELClassFieldExtractorTest extends TestCase {
@@ -27,7 +26,7 @@
 
     public void testGetBooleanValue() {
         try {
-            this.extractor.getBooleanValue( this.person );
+            this.extractor.getBooleanValue( null, this.person );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -36,7 +35,7 @@
 
     public void testGetByteValue() {
         try {
-            this.extractor.getByteValue( this.person );
+            this.extractor.getByteValue( null, this.person );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -45,7 +44,7 @@
 
     public void testGetCharValue() {
         try {
-            this.extractor.getCharValue( this.person );
+            this.extractor.getCharValue( null, this.person );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -54,7 +53,7 @@
 
     public void testGetDoubleValue() {
         try {
-            this.extractor.getDoubleValue( this.person );
+            this.extractor.getDoubleValue( null, this.person );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -63,7 +62,7 @@
 
     public void testGetFloatValue() {
         try {
-            this.extractor.getFloatValue( this.person );
+            this.extractor.getFloatValue( null, this.person );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -72,7 +71,7 @@
 
     public void testGetIntValue() {
         try {
-            this.extractor.getIntValue( this.person );
+            this.extractor.getIntValue( null, this.person );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -81,7 +80,7 @@
 
     public void testGetLongValue() {
         try {
-            this.extractor.getLongValue( this.person );
+            this.extractor.getLongValue( null, this.person );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -90,7 +89,7 @@
 
     public void testGetShortValue() {
         try {
-            this.extractor.getShortValue( this.person );
+            this.extractor.getShortValue( null, this.person );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -100,8 +99,8 @@
     public void testGetValue() {
         try {
             Assert.assertEquals( "Home Street",
-                                 this.extractor.getValue( this.person ) );
-            Assert.assertTrue( this.extractor.getValue( this.person ) instanceof String );
+                                 this.extractor.getValue( null, this.person ) );
+            Assert.assertTrue( this.extractor.getValue( null, this.person ) instanceof String );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -109,12 +108,12 @@
 
     public void testIsNullValue() {
         try {
-            Assert.assertFalse( this.extractor.isNullValue( this.person ) );
+            Assert.assertFalse( this.extractor.isNullValue( null, this.person ) );
 
             Extractor nullExtractor = ClassFieldExtractorCache.getExtractor( Person.class,
                                                                              "addresses['business'].phone",
                                                                              getClass().getClassLoader() );
-            Assert.assertTrue( nullExtractor.isNullValue( this.person ) );
+            Assert.assertTrue( nullExtractor.isNullValue( null, this.person ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }

Modified: 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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ObjectClassFieldExtractorTest.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -6,7 +6,6 @@
 import junit.framework.Assert;
 
 import org.drools.base.ClassFieldExtractorCache;
-import org.drools.base.ClassFieldExtractorFactory;
 import org.drools.base.TestBean;
 import org.drools.spi.Extractor;
 
@@ -23,7 +22,7 @@
 
     public void testGetBooleanValue() {
         try {
-            this.extractor.getBooleanValue( this.bean );
+            this.extractor.getBooleanValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -32,7 +31,7 @@
 
     public void testGetByteValue() {
         try {
-            this.extractor.getByteValue( this.bean );
+            this.extractor.getByteValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -41,7 +40,7 @@
 
     public void testGetCharValue() {
         try {
-            this.extractor.getCharValue( this.bean );
+            this.extractor.getCharValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -50,7 +49,7 @@
 
     public void testGetDoubleValue() {
         try {
-            this.extractor.getDoubleValue( this.bean );
+            this.extractor.getDoubleValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -59,7 +58,7 @@
 
     public void testGetFloatValue() {
         try {
-            this.extractor.getFloatValue( this.bean );
+            this.extractor.getFloatValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -68,7 +67,7 @@
 
     public void testGetIntValue() {
         try {
-            this.extractor.getIntValue( this.bean );
+            this.extractor.getIntValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -77,7 +76,7 @@
 
     public void testGetLongValue() {
         try {
-            this.extractor.getLongValue( this.bean );
+            this.extractor.getLongValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -86,7 +85,7 @@
 
     public void testGetShortValue() {
         try {
-            this.extractor.getShortValue( this.bean );
+            this.extractor.getShortValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -96,8 +95,8 @@
     public void testGetValue() {
         try {
             Assert.assertEquals( Collections.EMPTY_LIST,
-                                 this.extractor.getValue( this.bean ) );
-            Assert.assertTrue( this.extractor.getValue( this.bean ) instanceof List );
+                                 this.extractor.getValue( null, this.bean ) );
+            Assert.assertTrue( this.extractor.getValue( null, this.bean ) instanceof List );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -105,12 +104,12 @@
 
     public void testIsNullValue() {
         try {
-            Assert.assertFalse( this.extractor.isNullValue( this.bean ) );
+            Assert.assertFalse( this.extractor.isNullValue( null, this.bean ) );
 
             Extractor nullExtractor = ClassFieldExtractorCache.getExtractor(  TestBean.class,
                                                                               "nullAttr",
                                                                               getClass().getClassLoader() );
-            Assert.assertTrue( nullExtractor.isNullValue( this.bean ) );
+            Assert.assertTrue( nullExtractor.isNullValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }

Modified: 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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ShortClassFieldExtractorTest.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -3,7 +3,6 @@
 import junit.framework.Assert;
 
 import org.drools.base.ClassFieldExtractorCache;
-import org.drools.base.ClassFieldExtractorFactory;
 import org.drools.base.TestBean;
 import org.drools.spi.Extractor;
 
@@ -21,7 +20,7 @@
 
     public void testGetBooleanValue() {
         try {
-            this.extractor.getBooleanValue( this.bean );
+            this.extractor.getBooleanValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -31,7 +30,7 @@
     public void testGetByteValue() {
         try {
             Assert.assertEquals( ShortClassFieldExtractorTest.VALUE,
-                                 this.extractor.getByteValue( this.bean ) );
+                                 this.extractor.getByteValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -39,7 +38,7 @@
 
     public void testGetCharValue() {
         try {
-            this.extractor.getCharValue( this.bean );
+            this.extractor.getCharValue( null, this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -49,7 +48,7 @@
     public void testGetDoubleValue() {
         try {
             Assert.assertEquals( ShortClassFieldExtractorTest.VALUE,
-                                 this.extractor.getDoubleValue( this.bean ),
+                                 this.extractor.getDoubleValue( null, this.bean ),
                                  0.01 );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
@@ -59,7 +58,7 @@
     public void testGetFloatValue() {
         try {
             Assert.assertEquals( ShortClassFieldExtractorTest.VALUE,
-                                 this.extractor.getFloatValue( this.bean ),
+                                 this.extractor.getFloatValue( null, this.bean ),
                                  0.01 );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
@@ -69,7 +68,7 @@
     public void testGetIntValue() {
         try {
             Assert.assertEquals( ShortClassFieldExtractorTest.VALUE,
-                                 this.extractor.getIntValue( this.bean ) );
+                                 this.extractor.getIntValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -78,7 +77,7 @@
     public void testGetLongValue() {
         try {
             Assert.assertEquals( ShortClassFieldExtractorTest.VALUE,
-                                 this.extractor.getLongValue( this.bean ) );
+                                 this.extractor.getLongValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -87,7 +86,7 @@
     public void testGetShortValue() {
         try {
             Assert.assertEquals( ShortClassFieldExtractorTest.VALUE,
-                                 this.extractor.getShortValue( this.bean ) );
+                                 this.extractor.getShortValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -96,7 +95,7 @@
     public void testGetValue() {
         try {
             Assert.assertEquals( ShortClassFieldExtractorTest.VALUE,
-                                 ((Number) this.extractor.getValue( this.bean )).shortValue() );
+                                 ((Number) this.extractor.getValue( null, this.bean )).shortValue() );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }
@@ -104,7 +103,7 @@
 
     public void testIsNullValue() {
         try {
-            Assert.assertFalse( this.extractor.isNullValue( this.bean ) );
+            Assert.assertFalse( this.extractor.isNullValue( null, this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
         }

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/BaseMannersTest.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -41,6 +41,7 @@
 import org.drools.base.evaluators.Operator;
 import org.drools.base.field.BooleanFieldImpl;
 import org.drools.base.field.LongFieldImpl;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.Pattern;
 import org.drools.rule.Declaration;
 import org.drools.rule.GroupElement;
@@ -477,8 +478,8 @@
 
                     Context context = (Context) drools.get( contextDeclaration );
                     Count count = (Count) drools.get( countDeclaration );
-                    int seatId = seatingIdDeclaration.getExtractor().getIntValue( tuple.get( seatingIdDeclaration ).getObject() );
-                    int seatingRightSeat = seatingRightSeatDeclaration.getExtractor().getIntValue( tuple.get( seatingRightSeatDeclaration ).getObject() );
+                    int seatId = seatingIdDeclaration.getExtractor().getIntValue( (InternalWorkingMemory) workingMemory, tuple.get( seatingIdDeclaration ).getObject() );
+                    int seatingRightSeat = seatingRightSeatDeclaration.getExtractor().getIntValue( (InternalWorkingMemory) workingMemory, tuple.get( seatingRightSeatDeclaration ).getObject() );
 
                     String leftGuestName = (String) drools.get( leftGuestNameDeclaration );
                     String rightGuestName = (String) drools.get( seatingRightGuestNameDeclaration );
@@ -653,8 +654,8 @@
                     Rule rule = drools.getRule();
                     Tuple tuple = drools.getTuple();
 
-                    int id = seatingIdDeclaration.getExtractor().getIntValue( tuple.get( seatingIdDeclaration ).getObject() );
-                    int seat = pathSeatDeclaration.getExtractor().getIntValue( tuple.get( pathSeatDeclaration ).getObject() );
+                    int id = seatingIdDeclaration.getExtractor().getIntValue( (InternalWorkingMemory) workingMemory, tuple.get( seatingIdDeclaration ).getObject() );
+                    int seat = pathSeatDeclaration.getExtractor().getIntValue( (InternalWorkingMemory) workingMemory, tuple.get( pathSeatDeclaration ).getObject() );
                     String guestName = (String) drools.get( pathGuestNameDeclaration );
 
                     Path path = new Path( id,

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/facttemplates/FactTemplateFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/facttemplates/FactTemplateFieldExtractorTest.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/facttemplates/FactTemplateFieldExtractorTest.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -34,18 +34,18 @@
                                new Integer( 200 ) );
 
         assertEquals( "stilton",
-                      extractName.getValue( stilton ) );
+                      extractName.getValue( null, stilton ) );
 
         assertEquals( new Integer( 200 ),
-                      extractPrice.getValue( stilton ) );
+                      extractPrice.getValue( null, stilton ) );
 
-        assertFalse( extractName.isNullValue( stilton ) );
+        assertFalse( extractName.isNullValue( null, stilton ) );
         
         stilton.setFieldValue( "name",
                                null );
         
-        assertTrue( extractName.isNullValue( stilton ) );
-        assertFalse( extractPrice.isNullValue( stilton ) );
+        assertTrue( extractName.isNullValue( null, stilton ) );
+        assertFalse( extractPrice.isNullValue( null, stilton ) );
         
         final Fact brie = cheese.createFact( 12 );
         brie.setFieldValue( "name",
@@ -54,18 +54,18 @@
                             new Integer( 55 ) );
 
         assertEquals( "brie",
-                      extractName.getValue( brie ) );
+                      extractName.getValue( null, brie ) );
 
         assertEquals( new Integer( 55 ),
-                      extractPrice.getValue( brie ) );
+                      extractPrice.getValue( null, brie ) );
         
-        assertFalse( extractName.isNullValue( brie ) );
+        assertFalse( extractName.isNullValue( null, brie ) );
         
         brie.setFieldValue( "name",
                             null );
         
-        assertTrue( extractName.isNullValue( brie ) );
-        assertFalse( extractPrice.isNullValue( stilton ) );
+        assertTrue( extractName.isNullValue( null, brie ) );
+        assertFalse( extractPrice.isNullValue( null, stilton ) );
     }
 
     public void testDeclaration() {
@@ -100,6 +100,6 @@
 
         // Check we can extract Declarations correctly 
         assertEquals( "brie",
-                      declaration.getValue( brie ) );
+                      declaration.getValue( null, brie ) );
     }
 }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CompositeObjectSinkAdapterTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CompositeObjectSinkAdapterTest.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CompositeObjectSinkAdapterTest.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -226,22 +226,22 @@
             return 0;
         }
 
-        public boolean getBooleanValue(final Object object) {
+        public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
             //  Auto-generated method stub
             return false;
         }
 
-        public byte getByteValue(final Object object) {
+        public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
             //  Auto-generated method stub
             return 0;
         }
 
-        public char getCharValue(final Object object) {
+        public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
             //  Auto-generated method stub
             return 0;
         }
 
-        public double getDoubleValue(final Object object) {
+        public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
             //  Auto-generated method stub
             return 0;
         }
@@ -251,17 +251,17 @@
             return null;
         }
 
-        public float getFloatValue(final Object object) {
+        public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
             //  Auto-generated method stub
             return 0;
         }
 
-        public int getIntValue(final Object object) {
+        public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
             //  Auto-generated method stub
             return 0;
         }
 
-        public long getLongValue(final Object object) {
+        public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
             //  Auto-generated method stub
             return 0;
         }
@@ -271,17 +271,17 @@
             return null;
         }
 
-        public short getShortValue(final Object object) {
+        public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
             //  Auto-generated method stub
             return 0;
         }
 
-        public Object getValue(final Object object) {
+        public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
             //  Auto-generated method stub
             return null;
         }
         
-        public boolean isNullValue(final Object object) {
+        public boolean isNullValue(final Object object, InternalWorkingMemory workingMemory) {
             return false;
         }
 
@@ -290,10 +290,21 @@
             return null;
         }
 
-        public int getHashCode(final Object object) {
+        public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
             return 0;
         }
 
+        public boolean isGlobal() {
+            // TODO Auto-generated method stub
+            return false;
+        }
+
+        public boolean isNullValue(InternalWorkingMemory workingMemory,
+                                   Object object) {
+            // TODO Auto-generated method stub
+            return false;
+        }
+
     }
 
     static class MockBetaNode extends BetaNode {

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/DeclarationTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/DeclarationTest.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/DeclarationTest.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -78,7 +78,7 @@
 
         // Check we can extract Declarations correctly
         assertEquals( "cheddar",
-                      declaration.getValue( cheddar ) );
+                      declaration.getValue( null, cheddar ) );
     }
 
     public static int getIndex(final Class clazz,

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	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/FieldConstraintTest.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -194,8 +194,8 @@
                                     Declaration[] previousDeclarations,
                                     Declaration[] localDeclarations,
                                     WorkingMemory workingMemory) {
-                int price1 = previousDeclarations[0].getIntValue( workingMemory.getObject( tuple.get( previousDeclarations[0] ) ) );
-                int price2 = localDeclarations[0].getIntValue( object );
+                int price1 = previousDeclarations[0].getIntValue( (InternalWorkingMemory) workingMemory, workingMemory.getObject( tuple.get( previousDeclarations[0] ) ) );
+                int price2 = localDeclarations[0].getIntValue( (InternalWorkingMemory) workingMemory, object );
 
                 return (price2 == (price1 * 2));
 
@@ -267,7 +267,7 @@
                                        Declaration[] previousDeclarations,
                                        Declaration[] localDeclarations,
                                        WorkingMemory workingMemory) {
-                int price = ((Number) previousDeclarations[0].getValue( workingMemory.getObject( tuple.get( previousDeclarations[0] ) ) )).intValue();
+                int price = ((Number) previousDeclarations[0].getValue( (InternalWorkingMemory) workingMemory, workingMemory.getObject( tuple.get( previousDeclarations[0] ) ) )).intValue();
                 return FieldFactory.getFieldValue( 2 * price );
 
             }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/PatternTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/PatternTest.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/PatternTest.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -29,7 +29,7 @@
                                            42 );
 
         assertEquals( stilton,
-                      dec.getValue( stilton ) );
+                      dec.getValue( null, stilton ) );
 
     }
 
@@ -64,7 +64,7 @@
                                new Integer( 200 ) );
 
         assertEquals( stilton,
-                      dec.getValue( stilton ) );
+                      dec.getValue( null, stilton ) );
     }
 
 }

Modified: labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ExternalSheetListenerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ExternalSheetListenerTest.java	2007-06-28 21:46:54 UTC (rev 12939)
+++ labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ExternalSheetListenerTest.java	2007-06-28 22:27:18 UTC (rev 12940)
@@ -17,8 +17,6 @@
 import org.drools.QueryResults;
 import org.drools.RuleBase;
 import org.drools.StatefulSession;
-import org.drools.StatelessSession;
-import org.drools.WorkingMemory;
 import org.drools.concurrent.Future;
 import org.drools.event.AgendaEventListener;
 import org.drools.event.RuleFlowEventListener;




More information about the jboss-svn-commits mailing list