[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