[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