From: <jbo...@li...> - 2006-05-12 02:55:30
|
Author: tirelli Date: 2006-05-11 22:55:09 -0400 (Thu, 11 May 2006) New Revision: 4200 Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Cheese.java labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/LeapsTest.java labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_LogicalAssertionsDynamicRule.drl labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_LogicalAssertionsDynamicRule2.drl labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.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/LeftInputAdapterNode.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/NotNode.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSource.java labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockTupleSink.java labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockTupleSource.java Log: Fixing JBRULES-233 new scenario Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Cheese.java =================================================================== --- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Cheese.java 2006-05-11 11:17:32 UTC (rev 4199) +++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Cheese.java 2006-05-12 02:55:09 UTC (rev 4200) @@ -41,5 +41,9 @@ public void setPrice(int price) { this.price = price; } + + public String toString() { + return "Cheese( type='"+this.type+"', price="+this.price+" )"; + } } \ No newline at end of file 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-05-11 11:17:32 UTC (rev 4199) +++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java 2006-05-12 02:55:09 UTC (rev 4200) @@ -1890,7 +1890,7 @@ l.size() ); } - public void xxxtestLogicalAssertionsDynamicRule() throws Exception { + public void testLogicalAssertionsDynamicRule() throws Exception { PackageBuilder builder = new PackageBuilder(); builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionsDynamicRule.drl" ) ) ); Package pkg = builder.getPackage(); @@ -1980,7 +1980,7 @@ assertFalse( "remove of rule should retract objects logically asserted based on the rule", list.contains( c3.getType() ) ); - c2.setPrice( 1 ); + c2.setPrice( 3 ); workingMemory.modifyObject( h, c2 ); list = workingMemory.getObjects( c1.getType().getClass() ); Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/LeapsTest.java =================================================================== --- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/LeapsTest.java 2006-05-11 11:17:32 UTC (rev 4199) +++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/LeapsTest.java 2006-05-12 02:55:09 UTC (rev 4200) @@ -162,5 +162,9 @@ assertTrue( "rule2", list.contains( "rule2" ) ); } + + public void testLogicalAssertionsDynamicRule() throws Exception { + // TODO FIXME + } } Modified: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_LogicalAssertionsDynamicRule.drl =================================================================== --- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_LogicalAssertionsDynamicRule.drl 2006-05-11 11:17:32 UTC (rev 4199) +++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_LogicalAssertionsDynamicRule.drl 2006-05-12 02:55:09 UTC (rev 4200) @@ -4,7 +4,8 @@ rule "rule1" when - Cheese( type : type, price : price -> (price.intValue() > 1)) + #Cheese( type : type, price : price -> (price.intValue() > 1)) + Cheese( type : type, price > 1 ) then assertLogical( type ); end Modified: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_LogicalAssertionsDynamicRule2.drl =================================================================== --- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_LogicalAssertionsDynamicRule2.drl 2006-05-11 11:17:32 UTC (rev 4199) +++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_LogicalAssertionsDynamicRule2.drl 2006-05-12 02:55:09 UTC (rev 4200) @@ -4,7 +4,8 @@ rule "rule2" when - Cheese( type : type, price : price -> (price.intValue() < 3)) + #Cheese( type : type, price : price -> (price.intValue() < 3)) + Cheese( type : type, price < 3) then assertLogical( type ); end \ No newline at end of file Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java 2006-05-11 11:17:32 UTC (rev 4199) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java 2006-05-12 02:55:09 UTC (rev 4200) @@ -16,12 +16,15 @@ * limitations under the License. */ +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import org.drools.common.PropagationContextImpl; import org.drools.rule.EvalCondition; import org.drools.spi.PropagationContext; import org.drools.util.LinkedList; +import org.drools.util.LinkedListObjectWrapper; /** * Node which filters <code>ReteTuple</code>s. @@ -193,9 +196,13 @@ LinkedList memory = (LinkedList) workingMemory.getNodeMemory( this ); for ( Iterator it = memory.iterator(); it.hasNext(); ) { - propagateAssertTuple( (ReteTuple) it.next(), - context, - workingMemory ); + ReteTuple tuple = (ReteTuple) it.next(); + ReteTuple child = new ReteTuple( tuple ); + // no TupleMatch so instead add as a linked tuple + tuple.addLinkedTuple( new LinkedListObjectWrapper( child ) ); + ((TupleSink) getTupleSinks().get( getTupleSinks().size() - 1 )).assertTuple( child, + context, + workingMemory ); } this.attachingNewNode = false; @@ -244,4 +251,26 @@ public Object createMemory() { return new LinkedList(); } + + /** + * @inheritDoc + */ + public List getPropagatedTuples(WorkingMemoryImpl workingMemory, TupleSink sink) { + LinkedList memory = (LinkedList) workingMemory.getNodeMemory( this ); + int index = this.getTupleSinks().indexOf( sink ); + List propagatedTuples = new ArrayList(); + + for ( Iterator it = memory.iterator(); it.hasNext(); ) { + ReteTuple leftTuple = (ReteTuple) it.next(); + LinkedList linkedTuples = leftTuple.getLinkedTuples(); + + LinkedListObjectWrapper wrapper = (LinkedListObjectWrapper) linkedTuples.getFirst(); + for( int c = 0; c < index; c++) { + wrapper = (LinkedListObjectWrapper) wrapper.getNext(); + } + propagatedTuples.add( wrapper.getObject() ); + } + return propagatedTuples; + } + } 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-05-11 11:17:32 UTC (rev 4199) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java 2006-05-12 02:55:09 UTC (rev 4200) @@ -16,7 +16,9 @@ * limitations under the License. */ +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import java.util.Map; import org.drools.common.BetaNodeBinder; @@ -371,7 +373,24 @@ } } - this.attachingNewNode = true; + this.attachingNewNode = false; } + + /** + * @inheritDoc + */ + public List getPropagatedTuples(WorkingMemoryImpl workingMemory, TupleSink sink) { + BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this ); + int index = this.getTupleSinks().indexOf( sink ); + List propagatedTuples = new ArrayList(); + for ( Iterator it = memory.getRightObjectMemory().iterator(); it.hasNext(); ) { + ObjectMatches objectMatches = (ObjectMatches) it.next(); + for ( TupleMatch tupleMatch = objectMatches.getFirstTupleMatch(); tupleMatch != null; tupleMatch = (TupleMatch) tupleMatch.getNext() ) { + propagatedTuples.add( tupleMatch.getJoinedTuples().get( index ) ); + } + } + return propagatedTuples; + } + } Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java 2006-05-11 11:17:32 UTC (rev 4199) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java 2006-05-12 02:55:09 UTC (rev 4200) @@ -16,8 +16,10 @@ * limitations under the License. */ +import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; import org.drools.common.BetaNodeBinder; @@ -301,5 +303,25 @@ } else { return this.objectSource.equals( other.objectSource ) && this.binder.equals( other.binder ); } + } + + /** + * @inheritDoc + */ + public List getPropagatedTuples(WorkingMemoryImpl workingMemory, TupleSink sink) { + Map memory = (Map) workingMemory.getNodeMemory( this ); + int index = this.getTupleSinks().indexOf( sink ); + List propagatedTuples = new ArrayList(); + + for( Iterator i = memory.values().iterator(); i.hasNext(); ) { + LinkedList tuples = (LinkedList) i.next(); + LinkedListObjectWrapper wrapper = (LinkedListObjectWrapper) tuples.getFirst(); + for( int c = 0; c < index; c++) { + wrapper = (LinkedListObjectWrapper) wrapper.getNext(); + } + propagatedTuples.add( wrapper.getObject() ); + } + + return propagatedTuples; } } Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/NotNode.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/NotNode.java 2006-05-11 11:17:32 UTC (rev 4199) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/NotNode.java 2006-05-12 02:55:09 UTC (rev 4200) @@ -16,11 +16,15 @@ * limitations under the License. */ +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import java.util.Map; import org.drools.common.BetaNodeBinder; import org.drools.spi.PropagationContext; +import org.drools.util.LinkedList; +import org.drools.util.LinkedListObjectWrapper; /** * <code>NotNode</code> extends <code>BetaNode</code> to perform tests for @@ -351,18 +355,41 @@ this.attachingNewNode = true; BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this ); - //@todo: can we iterate left memory like this? - for ( Iterator it = memory.leftTupleIterator( workingMemory, - null ); it.hasNext(); ) { + for ( Iterator it = memory.getLeftTupleMemory().iterator(); it.hasNext(); ) { ReteTuple leftTuple = (ReteTuple) it.next(); if ( leftTuple.matchesSize() == 0 ) { - propagateAssertTuple( leftTuple, - context, - workingMemory ); + ReteTuple child = new ReteTuple( leftTuple ); + // no TupleMatch so instead add as a linked tuple + leftTuple.addLinkedTuple( new LinkedListObjectWrapper( child ) ); + ((TupleSink) getTupleSinks().get( getTupleSinks().size() - 1 )).assertTuple( child, + context, + workingMemory ); } } this.attachingNewNode = true; } + + /** + * @inheritDoc + */ + public List getPropagatedTuples(WorkingMemoryImpl workingMemory, TupleSink sink) { + BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this ); + int index = this.getTupleSinks().indexOf( sink ); + List propagatedTuples = new ArrayList(); + for ( Iterator it = memory.getLeftTupleMemory().iterator(); it.hasNext(); ) { + ReteTuple leftTuple = (ReteTuple) it.next(); + LinkedList linkedTuples = leftTuple.getLinkedTuples(); + + LinkedListObjectWrapper wrapper = (LinkedListObjectWrapper) linkedTuples.getFirst(); + for( int c = 0; c < index; c++) { + wrapper = (LinkedListObjectWrapper) wrapper.getNext(); + } + propagatedTuples.add( wrapper.getObject() ); + } + return propagatedTuples; + } + + } Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java 2006-05-11 11:17:32 UTC (rev 4199) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java 2006-05-12 02:55:09 UTC (rev 4200) @@ -265,33 +265,25 @@ for ( int i = 0, length = workingMemories.length; i < length; i++ ) { final WorkingMemoryImpl workingMemory = workingMemories[i]; - final TerminalNodeMemory memory = (TerminalNodeMemory) workingMemory.getNodeMemory( this ); - - final AgendaGroupImpl group = memory.getAgendaGroup(); - final Queueable[] elements = group.getQueueable(); - final List list = new ArrayList(); - //start at 1 as BinaryHeapQueue starts at 1 - for ( int j = 1, size = group.size() + 1; j < size; j++ ) { - final AgendaItem item = (AgendaItem) elements[j]; - if ( item.getRule() == this.rule ) { - list.add( item ); + for ( final Iterator it = this.tupleSource.getPropagatedTuples( workingMemory, this ).iterator(); + it.hasNext(); ) { + ReteTuple tuple = (ReteTuple) it.next(); + Activation activation = tuple.getActivation(); + + if ( activation.isActivated() ) { + activation.remove(); + workingMemory.getAgendaEventSupport().fireActivationCancelled( activation ); } - } - for ( final Iterator it = list.iterator(); it.hasNext(); ) { - final AgendaItem item = (AgendaItem) it.next(); - if ( item.isActivated() ) { - item.remove(); - workingMemory.getAgendaEventSupport().fireActivationCancelled( item ); - } final PropagationContext propagationContext = new PropagationContextImpl( workingMemory.getNextPropagationIdCounter(), PropagationContext.RULE_REMOVAL, null, null ); - workingMemory.removeLogicalDependencies( item, + workingMemory.removeLogicalDependencies( activation, propagationContext, this.rule ); } + workingMemory.propagateQueuedActions(); } this.tupleSource.remove( this, Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSource.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSource.java 2006-05-11 11:17:32 UTC (rev 4199) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSource.java 2006-05-12 02:55:09 UTC (rev 4200) @@ -222,4 +222,10 @@ return this.tupleSinks; } + /** + * Returns the list of propagated tuples + * @return + */ + public abstract List getPropagatedTuples(WorkingMemoryImpl workingMemory, TupleSink sink); + } Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockTupleSink.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockTupleSink.java 2006-05-11 11:17:32 UTC (rev 4199) +++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockTupleSink.java 2006-05-12 02:55:09 UTC (rev 4200) @@ -18,6 +18,7 @@ import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -110,4 +111,10 @@ } + public List getPropagatedTuples(WorkingMemoryImpl workingMemory, + TupleSink sink) { + // TODO Auto-generated method stub + return Collections.EMPTY_LIST; + } + } \ No newline at end of file Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockTupleSource.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockTupleSource.java 2006-05-11 11:17:32 UTC (rev 4199) +++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockTupleSource.java 2006-05-12 02:55:09 UTC (rev 4200) @@ -17,6 +17,9 @@ +import java.util.Collections; +import java.util.List; + import org.drools.spi.PropagationContext; public class MockTupleSource extends TupleSource { @@ -58,4 +61,10 @@ } + public List getPropagatedTuples(WorkingMemoryImpl workingMemory, + TupleSink sink) { + // TODO Auto-generated method stub + return Collections.EMPTY_LIST; + } + } \ No newline at end of file |