[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