[jboss-svn-commits] JBL Code SVN: r26196 - in labs/jbossrules/trunk: drools-compiler/src/test/java/org/drools and 6 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Tue Apr 21 19:10:54 EDT 2009
Author: tirelli
Date: 2009-04-21 19:10:54 -0400 (Tue, 21 Apr 2009)
New Revision: 26196
Added:
labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_AccumulateMVELwithModify.drl
Modified:
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Order.java
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/AccumulateTest.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELFactory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELPreviousDeclarationVariable.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELConsequence.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultFactHandle.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EventFactHandle.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalFactHandle.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/InitialFactHandle.java
labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/PetStore.drl
labs/jbossrules/trunk/pom.xml
Log:
JBRULES-2068: fixing problem with modify() call on mvel consequences
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Order.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Order.java 2009-04-21 19:47:39 UTC (rev 26195)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Order.java 2009-04-21 23:10:54 UTC (rev 26196)
@@ -37,7 +37,17 @@
private OrderStatus status;
private Date date;
+
+ private double total;
+ public double getTotal() {
+ return total;
+ }
+
+ public void setTotal(double total) {
+ this.total = total;
+ }
+
public Order() {
this( 0, "Bob" );
}
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/AccumulateTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/AccumulateTest.java 2009-04-21 19:47:39 UTC (rev 26195)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/AccumulateTest.java 2009-04-21 23:10:54 UTC (rev 26196)
@@ -14,6 +14,8 @@
import org.drools.Cheese;
import org.drools.Cheesery;
import org.drools.FactHandle;
+import org.drools.Order;
+import org.drools.OrderItem;
import org.drools.OuterClass;
import org.drools.Person;
import org.drools.RuleBase;
@@ -1444,6 +1446,35 @@
results.get( 0 ) );
}
+ public void testAccumulateMVELWithModify() throws Exception {
+ // read in the source
+ final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_AccumulateMVELwithModify.drl" ) );
+ final RuleBase ruleBase = loadRuleBase( reader );
+
+ final StatefulSession wm = ruleBase.newStatefulSession();
+ final List<Number> results = new ArrayList<Number>();
+ wm.setGlobal( "results",
+ results );
+
+ Order order = new Order(1, "Bob");
+ OrderItem item1 = new OrderItem( order, 1, "maquilage", 1, 10 );
+ OrderItem item2 = new OrderItem( order, 2, "perfume", 1, 5 );
+ order.addItem( item1 );
+ order.addItem( item2 );
+
+ wm.insert( order );
+ wm.insert( item1 );
+ wm.insert( item2 );
+ wm.fireAllRules();
+
+ assertEquals( 1,
+ results.size() );
+ assertEquals( 15,
+ results.get( 0 ).intValue() );
+ assertEquals( 15.0,
+ order.getTotal() );
+ }
+
public void testAccumulateGlobals() throws Exception {
// read in the source
Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_AccumulateMVELwithModify.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_AccumulateMVELwithModify.drl (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_AccumulateMVELwithModify.drl 2009-04-21 23:10:54 UTC (rev 26196)
@@ -0,0 +1,16 @@
+package org.drools;
+
+global java.util.List results;
+
+rule "Accumulate with modify"
+ dialect "mvel"
+ when
+ $o : Order( total == 0 )
+ Number( $total : doubleValue ) from accumulate(
+ OrderItem( order == $o, $p : price ),
+ sum( $p ) )
+ then
+ modify( $o ) { total = $total }
+ results.add( $total );
+end
+
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELFactory.java 2009-04-21 19:47:39 UTC (rev 26195)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELFactory.java 2009-04-21 23:10:54 UTC (rev 26196)
@@ -8,7 +8,6 @@
import java.util.HashMap;
import java.util.Map;
-import org.drools.FactHandle;
import org.drools.WorkingMemory;
import org.drools.common.InternalFactHandle;
import org.drools.reteoo.LeftTuple;
@@ -43,7 +42,11 @@
private Map localDeclarations;
- private Map previousDeclarations;
+ private Map<String, Declaration> previousDeclarations;
+
+ // this is a cache for previously declared objects in case they
+ // get retracted during the execution of an MVEL consequence
+ private Map<String, Object> previousDeclarationsObjectCache;
private Map globals;
@@ -52,7 +55,7 @@
private Map localVariables;
public DroolsMVELFactory() {
-
+ previousDeclarationsObjectCache = new HashMap<String, Object>();
}
public DroolsMVELFactory(final Map previousDeclarations,
@@ -68,7 +71,7 @@
final Map localDeclarations,
final Map globals,
final String[] inputIdentifiers) {
- this.previousDeclarations = previousDeclarations;
+ this.previousDeclarations = (Map<String, Declaration>) previousDeclarations;
this.localDeclarations = localDeclarations;
this.globals = globals;
@@ -77,6 +80,7 @@
isResolveable(inputIdentifiers[i]);
}
}
+ previousDeclarationsObjectCache = new HashMap<String, Object>();
}
public void readExternal(ObjectInput in) throws IOException,
@@ -85,7 +89,7 @@
knowledgeHelper = (KnowledgeHelper) in.readObject();
object = in.readObject();
localDeclarations = (Map) in.readObject();
- previousDeclarations = (Map) in.readObject();
+ previousDeclarations = (Map<String, Declaration>) in.readObject();
globals = (Map) in.readObject();
workingMemory = (WorkingMemory) in.readObject();
localVariables = (Map) in.readObject();
@@ -161,15 +165,31 @@
else {
this.localVariables = variables;
}
+
+ if( this.previousDeclarations != null ) {
+ // take a snapshot of required objects for variable resolution
+ for( Map.Entry<String, Declaration> entry : this.previousDeclarations.entrySet() ) {
+ Declaration decl = knowledgeHelper != null ? knowledgeHelper.getDeclaration( entry.getValue().getIdentifier() ) : entry.getValue();
+ this.previousDeclarationsObjectCache.put( entry.getKey(), getTupleObjectFor( decl ) );
+ }
+ }
}
+ private Object getTupleObjectFor(Declaration declaration) {
+ int i = declaration.getPattern().getOffset();
+ return ( i < this.tupleObjects.length ) ? this.tupleObjects[i].getObject() : null;
+ }
+
public KnowledgeHelper getKnowledgeHelper() {
return this.knowledgeHelper;
}
public Object getValue(final Declaration declaration) {
- int i = declaration.getPattern().getOffset();
- return this.tupleObjects[i].getObject();
+ if( this.previousDeclarationsObjectCache.containsKey( declaration.getIdentifier() ) ) {
+ return this.previousDeclarationsObjectCache.get( declaration.getIdentifier() );
+ } else {
+ return getTupleObjectFor( declaration );
+ }
}
public InternalFactHandle getFactHandle(final Declaration declaration){
int i = declaration.getPattern().getOffset();
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELPreviousDeclarationVariable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELPreviousDeclarationVariable.java 2009-04-21 19:47:39 UTC (rev 26195)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELPreviousDeclarationVariable.java 2009-04-21 23:10:54 UTC (rev 26196)
@@ -5,10 +5,8 @@
import java.io.ObjectInput;
import java.io.ObjectOutput;
-
import org.drools.common.InternalFactHandle;
import org.drools.common.InternalWorkingMemory;
-import org.drools.common.NamedEntryPoint;
import org.drools.rule.Declaration;
import org.drools.runtime.rule.WorkingMemoryEntryPoint;
import org.mvel2.integration.VariableResolver;
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELConsequence.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELConsequence.java 2009-04-21 19:47:39 UTC (rev 26195)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELConsequence.java 2009-04-21 23:10:54 UTC (rev 26196)
@@ -79,18 +79,19 @@
((InternalRuleBase) workingMemory.getRuleBase())
.getRootClassLoader());
- if (MVELDebugHandler.isDebugMode()) {
- if (MVELDebugHandler.verbose) {
- System.out.println("Executing expression " + compexpr.getSourceName());
- System.out.println(DebugTools.decompile(compexpr));
- }
- MVEL.executeDebugger(compexpr, null, factory);
- } else {
- MVEL.executeExpression(compexpr, null, factory);
+ try {
+ if (MVELDebugHandler.isDebugMode()) {
+ if (MVELDebugHandler.verbose) {
+ System.out.println("Executing expression " + compexpr.getSourceName());
+ System.out.println(DebugTools.decompile(compexpr));
+ }
+ MVEL.executeDebugger(compexpr, null, factory);
+ } else {
+ MVEL.executeExpression(compexpr, null, factory);
+ }
+ } finally {
+ Thread.currentThread().setContextClassLoader(tempClassLoader);
}
-
- Thread.currentThread().setContextClassLoader(tempClassLoader);
-
}
public Serializable getCompExpr() {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultFactHandle.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultFactHandle.java 2009-04-21 19:47:39 UTC (rev 26195)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultFactHandle.java 2009-04-21 23:10:54 UTC (rev 26196)
@@ -98,6 +98,10 @@
public int getObjectHashCode() {
return this.objectHashCode;
}
+
+ protected void setObjectHashCode( int hashCode ) {
+ this.objectHashCode = hashCode;
+ }
/**
* @see Object
@@ -191,4 +195,14 @@
public void setEntryPoint(WorkingMemoryEntryPoint sourceNode) {
this.entryPoint = sourceNode;
}
+
+ public DefaultFactHandle clone() {
+ DefaultFactHandle clone = new DefaultFactHandle(this.id, this.object, this.recency);
+ clone.entryPoint = this.entryPoint;
+ clone.key = this.key;
+ clone.leftTuple = this.leftTuple;
+ clone.rightTuple = this.rightTuple;
+ clone.objectHashCode = this.objectHashCode;
+ return clone;
+ }
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EventFactHandle.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EventFactHandle.java 2009-04-21 19:47:39 UTC (rev 26195)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EventFactHandle.java 2009-04-21 23:10:54 UTC (rev 26196)
@@ -6,10 +6,10 @@
private static final long serialVersionUID = 5997141759543399455L;
- private long startTimestamp;
- private long duration;
- private boolean expired;
- private long activationsCount;
+ private long startTimestamp;
+ private long duration;
+ private boolean expired;
+ private long activationsCount;
// ----------------------------------------------------------------------
// Constructors
@@ -54,11 +54,11 @@
* @param timestamp the timestamp of the occurrence of this event
* @param duration the duration of this event. May be 0 (zero) in case this is a primitive event.
*/
- public EventFactHandle( final int id,
- final Object object,
- final long recency,
- final long timestamp,
- final long duration ) {
+ public EventFactHandle(final int id,
+ final Object object,
+ final long recency,
+ final long timestamp,
+ final long duration) {
super( id,
object,
recency );
@@ -132,8 +132,24 @@
public void increaseActivationsCount() {
this.activationsCount++;
}
-
+
public void decreaseActivationsCount() {
this.activationsCount--;
}
+
+ public EventFactHandle clone() {
+ EventFactHandle clone = new EventFactHandle( getId(),
+ getObject(),
+ getRecency(),
+ startTimestamp,
+ duration );
+ clone.activationsCount = activationsCount;
+ clone.expired = expired;
+ clone.setEntryPoint( getEntryPoint() );
+ clone.setEqualityKey( getEqualityKey() );
+ clone.setLeftTuple( getLeftTuple() );
+ clone.setRightTuple( getRightTuple() );
+ clone.setObjectHashCode( getObjectHashCode() );
+ return clone;
+ }
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalFactHandle.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalFactHandle.java 2009-04-21 19:47:39 UTC (rev 26195)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalFactHandle.java 2009-04-21 23:10:54 UTC (rev 26196)
@@ -23,7 +23,7 @@
public interface InternalFactHandle
extends
- FactHandle {
+ FactHandle, Cloneable {
public int getId();
public long getRecency();
@@ -63,4 +63,6 @@
public void setEntryPoint( WorkingMemoryEntryPoint ep );
+ public InternalFactHandle clone();
+
}
\ No newline at end of file
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 2009-04-21 19:47:39 UTC (rev 26195)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java 2009-04-21 23:10:54 UTC (rev 26196)
@@ -461,6 +461,7 @@
// update result object
accctx.result.getFactHandle().setObject( result );
+ workingMemory.getFactHandleFactory().increaseFactHandleRecency( accctx.result.getFactHandle() );
evaluateResultConstraints( leftTuple,
context,
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/InitialFactHandle.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/InitialFactHandle.java 2009-04-21 19:47:39 UTC (rev 26195)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/InitialFactHandle.java 2009-04-21 23:10:54 UTC (rev 26196)
@@ -91,5 +91,9 @@
public String toExternalForm() {
return "InitialFact";
}
+
+ public InitialFactHandle clone() {
+ return this;
+ }
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/PetStore.drl
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/PetStore.drl 2009-04-21 19:47:39 UTC (rev 26195)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/PetStore.drl 2009-04-21 23:10:54 UTC (rev 26196)
@@ -81,13 +81,13 @@
rule "Gross Total"
agenda-group "checkout"
- dialect "java"
+ dialect "mvel"
when
$order : Order( grossTotal == -1)
Number( total : doubleValue ) from accumulate( Purchase( $price : product.price ),
sum( $price ) )
then
- modify( $order ) { setGrossTotal( total ) };
+ modify( $order ) { grossTotal = total }
textArea.append( "\ngross total=" + total + "\n" );
end
Modified: labs/jbossrules/trunk/pom.xml
===================================================================
--- labs/jbossrules/trunk/pom.xml 2009-04-21 19:47:39 UTC (rev 26195)
+++ labs/jbossrules/trunk/pom.xml 2009-04-21 23:10:54 UTC (rev 26196)
@@ -13,7 +13,7 @@
<url>http://www.jboss.com/products/rules</url>
<properties>
- <mvel.dep.version>2.0.9pre2</mvel.dep.version>
+ <mvel.dep.version>2.0.9-SNAPSHOT</mvel.dep.version>
</properties>
<prerequisites>
More information about the jboss-svn-commits
mailing list