From: <jbo...@li...> - 2006-05-23 04:19:31
|
Author: mar...@jb... Date: 2006-05-23 00:19:28 -0400 (Tue, 23 May 2006) New Revision: 4361 Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LogicTransformer.java Log: JBRULES-271 Incorrect Handling of 'I have found a number of issues. 1) re-ordering of elements by the transformer, which ofcourse messes up the column index alignment. 2) wasn't removing redundant nodes in some situations. 3) Was incorrectly increasing the counter values for 'or' elements. Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LogicTransformer.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LogicTransformer.java 2006-05-23 04:19:25 UTC (rev 4360) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LogicTransformer.java 2006-05-23 04:19:28 UTC (rev 4361) @@ -21,6 +21,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.ListIterator; import java.util.Map; import java.util.Set; @@ -139,6 +140,8 @@ ands[i] = newAnd; } + checkForAndRemoveDuplicates( ands[i] ); + i++; } @@ -160,9 +163,8 @@ * @param ce */ void processTree(GroupElement ce) throws InvalidPatternException { - List newChildren = new ArrayList(); - for ( Iterator it = ce.getChildren().iterator(); it.hasNext(); ) { + for ( ListIterator it = ce.getChildren().listIterator(); it.hasNext(); ) { Object object = it.next(); if ( object instanceof GroupElement ) { GroupElement parent = (GroupElement) object; @@ -176,18 +178,15 @@ for ( Iterator orIter = parent.getChildren().iterator(); orIter.hasNext(); ) { Object object2 = orIter.next(); if ( object2 instanceof Or ) { - newChildren.add( applyOrTransformation( parent, - (GroupElement) object2 ) ); it.remove(); + it.add( applyOrTransformation( parent, + (GroupElement) object2 ) ); break; } } } } - - // Add all the transformed children - ce.getChildren().addAll( newChildren ); } /** @@ -213,22 +212,23 @@ * */ void checkForAndRemoveDuplicates(GroupElement parent) { - List newChildren = new ArrayList(); - - for ( Iterator it = parent.getChildren().iterator(); it.hasNext(); ) { + for ( ListIterator it = parent.getChildren().listIterator(); it.hasNext(); ) { Object object = it.next(); // Remove the duplicate if the classes are the same and // removeDuplicate method returns true if ( parent.getClass().isInstance( object ) && removeDuplicate( parent, - (GroupElement) object ) ) { + (GroupElement) object ) ) { + List newList = new ArrayList(); GroupElement child = (GroupElement) object; for ( Iterator childIter = child.getChildren().iterator(); childIter.hasNext(); ) { - newChildren.add( childIter.next() ); + newList.add( childIter.next() ); } it.remove(); + for ( Iterator childIter = newList.iterator(); childIter.hasNext(); ) { + it.add( childIter.next() ); + } } - } - parent.getChildren().addAll( newChildren ); + } } GroupElement applyOrTransformation(GroupElement parent, |