[jboss-svn-commits] JBL Code SVN: r34068 - labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Tue Jul 20 12:04:15 EDT 2010
Author: tirelli
Date: 2010-07-20 12:04:13 -0400 (Tue, 20 Jul 2010)
New Revision: 34068
Added:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTupleSinkAdapter.java
Modified:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ExistsNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.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/LeftTuple.java
Log:
JBRULES-2584: fixing dynamic rules that include evals
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java 2010-07-20 15:32:38 UTC (rev 34067)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java 2010-07-20 16:04:13 UTC (rev 34068)
@@ -136,8 +136,8 @@
false );
} else {
// this is a hack, to not add closed DroolsQuery objects
- Object object = ((InternalFactHandle)context.getFactHandle()).getObject();
- if ( memory.betaMemory.getLeftTupleMemory() != null && !(object instanceof DroolsQuery && !((DroolsQuery)object).isOpen() ) ) {
+ Object object = ((InternalFactHandle) context.getFactHandle()).getObject();
+ if ( memory.betaMemory.getLeftTupleMemory() != null && !(object instanceof DroolsQuery && !((DroolsQuery) object).isOpen()) ) {
memory.betaMemory.getLeftTupleMemory().add( leftTuple );
memory.betaMemory.getCreatedHandles().put( leftTuple,
accresult,
@@ -145,7 +145,7 @@
} else {
useLeftMemory = false;
}
- }
+ }
accresult.context = this.accumulate.createContext();
@@ -158,7 +158,8 @@
workingMemory,
leftTuple );
- for ( RightTuple rightTuple = memory.betaMemory.getRightTupleMemory().getFirst( leftTuple, (InternalFactHandle) context.getFactHandle() ); rightTuple != null; rightTuple = (RightTuple) rightTuple.getNext() ) {
+ for ( RightTuple rightTuple = memory.betaMemory.getRightTupleMemory().getFirst( leftTuple,
+ (InternalFactHandle) context.getFactHandle() ); rightTuple != null; rightTuple = (RightTuple) rightTuple.getNext() ) {
InternalFactHandle handle = rightTuple.getFactHandle();
if ( this.constraints.isAllowedCachedLeft( memory.betaMemory.getContext(),
handle ) ) {
@@ -244,10 +245,10 @@
memory.betaMemory.getRightTupleMemory().add( rightTuple );
- if ( memory.betaMemory.getLeftTupleMemory() == null || memory.betaMemory.getLeftTupleMemory().size() == 0 ) {
+ if ( memory.betaMemory.getLeftTupleMemory() == null || memory.betaMemory.getLeftTupleMemory().size() == 0 ) {
// do nothing here, as we know there are no left tuples at this stage in sequential mode or for a query.
// unless it's an "Open Query" and thus that will have left memory, so continue as normal
- return;
+ return;
}
this.constraints.updateFromFactHandle( memory.betaMemory.getContext(),
@@ -331,7 +332,8 @@
RightTupleMemory rightMemory = memory.betaMemory.getRightTupleMemory();
- RightTuple rightTuple = rightMemory.getFirst( leftTuple, (InternalFactHandle) context.getFactHandle() );
+ RightTuple rightTuple = rightMemory.getFirst( leftTuple,
+ (InternalFactHandle) context.getFactHandle() );
// first check our index (for indexed nodes only) hasn't changed and we are returning the same bucket
if ( childLeftTuple != null && rightMemory.isIndexed() && rightTuple != rightMemory.getFirst( childLeftTuple.getRightParent() ) ) {
@@ -376,7 +378,7 @@
// add a new match
addMatch( leftTuple,
rightTuple,
- childLeftTuple,
+ childLeftTuple,
null,
workingMemory,
memory,
@@ -434,11 +436,11 @@
// this is needed to fix for indexing and deterministic iteration
memory.betaMemory.getRightTupleMemory().remove( rightTuple );
memory.betaMemory.getRightTupleMemory().add( rightTuple );
-
+
if ( memory.betaMemory.getLeftTupleMemory() == null || memory.betaMemory.getLeftTupleMemory().size() == 0 ) {
// do nothing here, as we know there are no left tuples at this stage in sequential mode.
return;
- }
+ }
// WTD here
// if ( !behavior.assertRightTuple( memory.getBehaviorContext(),
@@ -525,7 +527,7 @@
memory,
accctx,
true );
- if( temp != null ) {
+ if ( temp != null ) {
childLeftTuple = temp;
}
evaluateResultConstraints( ActivitySource.RIGHT,
@@ -580,7 +582,7 @@
final InternalWorkingMemory workingMemory,
final AccumulateMemory memory,
final AccumulateContext accctx,
- final boolean useLeftMemory ) {
+ final boolean useLeftMemory) {
// get the actual result
final Object result = this.accumulate.getResult( memory.workingMemoryContext,
@@ -658,8 +660,8 @@
// assert
this.sink.propagateAssertLeftTuple( leftTuple,
accctx.result,
- null,
null,
+ null,
context,
workingMemory,
useLeftMemory );
@@ -763,7 +765,7 @@
final InternalWorkingMemory workingMemory,
final AccumulateMemory memory,
final AccumulateContext accresult,
- final boolean useLeftMemory ) {
+ final boolean useLeftMemory) {
LeftTuple tuple = leftTuple;
InternalFactHandle handle = rightTuple.getFactHandle();
if ( this.unwrapRightObject ) {
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 2010-07-20 15:32:38 UTC (rev 34067)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java 2010-07-20 16:04:13 UTC (rev 34068)
@@ -408,7 +408,7 @@
*/
private static class LeftTupleSinkUpdateAdapter
implements
- LeftTupleSink {
+ LeftTupleSink, LeftTupleSinkAdapter {
private final EvalConditionNode node;
private final LeftTupleSink sink;
private final EvalCondition constraint;
@@ -426,6 +426,8 @@
final InternalWorkingMemory workingMemory) {
final EvalMemory memory = (EvalMemory) workingMemory.getNodeMemory( node );
+ // need to be overridden, because it was pointing to the adapter instead
+ leftTuple.setLeftTupleSink( this.node );
final boolean allowed = this.constraint.isAllowed( leftTuple,
workingMemory,
@@ -487,6 +489,10 @@
return sink.getPartitionId();
}
+ public LeftTupleSink getRealSink() {
+ return this.node;
+ }
+
}
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ExistsNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ExistsNode.java 2010-07-20 15:32:38 UTC (rev 34067)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ExistsNode.java 2010-07-20 16:04:13 UTC (rev 34068)
@@ -112,7 +112,8 @@
}
}
- for ( RightTuple rightTuple = memory.getRightTupleMemory().getFirst( leftTuple, (InternalFactHandle) context.getFactHandle() ); rightTuple != null; rightTuple = (RightTuple) rightTuple.getNext() ) {
+ for ( RightTuple rightTuple = memory.getRightTupleMemory().getFirst( leftTuple,
+ (InternalFactHandle) context.getFactHandle() ); rightTuple != null; rightTuple = (RightTuple) rightTuple.getNext() ) {
if ( this.constraints.isAllowedCachedLeft( memory.getContext(),
rightTuple.getFactHandle() ) ) {
@@ -304,7 +305,8 @@
memory.getLeftTupleMemory().remove( leftTuple );
} else {
// check if we changed bucket
- if ( rightMemory.isIndexed() && rightMemory.getFirst( blocker ) != rightMemory.getFirst( leftTuple, (InternalFactHandle) context.getFactHandle() ) ) {
+ if ( rightMemory.isIndexed() && rightMemory.getFirst( blocker ) != rightMemory.getFirst( leftTuple,
+ (InternalFactHandle) context.getFactHandle() ) ) {
// we changed bucket, so blocker no longer blocks
blocker.removeBlocked( leftTuple );
leftTuple.setBlocker( null );
@@ -332,7 +334,8 @@
}
// find first blocker, because it's a modify, we need to start from the beginning again
- RightTuple rightTuple = rightMemory.getFirst( leftTuple, (InternalFactHandle) context.getFactHandle() );
+ RightTuple rightTuple = rightMemory.getFirst( leftTuple,
+ (InternalFactHandle) context.getFactHandle() );
for ( RightTuple newBlocker = rightTuple; newBlocker != null; newBlocker = (RightTuple) newBlocker.getNext() ) {
if ( this.constraints.isAllowedCachedLeft( memory.getContext(),
newBlocker.getFactHandle() ) ) {
@@ -377,7 +380,7 @@
InternalWorkingMemory workingMemory) {
final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
- if ( memory.getLeftTupleMemory() == null || ( memory.getLeftTupleMemory().size() == 0 && rightTuple.getBlocked() == null ) ) {
+ if ( memory.getLeftTupleMemory() == null || (memory.getLeftTupleMemory().size() == 0 && rightTuple.getBlocked() == null) ) {
// do nothing here, as we know there are no left tuples
//normally do this at the end, but as we are exiting early, make sure the buckets are still correct.
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java 2010-07-20 15:32:38 UTC (rev 34067)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java 2010-07-20 16:04:13 UTC (rev 34068)
@@ -391,13 +391,14 @@
Map<Object, RightTuple> matches = (Map<Object, RightTuple>) memory.betaMemory.getCreatedHandles().get( leftTuple );
for ( RightTuple rightTuples : matches.values() ) {
for ( RightTuple rightTuple = rightTuples; rightTuple != null; rightTuple = (RightTuple) rightTuples.getNext() ) {
- this.sink.propagateAssertLeftTuple( leftTuple,
- rightTuple,
- null,
- null,
- context,
- workingMemory,
- this.tupleMemoryEnabled );
+ sink.assertLeftTuple( new LeftTuple( leftTuple,
+ rightTuple,
+ null,
+ null,
+ sink,
+ this.tupleMemoryEnabled ),
+ context,
+ workingMemory );
}
}
}
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 2010-07-20 15:32:38 UTC (rev 34067)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java 2010-07-20 16:04:13 UTC (rev 34068)
@@ -61,14 +61,14 @@
final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
boolean useLeftMemory = true;
- if ( this.tupleMemoryEnabled ) {
+ if ( this.tupleMemoryEnabled ) {
memory.getLeftTupleMemory().add( leftTuple );
} else {
// This is a hack, to not add closed DroolsQuery objects
- Object object = ((InternalFactHandle)context.getFactHandle()).getObject();
- if ( object instanceof DroolsQuery && !((DroolsQuery)object).isOpen() ) {
+ Object object = ((InternalFactHandle) context.getFactHandle()).getObject();
+ if ( object instanceof DroolsQuery && !((DroolsQuery) object).isOpen() ) {
useLeftMemory = false;
- } else if ( memory.getLeftTupleMemory() != null ) {
+ } else if ( memory.getLeftTupleMemory() != null ) {
// LeftMemory will be null for sequential (still created for queries).
memory.getLeftTupleMemory().add( leftTuple );
}
@@ -77,7 +77,8 @@
this.constraints.updateFromTuple( memory.getContext(),
workingMemory,
leftTuple );
- for ( RightTuple rightTuple = memory.getRightTupleMemory().getFirst( leftTuple, (InternalFactHandle) context.getFactHandle() ); rightTuple != null; rightTuple = (RightTuple) rightTuple.getNext() ) {
+ for ( RightTuple rightTuple = memory.getRightTupleMemory().getFirst( leftTuple,
+ (InternalFactHandle) context.getFactHandle() ); rightTuple != null; rightTuple = (RightTuple) rightTuple.getNext() ) {
final InternalFactHandle handle = rightTuple.getFactHandle();
if ( this.constraints.isAllowedCachedLeft( memory.getContext(),
handle ) ) {
@@ -111,9 +112,9 @@
}
memory.getRightTupleMemory().add( rightTuple );
- if ( memory.getLeftTupleMemory() == null || memory.getLeftTupleMemory().size() == 0 ) {
+ if ( memory.getLeftTupleMemory() == null || memory.getLeftTupleMemory().size() == 0 ) {
// do nothing here, as no left memory
- return;
+ return;
}
this.constraints.updateFromFactHandle( memory.getContext(),
@@ -183,11 +184,11 @@
// this is needed to fix for indexing and deterministic iteration
memory.getRightTupleMemory().remove( rightTuple );
memory.getRightTupleMemory().add( rightTuple );
-
+
if ( memory.getLeftTupleMemory() != null && memory.getLeftTupleMemory().size() == 0 ) {
// do nothing here, as we know there are no left tuples.
return;
- }
+ }
LeftTuple childLeftTuple = rightTuple.firstChild;
@@ -200,7 +201,7 @@
rightTuple.getFactHandle() );
// first check our index (for indexed nodes only) hasn't changed and we are returning the same bucket
- if ( childLeftTuple != null && leftMemory.isIndexed() && ( leftTuple == null || ( leftTuple.getMemory() != childLeftTuple.getLeftParent().getMemory() ) ) ) {
+ if ( childLeftTuple != null && leftMemory.isIndexed() && (leftTuple == null || (leftTuple.getMemory() != childLeftTuple.getLeftParent().getMemory())) ) {
// our index has changed, so delete all the previous propagations
this.sink.propagateRetractRightTuple( rightTuple,
context,
@@ -281,10 +282,11 @@
RightTupleMemory rightMemory = memory.getRightTupleMemory();
- RightTuple rightTuple = rightMemory.getFirst( leftTuple, (InternalFactHandle) context.getFactHandle() );
+ RightTuple rightTuple = rightMemory.getFirst( leftTuple,
+ (InternalFactHandle) context.getFactHandle() );
// first check our index (for indexed nodes only) hasn't changed and we are returning the same bucket
- if ( childLeftTuple != null && rightMemory.isIndexed() && ( rightTuple == null || ( rightTuple.getMemory() != childLeftTuple.getRightParent().getMemory() ) ) ) {
+ if ( childLeftTuple != null && rightMemory.isIndexed() && (rightTuple == null || (rightTuple.getMemory() != childLeftTuple.getRightParent().getMemory())) ) {
// our index has changed, so delete all the previous propagations
this.sink.propagateRetractLeftTuple( leftTuple,
context,
@@ -358,14 +360,15 @@
final PropagationContext context,
final InternalWorkingMemory workingMemory) {
- final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
-
+ final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
+
final Iterator tupleIter = memory.getLeftTupleMemory().iterator();
for ( LeftTuple leftTuple = (LeftTuple) tupleIter.next(); leftTuple != null; leftTuple = (LeftTuple) tupleIter.next() ) {
this.constraints.updateFromTuple( memory.getContext(),
workingMemory,
leftTuple );
- for ( RightTuple rightTuple = memory.getRightTupleMemory().getFirst( leftTuple, (InternalFactHandle) context.getFactHandle() ); rightTuple != null; rightTuple = (RightTuple) rightTuple.getNext() ) {
+ for ( RightTuple rightTuple = memory.getRightTupleMemory().getFirst( leftTuple,
+ (InternalFactHandle) context.getFactHandle() ); rightTuple != null; rightTuple = (RightTuple) rightTuple.getNext() ) {
if ( this.constraints.isAllowedCachedLeft( memory.getContext(),
rightTuple.getFactHandle() ) ) {
sink.assertLeftTuple( new LeftTuple( leftTuple,
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java 2010-07-20 15:32:38 UTC (rev 34067)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java 2010-07-20 16:04:13 UTC (rev 34068)
@@ -314,6 +314,13 @@
public LeftTupleSink getLeftTupleSink() {
return sink;
}
+
+ /* Had to add the set method because sink adapters must override
+ * the tuple sink set when the tuple was created.
+ */
+ public void setLeftTupleSink( LeftTupleSink sink ) {
+ this.sink = sink;
+ }
public LeftTuple getLeftParent() {
return leftParent;
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTupleSinkAdapter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTupleSinkAdapter.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTupleSinkAdapter.java 2010-07-20 16:04:13 UTC (rev 34068)
@@ -0,0 +1,31 @@
+package org.drools.reteoo;
+
+/*
+ * Copyright 2010 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Interface implemented by all sink adapters to allow
+ * nodes to create tuples that properly reference the real
+ * sink.
+ */
+public interface LeftTupleSinkAdapter {
+
+ /**
+ * Returns the sink node that this adapter is wrapping
+ */
+ public LeftTupleSink getRealSink();
+
+}
More information about the jboss-svn-commits
mailing list