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. |