[jboss-svn-commits] JBL Code SVN: r26576 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/base/evaluators and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon May 18 00:28:22 EDT 2009


Author: mark.proctor at jboss.com
Date: 2009-05-18 00:28:22 -0400 (Mon, 18 May 2009)
New Revision: 26576

Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ArrayContainsTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/SetEvaluatorsDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java
Log:
JBRULES-1954 issue with using contains operator on array or collection of double (any )
-contains and memberof now works with arrays
-added extensive integregration test.

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ArrayContainsTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ArrayContainsTest.java	2009-05-16 10:03:33 UTC (rev 26575)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ArrayContainsTest.java	2009-05-18 04:28:22 UTC (rev 26576)
@@ -1,10 +1,12 @@
 package org.drools.integrationtests;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 import org.drools.KnowledgeBase;
 import org.drools.KnowledgeBaseFactory;
+import org.drools.Order;
 import org.drools.Primitives;
 import org.drools.builder.KnowledgeBuilder;
 import org.drools.builder.KnowledgeBuilderFactory;
@@ -22,15 +24,17 @@
 
         str += "global java.util.List list;\n";
         str += "global Boolean bGlobal;\n";
+        str += "global Object bArrayGlobal;\n";
 
         str += "rule \"contains in array\"\n";
         str += "     salience 10\n";
         str += "     when\n";
-        str += "         Primitives( $b : booleanPrimitive == true ) \n";
-        str += "         Primitives( booleanPrimitive == false, primitiveBooleanArray contains bGlobal,  primitiveBooleanArray contains $b )\n";
+        str += "         Primitives( $b : booleanPrimitive == true, $array1 :  primitiveBooleanArray ) \n";
+        str += "         Primitives( booleanPrimitive == false, $array2 : primitiveBooleanArray contains bGlobal,  primitiveBooleanArray contains $b, ";
+        str += "                     booleanPrimitive memberOf $array2, booleanPrimitive memberOf $array1, booleanPrimitive memberOf bArrayGlobal )\n";
         str += "     then\n";
         str += "        list.add( \"ok1\" );\n";
-        str += "end\n";
+        str += "end\n";        
         
         final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
         kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL );
@@ -47,16 +51,19 @@
 
         final List list = new ArrayList();
         ksession.setGlobal( "list",
-                            list );  
-        
+                            list );          
         ksession.setGlobal( "bGlobal",
-                            true );             
+                            true );
+        ksession.setGlobal( "bArrayGlobal",
+                            new boolean[]{true, false} );          
         
         final Primitives p1 = new Primitives();
         p1.setPrimitiveBooleanArray( new boolean[]{true, false} );
+        p1.setBooleanPrimitive( false );
         FactHandle p1h = ksession.insert( p1 );
         
         final Primitives p2 = new Primitives();
+        p2.setPrimitiveBooleanArray( new boolean[]{true, false} );
         p2.setBooleanPrimitive( true );
         ksession.insert( p2 );                 
 
@@ -75,21 +82,88 @@
                       list.size() );        
     }      
     
+    public void testNotContainsBooleanArray() throws Exception {
+        String str = "";
+        str += "package org.drools;\n";
+
+        str += "global java.util.List list;\n";
+        str += "global Boolean bGlobal;\n";
+        str += "global Object bArrayGlobal;\n";
+
+        str += "rule \"contains in array\"\n";
+        str += "     salience 10\n";
+        str += "     when\n";
+        str += "         Primitives( $b : booleanPrimitive, intPrimitive == 10, $array1 :  primitiveBooleanArray ) \n";
+        str += "         Primitives( booleanPrimitive == false, intPrimitive != 10, $array2 : primitiveBooleanArray not contains bGlobal,  primitiveBooleanArray not contains $b, ";
+        str += "                     booleanPrimitive not memberOf $array2, booleanPrimitive not memberOf $array1, booleanPrimitive not memberOf bArrayGlobal )\n";
+        str += "     then\n";
+        str += "        list.add( \"ok1\" );\n";
+        str += "end\n";        
+        
+        final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL );
+        
+        if ( kbuilder.hasErrors() ) {
+            fail( "kbuilder has errors\n:" + kbuilder.getErrors() );
+        }
+        
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        kbase = SerializationHelper.serializeObject( kbase );
+        final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        final List list = new ArrayList();
+        ksession.setGlobal( "list",
+                            list );          
+        ksession.setGlobal( "bGlobal",
+                            false );
+        ksession.setGlobal( "bArrayGlobal",
+                            new boolean[]{true, true} );          
+        
+        final Primitives p1 = new Primitives();
+        p1.setIntPrimitive( 10 );
+        p1.setPrimitiveBooleanArray( new boolean[]{true, true} );
+        p1.setBooleanPrimitive( false );
+        FactHandle p1h = ksession.insert( p1 );
+        
+        final Primitives p2 = new Primitives();
+        p2.setPrimitiveBooleanArray( new boolean[]{true,true} );
+        p2.setBooleanPrimitive( false );
+        ksession.insert( p2 );                 
+
+        ksession.fireAllRules();
+
+        assertEquals( 1,
+                      list.size() );
+        
+        ksession.retract( p1h );
+        
+        ksession.insert( p1 );
+        
+        ksession.fireAllRules();
+
+        assertEquals( 2,
+                      list.size() );        
+    }          
+    
     public void testContainsByteArray() throws Exception {
         String str = "";
         str += "package org.drools;\n";
 
         str += "global java.util.List list;\n";
-        str += "global Byte bGlobal;\n";
+        str += "global Byte bGlobal;\n";        
+        str += "global Object bArrayGlobal;\n";
 
         str += "rule \"contains in array\"\n";
         str += "     salience 10\n";
         str += "     when\n";
-        str += "         Primitives( $b : bytePrimitive == 1 ) \n";
-        str += "         Primitives( bytePrimitive != 1, primitiveByteArray contains bGlobal,  primitiveByteArray contains $b )\n";
+        str += "         Primitives( $b : bytePrimitive == 1, $array1 :  primitiveByteArray ) \n";
+        str += "         Primitives( bytePrimitive != 1, $array2 : primitiveByteArray contains bGlobal,  primitiveByteArray contains $b, ";
+        str += "                     bytePrimitive memberOf $array2, bytePrimitive memberOf $array1, bytePrimitive memberOf bArrayGlobal )\n";
         str += "     then\n";
         str += "        list.add( \"ok1\" );\n";
-        str += "end\n";
+        str += "end\n";         
         
         final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
         kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL );
@@ -106,16 +180,19 @@
 
         final List list = new ArrayList();
         ksession.setGlobal( "list",
-                            list );  
-        
+                            list );        
         ksession.setGlobal( "bGlobal",
-                            (byte) 1 );             
+                            (byte) 1 );
+        ksession.setGlobal( "bArrayGlobal",
+                            new byte[]{1, 2, 3} );           
         
         final Primitives p1 = new Primitives();
         p1.setPrimitiveByteArray( new byte[]{1, 2, 3} );
+        p1.setBytePrimitive( (byte) 2 );
         FactHandle p1h = ksession.insert( p1 );
         
         final Primitives p2 = new Primitives();
+        p2.setPrimitiveByteArray( new byte[]{1, 2, 3} );
         p2.setBytePrimitive( (byte) 1 );
         ksession.insert( p2 );                 
 
@@ -134,21 +211,87 @@
                       list.size() );        
     }       
     
+    public void testNotContainsByteArray() throws Exception {
+        String str = "";
+        str += "package org.drools;\n";
+
+        str += "global java.util.List list;\n";
+        str += "global Byte bGlobal;\n";        
+        str += "global Object bArrayGlobal;\n";
+
+        str += "rule \"contains in array\"\n";
+        str += "     salience 10\n";
+        str += "     when\n";
+        str += "         Primitives( $b : bytePrimitive == 1, $array1 :  primitiveByteArray ) \n";
+        str += "         Primitives( bytePrimitive != 1, $array2 : primitiveByteArray not contains bGlobal,  primitiveByteArray not contains $b, ";
+        str += "                     bytePrimitive not memberOf $array2, bytePrimitive not memberOf $array1, bytePrimitive not memberOf bArrayGlobal )\n";
+        str += "     then\n";
+        str += "        list.add( \"ok1\" );\n";
+        str += "end\n";         
+        
+        final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL );
+        
+        if ( kbuilder.hasErrors() ) {
+            fail( "kbuilder has errors\n:" + kbuilder.getErrors() );
+        }
+        
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        kbase = SerializationHelper.serializeObject( kbase );
+        final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        final List list = new ArrayList();
+        ksession.setGlobal( "list",
+                            list );        
+        ksession.setGlobal( "bGlobal",
+                            (byte) 1 );
+        ksession.setGlobal( "bArrayGlobal",
+                            new byte[]{4, 5, 6} );           
+        
+        final Primitives p1 = new Primitives();
+        p1.setPrimitiveByteArray( new byte[]{4, 5, 6} );
+        p1.setBytePrimitive( (byte) 2 );
+        FactHandle p1h = ksession.insert( p1 );
+        
+        final Primitives p2 = new Primitives();
+        p2.setPrimitiveByteArray( new byte[]{4, 5, 6} );
+        p2.setBytePrimitive( (byte) 1 );
+        ksession.insert( p2 );                 
+
+        ksession.fireAllRules();
+
+        assertEquals( 1,
+                      list.size() );
+        
+        ksession.retract( p1h );
+        
+        ksession.insert( p1 );
+        
+        ksession.fireAllRules();
+
+        assertEquals( 2,
+                      list.size() );        
+    }           
+    
     public void testContainsShortArray() throws Exception {
         String str = "";
         str += "package org.drools;\n";
 
         str += "global java.util.List list;\n";
-        str += "global Short sGlobal;\n";
+        str += "global Short sGlobal;\n";        
+        str += "global Object sArrayGlobal;\n";
 
         str += "rule \"contains in array\"\n";
         str += "     salience 10\n";
         str += "     when\n";
-        str += "         Primitives( $s : shortPrimitive == 1 ) \n";
-        str += "         Primitives( shortPrimitive != 1, primitiveShortArray contains sGlobal,  primitiveShortArray contains $s )\n";
+        str += "         Primitives( $s : shortPrimitive == 1, $array1 :  primitiveShortArray ) \n";
+        str += "         Primitives( shortPrimitive != 1, $array2 : primitiveShortArray contains sGlobal,  primitiveShortArray contains $s, ";
+        str += "                     shortPrimitive memberOf $array2, shortPrimitive memberOf $array1, shortPrimitive memberOf sArrayGlobal )\n";
         str += "     then\n";
         str += "        list.add( \"ok1\" );\n";
-        str += "end\n";
+        str += "end\n";          
         
         final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
         kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL );
@@ -165,16 +308,19 @@
 
         final List list = new ArrayList();
         ksession.setGlobal( "list",
-                            list );  
-        
+                            list );          
         ksession.setGlobal( "sGlobal",
-                            (short) 1 );             
+                            (short) 1 );        
+        ksession.setGlobal( "sArrayGlobal",
+                            new short[]{1, 2, 3} );         
         
         final Primitives p1 = new Primitives();
         p1.setPrimitiveShortArray( new short[]{1, 2, 3} );
+        p1.setShortPrimitive( (short) 2 );
         FactHandle p1h = ksession.insert( p1 );
         
         final Primitives p2 = new Primitives();
+        p2.setPrimitiveShortArray( new short[]{1, 2, 3} );
         p2.setShortPrimitive( (short) 1 );
         ksession.insert( p2 );                 
 
@@ -191,23 +337,89 @@
 
         assertEquals( 2,
                       list.size() );        
-    }         
+    }       
     
+    public void testNotContainsShortArray() throws Exception {
+        String str = "";
+        str += "package org.drools;\n";
+
+        str += "global java.util.List list;\n";
+        str += "global Short sGlobal;\n";        
+        str += "global Object sArrayGlobal;\n";
+
+        str += "rule \"contains in array\"\n";
+        str += "     salience 10\n";
+        str += "     when\n";
+        str += "         Primitives( $s : shortPrimitive == 1, $array1 :  primitiveShortArray ) \n";
+        str += "         Primitives( shortPrimitive != 1, $array2 : primitiveShortArray not contains sGlobal,  primitiveShortArray not contains $s, ";
+        str += "                     shortPrimitive not memberOf $array2, shortPrimitive not memberOf $array1, shortPrimitive not memberOf sArrayGlobal )\n";
+        str += "     then\n";
+        str += "        list.add( \"ok1\" );\n";
+        str += "end\n";          
+        
+        final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL );
+        
+        if ( kbuilder.hasErrors() ) {
+            fail( "kbuilder has errors\n:" + kbuilder.getErrors() );
+        }
+        
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        kbase = SerializationHelper.serializeObject( kbase );
+        final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        final List list = new ArrayList();
+        ksession.setGlobal( "list",
+                            list );          
+        ksession.setGlobal( "sGlobal",
+                            (short) 1 );        
+        ksession.setGlobal( "sArrayGlobal",
+                            new short[]{4, 5, 6} );         
+        
+        final Primitives p1 = new Primitives();
+        p1.setPrimitiveShortArray( new short[]{4, 5, 6} );
+        p1.setShortPrimitive( (short) 2 );
+        FactHandle p1h = ksession.insert( p1 );
+        
+        final Primitives p2 = new Primitives();
+        p2.setPrimitiveShortArray( new short[]{4, 5, 6} );
+        p2.setShortPrimitive( (short) 1 );
+        ksession.insert( p2 );                 
+
+        ksession.fireAllRules();
+
+        assertEquals( 1,
+                      list.size() );
+        
+        ksession.retract( p1h );
+        
+        ksession.insert( p1 );
+        
+        ksession.fireAllRules();
+
+        assertEquals( 2,
+                      list.size() );        
+    }           
+    
     public void testContainsCharArray() throws Exception {
         String str = "";
         str += "package org.drools;\n";
 
         str += "global java.util.List list;\n";
         str += "global Character cGlobal;\n";
+        str += "global Object cArrayGlobal;\n";
 
         str += "rule \"contains in array\"\n";
         str += "     salience 10\n";
         str += "     when\n";
-        str += "         Primitives( $c : charPrimitive == 'c' ) \n";
-        str += "         Primitives( charPrimitive != 'c', primitiveCharArray contains cGlobal,  primitiveCharArray contains $c )\n";
+        str += "         Primitives( $c : charPrimitive == 'c', $array1 :  primitiveCharArray ) \n";
+        str += "         Primitives( charPrimitive != 'c', $array2 : primitiveCharArray contains cGlobal,  primitiveCharArray contains $c, ";
+        str += "                     charPrimitive memberOf $array2, charPrimitive memberOf $array1, charPrimitive memberOf cArrayGlobal )\n";
         str += "     then\n";
         str += "        list.add( \"ok1\" );\n";
-        str += "end\n";
+        str += "end\n";            
         
         final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
         kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL );
@@ -224,16 +436,19 @@
 
         final List list = new ArrayList();
         ksession.setGlobal( "list",
-                            list );  
-        
+                            list );          
         ksession.setGlobal( "cGlobal",
-                            'c' );             
+                            'c'  );  
+        ksession.setGlobal( "cArrayGlobal",
+                            new char[]{ 'a', 'b', 'c'} );        
         
         final Primitives p1 = new Primitives();
         p1.setPrimitiveCharArray( new char[]{ 'a', 'b', 'c'} );
+        p1.setCharPrimitive( 'a' );
         FactHandle p1h = ksession.insert( p1 );
         
         final Primitives p2 = new Primitives();
+        p2.setPrimitiveCharArray( new char[]{ 'a', 'b', 'c'} );
         p2.setCharPrimitive( 'c' );
         ksession.insert( p2 );                 
 
@@ -252,21 +467,87 @@
                       list.size() );        
     }     
     
+    public void testNotContainsCharArray() throws Exception {
+        String str = "";
+        str += "package org.drools;\n";
+
+        str += "global java.util.List list;\n";
+        str += "global Character cGlobal;\n";
+        str += "global Object cArrayGlobal;\n";
+
+        str += "rule \"contains in array\"\n";
+        str += "     salience 10\n";
+        str += "     when\n";
+        str += "         Primitives( $c : charPrimitive == 'c', $array1 :  primitiveCharArray ) \n";
+        str += "         Primitives( charPrimitive != 'c', $array2 : primitiveCharArray not contains cGlobal,  primitiveCharArray not contains $c, ";
+        str += "                     charPrimitive not memberOf $array2, charPrimitive not memberOf $array1, charPrimitive not memberOf cArrayGlobal )\n";
+        str += "     then\n";
+        str += "        list.add( \"ok1\" );\n";
+        str += "end\n";            
+        
+        final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL );
+        
+        if ( kbuilder.hasErrors() ) {
+            fail( "kbuilder has errors\n:" + kbuilder.getErrors() );
+        }
+        
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        kbase = SerializationHelper.serializeObject( kbase );
+        final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        final List list = new ArrayList();
+        ksession.setGlobal( "list",
+                            list );          
+        ksession.setGlobal( "cGlobal",
+                            'c'  );  
+        ksession.setGlobal( "cArrayGlobal",
+                            new char[]{ 'd', 'e', 'f'} );        
+        
+        final Primitives p1 = new Primitives();
+        p1.setPrimitiveCharArray( new char[]{ 'd', 'e', 'f'} );
+        p1.setCharPrimitive( 'a' );
+        FactHandle p1h = ksession.insert( p1 );
+        
+        final Primitives p2 = new Primitives();
+        p2.setPrimitiveCharArray( new char[]{ 'd', 'e', 'f'} );
+        p2.setCharPrimitive( 'c' );
+        ksession.insert( p2 );                 
+
+        ksession.fireAllRules();
+
+        assertEquals( 1,
+                      list.size() );
+        
+        ksession.retract( p1h );
+        
+        ksession.insert( p1 );
+        
+        ksession.fireAllRules();
+
+        assertEquals( 2,
+                      list.size() );        
+    }         
+    
     public void testContainsIntArray() throws Exception {
         String str = "";
         str += "package org.drools;\n";
 
         str += "global java.util.List list;\n";
-        str += "global Integer iGlobal;\n";
+        str += "global Integer iGlobal;\n";        
+        str += "global Object iArrayGlobal;\n";
 
         str += "rule \"contains in array\"\n";
         str += "     salience 10\n";
         str += "     when\n";
-        str += "         Primitives( $i : intPrimitive == 10 ) \n";
-        str += "         Primitives( intPrimitive != 10, primitiveIntArray contains iGlobal,  primitiveIntArray contains $i )\n";
+        str += "         Primitives( $i : intPrimitive == 10, $array1 :  primitiveIntArray ) \n";
+        str += "         Primitives( intPrimitive != 10, $array2 : primitiveIntArray contains iGlobal,  primitiveIntArray contains $i, ";
+        str += "                     intPrimitive memberOf $array2, intPrimitive memberOf $array1, intPrimitive memberOf iArrayGlobal )\n";
         str += "     then\n";
         str += "        list.add( \"ok1\" );\n";
-        str += "end\n";
+        str += "end\n";           
         
         final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
         kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL );
@@ -286,13 +567,17 @@
                             list );  
         
         ksession.setGlobal( "iGlobal",
-                            10 );             
+                            10 );   
+        ksession.setGlobal( "iArrayGlobal",
+                            new int[]{ 5, 10, 20} );           
         
         final Primitives p1 = new Primitives();
         p1.setPrimitiveIntArray( new int[]{ 5, 10, 20} );
+        p1.setIntPrimitive( 5 );
         FactHandle p1h = ksession.insert( p1 );
         
         final Primitives p2 = new Primitives();
+        p2.setPrimitiveIntArray( new int[]{ 5, 10, 20} );
         p2.setIntPrimitive( 10 );
         ksession.insert( p2 );                 
 
@@ -311,21 +596,88 @@
                       list.size() );        
     } 
     
+    public void testNotContainsIntArray() throws Exception {
+        String str = "";
+        str += "package org.drools;\n";
+
+        str += "global java.util.List list;\n";
+        str += "global Integer iGlobal;\n";        
+        str += "global Object iArrayGlobal;\n";
+
+        str += "rule \"contains in array\"\n";
+        str += "     salience 10\n";
+        str += "     when\n";
+        str += "         Primitives( $i : intPrimitive == 10, $array1 :  primitiveIntArray ) \n";
+        str += "         Primitives( intPrimitive != 10, $array2 : primitiveIntArray not contains iGlobal,  primitiveIntArray not contains $i, ";
+        str += "                     intPrimitive not memberOf $array2, intPrimitive not memberOf $array1, intPrimitive not memberOf iArrayGlobal )\n";
+        str += "     then\n";
+        str += "        list.add( \"ok1\" );\n";
+        str += "end\n";           
+        
+        final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL );
+        
+        if ( kbuilder.hasErrors() ) {
+            fail( "kbuilder has errors\n:" + kbuilder.getErrors() );
+        }
+        
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        kbase = SerializationHelper.serializeObject( kbase );
+        final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        final List list = new ArrayList();
+        ksession.setGlobal( "list",
+                            list );  
+        
+        ksession.setGlobal( "iGlobal",
+                            10 );   
+        ksession.setGlobal( "iArrayGlobal",
+                            new int[]{ 40, 50, 60} );           
+        
+        final Primitives p1 = new Primitives();
+        p1.setPrimitiveIntArray( new int[]{ 40, 50, 60} );
+        p1.setIntPrimitive( 5 );
+        FactHandle p1h = ksession.insert( p1 );
+        
+        final Primitives p2 = new Primitives();
+        p2.setPrimitiveIntArray( new int[]{ 40, 50, 60} );
+        p2.setIntPrimitive( 10 );
+        ksession.insert( p2 );                 
+
+        ksession.fireAllRules();
+
+        assertEquals( 1,
+                      list.size() );
+        
+        ksession.retract( p1h );
+        
+        ksession.insert( p1 );
+        
+        ksession.fireAllRules();
+
+        assertEquals( 2,
+                      list.size() );        
+    }     
+    
     public void testContainsLongArray() throws Exception {
         String str = "";
         str += "package org.drools;\n";
 
         str += "global java.util.List list;\n";
-        str += "global Long lGlobal;\n";
+        str += "global Long lGlobal;\n";        
+        str += "global Object lArrayGlobal;\n";
 
         str += "rule \"contains in array\"\n";
         str += "     salience 10\n";
         str += "     when\n";
-        str += "         Primitives( $l : longPrimitive == 10 ) \n";
-        str += "         Primitives( longPrimitive != 10, primitiveLongArray contains lGlobal,  primitiveLongArray contains $l )\n";
+        str += "         Primitives( $l : longPrimitive == 10, $array1 :  primitiveLongArray ) \n";
+        str += "         Primitives( longPrimitive != 10, $array2 : primitiveLongArray contains lGlobal,  primitiveLongArray contains $l, ";
+        str += "                     longPrimitive memberOf $array2, longPrimitive memberOf $array1, longPrimitive memberOf lArrayGlobal )\n";
         str += "     then\n";
         str += "        list.add( \"ok1\" );\n";
-        str += "end\n";
+        str += "end\n";            
         
         final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
         kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL );
@@ -345,14 +697,18 @@
                             list );  
         
         ksession.setGlobal( "lGlobal",
-                            10l );             
+                            10l );  
+        ksession.setGlobal( "lArrayGlobal",
+                            new long[]{ 5, 10, 20}  );         
         
         final Primitives p1 = new Primitives();
         p1.setPrimitiveLongArray( new long[]{ 5, 10, 20} );
+        p1.setLongPrimitive( 5 );
         FactHandle p1h = ksession.insert( p1 );
         
         final Primitives p2 = new Primitives();
         p2.setLongPrimitive( 10 );
+        p2.setPrimitiveLongArray( new long[]{ 5, 10, 20} );
         ksession.insert( p2 );                 
 
         ksession.fireAllRules();
@@ -370,21 +726,88 @@
                       list.size() );        
     }     
     
+    public void testNotContainsLongArray() throws Exception {
+        String str = "";
+        str += "package org.drools;\n";
+
+        str += "global java.util.List list;\n";
+        str += "global Long lGlobal;\n";        
+        str += "global Object lArrayGlobal;\n";
+
+        str += "rule \"contains in array\"\n";
+        str += "     salience 10\n";
+        str += "     when\n";
+        str += "         Primitives( $l : longPrimitive == 10, $array1 :  primitiveLongArray ) \n";
+        str += "         Primitives( longPrimitive != 10, $array2 : primitiveLongArray not contains lGlobal,  primitiveLongArray not contains $l, ";
+        str += "                     longPrimitive not memberOf $array2, longPrimitive not memberOf $array1, longPrimitive not memberOf lArrayGlobal )\n";
+        str += "     then\n";
+        str += "        list.add( \"ok1\" );\n";
+        str += "end\n";            
+        
+        final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL );
+        
+        if ( kbuilder.hasErrors() ) {
+            fail( "kbuilder has errors\n:" + kbuilder.getErrors() );
+        }
+        
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        kbase = SerializationHelper.serializeObject( kbase );
+        final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        final List list = new ArrayList();
+        ksession.setGlobal( "list",
+                            list );  
+        
+        ksession.setGlobal( "lGlobal",
+                            10l );  
+        ksession.setGlobal( "lArrayGlobal",
+                            new long[]{ 40, 50, 60}  );         
+        
+        final Primitives p1 = new Primitives();
+        p1.setPrimitiveLongArray( new long[]{ 40, 50, 60} );
+        p1.setLongPrimitive( 5 );
+        FactHandle p1h = ksession.insert( p1 );
+        
+        final Primitives p2 = new Primitives();
+        p2.setLongPrimitive( 10 );
+        p2.setPrimitiveLongArray( new long[]{ 40, 50, 60} );
+        ksession.insert( p2 );                 
+
+        ksession.fireAllRules();
+
+        assertEquals( 1,
+                      list.size() );
+        
+        ksession.retract( p1h );
+        
+        ksession.insert( p1 );
+        
+        ksession.fireAllRules();
+
+        assertEquals( 2,
+                      list.size() );        
+    }         
+    
     public void testContainsFloatArray() throws Exception {
         String str = "";
         str += "package org.drools;\n";
 
         str += "global java.util.List list;\n";
         str += "global Float fGlobal;\n";
+        str += "global Object fArrayGlobal;\n";
 
         str += "rule \"contains in array\"\n";
         str += "     salience 10\n";
         str += "     when\n";
-        str += "         Primitives( $f : floatPrimitive == 10 ) \n";
-        str += "         Primitives( floatPrimitive != 10, primitiveFloatArray contains fGlobal,  primitiveFloatArray contains $f )\n";
+        str += "         Primitives( $f : floatPrimitive == 10, $array1 :  primitiveFloatArray ) \n";
+        str += "         Primitives( floatPrimitive != 10, $array2 : primitiveFloatArray contains fGlobal,  primitiveFloatArray contains $f, ";
+        str += "                     floatPrimitive memberOf $array2, floatPrimitive memberOf $array1, floatPrimitive memberOf fArrayGlobal )\n";
         str += "     then\n";
         str += "        list.add( \"ok1\" );\n";
-        str += "end\n";
+        str += "end\n";        
         
         final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
         kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL );
@@ -404,14 +827,18 @@
                                  list );  
         
         ksession.setGlobal( "fGlobal",
-                            10.0f );             
+                            10.0f ); 
+        ksession.setGlobal( "fArrayGlobal",
+                            new float[]{ 5, 10, 20} );         
         
         final Primitives p1 = new Primitives();
-        p1.setPrimitiveFloatArray( new float[]{ 5f, 10f, 20f} );
+        p1.setFloatPrimitive( 5 );
+        p1.setPrimitiveFloatArray( new float[]{ 5, 10, 20} );
         FactHandle p1h = ksession.insert( p1 );
         
         final Primitives p2 = new Primitives();
-        p2.setFloatPrimitive( 10f );
+        p2.setFloatPrimitive( 10 );
+        p2.setPrimitiveFloatArray( new float[]{ 5, 10, 20} );
         ksession.insert( p2 );                 
 
         ksession.fireAllRules();
@@ -429,18 +856,86 @@
                       list.size() );        
     }     
     
+    public void testNotContainsFloatArray() throws Exception {
+        String str = "";
+        str += "package org.drools;\n";
+
+        str += "global java.util.List list;\n";
+        str += "global Float fGlobal;\n";
+        str += "global Object fArrayGlobal;\n";
+
+        str += "rule \"contains in array\"\n";
+        str += "     salience 10\n";
+        str += "     when\n";
+        str += "         Primitives( $f : floatPrimitive == 10, $array1 :  primitiveFloatArray ) \n";
+        str += "         Primitives( floatPrimitive != 10, $array2 : primitiveFloatArray not contains fGlobal,  primitiveFloatArray not contains $f, ";
+        str += "                     floatPrimitive not memberOf $array2, floatPrimitive not memberOf $array1, floatPrimitive not memberOf fArrayGlobal )\n";
+        str += "     then\n";
+        str += "        list.add( \"ok1\" );\n";
+        str += "end\n";        
+        
+        final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL );
+        
+        if ( kbuilder.hasErrors() ) {
+            fail( "kbuilder has errors\n:" + kbuilder.getErrors() );
+        }
+        
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        kbase = SerializationHelper.serializeObject( kbase );
+        final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        final List list = new ArrayList();
+        ksession.setGlobal( "list",
+                                 list );  
+        
+        ksession.setGlobal( "fGlobal",
+                            10.0f ); 
+        ksession.setGlobal( "fArrayGlobal",
+                            new float[]{ 40, 50, 60} );         
+        
+        final Primitives p1 = new Primitives();
+        p1.setFloatPrimitive( 5 );
+        p1.setPrimitiveFloatArray( new float[]{ 40, 50, 60} );
+        FactHandle p1h = ksession.insert( p1 );
+        
+        final Primitives p2 = new Primitives();
+        p2.setFloatPrimitive( 10 );
+        p2.setPrimitiveFloatArray( new float[]{ 40, 50, 60} );
+        ksession.insert( p2 );                
+
+        ksession.fireAllRules();
+
+        assertEquals( 1,
+                      list.size() );
+        
+        ksession.retract( p1h );
+        
+        ksession.insert( p1 );
+        
+        ksession.fireAllRules();
+
+        assertEquals( 2,
+                      list.size() );        
+    }         
+       
+    
     public void testContainsDoubleArray() throws Exception {
         String str = "";
         str += "package org.drools;\n";
 
         str += "global java.util.List list;\n";
         str += "global Double dGlobal;\n";
+        str += "global Object dArrayGlobal;\n";
 
         str += "rule \"contains in array\"\n";
         str += "     salience 10\n";
         str += "     when\n";
-        str += "         Primitives( $d : doublePrimitive == 10 ) \n";
-        str += "         Primitives( doublePrimitive != 10, primitiveDoubleArray contains dGlobal,  primitiveDoubleArray contains $d )\n";
+        str += "         Primitives( $d : doublePrimitive == 10, $array1 :  primitiveDoubleArray ) \n";
+        str += "         Primitives( doublePrimitive != 10, $array2 : primitiveDoubleArray contains dGlobal,  primitiveDoubleArray contains $d, ";
+        str += "                     doublePrimitive memberOf $array2, doublePrimitive memberOf $array1, doublePrimitive memberOf dArrayGlobal )\n";
         str += "     then\n";
         str += "        list.add( \"ok1\" );\n";
         str += "end\n";
@@ -463,14 +958,19 @@
                                  list );  
         
         ksession.setGlobal( "dGlobal",
-                            10.0d );             
+                            10.0d ); 
         
+        ksession.setGlobal( "dArrayGlobal",
+                            new double[]{ 5, 10, 20} );       
+        
         final Primitives p1 = new Primitives();
         p1.setPrimitiveDoubleArray( new double[]{ 5, 10, 20} );
+        p1.setDoublePrimitive( 5 );
         FactHandle p1h = ksession.insert( p1 );
         
         final Primitives p2 = new Primitives();
         p2.setDoublePrimitive( 10 );
+        p2.setPrimitiveDoubleArray( new double[]{ 5, 10, 20} );
         ksession.insert( p2 );                 
 
         ksession.fireAllRules();
@@ -487,5 +987,73 @@
         assertEquals( 2,
                       list.size() );        
     }    
+    
+    public void testNotContainsDoubleArray() throws Exception {
+        String str = "";
+        str += "package org.drools;\n";
+
+        str += "global java.util.List list;\n";
+        str += "global Double dGlobal;\n";
+        str += "global Object dArrayGlobal;\n";
+
+        str += "rule \"contains in array\"\n";
+        str += "     salience 10\n";
+        str += "     when\n";
+        str += "         Primitives( $d : doublePrimitive == 10, $array1 :  primitiveDoubleArray ) \n";
+        str += "         Primitives( doublePrimitive != 10, $array2 : primitiveDoubleArray not contains dGlobal,  primitiveDoubleArray not contains $d, ";
+        str += "                     doublePrimitive not memberOf $array2, doublePrimitive not memberOf $array1, doublePrimitive not memberOf dArrayGlobal )\n";
+        str += "     then\n";
+        str += "        list.add( \"ok1\" );\n";
+        str += "end\n";
+        
+        final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL );
+        
+        if ( kbuilder.hasErrors() ) {
+            fail( "kbuilder has errors\n:" + kbuilder.getErrors() );
+        }
+        
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        kbase = SerializationHelper.serializeObject( kbase );
+        final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        final List list = new ArrayList();
+        ksession.setGlobal( "list",
+                                 list );  
+        
+        ksession.setGlobal( "dGlobal",
+                            10.0d ); 
+        
+        ksession.setGlobal( "dArrayGlobal",
+                            new double[]{ 40, 50, 60} );       
+        
+        final Primitives p1 = new Primitives();
+        p1.setPrimitiveDoubleArray( new double[]{ 40, 50, 60} );
+        p1.setDoublePrimitive( 5 );
+        FactHandle p1h = ksession.insert( p1 );
+        
+        final Primitives p2 = new Primitives();
+        p2.setDoublePrimitive( 10 );
+        p2.setPrimitiveDoubleArray( new double[]{ 40, 50, 60} );
+        ksession.insert( p2 );                 
+
+        ksession.fireAllRules();
+
+        assertEquals( 1,
+                      list.size() );
+        
+        ksession.retract( p1h );
+        
+        ksession.insert( p1 );
+        
+        ksession.fireAllRules();
+
+        assertEquals( 2,
+                      list.size() );        
+    }       
+    
+    
          
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/SetEvaluatorsDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/SetEvaluatorsDefinition.java	2009-05-16 10:03:33 UTC (rev 26575)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/SetEvaluatorsDefinition.java	2009-05-18 04:28:22 UTC (rev 26576)
@@ -35,9 +35,9 @@
 import org.drools.spi.InternalReadAccessor;
 
 /**
- * This class defines all the set built in
- * evaluators like contains, memberOf, etc.
- *
+ * This class defines all the set built in evaluators like contains, memberOf,
+ * etc.
+ * 
  * @author etirelli
  */
 public class SetEvaluatorsDefinition
@@ -73,12 +73,6 @@
                                                         addEvaluator( ValueType.ARRAY_TYPE,
                                                                       NOT_EXCLUDES,
                                                                       ArrayContainsEvaluator.INSTANCE );
-                                                        addEvaluator( ValueType.ARRAY_TYPE,
-                                                                      MEMBEROF,
-                                                                      ArrayMemberOfEvaluator.INSTANCE );
-                                                        addEvaluator( ValueType.ARRAY_TYPE,
-                                                                      NOT_MEMBEROF,
-                                                                      ArrayNotMemberOfEvaluator.INSTANCE );
                                                         addEvaluator( ValueType.BIG_DECIMAL_TYPE,
                                                                       MEMBEROF,
                                                                       BigDecimalMemberOfEvaluator.INSTANCE );
@@ -322,9 +316,8 @@
         return eval;
     }
 
-    /*  *********************************************************
-     *                Evaluator Implementations
-     *  *********************************************************
+    /*
+     * Evaluator Implementations
      */
     public static class ArrayContainsEvaluator extends BaseEvaluator {
 
@@ -346,8 +339,7 @@
             if ( array == null ) return false;
 
             return getArrayContains( array.getClass() ).contains( array,
-                                                                  object2,
-                                                                  true );
+                                                                  object2 );
         }
 
         public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
@@ -359,8 +351,7 @@
             return getArrayContains( array.getClass() ).contains( array,
                                                                   workingMemory,
                                                                   context.declaration.getExtractor(),
-                                                                  left,
-                                                                  true );
+                                                                  left );
         }
 
         public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
@@ -374,8 +365,7 @@
             return getArrayContains( array.getClass() ).contains( array,
                                                                   workingMemory,
                                                                   context.declaration.getExtractor(),
-                                                                  context.getTuple().get( context.getVariableDeclaration() ).getObject(),
-                                                                  true );
+                                                                  context.reteTuple.get( context.declaration ).getObject() );
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
@@ -391,8 +381,7 @@
             return getArrayContains( array.getClass() ).contains( array,
                                                                   workingMemory,
                                                                   extractor2,
-                                                                  object2,
-                                                                  true );
+                                                                  object2 );
         }
 
         public String toString() {
@@ -416,100 +405,39 @@
                                 final InternalReadAccessor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
-            final Object value = object2.getValue();
-            final Object[] array = (Object[]) extractor.getValue( workingMemory,
-                                                                  object1 );
-            if ( array == null ) return true;
-            return !contains( array,
-                              value );
-        }
+            final Object array = extractor.getValue( workingMemory,
+                                                     object1 );
 
-        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 true;
-            return !contains( array,
-                              value );
-        }
+            if ( array == null ) return false;
 
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          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 true;
-            return !contains( array,
-                              value );
+            return !getArrayContains( array.getClass() ).contains( array,
+                                                                   object2 );
         }
 
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final InternalReadAccessor extractor1,
-                                final Object object1,
-                                final InternalReadAccessor extractor2,
-                                final Object object2) {
-            final Object value = extractor2.getValue( workingMemory,
-                                                      object2 );
-            final Object[] array = (Object[]) extractor1.getValue( workingMemory,
-                                                                   object1 );
-
-            if ( array == null ) return true;
-            return !contains( array,
-                              value );
-        }
-
-        public String toString() {
-            return "Array excludes";
-        }
-    }
-
-    public static class ArrayMemberOfEvaluator extends BaseEvaluator {
-        /**
-         *
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ArrayMemberOfEvaluator();
-
-        public ArrayMemberOfEvaluator() {
-            super( ValueType.ARRAY_TYPE,
-                   MEMBEROF );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final InternalReadAccessor extractor,
-                                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 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 Object value = ((ObjectVariableContextEntry) context).right;
+            final Object array = ((ObjectVariableContextEntry) context).right;
             if ( array == null ) return false;
-            return contains( array,
-                             value );
+
+            return !getArrayContains( array.getClass() ).contains( array,
+                                                                   workingMemory,
+                                                                   context.declaration.getExtractor(),
+                                                                   left );
         }
 
         public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
                                           final VariableContextEntry context,
                                           final Object right) {
-            final Object[] array = (Object[]) ((ObjectVariableContextEntry) context).left;
-            final Object value = context.extractor.getValue( workingMemory,
+            final Object array = context.extractor.getValue( workingMemory,
                                                              right );
+
             if ( array == null ) return false;
-            return contains( array,
-                             value );
+
+            return !getArrayContains( array.getClass() ).contains( array,
+                                                                   workingMemory,
+                                                                   context.declaration.getExtractor(),
+                                                                   context.getTuple().get( context.getVariableDeclaration() ).getObject() );
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
@@ -517,87 +445,23 @@
                                 final Object object1,
                                 final InternalReadAccessor extractor2,
                                 final Object object2) {
-            final Object[] array = (Object[]) extractor2.getValue( workingMemory,
-                                                                   object2 );
-            final Object value = extractor1.getValue( workingMemory,
+            final Object array = extractor1.getValue( workingMemory,
                                                       object1 );
 
             if ( array == null ) return false;
-            return contains( array,
-                             value );
-        }
 
-        public String toString() {
-            return "Array memberOf";
-        }
-    }
-
-    public static class ArrayNotMemberOfEvaluator extends BaseEvaluator {
-        /**
-         *
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ArrayNotMemberOfEvaluator();
-
-        public ArrayNotMemberOfEvaluator() {
-            super( ValueType.ARRAY_TYPE,
-                   NOT_MEMBEROF );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final InternalReadAccessor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            final Object[] array = (Object[]) object2.getValue();
-            final Object value = extractor.getValue( workingMemory,
-                                                     object1 );
-            if ( array == null ) return true;
-            return !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 Object value = ((ObjectVariableContextEntry) context).right;
-            if ( array == null ) return true;
-            return !SetEvaluatorsDefinition.contains( array,
-                                                      value );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          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 true;
-            return !contains( array,
-                              value );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final InternalReadAccessor extractor1,
-                                final Object object1,
-                                final InternalReadAccessor extractor2,
-                                final Object object2) {
-            final Object[] array = (Object[]) extractor2.getValue( workingMemory,
+            return !getArrayContains( array.getClass() ).contains( array,
+                                                                   workingMemory,
+                                                                   extractor2,
                                                                    object2 );
-            final Object value = extractor1.getValue( workingMemory,
-                                                      object1 );
-
-            if ( array == null ) return true;
-            return !SetEvaluatorsDefinition.contains( array,
-                                                      value );
         }
 
         public String toString() {
-            return "Array not memberOf";
+            return "Array not contains";
         }
     }
 
+
     private static boolean contains(Object[] array,
                                     Object value) {
         for ( int i = 0; i < array.length; i++ ) {
@@ -634,13 +498,19 @@
                                 final FieldValue object2) {
             if ( object2.isNull() ) {
                 return false;
-            } else if ( !object2.isCollectionField() ) {
+            } else if ( object2.isCollectionField() ) {
+                final Collection col = (Collection) object2.getValue();
+                final Object value = extractor.getValue( workingMemory,
+                                                         object1 );
+                return col.contains( value );
+            } else if ( object2.getValue().getClass().isArray() ) {
+                return getArrayContains( object2.getValue().getClass() ).contains( object2.getValue(),
+                                                                                   workingMemory,
+                                                                                   extractor,
+                                                                                   object1 );
+            } else {
                 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( workingMemory,
-                                                     object1 );
-            return col.contains( value );
         }
 
         public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
@@ -650,12 +520,18 @@
                                                                                left );
             if ( object == null ) {
                 return false;
-            } else if ( !(object instanceof Collection) ) {
+            } else if ( object instanceof Collection ) {
+                final Collection col = (Collection) object;
+                final Object value = ((ObjectVariableContextEntry) context).right;
+                return col.contains( value );
+            } else if ( object.getClass().isArray() ) {
+                return getArrayContains( object.getClass() ).contains( object,
+                                                                       workingMemory,
+                                                                       context.extractor,
+                                                                       context.object );
+            } else {
                 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 = ((ObjectVariableContextEntry) context).right;
-            return col.contains( value );
         }
 
         public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
@@ -664,13 +540,19 @@
             final Object object = ((ObjectVariableContextEntry) context).left;
             if ( object == null ) {
                 return false;
-            } else if ( !(object instanceof Collection) ) {
+            } else if ( object instanceof Collection ) {
+                final Collection col = (Collection) object;
+                final Object value = context.extractor.getValue( workingMemory,
+                                                                 right );
+                return col.contains( value );
+            } else if ( object.getClass().isArray() ) {
+                return getArrayContains( object.getClass() ).contains( object,
+                                                                       workingMemory,
+                                                                       context.extractor,
+                                                                       right );
+            } else {
                 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( workingMemory,
-                                                             right );
-            return col.contains( value );
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
@@ -682,13 +564,19 @@
                                                        object2 );
             if ( object == null ) {
                 return false;
-            } else if ( !(object instanceof Collection) ) {
+            } else if ( object instanceof Collection ) {
+                final Collection col = (Collection) object;
+                final Object value = extractor1.getValue( workingMemory,
+                                                          object1 );
+                return col.contains( value );
+            } else if ( object.getClass().isArray() ) {                
+                return getArrayContains( object.getClass() ).contains( object,
+                                                                      workingMemory,
+                                                                      extractor1,
+                                                                      object1 );                
+            } else {
                 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( workingMemory,
-                                                      object1 );
-            return col.contains( value );
         }
 
         public abstract String toString();
@@ -716,13 +604,19 @@
                                 final FieldValue object2) {
             if ( object2.isNull() ) {
                 return false;
-            } else if ( !object2.isCollectionField() ) {
+            } else if ( object2.isCollectionField() ) {
+                final Collection col = (Collection) object2.getValue();
+                final Object value = extractor.getValue( workingMemory,
+                                                         object1 );
+                return !col.contains( value );
+            } else if ( object2.getValue().getClass().isArray() ) {
+                return !getArrayContains( object2.getValue().getClass() ).contains( object2.getValue(),
+                                                                                   workingMemory,
+                                                                                   extractor,
+                                                                                   object1 );
+            } else {
                 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( workingMemory,
-                                                     object1 );
-            return !col.contains( value );
         }
 
         public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
@@ -732,12 +626,18 @@
                                                                                left );
             if ( object == null ) {
                 return false;
-            } else if ( !(object instanceof Collection) ) {
+            } else if ( object instanceof Collection ) {
+                final Collection col = (Collection) object;
+                final Object value = ((ObjectVariableContextEntry) context).right;
+                return !col.contains( value );
+            } else if ( object.getClass().isArray() ) {
+                return !getArrayContains( object.getClass() ).contains( object,
+                                                                       workingMemory,
+                                                                       context.extractor,
+                                                                       context.object );
+            } else {
                 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 = ((ObjectVariableContextEntry) context).right;
-            return !col.contains( value );
         }
 
         public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
@@ -746,13 +646,19 @@
             final Object object = ((ObjectVariableContextEntry) context).left;
             if ( object == null ) {
                 return false;
-            } else if ( !(object instanceof Collection) ) {
+            } else if ( object instanceof Collection ) {
+                final Collection col = (Collection) object;
+                final Object value = context.extractor.getValue( workingMemory,
+                                                                 right );
+                return !col.contains( value );
+            } else if ( object.getClass().isArray() ) {
+                return !getArrayContains( object.getClass() ).contains( object,
+                                                                       workingMemory,
+                                                                       context.extractor,
+                                                                       right );
+            } else {
                 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( workingMemory,
-                                                             right );
-            return !col.contains( value );
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
@@ -764,13 +670,20 @@
                                                        object2 );
             if ( object == null ) {
                 return false;
-            } else if ( !(object instanceof Collection) ) {
+            } else if ( object instanceof Collection ) {
+                final Collection col = (Collection) object;
+                final Object value = extractor1.getValue( workingMemory,
+                                                          object1 );
+                return !col.contains( value );
+            } else if ( object.getClass().isArray() ) {                
+                return !getArrayContains( object.getClass() ).contains( object,
+                                                                      workingMemory,
+                                                                      extractor1,
+                                                                      object1 );                
+            } else {
                 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( workingMemory,
-                                                      object1 );
-            return !col.contains( value );
+           
         }
 
         public abstract String toString();
@@ -1286,14 +1199,20 @@
         Class getArrayType();
 
         boolean contains(Object array,
-                         FieldValue value,
-                         boolean negate);
+                         FieldValue value);
 
         boolean contains(Object array,
                          InternalWorkingMemory workingMemory,
                          InternalReadAccessor accessor,
-                         Object object,
-                         boolean negate);
+                         Object object);
+        //        
+        // boolean member(FieldValue array,
+        // Object object);
+        //        
+        // boolean member(Object object,
+        // InternalWorkingMemory workingMemory,
+        // InternalReadAccessor accessor,
+        // Object array);
     }
 
     public static class BooleanArrayContainsEvaluator
@@ -1301,34 +1220,32 @@
         ArrayContains {
 
         public boolean contains(Object array,
-                                FieldValue value,
-                                boolean negate) {
+                                FieldValue value) {
             boolean[] boolArray = (boolean[]) array;
 
             for ( int i = 0, length = boolArray.length; i < length; i++ ) {
                 if ( boolArray[i] == value.getBooleanValue() ) {
-                    return negate == true;
+                    return true;
                 }
             }
 
-            return negate == false;
+            return false;
         }
 
         public boolean contains(Object array,
                                 InternalWorkingMemory workingMemory,
                                 InternalReadAccessor accessor,
-                                Object object,
-                                boolean negate) {
+                                Object object) {
             boolean[] boolArray = (boolean[]) array;
 
             for ( int i = 0, length = boolArray.length; i < length; i++ ) {
                 if ( boolArray[i] == accessor.getBooleanValue( workingMemory,
                                                                object ) ) {
-                    return negate == true;
+                    return true;
                 }
             }
 
-            return negate == false;
+            return false;
         }
 
         private boolean contains(byte[] array,
@@ -1336,11 +1253,11 @@
                                  boolean negate) {
             for ( int i = 0, length = array.length; i < length; i++ ) {
                 if ( array[i] == value ) {
-                    return negate == true;
+                    return true;
                 }
             }
 
-            return negate == false;
+            return false;
         }
 
         public Class getArrayType() {
@@ -1354,34 +1271,29 @@
         ArrayContains {
 
         public boolean contains(Object array,
-                                FieldValue value,
-                                boolean negate) {
+                                FieldValue value) {
             return contains( (byte[]) array,
-                             value.getByteValue(),
-                             negate );
+                             value.getByteValue() );
         }
 
         public boolean contains(Object array,
                                 InternalWorkingMemory workingMemory,
                                 InternalReadAccessor accessor,
-                                Object object,
-                                boolean negate) {
+                                Object object) {
             return contains( (byte[]) array,
                              accessor.getByteValue( workingMemory,
-                                                    object ),
-                             negate );
+                                                    object ) );
         }
 
         private boolean contains(byte[] array,
-                                 byte value,
-                                 boolean negate) {
+                                 byte value) {
             for ( int i = 0, length = array.length; i < length; i++ ) {
                 if ( array[i] == value ) {
-                    return negate == true;
+                    return true;
                 }
             }
 
-            return negate == false;
+            return false;
         }
 
         public Class getArrayType() {
@@ -1395,34 +1307,29 @@
         ArrayContains {
 
         public boolean contains(Object array,
-                                FieldValue value,
-                                boolean negate) {
+                                FieldValue value) {
             return contains( (short[]) array,
-                             value.getShortValue(),
-                             negate );
+                             value.getShortValue() );
         }
 
         public boolean contains(Object array,
                                 InternalWorkingMemory workingMemory,
                                 InternalReadAccessor accessor,
-                                Object object,
-                                boolean negate) {
+                                Object object) {
             return contains( (short[]) array,
                              accessor.getShortValue( workingMemory,
-                                                     object ),
-                             negate );
+                                                     object ) );
         }
 
         private boolean contains(short[] array,
-                                 short value,
-                                 boolean negate) {
+                                 short value) {
             for ( int i = 0, length = array.length; i < length; i++ ) {
                 if ( array[i] == value ) {
-                    return negate == true;
+                    return true;
                 }
             }
 
-            return negate == false;
+            return false;
         }
 
         public Class getArrayType() {
@@ -1435,34 +1342,29 @@
         ArrayContains {
 
         public boolean contains(Object array,
-                                FieldValue value,
-                                boolean negate) {
+                                FieldValue value) {
             return contains( (char[]) array,
-                             value.getCharValue(),
-                             negate );
+                             value.getCharValue() );
         }
 
         public boolean contains(Object array,
                                 InternalWorkingMemory workingMemory,
                                 InternalReadAccessor accessor,
-                                Object object,
-                                boolean negate) {
+                                Object object) {
             return contains( (char[]) array,
                              accessor.getCharValue( workingMemory,
-                                                    object ),
-                             negate );
+                                                    object ) );
         }
 
         private boolean contains(char[] array,
-                                 char value,
-                                 boolean negate) {
+                                 char value) {
             for ( int i = 0, length = array.length; i < length; i++ ) {
                 if ( array[i] == value ) {
-                    return negate == true;
+                    return true;
                 }
             }
 
-            return negate == false;
+            return false;
         }
 
         public Class getArrayType() {
@@ -1476,34 +1378,29 @@
         ArrayContains {
 
         public boolean contains(Object array,
-                                FieldValue value,
-                                boolean negate) {
+                                FieldValue value) {
             return contains( (int[]) array,
-                             value.getIntValue(),
-                             negate );
+                             value.getIntValue() );
         }
 
         public boolean contains(Object array,
                                 InternalWorkingMemory workingMemory,
                                 InternalReadAccessor accessor,
-                                Object object,
-                                boolean negate) {
+                                Object object) {
             return contains( (int[]) array,
                              accessor.getIntValue( workingMemory,
-                                                   object ),
-                             negate );
+                                                   object ) );
         }
 
         private boolean contains(int[] array,
-                                 int value,
-                                 boolean negate) {
+                                 int value) {
             for ( int i = 0, length = array.length; i < length; i++ ) {
                 if ( array[i] == value ) {
-                    return negate == true;
+                    return true;
                 }
             }
 
-            return negate == false;
+            return false;
         }
 
         public Class getArrayType() {
@@ -1517,34 +1414,29 @@
         ArrayContains {
 
         public boolean contains(Object array,
-                                FieldValue value,
-                                boolean negate) {
+                                FieldValue value) {
             return contains( (long[]) array,
-                             value.getLongValue(),
-                             negate );
+                             value.getLongValue() );
         }
 
         public boolean contains(Object array,
                                 InternalWorkingMemory workingMemory,
                                 InternalReadAccessor accessor,
-                                Object object,
-                                boolean negate) {
+                                Object object) {
             return contains( (long[]) array,
                              accessor.getLongValue( workingMemory,
-                                                    object ),
-                             negate );
+                                                    object ) );
         }
 
         private boolean contains(long[] array,
-                                 long value,
-                                 boolean negate) {
+                                 long value) {
             for ( int i = 0, length = array.length; i < length; i++ ) {
                 if ( array[i] == value ) {
-                    return negate == true;
+                    return true;
                 }
             }
 
-            return negate == false;
+            return false;
         }
 
         public Class getArrayType() {
@@ -1558,34 +1450,29 @@
         ArrayContains {
 
         public boolean contains(Object array,
-                                FieldValue value,
-                                boolean negate) {
+                                FieldValue value) {
             return contains( (float[]) array,
-                             value.getFloatValue(),
-                             negate );
+                             value.getFloatValue() );
         }
 
         public boolean contains(Object array,
                                 InternalWorkingMemory workingMemory,
                                 InternalReadAccessor accessor,
-                                Object object,
-                                boolean negate) {
+                                Object object) {
             return contains( (float[]) array,
                              accessor.getFloatValue( workingMemory,
-                                                     object ),
-                             negate );
+                                                     object ) );
         }
 
         private boolean contains(float[] array,
-                                 float value,
-                                 boolean negate) {
+                                 float value) {
             for ( int i = 0, length = array.length; i < length; i++ ) {
                 if ( array[i] == value ) {
-                    return negate == true;
+                    return true;
                 }
             }
 
-            return negate == false;
+            return false;
         }
 
         public Class getArrayType() {
@@ -1598,34 +1485,44 @@
         ArrayContains {
 
         public boolean contains(Object array,
-                                FieldValue fieldValue,
-                                boolean negate) {
+                                FieldValue fieldValue) {
             return contains( (double[]) array,
-                             fieldValue.getDoubleValue(),
-                             negate );
+                             fieldValue.getDoubleValue() );
         }
 
         public boolean contains(Object array,
                                 InternalWorkingMemory workingMemory,
                                 InternalReadAccessor accessor,
-                                Object object,
-                                boolean negate) {
+                                Object object) {
             return contains( (double[]) array,
                              accessor.getDoubleValue( workingMemory,
-                                                      object ),
-                             negate );
+                                                      object ) );
         }
 
+        // public boolean member(FieldValue array,
+        // Object object) {
+        // return contains( (double[]) array.getValue(),
+        // object );
+        // }
+        //
+        // public boolean member(Object object,
+        // InternalWorkingMemory workingMemory,
+        // InternalReadAccessor accessor,
+        // Object array) {
+        // return contains( (double[]) accessor.getValue( workingMemory,
+        // object ),
+        // object );
+        // }
+
         private boolean contains(double[] array,
-                                 double value,
-                                 boolean negate) {
+                                 double value) {
             for ( int i = 0, length = array.length; i < length; i++ ) {
                 if ( array[i] == value ) {
-                    return negate == true;
+                    return true;
                 }
             }
 
-            return negate == false;
+            return false;
         }
 
         public Class getArrayType() {
@@ -1638,38 +1535,48 @@
         ArrayContains {
 
         public boolean contains(Object array,
-                                FieldValue fieldValue,
-                                boolean negate) {
+                                FieldValue fieldValue) {
             return contains( (Object[]) array,
-                             fieldValue.getValue(),
-                             negate );
+                             fieldValue.getValue() );
         }
 
         public boolean contains(Object array,
                                 InternalWorkingMemory workingMemory,
                                 InternalReadAccessor accessor,
-                                Object object,
-                                boolean negate) {
+                                Object object) {
             return contains( (Object[]) array,
                              accessor.getValue( workingMemory,
-                                                object ),
-                             negate );
+                                                object ) );
         }
 
         private boolean contains(Object[] array,
-                                 Object value,
-                                 boolean negate) {
+                                 Object value) {
             for ( int i = 0, length = array.length; i < length; i++ ) {
                 if ( array[i].equals( value ) ) {
-                    return negate == true;
+                    return true;
                 }
             }
 
-            return negate == false;
+            return false;
         }
 
         public Class getArrayType() {
             return Object[].class;
         }
+
+        // public boolean member(FieldValue array,
+        // Object object) {
+        // return contains( (Object[]) array.getValue(),
+        // object );
+        // }
+        //
+        // public boolean member(Object object,
+        // InternalWorkingMemory workingMemory,
+        // InternalReadAccessor accessor,
+        // Object array) {
+        // return contains( (Object[]) accessor.getValue( workingMemory,
+        // object ),
+        // object );
+        // }
     }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java	2009-05-16 10:03:33 UTC (rev 26575)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java	2009-05-18 04:28:22 UTC (rev 26576)
@@ -123,7 +123,7 @@
 
     public String toString() {
         return "[VariableConstraint fieldExtractor=" + this.fieldExtractor + " declaration=" + getRequiredDeclarations() + "]";
-    }
+    } 
 
     public ContextEntry createContextEntry() {
         return this.restriction.createContextEntry();

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	2009-05-16 10:03:33 UTC (rev 26575)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java	2009-05-18 04:28:22 UTC (rev 26576)
@@ -108,7 +108,7 @@
                                        final InternalFactHandle handle) {
         return this.evaluator.evaluateCachedLeft( ((VariableContextEntry) context).workingMemory,
                                                   (VariableContextEntry) context,
-                                                  this.evaluator.prepareLeftObject( handle ) );
+                                                  this.evaluator.prepareRightObject( handle ) );
     }
 
     public boolean isAllowedCachedRight(final LeftTuple tuple,




More information about the jboss-svn-commits mailing list