[jboss-svn-commits] JBL Code SVN: r33316 - in labs/jbossrules/trunk: drools-compiler/src/test/java/org/drools/integrationtests and 7 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Jun 2 13:32:02 EDT 2010


Author: tirelli
Date: 2010-06-02 13:32:00 -0400 (Wed, 02 Jun 2010)
New Revision: 33316

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_OrCEFollowedByMultipleEval2.drl
Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FirstOrderLogicTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELCompilationUnit.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELEvalExpression.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LogicTransformer.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/EvalExpression.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockEvalCondition.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/test/dsl/EvalNodeStep.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/PackageCompilationDataTest.java
Log:
JBRULES-2526: fixing eval cloning when rules have multiple logical branches

Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel	2010-06-02 17:06:19 UTC (rev 33315)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel	2010-06-02 17:32:00 UTC (rev 33316)
@@ -178,6 +178,11 @@
             @end{","} );
     }
     
+    public org.drools.spi.EvalExpression clone() {
+        // this class is stateless, so no cloning needed
+        return this;
+    }
+    
     @includeNamed{"replaceDeclaration"}
 
     @includeNamed{"hashCode"}

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FirstOrderLogicTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FirstOrderLogicTest.java	2010-06-02 17:06:19 UTC (rev 33315)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FirstOrderLogicTest.java	2010-06-02 17:32:00 UTC (rev 33316)
@@ -963,6 +963,33 @@
                 times( 6 ) ).afterActivationFired( any( AfterActivationFiredEvent.class ) );
     }
 
+    // JBRULES-2526
+    public void testOrWithVariableResolution2() throws Exception {
+        final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_OrCEFollowedByMultipleEval2.drl",
+                                                            FirstOrderLogicTest.class ),
+                      ResourceType.DRL );
+
+        assertFalse( kbuilder.getErrors().toString(),
+                     kbuilder.hasErrors() );
+
+        final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        final AgendaEventListener al = mock( AgendaEventListener.class );
+        ksession.addEventListener( al );
+
+        ksession.insert( new FactA( "a" ) );
+        ksession.insert( new FactB( "b" ) );
+        ksession.insert( new FactC( "c" ) );
+
+        ksession.fireAllRules();
+        verify( al,
+                times( 8 ) ).afterActivationFired( any( AfterActivationFiredEvent.class ) );
+    }
+
     public void testCollectWithMemberOfOperators() throws Exception {
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_CollectMemberOfOperator.drl" ) ) );

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_OrCEFollowedByMultipleEval2.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_OrCEFollowedByMultipleEval2.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_OrCEFollowedByMultipleEval2.drl	2010-06-02 17:32:00 UTC (rev 33316)
@@ -0,0 +1,25 @@
+package org.drools;
+
+rule "Test OR with multiple evals - java"
+    dialect "java"
+when
+    $aFact : FactA( $a : field1 == "a" )
+    $bFact : FactB( $b : f1 == "b" )
+    $cFact : FactC( $c : f1 == "c" )
+	( eval($aFact != null) || eval($bFact != null) ) 
+    ( eval($bFact != null) || eval($cFact != null) )
+then
+    // do something thrice
+end
+
+rule "Test OR with multiple evals - mvel"
+    dialect "mvel"
+when
+    $aFact : FactA( $a : field1 == "a" )
+    $bFact : FactB( $b : f1 == "b" )
+    $cFact : FactC( $c : f1 == "c" )
+	( eval($aFact != null) || eval($bFact != null) ) 
+    ( eval($bFact != null) || eval($cFact != null) )
+then
+    // do something thrice
+end
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELCompilationUnit.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELCompilationUnit.java	2010-06-02 17:06:19 UTC (rev 33315)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELCompilationUnit.java	2010-06-02 17:32:00 UTC (rev 33316)
@@ -27,7 +27,8 @@
 
 public class MVELCompilationUnit
     implements
-    Externalizable {
+    Externalizable,
+    Cloneable {
 
     private static final long serialVersionUID = 510L;
 
@@ -402,4 +403,23 @@
             }
         }
     }
+
+    @Override
+    public MVELCompilationUnit clone() {
+        return new MVELCompilationUnit(name, 
+                                       expression,
+                                       pkgImports,
+                                       importClasses,
+                                       importMethods,
+                                       importFields,
+                                       globalIdentifiers,
+                                       previousDeclarations,
+                                       localDeclarations,
+                                       otherIdentifiers,
+                                       inputIdentifiers,
+                                       inputTypes,
+                                       languageLevel,
+                                       strictMode);
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELEvalExpression.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELEvalExpression.java	2010-06-02 17:06:19 UTC (rev 33315)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELEvalExpression.java	2010-06-02 17:32:00 UTC (rev 33316)
@@ -93,7 +93,7 @@
     @SuppressWarnings("unchecked")
     public Declaration[] getRequiredDeclarations() {
         Map previousDeclarations = this.unit.getFactory().getPreviousDeclarations();
-        return (Declaration[]) previousDeclarations.values().toArray(new Declaration[previousDeclarations.size()]);
+        return (Declaration[]) previousDeclarations.values().toArray( new Declaration[previousDeclarations.size()] );
     }
 
     public void replaceDeclaration(Declaration declaration,
@@ -101,7 +101,17 @@
         this.unit.replaceDeclaration( declaration,
                                       resolved );
         // need to get a new prototype factory, since the declaration was updated
-        prototype = unit.getFactory();        
+        prototype = unit.getFactory();
     }
 
+    public MVELEvalExpression clone() {
+        MVELEvalExpression clone = new MVELEvalExpression( unit.clone(),
+                                                           id );
+        // expr should be stateless, so it should be fine to share the reference
+        clone.expr = expr;
+        clone.prototype = clone.unit.getFactory();
+        
+        return clone;
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java	2010-06-02 17:06:19 UTC (rev 33315)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java	2010-06-02 17:32:00 UTC (rev 33316)
@@ -125,7 +125,7 @@
     }
 
     public Object clone() {
-        final EvalCondition clone = new EvalCondition( this.expression,
+        final EvalCondition clone = new EvalCondition( this.expression.clone(),
                                                        (Declaration[]) this.requiredDeclarations.clone() );
 
         if ( this.cloned == Collections.EMPTY_LIST ) {

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	2010-06-02 17:06:19 UTC (rev 33315)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LogicTransformer.java	2010-06-02 17:32:00 UTC (rev 33316)
@@ -313,7 +313,7 @@
                 for ( int j = ors.length - 1; j >= 0; j-- ) {
                     // we must insert at the beginning to keep the order
                     and.getChildren().add( 0,
-                                           ors[j].getChildren().get( indexes[j] ) );
+                                           ((RuleConditionElement) ors[j].getChildren().get( indexes[j] )).clone() );
                     if ( (i % mod) == 0 ) {
                         indexes[j] = (indexes[j] + 1) % ors[j].getChildren().size();
                     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/EvalExpression.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/EvalExpression.java	2010-06-02 17:06:19 UTC (rev 33315)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/EvalExpression.java	2010-06-02 17:32:00 UTC (rev 33316)
@@ -21,7 +21,8 @@
 
 public interface EvalExpression
     extends
-    Invoker {
+    Invoker,
+    Cloneable {
     
     public Object createContext();
     
@@ -32,4 +33,6 @@
 
     public void replaceDeclaration(Declaration declaration,
                                    Declaration resolved);
+    
+    public EvalExpression clone();
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockEvalCondition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockEvalCondition.java	2010-06-02 17:06:19 UTC (rev 33315)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockEvalCondition.java	2010-06-02 17:32:00 UTC (rev 33316)
@@ -64,6 +64,9 @@
         public void replaceDeclaration(Declaration declaration,
                                        Declaration resolved) {
         }
+        public EvalExpression clone() {
+            return this;
+        }
                                                   };
 
     public MockEvalCondition(final boolean isAllowed) {

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/test/dsl/EvalNodeStep.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/test/dsl/EvalNodeStep.java	2010-06-02 17:06:19 UTC (rev 33315)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/test/dsl/EvalNodeStep.java	2010-06-02 17:32:00 UTC (rev 33316)
@@ -125,6 +125,10 @@
         public void replaceDeclaration(Declaration declaration,
                                        Declaration resolved) {
         }
+        
+        public EvalExpression clone() {
+            return this;
+        }
 
     }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/PackageCompilationDataTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/PackageCompilationDataTest.java	2010-06-02 17:06:19 UTC (rev 33315)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/PackageCompilationDataTest.java	2010-06-02 17:32:00 UTC (rev 33316)
@@ -35,6 +35,9 @@
         public void replaceDeclaration(Declaration declaration,
                                        Declaration resolved) {
         }
+        public EvalExpression clone() {
+            return this;
+        }
     }
 
     public void testCodeSourceUrl() throws Exception {



More information about the jboss-svn-commits mailing list