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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Sep 25 14:59:06 EDT 2007


Author: tirelli
Date: 2007-09-25 14:59:06 -0400 (Tue, 25 Sep 2007)
New Revision: 15366

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CollectContainsOperator.drl
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CollectMemberOfOperator.drl
Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FirstOrderLogicTest.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/ObjectFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ShadowProxyUtils.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java
Log:
JBRULES-1204: fixing memberOf and contains behavior when handling collections of shadow facts

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FirstOrderLogicTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FirstOrderLogicTest.java	2007-09-25 16:41:01 UTC (rev 15365)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FirstOrderLogicTest.java	2007-09-25 18:59:06 UTC (rev 15366)
@@ -13,6 +13,8 @@
 import org.drools.Cheese;
 import org.drools.Cheesery;
 import org.drools.FactHandle;
+import org.drools.Order;
+import org.drools.OrderItem;
 import org.drools.Person;
 import org.drools.PersonInterface;
 import org.drools.RuleBase;
@@ -772,11 +774,124 @@
         FactHandle ph = workingMemory.insert( provolone );
         FactHandle bh = workingMemory.insert( brie );
         FactHandle markh = workingMemory.insert( mark );
-        
+
         workingMemory.fireAllRules();
         assertEquals( 1,
                       list.size() );
+    }
 
+    public void testCollectWithMemberOfOperators() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_CollectMemberOfOperator.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+        final List list = new ArrayList();
+        workingMemory.setGlobal( "results",
+                                 list );
+
+        final Order order1 = new Order( 1,
+                                        "bob" );
+        final OrderItem item11 = new OrderItem( order1,
+                                                1 );
+        final OrderItem item12 = new OrderItem( order1,
+                                                2 );
+        final Order order2 = new Order( 2,
+                                        "mark" );
+        final OrderItem item21 = new OrderItem( order2,
+                                                1 );
+        final OrderItem item22 = new OrderItem( order2,
+                                                2 );
+
+        workingMemory.insert( order1 );
+        workingMemory.insert( item11 );
+        workingMemory.insert( item12 );
+        workingMemory.insert( order2 );
+        workingMemory.insert( item21 );
+        workingMemory.insert( item22 );
+
+        workingMemory.fireAllRules();
+
+        int index = 0;
+        assertEquals( 8,
+                      list.size() );
+        assertSame( order1,
+                    list.get( index++ ) );
+        assertSame( item11,
+                    list.get( index++ ) );
+        assertSame( order2,
+                    list.get( index++ ) );
+        assertSame( item21,
+                    list.get( index++ ) );
+        assertSame( order1,
+                    list.get( index++ ) );
+        assertSame( item11,
+                    list.get( index++ ) );
+        assertSame( order2,
+                    list.get( index++ ) );
+        assertSame( item21,
+                    list.get( index++ ) );
+
     }
 
+    public void testCollectWithContainsOperators() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_CollectContainsOperator.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+        final List list = new ArrayList();
+        workingMemory.setGlobal( "results",
+                                 list );
+
+        final Order order1 = new Order( 1,
+                                        "bob" );
+        final OrderItem item11 = new OrderItem( order1,
+                                                1 );
+        final OrderItem item12 = new OrderItem( order1,
+                                                2 );
+        final Order order2 = new Order( 2,
+                                        "mark" );
+        final OrderItem item21 = new OrderItem( order2,
+                                                1 );
+        final OrderItem item22 = new OrderItem( order2,
+                                                2 );
+
+        workingMemory.insert( order1 );
+        workingMemory.insert( item11 );
+        workingMemory.insert( item12 );
+        workingMemory.insert( order2 );
+        workingMemory.insert( item21 );
+        workingMemory.insert( item22 );
+
+        workingMemory.fireAllRules();
+
+        int index = 0;
+        assertEquals( 8,
+                      list.size() );
+        assertSame( order1,
+                    list.get( index++ ) );
+        assertSame( item11,
+                    list.get( index++ ) );
+        assertSame( order2,
+                    list.get( index++ ) );
+        assertSame( item21,
+                    list.get( index++ ) );
+        assertSame( order1,
+                    list.get( index++ ) );
+        assertSame( item11,
+                    list.get( index++ ) );
+        assertSame( order2,
+                    list.get( index++ ) );
+        assertSame( item21,
+                    list.get( index++ ) );
+
+    }
+
 }

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CollectContainsOperator.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CollectContainsOperator.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CollectContainsOperator.drl	2007-09-25 18:59:06 UTC (rev 15366)
@@ -0,0 +1,99 @@
+package org.drools;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.LinkedList;
+
+global java.util.List results;
+
+rule "Collect with memberOf shadow proxy"
+    salience 100
+    dialect "java"
+when
+    $order : Order( number == 1 )
+    $list : ArrayList( this contains $order ) from collect( Order() )
+then
+    results.add( $order );
+end 
+
+rule "Collect with memberOf no shadow proxy"
+    salience 90
+    dialect "java"
+when
+    $item : OrderItem( seq == 1, order.number == 1 )
+    $list : ArrayList( this contains $item.order ) from collect( Order() )
+then
+    results.add( $item );
+end 
+
+rule "Accumulate with memberOf shadow proxy"
+    salience 80
+    dialect "java"
+when
+    $order : Order( number == 2 )
+    $list : List( this contains $order ) from accumulate( $o : Order(),
+                                         init( List list = new LinkedList(); ),
+                                         action( list.add( $o ); ),
+                                         result( list ) )
+then
+    results.add( $order );
+end 
+
+rule "Accumulate with memberOf no shadow proxy"
+    salience 70
+    dialect "java"
+when
+    $item : OrderItem( seq == 1, order.number == 2 )
+    $list : List( this contains $item.order ) from accumulate( $o : Order(),
+                                         init( List list = new LinkedList(); ),
+                                         action( list.add( $o ); ),
+                                         result( list ) )
+then
+    results.add( $item );
+end 
+
+rule "MVEL Collect with memberOf shadow proxy"
+    salience 60
+    dialect "mvel"
+when
+    $order : Order( number == 1 )
+    $list : ArrayList( this contains $order ) from collect( Order() )
+then
+    results.add( $order );
+end 
+
+rule "MVEL Collect with memberOf no shadow proxy"
+    salience 50
+    dialect "mvel"
+when
+    $item : OrderItem( seq == 1, order.number == 1 )
+    $list : ArrayList( this contains $item.order ) from collect( Order() )
+then
+    results.add( $item );
+end 
+
+rule "MVEL Accumulate with memberOf shadow proxy"
+    salience 40
+    dialect "mvel"
+when
+    $order : Order( number == 2 )
+    $list : List( this contains $order ) from accumulate( $o : Order(),
+                                         init( List list = new LinkedList(); ),
+                                         action( list.add( $o ); ),
+                                         result( list ) )
+then
+    results.add( $order );
+end 
+
+rule "MVEL Accumulate with memberOf no shadow proxy"
+    salience 30
+    dialect "mvel"
+when
+    $item : OrderItem( seq == 1, order.number == 2 )
+    $list : List( this contains $item.order ) from accumulate( $o : Order(),
+                                         init( List list = new LinkedList(); ),
+                                         action( list.add( $o ); ),
+                                         result( list ) )
+then
+    results.add( $item );
+end 

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CollectMemberOfOperator.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CollectMemberOfOperator.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CollectMemberOfOperator.drl	2007-09-25 18:59:06 UTC (rev 15366)
@@ -0,0 +1,99 @@
+package org.drools;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.LinkedList;
+
+global java.util.List results;
+
+rule "Collect with memberOf shadow proxy"
+    salience 100
+    dialect "java"
+when
+    $list : ArrayList() from collect( Order() )
+    $order : Order( number == 1, this memberOf $list )
+then
+    results.add( $order );
+end 
+
+rule "Collect with memberOf no shadow proxy"
+    salience 90
+    dialect "java"
+when
+    $list : ArrayList() from collect( Order() )
+    $item : OrderItem( seq == 1, order.number == 1, order memberOf $list )
+then
+    results.add( $item );
+end 
+
+rule "Accumulate with memberOf shadow proxy"
+    salience 80
+    dialect "java"
+when
+    $list : List() from accumulate( $o : Order(),
+                                         init( List list = new LinkedList(); ),
+                                         action( list.add( $o ); ),
+                                         result( list ) )
+    $order : Order( number == 2, this memberOf $list )
+then
+    results.add( $order );
+end 
+
+rule "Accumulate with memberOf no shadow proxy"
+    salience 70
+    dialect "java"
+when
+    $list : List() from accumulate( $o : Order(),
+                                         init( List list = new LinkedList(); ),
+                                         action( list.add( $o ); ),
+                                         result( list ) )
+    $item : OrderItem( seq == 1, order.number == 2, order memberOf $list )
+then
+    results.add( $item );
+end 
+
+rule "MVEL Collect with memberOf shadow proxy"
+    salience 60
+    dialect "mvel"
+when
+    $list : ArrayList() from collect( Order() )
+    $order : Order( number == 1, this memberOf $list )
+then
+    results.add( $order );
+end 
+
+rule "MVEL Collect with memberOf no shadow proxy"
+    salience 50
+    dialect "mvel"
+when
+    $list : ArrayList() from collect( Order() )
+    $item : OrderItem( seq == 1, order.number == 1, order memberOf $list )
+then
+    results.add( $item );
+end 
+
+rule "MVEL Accumulate with memberOf shadow proxy"
+    salience 40
+    dialect "mvel"
+when
+    $list : List() from accumulate( $o : Order(),
+                                         init( List list = new LinkedList(); ),
+                                         action( list.add( $o ); ),
+                                         result( list ) )
+    $order : Order( number == 2, this memberOf $list )
+then
+    results.add( $order );
+end 
+
+rule "MVEL Accumulate with memberOf no shadow proxy"
+    salience 30
+    dialect "mvel"
+when
+    $list : List() from accumulate( $o : Order(),
+                                         init( List list = new LinkedList(); ),
+                                         action( list.add( $o ); ),
+                                         result( list ) )
+    $item : OrderItem( seq == 1, order.number == 2, order memberOf $list )
+then
+    results.add( $item );
+end 

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-09-25 16:41:01 UTC (rev 15365)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ArrayFactory.java	2007-09-25 18:59:06 UTC (rev 15366)
@@ -24,6 +24,7 @@
 import org.drools.spi.Evaluator;
 import org.drools.spi.Extractor;
 import org.drools.spi.FieldValue;
+import org.drools.util.ShadowProxyUtils;
 
 /**
  * For handling simple (non collection) array types.
@@ -66,7 +67,7 @@
             throw new RuntimeException( "Operator '" + operator + "' does not exist for ArrayEvaluator" );
         }
     }
-    
+
     static class ArrayEqualEvaluator extends BaseEvaluator {
         /**
          * 
@@ -81,8 +82,10 @@
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
                                 final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            final Object value1 = extractor.getValue( workingMemory, object1 );
+                                final Object object1,
+                                final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory,
+                                                      object1 );
             final Object value2 = object2.getValue();
             if ( value1 == null ) {
                 return value2 == null;
@@ -91,8 +94,10 @@
         }
 
         public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
+                                           final VariableContextEntry context,
+                                           final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory,
+                                                                              left );
             if ( value == null ) {
                 return ((ObjectVariableContextEntry) context).right == null;
             }
@@ -100,8 +105,10 @@
         }
 
         public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            final Object value = context.extractor.getValue( workingMemory, right );
+                                          final VariableContextEntry context,
+                                          final Object right) {
+            final Object value = context.extractor.getValue( workingMemory,
+                                                             right );
             if ( ((ObjectVariableContextEntry) context).left == null ) {
                 return value == null;
             }
@@ -111,9 +118,12 @@
         public boolean evaluate(InternalWorkingMemory workingMemory,
                                 final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            final Object value1 = extractor1.getValue( workingMemory, object1 );
-            final Object value2 = extractor2.getValue( workingMemory, 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;
             }
@@ -140,8 +150,10 @@
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
                                 final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            final Object value1 = extractor.getValue( workingMemory, object1 );
+                                final Object object1,
+                                final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory,
+                                                      object1 );
             final Object value2 = object2.getValue();
             if ( value1 == null ) {
                 return value2 != null;
@@ -150,8 +162,10 @@
         }
 
         public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
+                                           final VariableContextEntry context,
+                                           final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory,
+                                                                              left );
             if ( value == null ) {
                 return ((ObjectVariableContextEntry) context).right != null;
             }
@@ -159,8 +173,10 @@
         }
 
         public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            final Object value = context.extractor.getValue( workingMemory, right );
+                                          final VariableContextEntry context,
+                                          final Object right) {
+            final Object value = context.extractor.getValue( workingMemory,
+                                                             right );
             if ( ((ObjectVariableContextEntry) context).left == null ) {
                 return value != null;
             }
@@ -170,9 +186,12 @@
         public boolean evaluate(InternalWorkingMemory workingMemory,
                                 final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            final Object value1 = extractor1.getValue( workingMemory, object1 );
-            final Object value2 = extractor2.getValue( workingMemory, 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;
             }
@@ -198,46 +217,51 @@
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
                                 final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
+                                final Object object1,
+                                final FieldValue object2) {
             final Object value = object2.getValue();
-            final Object[] array = (Object[]) extractor.getValue( workingMemory, object1 );
-            if( array == null )
-                return false;
-            return ArrayUtils.search( array,
-                                        value ) >= 0;
+            final Object[] array = (Object[]) extractor.getValue( workingMemory,
+                                                                  object1 );
+            if ( array == null ) return false;
+            return ShadowProxyUtils.contains( array,
+                                              value );
         }
 
         public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
+                                           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;
-            return ArrayUtils.search( array,
-                                        value ) >= 0;
+            if ( array == null ) return false;
+            return ShadowProxyUtils.contains( array,
+                                              value );
         }
 
         public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
+                                          final VariableContextEntry context,
+                                          final Object right) {
             final Object value = ((ObjectVariableContextEntry) context).left;
-            final Object[] array = (Object[]) context.extractor.getValue( workingMemory, right );
-            if( array == null )
-                return false;
-            return ArrayUtils.search( array,
-                                        value ) >= 0;
+            final Object[] array = (Object[]) context.extractor.getValue( workingMemory,
+                                                                          right );
+            if ( array == null ) return false;
+            return ShadowProxyUtils.contains( array,
+                                              value );
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
                                 final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            final Object value = extractor2.getValue( workingMemory, object2 );
-            final Object[] array = (Object[]) extractor1.getValue( workingMemory, 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;
-            return ArrayUtils.search( array,
-                                        value ) >= 0;
+            if ( array == null ) return false;
+            return ShadowProxyUtils.contains( array,
+                                              value );
         }
 
         public String toString() {
@@ -259,46 +283,51 @@
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
                                 final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
+                                final Object object1,
+                                final FieldValue object2) {
             final Object value = object2.getValue();
-            final Object[] array = (Object[]) extractor.getValue( workingMemory, object1 );
-            if( array == null )
-                return false;
-            return ArrayUtils.search( array,
-                                        value ) < 0;
+            final Object[] array = (Object[]) extractor.getValue( workingMemory,
+                                                                  object1 );
+            if ( array == null ) return true;
+            return !ShadowProxyUtils.contains( array,
+                                               value );
         }
 
         public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
+                                           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;
-            return ArrayUtils.search( array,
-                                        value ) < 0;
+            if ( array == null ) return true;
+            return !ShadowProxyUtils.contains( array,
+                                               value );
         }
 
         public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
+                                          final VariableContextEntry context,
+                                          final Object right) {
             final Object value = ((ObjectVariableContextEntry) context).left;
-            final Object[] array = (Object[]) context.extractor.getValue( workingMemory, right );
-            if( array == null )
-                return false;
-            return ArrayUtils.search( array,
-                                        value ) < 0;
+            final Object[] array = (Object[]) context.extractor.getValue( workingMemory,
+                                                                          right );
+            if ( array == null ) return true;
+            return !ShadowProxyUtils.contains( array,
+                                               value );
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
                                 final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            final Object value = extractor2.getValue( workingMemory, object2 );
-            final Object[] array = (Object[]) extractor1.getValue( workingMemory, 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;
-            return ArrayUtils.search( array,
-                                        value ) < 0;
+            if ( array == null ) return true;
+            return !ShadowProxyUtils.contains( array,
+                                               value );
         }
 
         public String toString() {
@@ -320,46 +349,51 @@
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
                                 final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
+                                final Object object1,
+                                final FieldValue object2) {
             final Object[] array = (Object[]) object2.getValue();
-            final Object value = extractor.getValue( workingMemory, object1 );
-            if( array == null )
-                return false;
-            return ArrayUtils.search( array,
-                                        value ) >= 0;
+            final Object value = extractor.getValue( workingMemory,
+                                                     object1 );
+            if ( array == null ) return false;
+            return ShadowProxyUtils.contains( array,
+                                              value );
         }
 
         public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            final Object[] array = (Object[]) context.declaration.getExtractor().getValue( workingMemory, left );
+                                           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;
-            return ArrayUtils.search( array,
-                                        value ) >= 0;
+            if ( array == null ) return false;
+            return ShadowProxyUtils.contains( array,
+                                              value );
         }
 
         public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
+                                          final VariableContextEntry context,
+                                          final Object right) {
             final Object[] array = (Object[]) ((ObjectVariableContextEntry) context).left;
-            final Object value = context.extractor.getValue( workingMemory, right );
-            if( array == null )
-                return false;
-            return ArrayUtils.search( array,
-                                        value ) >= 0;
+            final Object value = context.extractor.getValue( workingMemory,
+                                                             right );
+            if ( array == null ) return false;
+            return ShadowProxyUtils.contains( array,
+                                              value );
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
                                 final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            final Object[] array = (Object[]) extractor2.getValue( workingMemory, object2 );
-            final Object value = extractor1.getValue( workingMemory, 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;
-            return ArrayUtils.search( array,
-                                        value ) >= 0;
+            if ( array == null ) return false;
+            return ShadowProxyUtils.contains( array,
+                                              value );
         }
 
         public String toString() {
@@ -381,160 +415,57 @@
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
                                 final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
+                                final Object object1,
+                                final FieldValue object2) {
             final Object[] array = (Object[]) object2.getValue();
-            final Object value = extractor.getValue( workingMemory, object1 );
-            if( array == null )
-                return false;
-            return ArrayUtils.search( array,
-                                        value ) < 0;
+            final Object value = extractor.getValue( workingMemory,
+                                                     object1 );
+            if ( array == null ) return true;
+            return !ShadowProxyUtils.contains( array,
+                                               value );
         }
 
         public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            final Object[] array = (Object[]) context.declaration.getExtractor().getValue( workingMemory, left );
+                                           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;
-            return ArrayUtils.search( array,
-                                        value ) < 0;
+            if ( array == null ) return true;
+            return !ShadowProxyUtils.contains( array,
+                                               value );
         }
 
         public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
+                                          final VariableContextEntry context,
+                                          final Object right) {
             final Object[] array = (Object[]) ((ObjectVariableContextEntry) context).left;
-            final Object value = context.extractor.getValue( workingMemory, right );
-            if( array == null )
-                return false;
-            return ArrayUtils.search( array,
-                                        value ) < 0;
+            final Object value = context.extractor.getValue( workingMemory,
+                                                             right );
+            if ( array == null ) return true;
+            return !ShadowProxyUtils.contains( array,
+                                               value );
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
                                 final Extractor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            final Object[] array = (Object[]) extractor2.getValue( workingMemory, object2 );
-            final Object value = extractor1.getValue( workingMemory, 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;
-            return ArrayUtils.search( array,
-                                        value ) < 0;
+            if ( array == null ) return true;
+            return !ShadowProxyUtils.contains( array,
+                                               value );
         }
 
         public String toString() {
             return "Array not memberOf";
         }
     }
-    
-    /**
-     * Utility functions for arrays
-     * 
-     * @author etirelli
-     */
-    static final class ArrayUtils {
-        
-        public static final int search( Object[] array, Object value ) {
-            int index = -1;
-            for( int i = 0; i < array.length; i++ ) {
-                if(( array[i] == null && value == null ) ||
-                   ( array[i] != null && array[i].equals( value ) ) ) {
-                    index = i;
-                    break;
-                }
-            }
-            return index;
-        }
 
-        public static final int search( boolean[] array, boolean value ) {
-            int index = -1;
-            for( int i = 0; i < array.length; i++ ) {
-                if( array[i] == value ) {
-                    index = i;
-                    break;
-                }
-            }
-            return index;
-        }
 
-        public static final int search( byte[] array, byte value ) {
-            int index = -1;
-            for( int i = 0; i < array.length; i++ ) {
-                if( array[i] == value ) {
-                    index = i;
-                    break;
-                }
-            }
-            return index;
-        }
-
-        public static final int search( short[] array, short value ) {
-            int index = -1;
-            for( int i = 0; i < array.length; i++ ) {
-                if( array[i] == value ) {
-                    index = i;
-                    break;
-                }
-            }
-            return index;
-        }
-
-        public static final int search( int[] array, int value ) {
-            int index = -1;
-            for( int i = 0; i < array.length; i++ ) {
-                if( array[i] == value ) {
-                    index = i;
-                    break;
-                }
-            }
-            return index;
-        }
-
-        public static final int search( long[] array, long value ) {
-            int index = -1;
-            for( int i = 0; i < array.length; i++ ) {
-                if( array[i] == value ) {
-                    index = i;
-                    break;
-                }
-            }
-            return index;
-        }
-
-        public static final int search( float[] array, float value ) {
-            int index = -1;
-            for( int i = 0; i < array.length; i++ ) {
-                if( array[i] == value ) {
-                    index = i;
-                    break;
-                }
-            }
-            return index;
-        }
-
-        public static final int search( double[] array, double value ) {
-            int index = -1;
-            for( int i = 0; i < array.length; i++ ) {
-                if( array[i] == value ) {
-                    index = i;
-                    break;
-                }
-            }
-            return index;
-        }
-
-        public static final int search( char[] array, char value ) {
-            int index = -1;
-            for( int i = 0; i < array.length; i++ ) {
-                if( array[i] == value ) {
-                    index = i;
-                    break;
-                }
-            }
-            return index;
-        }
-
-    }
-    
 }
\ No newline at end of file

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-09-25 16:41:01 UTC (rev 15365)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BaseMemberOfEvaluator.java	2007-09-25 18:59:06 UTC (rev 15366)
@@ -12,6 +12,7 @@
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Extractor;
 import org.drools.spi.FieldValue;
+import org.drools.util.ShadowProxyUtils;
 
 /**
  * This is a base class for MemberOf Evaluators
@@ -36,7 +37,7 @@
         }
         final Collection col = (Collection) object2.getValue();
         final Object value = extractor.getValue( workingMemory, object1 ); 
-        return col.contains( value );
+        return ShadowProxyUtils.contains( col, value );
     }
 
     public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
@@ -49,7 +50,7 @@
         }
         final Collection col = (Collection) object;
         final Object value = ((ObjectVariableContextEntry) context).right;
-        return col.contains( value );
+        return ShadowProxyUtils.contains( col, value );
     }
 
     public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
@@ -62,7 +63,7 @@
         }
         final Collection col = (Collection) object;
         final Object value = context.extractor.getValue( workingMemory, right ); 
-        return col.contains( value );
+        return ShadowProxyUtils.contains( col, value );
     }
 
     public boolean evaluate(InternalWorkingMemory workingMemory,
@@ -77,9 +78,9 @@
         }
         final Collection col = (Collection) object;
         final Object value = extractor1.getValue( workingMemory, object1 );
-        return col.contains( value );
+        return ShadowProxyUtils.contains( col, value );
     }
     
     public abstract String toString();
-
+    
 }

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-09-25 16:41:01 UTC (rev 15365)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BaseNotMemberOfEvaluator.java	2007-09-25 18:59:06 UTC (rev 15366)
@@ -12,6 +12,7 @@
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Extractor;
 import org.drools.spi.FieldValue;
+import org.drools.util.ShadowProxyUtils;
 
 /**
  * This is a base class for Not MemberOf Evaluators
@@ -37,7 +38,7 @@
         }
         final Collection col = (Collection) object2.getValue();
         final Object value = extractor.getValue( workingMemory, object1 ); 
-        return ! col.contains( value );
+        return ! ShadowProxyUtils.contains( col, value );
     }
 
     public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
@@ -50,7 +51,7 @@
         }
         final Collection col = (Collection) object;
         final Object value = ((ObjectVariableContextEntry) context).right;
-        return ! col.contains( value );
+        return ! ShadowProxyUtils.contains( col, value );
     }
 
     public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
@@ -63,7 +64,7 @@
         }
         final Collection col = (Collection) object;
         final Object value = context.extractor.getValue( workingMemory, right ); 
-        return ! col.contains( value );
+        return ! ShadowProxyUtils.contains( col, value );
     }
 
     public boolean evaluate(InternalWorkingMemory workingMemory,
@@ -78,10 +79,9 @@
         }
         final Collection col = (Collection) object;
         final Object value = extractor1.getValue( workingMemory, object1 );
-        return ! col.contains( value );
+        return ! ShadowProxyUtils.contains( col, value );
     }
 
     public abstract 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-09-25 16:41:01 UTC (rev 15365)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ObjectFactory.java	2007-09-25 18:59:06 UTC (rev 15366)
@@ -27,6 +27,7 @@
 import org.drools.spi.Evaluator;
 import org.drools.spi.Extractor;
 import org.drools.spi.FieldValue;
+import org.drools.util.ShadowProxyUtils;
 
 /**
  * This is the misc "bucket" evaluator factory for objects.
@@ -464,21 +465,21 @@
                                 final Object object1, final FieldValue object2) {
             final Object value = object2.getValue();
             final Collection col = (Collection) extractor.getValue( workingMemory, object1 );
-            return ( col == null ) ? false : col.contains( value );
+            return ( col == null ) ? false : ShadowProxyUtils.contains( col, value );
         }
 
         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 == null ) ? false : col.contains( value );
+            return ( col == null ) ? false : ShadowProxyUtils.contains( col, value );
         }
 
         public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
                                           final VariableContextEntry context, final Object right) {
             final Object value = ((ObjectVariableContextEntry) context).left;
             final Collection col = (Collection) context.extractor.getValue( workingMemory, right );
-            return ( col == null ) ? false : col.contains( value );
+            return ( col == null ) ? false : ShadowProxyUtils.contains( col, value );
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
@@ -487,7 +488,7 @@
                                 final Extractor extractor2, final Object object2) {
             final Object value = extractor2.getValue( workingMemory, object2 );
             final Collection col = (Collection) extractor1.getValue( workingMemory, object1 );
-            return ( col == null ) ? false : col.contains( value );
+            return ( col == null ) ? false : ShadowProxyUtils.contains( col, value );
         }
 
         public String toString() {
@@ -512,21 +513,21 @@
                                 final Object object1, final FieldValue object2) {
             final Object value = object2.getValue();
             final Collection col = (Collection) extractor.getValue( workingMemory, object1 );
-            return !col.contains( value );
+            return ( col == null ) ? true : !ShadowProxyUtils.contains( col, value );
         }
 
         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 );
+            return ( col == null ) ? true : !ShadowProxyUtils.contains( col, value );
         }
 
         public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
                                           final VariableContextEntry context, final Object right) {
             final Object value = ((ObjectVariableContextEntry) context).left;
             final Collection col = (Collection) context.extractor.getValue( workingMemory, right );
-            return !col.contains( value );
+            return ( col == null ) ? true : !ShadowProxyUtils.contains( col, value );
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
@@ -535,7 +536,7 @@
                                 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 );
+            return ( col == null ) ? true : !ShadowProxyUtils.contains( col, value );
         }
 
         public String toString() {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ShadowProxyUtils.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ShadowProxyUtils.java	2007-09-25 16:41:01 UTC (rev 15365)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ShadowProxyUtils.java	2007-09-25 18:59:06 UTC (rev 15366)
@@ -21,8 +21,11 @@
 import java.lang.reflect.Method;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.Map;
 
+import org.drools.base.ShadowProxy;
+
 /**
  * A class with simple utility methods for shadowing
  * 
@@ -124,5 +127,75 @@
         }
         return result;
     }
+    
+    /**
+     * Checks if a collection contains a given object taking
+     * appropriate care with the presence or not of shadow proxies
+     * 
+     * @param col
+     * @param obj
+     * @return
+     */
+    public static boolean contains( Collection col, Object obj ) {
+        if( col == null )
+            return false;
+        if( obj instanceof ShadowProxy ) {
+            // if obj is a shadow proxy, its equals() method
+            // implementation will take appropriate care when
+            // the collection is checked.
+            return col.contains( obj );
+        } else {
+            // otherwise, iterate over the collection 
+            // comparing each element. If the element
+            // is a shadow proxy, there is no problem, since
+            // its equals() method implementation handles 
+            // comparisons with non shadowed objects appropriately
+            for( Iterator it = col.iterator(); it.hasNext(); ) {
+                Object next = it.next();
+                if( next == null && obj == null ||
+                    next != null && next.equals( obj ) ) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
 
+    /**
+     * Checks if an array contains a given object taking
+     * appropriate care with the presence or not of shadow proxies
+     * 
+     * @param col
+     * @param obj
+     * @return
+     */
+    public static boolean contains( Object[] array, Object obj ) {
+        if( array == null )
+            return false;
+        if( obj instanceof ShadowProxy ) {
+            // if obj is a shadow proxy, its equals() method
+            // implementation will take appropriate care when
+            // the array is checked.
+            for( int i = 0; i < array.length; i++ ) {
+                if( array[i] == null && obj == null ||
+                    obj != null && obj.equals( array[i] )) {
+                    return true;
+                }
+            }
+        } else {
+            // otherwise, iterate over the array 
+            // comparing each element. If the element
+            // is a shadow proxy, there is no problem, since
+            // its equals() method implementation handles 
+            // comparisons with non shadowed objects appropriately
+            for( int i = 0; i < array.length; i++ ) {
+                if( array[i] == null && obj == null ||
+                    array[i] != null && array[i].equals( obj )) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
 }

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-09-25 16:41:01 UTC (rev 15365)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java	2007-09-25 18:59:06 UTC (rev 15366)
@@ -113,7 +113,7 @@
                                  {field, "excludes", "foo", Boolean.FALSE},
                                  {field, "excludes", "xyz", Boolean.TRUE},
                                  {field, "excludes", null, Boolean.TRUE},
-                                 {null, "excludes", "foo", Boolean.FALSE},
+                                 {null, "excludes", "foo", Boolean.TRUE},
                                  {field, "!=", null, Boolean.TRUE},
                                  {field, "==", null, Boolean.FALSE},
                                  {null, "==", field, Boolean.FALSE},
@@ -127,7 +127,7 @@
                                  {"foo", "not memberOf", field, Boolean.FALSE},
                                  {"xyz", "not memberOf", field, Boolean.TRUE},
                                  {null, "not memberOf", field, Boolean.TRUE},
-                                 {"foo", "not memberOf", null, Boolean.FALSE}
+                                 {"foo", "not memberOf", null, Boolean.TRUE}
                                  };
 
         runEvaluatorTest( data,




More information about the jboss-svn-commits mailing list