From: <jbo...@li...> - 2006-04-19 04:47:18
|
Author: mar...@jb... Date: 2006-04-19 00:47:13 -0400 (Wed, 19 Apr 2006) New Revision: 3787 Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/GroupElementTest.java Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/And.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/GroupElement.java Log: -Now removes single branch nodes -Does initial nested and/or removal, repeated again in LogicTransformer Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/And.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/And.java 2006-04-19 04:13:57 UTC (rev 3786) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/And.java 2006-04-19 04:47:13 UTC (rev 3787) @@ -18,5 +18,5 @@ public class And extends GroupElement { - + } \ No newline at end of file Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/GroupElement.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/GroupElement.java 2006-04-19 04:13:57 UTC (rev 3786) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/GroupElement.java 2006-04-19 04:47:13 UTC (rev 3787) @@ -21,11 +21,53 @@ import java.util.Iterator; import java.util.List; +import org.drools.RuntimeDroolsException; + public abstract class GroupElement extends ConditionalElement { private List children = new ArrayList(); + /** + * This removes single branch 'and' and 'or' + * It also does basic nested removal, where an 'and' is + * nested inside an 'and' and when an 'or' is nested inside an 'or' + * + * LogicTransformer does further, more complicated, transformations + * @param child + */ public void addChild(Object child) { - this.children.add( child ); + if ( child instanceof GroupElement && ( child instanceof And || child instanceof Or ) ) { + GroupElement group = ( GroupElement ) child; + + // Removal single branch group elements + // If the child is a GroupElement iterate down until we either + // find a GroupElement that has more than one children, or its not a GroupElement + if ( group.getChildren().size() == 1 ) { + child = group.getChildren().get( 0 ); + } + } + + if ( child instanceof GroupElement && ( child instanceof And || child instanceof Or ) ) { + GroupElement group = ( GroupElement ) child; + + // Remove nested Ands/Ors + if ( group.getClass() == this.getClass() ) { + + GroupElement newGroup = null; + if ( group instanceof And) { + newGroup = new And(); + } else { + newGroup = new Or(); + } + + for ( Iterator it = group.getChildren().iterator(); it.hasNext(); ) { + this.children.add( it.next() ); + } + } else { + this.children.add( child ); + } + } else { + this.children.add( child ); + } } public List getChildren() { Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/GroupElementTest.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/GroupElementTest.java 2006-04-19 04:13:57 UTC (rev 3786) +++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/GroupElementTest.java 2006-04-19 04:47:13 UTC (rev 3787) @@ -0,0 +1,94 @@ +package org.drools.rule; + +import junit.framework.TestCase; + +public class GroupElementTest extends TestCase { + public void testAddNestedAnd() { + And and1 = new And(); + Column column1 = new Column(0, null); + and1.addChild( column1 ); + + Column column2 = new Column(0, null); + and1.addChild( column2 ); + + assertEquals( 2, and1.getChildren().size() ); + assertSame( column1, and1.getChildren().get( 0 ) ); + assertSame( column2, and1.getChildren().get( 1 ) ); + + And and2 = new And(); + and2.addChild( and1 ); + assertEquals( 2, and2.getChildren().size() ); + assertSame( column1, and2.getChildren().get( 0 ) ); + assertSame( column2, and2.getChildren().get( 1 ) ); + } + + public void testAddNestedOr() { + Or or1 = new Or(); + Column column1 = new Column(0, null); + or1.addChild( column1 ); + + Column column2 = new Column(0, null); + or1.addChild( column2 ); + + assertEquals( 2, or1.getChildren().size() ); + assertSame( column1, or1.getChildren().get( 0 ) ); + assertSame( column2, or1.getChildren().get( 1 ) ); + + Or or2 = new Or(); + or2.addChild( or1 ); + assertEquals( 2, or2.getChildren().size() ); + assertSame( column1, or2.getChildren().get( 0 ) ); + assertSame( column2, or2.getChildren().get( 1 ) ); + } + + public void testAddSingleBranchAnd() { + And and1 = new And(); + Column column = new Column(0, null); + and1.addChild( column ); + assertEquals( 1, and1.getChildren().size() ); + assertSame( column, and1.getChildren().get( 0 ) ); + + Or or1= new Or(); + or1.addChild( and1 ); + assertEquals( 1, or1.getChildren().size() ); + assertSame( column, or1.getChildren().get( 0 ) ); + } + + public void testAddSingleBranchOr() { + Or or1 = new Or(); + Column column = new Column(0, null); + or1.addChild( column ); + assertEquals( 1, or1.getChildren().size() ); + assertSame( column, or1.getChildren().get( 0 ) ); + + And and1= new And(); + and1.addChild( or1 ); + assertEquals( 1, and1.getChildren().size() ); + assertSame( column, and1.getChildren().get( 0 ) ); + } + + public void testX() { + Or or1 = new Or(); + Column column1 = new Column(0, null); + or1.addChild( column1 ); + + Column column2 = new Column(0, null); + or1.addChild( column2 ); + + And and1 = new And(); + and1.addChild( or1 ); + assertEquals( 1, and1.getChildren().size() ); + assertSame( or1, and1.getChildren().get( 0 ) ); + + assertSame( column1, or1.getChildren().get( 0 ) ); + assertSame( column2, or1.getChildren().get( 1 ) ); + + Or or2 = new Or(); + or2.addChild( and1 ); + + assertEquals( 2, or1.getChildren().size() ); + assertSame( column1, or1.getChildren().get( 0 ) ); + assertSame( column2, or2.getChildren().get( 1 ) ); + + } +} |