[jboss-svn-commits] JBL Code SVN: r30836 - in labs/jbossrules/trunk/drools-compiler/src: test/java/org/drools/integrationtests and 1 other directory.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sun Dec 27 22:03:38 EST 2009
Author: mark.proctor at jboss.com
Date: 2009-12-27 22:03:38 -0500 (Sun, 27 Dec 2009)
New Revision: 30836
Modified:
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialect.java
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
Log:
JBRULES-2392 MVEL should only resolve used declarations
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialect.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialect.java 2009-12-28 02:50:04 UTC (rev 30835)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialect.java 2009-12-28 03:03:38 UTC (rev 30836)
@@ -8,7 +8,9 @@
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -525,8 +527,8 @@
public MVELCompilationUnit getMVELCompilationUnit(final String expression,
final Dialect.AnalysisResult analysis,
- final Declaration[] previousDeclarations,
- final Declaration[] localDeclarations,
+ Declaration[] previousDeclarations,
+ Declaration[] localDeclarations,
final Map<String, Class<?>> otherInputVariables,
final PackageBuildContext context) {
String[] pkgImports = new String[this.packageImports.size()];
@@ -582,19 +584,31 @@
// }
// Set<String> usedIdentifiers = new HashSet<String>( list[0] );
+
+ HashSet set = new HashSet( list[0] );
+ List<Declaration> usedDeclrs = new ArrayList<Declaration>();
if ( previousDeclarations != null ) {
for ( Declaration declr : previousDeclarations ) {
- resolvedInputs.put( declr.getIdentifier(),
- declr.getExtractor().getExtractToClass() );
+ if ( set.contains( declr.getIdentifier() )) {
+ usedDeclrs.add( declr );
+ resolvedInputs.put( declr.getIdentifier(),
+ declr.getExtractor().getExtractToClass() );
+ }
}
+ previousDeclarations = usedDeclrs.toArray( new Declaration[usedDeclrs.size()]);
}
if ( localDeclarations != null ) {
+ usedDeclrs.clear();
for ( Declaration declr : localDeclarations ) {
- resolvedInputs.put( declr.getIdentifier(),
- declr.getExtractor().getExtractToClass() );
+ if ( set.contains( declr.getIdentifier() )) {
+ usedDeclrs.add( declr );
+ resolvedInputs.put( declr.getIdentifier(),
+ declr.getExtractor().getExtractToClass() );
+ }
}
+ localDeclarations = usedDeclrs.toArray( new Declaration[usedDeclrs.size()]);
}
// if ( outerDeclarations != null ) {
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java 2009-12-28 02:50:04 UTC (rev 30835)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java 2009-12-28 03:03:38 UTC (rev 30836)
@@ -114,7 +114,9 @@
import org.drools.compiler.ParserError;
import org.drools.compiler.PackageBuilder.PackageMergeException;
import org.drools.definition.KnowledgePackage;
+import org.drools.definition.rule.Rule;
import org.drools.definition.type.FactType;
+import org.drools.definitions.rule.impl.RuleImpl;
import org.drools.event.ActivationCancelledEvent;
import org.drools.event.ActivationCreatedEvent;
import org.drools.event.AfterActivationFiredEvent;
@@ -6430,6 +6432,88 @@
1,
list.size() );
}
+
+ public void testOrWithAndUsingNestedBindings() {
+ String str = "";
+ str += "package org.drools\n";
+ str += "import org.drools.Person\n";
+ str += "global java.util.List mlist\n";
+ str += "global java.util.List jlist\n";
+ str += "rule rule1 dialect \"mvel\" \n";
+ str += "when\n";
+ str += "$a : Person( name == \"a\" )\n";
+ str += " (or $b : Person( name == \"b1\" )\n";
+ str += " (and $p : Person( name == \"p2\" )\n";
+ str += " $b : Person( name == \"b2\" ) )\n";
+ str += " (and $p : Person( name == \"p3\" )\n";
+ str += " $b : Person( name == \"b3\" ) )\n";
+ str += " )\n ";
+ str += "then\n";
+ str += " mlist.add( $b );\n";
+ str += "end\n";
+ str += "rule rule2 dialect \"java\" \n";
+ str += "when\n";
+ str += "$a : Person( name == \"a\" )\n";
+ str += " (or $b : Person( name == \"b1\" )\n";
+ str += " (and $p : Person( name == \"p2\" )\n";
+ str += " $b : Person( name == \"b2\" ) )\n";
+ str += " (and $p : Person( name == \"p3\" )\n";
+ str += " $b : Person( name == \"b3\" ) )\n";
+ str += " )\n ";
+ str += "then\n";
+ str += " jlist.add( $b );\n";
+ str += "end\n";
+
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL );
+
+ if ( kbuilder.hasErrors() ) {
+ fail( kbuilder.getErrors().toString() );
+ }
+
+ Person a = new Person( "a" );
+ Person b1 = new Person( "b1" );
+ Person p2 = new Person( "p2" );
+ Person b2 = new Person( "b2" );
+ Person p3 = new Person( "p3" );
+ Person b3 = new Person( "b3" );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ List mlist = new ArrayList();
+ List jlist = new ArrayList();
+
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+ ksession.setGlobal( "mlist", mlist);
+ ksession.setGlobal( "jlist", jlist);
+ ksession.insert( a );
+ ksession.insert( b1 );
+ ksession.fireAllRules();
+ assertEquals( b1, mlist.get(0));
+ assertEquals( b1, jlist.get(0));
+
+ ksession = kbase.newStatefulKnowledgeSession();
+ ksession.setGlobal( "mlist", mlist);
+ ksession.setGlobal( "jlist", jlist);
+ ksession.insert( a );
+ ksession.insert( b2 );
+ ksession.insert( p2 );
+ ksession.fireAllRules();
+ assertEquals( b2, mlist.get(1));
+ assertEquals( b2, jlist.get(1));
+
+ ksession = kbase.newStatefulKnowledgeSession();
+ ksession.setGlobal( "mlist", mlist);
+ ksession.setGlobal( "jlist", jlist);
+ ksession.insert( a );
+ ksession.insert( b3 );
+ ksession.insert( p3 );
+ ksession.fireAllRules();
+ assertEquals( b3, mlist.get(2));
+ assertEquals( b3, jlist.get(2));
+
+ }
public void testDeepNestedConstraints() throws Exception {
final PackageBuilder builder = new PackageBuilder();
More information about the jboss-svn-commits
mailing list