[jboss-svn-commits] JBL Code SVN: r32787 - in labs/jbossrules/trunk/drools-core/src: test/java/org/drools/reteoo and 1 other directory.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Fri May 7 13:59:38 EDT 2010
Author: mark.proctor at jboss.com
Date: 2010-05-07 13:59:38 -0400 (Fri, 07 May 2010)
New Revision: 32787
Added:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleIterator.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/TupleIterationTest.java
Log:
-Added class to iterate reteoo, finding leaf nodes to execute a callback on.
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleIterator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleIterator.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleIterator.java 2010-05-07 17:59:38 UTC (rev 32787)
@@ -0,0 +1,42 @@
+package org.drools.reteoo;
+
+public class TupleIterator {
+ public interface OnLeaf {
+ public void execute(LeftTuple leafLeftTuple);
+ }
+ public static void traverse(LeftTuple rootLeftTuple, LeftTuple leftTuple, OnLeaf onLeaf) {
+ boolean down = true;
+ while ( leftTuple != null ) {
+ while ( down ) {
+ // iterate to next leaf
+ if ( leftTuple.firstChild != null ) {
+ leftTuple = leftTuple.firstChild;
+ } else {
+ down = false;
+ }
+ }
+
+ // we know we are at a leaf here
+ onLeaf.execute( leftTuple );
+
+ if ( leftTuple.getLeftParentNext() != null ) {
+ // iterate to next peer
+ leftTuple = leftTuple.getLeftParentNext();
+ // attempt to traverse that peer's children
+ if ( leftTuple.firstChild != null ) {
+ down = true;
+ }
+ } else {
+ // iterate to parent's next peer and set down to find next leaf
+ // never go beyond the specified root node
+ while (leftTuple != rootLeftTuple && leftTuple.getLeftParentNext() == null) {
+ leftTuple = leftTuple.getLeftParent();
+ // onNode
+ }
+ leftTuple = leftTuple.getLeftParentNext();
+
+ down = true;
+ }
+ }
+ }
+}
Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/TupleIterationTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/TupleIterationTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/TupleIterationTest.java 2010-05-07 17:59:38 UTC (rev 32787)
@@ -0,0 +1,122 @@
+package org.drools.reteoo;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.drools.reteoo.TupleIterator.OnLeaf;
+
+import junit.framework.TestCase;
+
+
+public class TupleIterationTest extends TestCase {
+ public void testRootTraversal() {
+ LeftTuple t0 = new LeftTuple();
+ LeftTuple t1 = new LeftTuple(t0, null, true);
+ LeftTuple t2 = new LeftTuple(t0, null, true);
+ LeftTuple t3 = new LeftTuple(t0, null, true);
+
+ LeftTuple t1_1 = new LeftTuple(t1, null, true);
+ LeftTuple t1_2 = new LeftTuple(t1, null, true);
+
+ LeftTuple t1_1_1 = new LeftTuple(t1_1, null, true);
+ LeftTuple t1_1_1_1 = new LeftTuple(t1_1_1, null, true);
+ LeftTuple t1_1_1_2 = new LeftTuple(t1_1_1, null, true);
+ LeftTuple t1_1_1_3 = new LeftTuple(t1_1_1, null, true);
+
+ LeftTuple t1_2_1 = new LeftTuple(t1_2, null, true);
+
+ LeftTuple t1_2_2 = new LeftTuple(t1_2, null, true);
+ LeftTuple t1_2_2_1 = new LeftTuple(t1_2_2, null, true);
+
+ LeftTuple t1_2_3 = new LeftTuple(t1_2, null, true);
+
+ LeftTuple t2_1 = new LeftTuple(t2, null, true);
+ LeftTuple t2_2 = new LeftTuple(t2, null, true);
+ LeftTuple t2_3 = new LeftTuple(t2, null, true);
+
+ LeftTuple t2_3_1 = new LeftTuple(t2_3, null, true);
+ LeftTuple t2_3_1_1 = new LeftTuple(t2_3_1, null, true);
+
+ LeftTuple t2_3_2 = new LeftTuple(t2_3, null, true);
+
+
+ LeftTuple[] leafs = new LeftTuple[] {
+t1_1_1_1, t1_1_1_2, t1_1_1_3, t1_2_1, t1_2_2_1, t1_2_3, t2_1, t2_2, t2_3_1_1, t2_3_2, t3
+ };
+
+ final List<LeftTuple> foundLeafs = new ArrayList<LeftTuple>();
+
+ TupleIterator iterator = new TupleIterator();
+ OnLeaf onLeaf = new OnLeaf() {
+
+ public void execute(LeftTuple leafLeftTuple) {
+ foundLeafs.add( leafLeftTuple );
+ }
+
+ };
+
+ iterator.traverse( t0, t0, onLeaf );
+
+ assertEquals( leafs.length, foundLeafs.size() );
+ assertEquals( Arrays.asList( leafs ), foundLeafs );
+ }
+
+ public void testMidTraversal() {
+ LeftTuple tm2 = new LeftTuple();
+ LeftTuple tm1 = new LeftTuple(tm2, null, true);
+ LeftTuple tm1_1 = new LeftTuple(tm1, null, true); // this leaf will not be included
+
+ LeftTuple t0 = new LeftTuple(tm1, null, true); // insert two nodes before our root traversal position
+
+
+ LeftTuple t1 = new LeftTuple(t0, null, true);
+ LeftTuple t2 = new LeftTuple(t0, null, true);
+ LeftTuple t3 = new LeftTuple(t0, null, true);
+
+ LeftTuple t1_1 = new LeftTuple(t1, null, true);
+ LeftTuple t1_2 = new LeftTuple(t1, null, true);
+
+ LeftTuple t1_1_1 = new LeftTuple(t1_1, null, true);
+ LeftTuple t1_1_1_1 = new LeftTuple(t1_1_1, null, true);
+ LeftTuple t1_1_1_2 = new LeftTuple(t1_1_1, null, true);
+ LeftTuple t1_1_1_3 = new LeftTuple(t1_1_1, null, true);
+
+ LeftTuple t1_2_1 = new LeftTuple(t1_2, null, true);
+
+ LeftTuple t1_2_2 = new LeftTuple(t1_2, null, true);
+ LeftTuple t1_2_2_1 = new LeftTuple(t1_2_2, null, true);
+
+ LeftTuple t1_2_3 = new LeftTuple(t1_2, null, true);
+
+ LeftTuple t2_1 = new LeftTuple(t2, null, true);
+ LeftTuple t2_2 = new LeftTuple(t2, null, true);
+ LeftTuple t2_3 = new LeftTuple(t2, null, true);
+
+ LeftTuple t2_3_1 = new LeftTuple(t2_3, null, true);
+ LeftTuple t2_3_1_1 = new LeftTuple(t2_3_1, null, true);
+
+ LeftTuple t2_3_2 = new LeftTuple(t2_3, null, true);
+
+
+ LeftTuple[] leafs = new LeftTuple[] {
+t1_1_1_1, t1_1_1_2, t1_1_1_3, t1_2_1, t1_2_2_1, t1_2_3, t2_1, t2_2, t2_3_1_1, t2_3_2, t3
+ };
+
+ final List<LeftTuple> foundLeafs = new ArrayList<LeftTuple>();
+
+ TupleIterator iterator = new TupleIterator();
+ OnLeaf onLeaf = new OnLeaf() {
+
+ public void execute(LeftTuple leafLeftTuple) {
+ foundLeafs.add( leafLeftTuple );
+ }
+
+ };
+
+ iterator.traverse( t0, t0, onLeaf );
+
+ assertEquals( leafs.length, foundLeafs.size() );
+ assertEquals( Arrays.asList( leafs ), foundLeafs );
+ }
+}
More information about the jboss-svn-commits
mailing list