[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