Author: tirelli
Date: 2006-07-01 09:38:00 -0400 (Sat, 01 Jul 2006)
New Revision: 4898
Added:
labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_JoinNodeModifyObject.drl
Removed:
labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_Eval.drl
Modified:
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/ObjectMatches.java
Log:
JBRULES-318:
* Fixing JoinNode.modifyTuple() to keep matches ordering
* Added integration test
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-07-01 01:37:10 UTC (rev 4897)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java 2006-07-01 13:38:00 UTC (rev 4898)
@@ -2493,8 +2493,8 @@
return bytes;
}
- public void FIXME_testEval2() throws Exception {
- final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_Eval.drl" ) );
+ public void testJoinNodeModifyObject() throws Exception {
+ final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_JoinNodeModifyObject.drl" ) );
final PackageBuilder builder = new PackageBuilder();
builder.addPackageFromDrl( reader );
@@ -2504,12 +2504,26 @@
ruleBase.addPackage( pkg1 );
final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
- final int MAX = 3;
+ final List orderedFacts = new ArrayList();
+ final List errors = new ArrayList();
+
+ workingMemory.setGlobal( "orderedNumbers", orderedFacts );
+ workingMemory.setGlobal( "errors", errors );
+
+ final int MAX = 5;
for (int i=1 ; i<=MAX; i++) {
IndexedNumber n = new IndexedNumber(i, MAX - i + 1);
workingMemory.assertObject(n);
}
workingMemory.fireAllRules();
+
+ Assert.assertTrue( "Processing generated errors: "+errors.toString(),
+ errors.isEmpty());
+
+ for(int i=1 ; i<=MAX; i++) {
+ IndexedNumber n = (IndexedNumber) orderedFacts.get( i-1 );
+ Assert.assertEquals( "Fact is out of order", i, n.getIndex() );
+ }
}
}
Deleted: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_Eval.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_Eval.drl 2006-07-01 01:37:10 UTC (rev 4897)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_Eval.drl 2006-07-01 13:38:00 UTC (rev 4898)
@@ -1,45 +0,0 @@
-#created on: 12 juin 2006
-package Number
-
-import org.drools.IndexedNumber;
-
-rule "Order"
-salience 200
- when
- #Doesnt work
- n1 : IndexedNumber($nb1 : number);
- n2 : IndexedNumber(number < $nb1);
- eval(n1.getIndex() < n2.getIndex());
-
- #Works great
- #n1 : IndexedNumber($nb1 : number, $index1 : index);
- #n2 : IndexedNumber($nb2 : number -> ($nb2.compareTo($nb1) < 0), index > $index1);
- then
- System.out.println("Swapping " + n1 + " with " + n2);
- check(n1, n2);
- swap(n1, n2);
- modify(n1);
- modify(n2);
-end
-
-rule "Debug"
-salience 10
- when
- n : IndexedNumber($idx : index);
- not IndexedNumber(index < $idx);
- then
- System.out.println("Number is " + n);
- retract(n);
-end
-
-function void check(IndexedNumber n1, IndexedNumber n2) {
- if ( ! (n1.getIndex() < n2.getIndex())) {
- System.out.println("Shouldn't come here... " + n1 + " " + n2);
- }
-}
-
-function void swap(IndexedNumber n1, IndexedNumber n2) {
- int tmp = n1.getIndex();
- n1.setIndex(n2.getIndex());
- n2.setIndex(tmp);
-}
\ No newline at end of file
Copied: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_JoinNodeModifyObject.drl (from rev 4897, labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_Eval.drl)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_Eval.drl 2006-07-01 01:37:10 UTC (rev 4897)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_JoinNodeModifyObject.drl 2006-07-01 13:38:00 UTC (rev 4898)
@@ -0,0 +1,41 @@
+#created on: 12 juin 2006
+package Number
+
+import org.drools.IndexedNumber;
+import java.util.List;
+
+global java.util.List orderedNumbers;
+global java.util.List errors;
+
+rule "Order"
+salience 200
+ when
+ #Doesnt work
+ n1 : IndexedNumber($nb1 : number);
+ n2 : IndexedNumber(number < $nb1);
+ eval(n1.getIndex() < n2.getIndex());
+
+ then
+ if ( ! (n1.getIndex() < n2.getIndex())) {
+ errors.add("Shouldn't fire for: " + n1 + " " + n2);
+ }
+ swap(n1, n2);
+ modify(n1);
+ modify(n2);
+end
+
+rule "Debug"
+salience 10
+ when
+ n : IndexedNumber($idx : index);
+ not IndexedNumber(index < $idx);
+ then
+ orderedNumbers.add(n);
+ retract(n);
+end
+
+function void swap(IndexedNumber n1, IndexedNumber n2) {
+ int tmp = n1.getIndex();
+ n1.setIndex(n2.getIndex());
+ n2.setIndex(tmp);
+}
\ No newline at end of file
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-07-01 01:37:10 UTC (rev 4897)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java 2006-07-01 13:38:00 UTC (rev 4898)
@@ -273,6 +273,10 @@
workingMemory ) ) {
TupleMatch tupleMatch = (TupleMatch) leftTuple.getTupleMatches().get( handle );
if ( tupleMatch != null ) {
+ // ensures tupleMatch will be in the appropriate order
+ objectMatches.remove( tupleMatch );
+ objectMatches.add( tupleMatch );
+
propagateModifyTuple( tupleMatch,
context,
workingMemory );
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectMatches.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectMatches.java 2006-07-01 01:37:10 UTC (rev 4897)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectMatches.java 2006-07-01 13:38:00 UTC (rev 4898)
@@ -61,6 +61,10 @@
return tupleMatch;
}
+
+ void add(final TupleMatch tupleMatch) {
+ this.list.add( tupleMatch );
+ }
/**
* Removes the <code>TupleMatch</code> as the underlying <code>ReteTuple</code> has been retracted and no longer matches.
|