[jboss-svn-commits] JBL Code SVN: r5824 - in labs/jbossrules/trunk: drools-compiler/src/test/java/org/drools drools-compiler/src/test/java/org/drools/integrationtests drools-compiler/src/test/resources/org/drools/integrationtests drools-core/src/main/java/org/drools/reteoo
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sat Aug 12 10:33:11 EDT 2006
Author: tirelli
Date: 2006-08-12 10:32:58 -0400 (Sat, 12 Aug 2006)
New Revision: 5824
Added:
labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_LogicalAssertionWithExists.drl
Modified:
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Cheese.java
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java
Log:
JBRULES-387:
* Fixing NOT and JOIN node problems on modify tuple
* Adding test case
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Cheese.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Cheese.java 2006-08-12 14:13:27 UTC (rev 5823)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Cheese.java 2006-08-12 14:32:58 UTC (rev 5824)
@@ -43,6 +43,10 @@
return this.type;
}
+ public void setType( String type ) {
+ this.type = type;
+ }
+
public void setPrice(final int price) {
this.price = price;
}
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java 2006-08-12 14:13:27 UTC (rev 5823)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java 2006-08-12 14:32:58 UTC (rev 5824)
@@ -2715,4 +2715,92 @@
assertEquals(1, list.size() );
}
+ public void testLogicalAssertionsWithExists() throws Exception {
+ final PackageBuilder builder = new PackageBuilder();
+ builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionWithExists.drl" )) );
+ final Package pkg = builder.getPackage();
+
+ final RuleBase ruleBase = getRuleBase();
+ ruleBase.addPackage( pkg );
+ final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+
+ Person p1 = new Person( "p1",
+ "stilton",
+ 20 );
+ p1.setStatus( "europe" );
+ FactHandle c1FactHandle = workingMemory.assertObject( p1 );
+ Person p2 = new Person( "p2",
+ "stilton",
+ 30 );
+ p2.setStatus( "europe" );
+ FactHandle c2FactHandle = workingMemory.assertObject( p2 );
+ Person p3 = new Person( "p3",
+ "stilton",
+ 40 );
+ p3.setStatus( "europe" );
+ FactHandle c3FactHandle = workingMemory.assertObject( p3 );
+ workingMemory.fireAllRules();
+
+ // all 3 in europe, so, 2 cheese
+ List cheeseList = workingMemory.getObjects( String.class );
+ assertEquals( 2,
+ cheeseList.size() );
+
+ // europe=[ 1, 2 ], america=[ 3 ]
+ p3.setStatus( "america" );
+ workingMemory.modifyObject( c3FactHandle,
+ p3 );
+ workingMemory.fireAllRules();
+ cheeseList = workingMemory.getObjects( String.class );
+ assertEquals( 1,
+ cheeseList.size() );
+
+ // europe=[ 1 ], america=[ 2, 3 ]
+ p2.setStatus( "america" );
+ workingMemory.modifyObject( c2FactHandle,
+ p2 );
+ workingMemory.fireAllRules();
+ cheeseList = workingMemory.getObjects( String.class );
+ assertEquals( 1,
+ cheeseList.size() );
+
+ // europe=[ ], america=[ 1, 2, 3 ]
+ p1.setStatus( "america" );
+ workingMemory.modifyObject( c1FactHandle,
+ p1 );
+ workingMemory.fireAllRules();
+ cheeseList = workingMemory.getObjects( String.class );
+ assertEquals( 2,
+ cheeseList.size() );
+
+ // europe=[ 2 ], america=[ 1, 3 ]
+ p2.setStatus( "europe" );
+ workingMemory.modifyObject( c2FactHandle,
+ p2 );
+ workingMemory.fireAllRules();
+ cheeseList = workingMemory.getObjects( String.class );
+ assertEquals( 1,
+ cheeseList.size() );
+
+ // europe=[ 1, 2 ], america=[ 3 ]
+ p1.setStatus( "europe" );
+ workingMemory.modifyObject( c1FactHandle,
+ p1 );
+ workingMemory.fireAllRules();
+ cheeseList = workingMemory.getObjects( String.class );
+ assertEquals( 1,
+ cheeseList.size() );
+
+ // europe=[ 1, 2, 3 ], america=[ ]
+ p3.setStatus( "europe" );
+ workingMemory.modifyObject( c3FactHandle,
+ p3 );
+ workingMemory.fireAllRules();
+ cheeseList = workingMemory.getObjects( String.class );
+ assertEquals( 2,
+ cheeseList.size() );
+
+
+ }
+
}
Copied: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_LogicalAssertionWithExists.drl (from rev 5823, labs/jbossrules/branches/3.0.x/drools-compiler/src/test/resources/org/drools/integrationtests/test_LogicalAssertionWithExists.drl)
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java 2006-08-12 14:13:27 UTC (rev 5823)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java 2006-08-12 14:32:58 UTC (rev 5824)
@@ -17,6 +17,7 @@
*/
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -258,6 +259,11 @@
context,
workingMemory );
} else {
+ // TIRELLI's NOTE: the following is necessary because in case memory
+ // indexing is enabled, the loop over right objects may skip some of the
+ // previously matched objects
+ final Map oldMatches = new HashMap(matches);
+
// ensure the tuple is at the top of the memory
memory.add( workingMemory,
leftTuple );
@@ -271,7 +277,7 @@
if ( binder.isAllowed( handle,
leftTuple,
workingMemory ) ) {
- TupleMatch tupleMatch = (TupleMatch) leftTuple.getTupleMatches().get( handle );
+ TupleMatch tupleMatch = (TupleMatch) oldMatches.remove( handle );
if ( tupleMatch != null ) {
// ensures tupleMatch will be in the appropriate order
objectMatches.remove( tupleMatch );
@@ -294,6 +300,7 @@
} else {
final TupleMatch tupleMatch = leftTuple.removeMatch( handle );
if ( tupleMatch != null ) {
+ oldMatches.remove( handle );
objectMatches.remove( tupleMatch );
propagateRetractTuple( tupleMatch,
context,
@@ -301,6 +308,16 @@
}
}
}
+
+ // TIRELLI's NOTE: the following is necessary because in case memory
+ // indexing is enabled, the loop over right objects may skip some of the
+ // previously matched objects
+ if(!oldMatches.isEmpty()) {
+ for(Iterator it = oldMatches.values().iterator(); it.hasNext(); ) {
+ final TupleMatch tupleMatch = (TupleMatch) it.next();
+ tupleMatch.getObjectMatches().remove( tupleMatch );
+ }
+ }
}
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java 2006-08-12 14:13:27 UTC (rev 5823)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java 2006-08-12 14:32:58 UTC (rev 5824)
@@ -225,14 +225,18 @@
final PropagationContext context,
final ReteooWorkingMemory workingMemory) {
// We have to remove and assert the new tuple as it has modified facts and thus its tuple is newer
- if ( tuple.getActivation().isActivated() ) {
- tuple.getActivation().remove();
+ boolean fireActivation = true;
+ Activation activation = tuple.getActivation();
+
+ if ( activation.isActivated() ) {
+ activation.remove();
+ fireActivation = false;
}
+
assertTuple( tuple,
context,
workingMemory,
- false );
-
+ fireActivation );
}
public String toString() {
More information about the jboss-svn-commits
mailing list