[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