[jboss-svn-commits] JBL Code SVN: r8184 - in labs/jbossrules/trunk/drools-compiler/src: main/java/org/drools/compiler main/java/org/drools/semantics/java test/java/org/drools/integrationtests test/java/org/drools/lang test/java/org/drools/semantics/java

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Dec 10 14:57:26 EST 2006


Author: mark.proctor at jboss.com
Date: 2006-12-10 14:57:12 -0500 (Sun, 10 Dec 2006)
New Revision: 8184

Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/FunctionBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/RuleBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/StaticMethodFunctionResolver.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/FunctionFixerTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/StaticMethodFunctionResolverTest.java
Log:
JBRULES-339  'from' support for reasoning over facts not in the working memory
-inlined JFDI
-integrated JFDI

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java	2006-12-10 19:56:41 UTC (rev 8183)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java	2006-12-10 19:57:12 UTC (rev 8184)
@@ -35,6 +35,8 @@
 import org.apache.commons.jci.problems.CompilationProblem;
 import org.apache.commons.jci.readers.MemoryResourceReader;
 import org.apache.commons.jci.readers.ResourceReader;
+import org.codehaus.jfdi.interpreter.ClassTypeResolver;
+import org.codehaus.jfdi.interpreter.TypeResolver;
 import org.drools.RuntimeDroolsException;
 import org.drools.base.ClassFieldExtractorCache;
 import org.drools.facttemplates.FactTemplate;
@@ -50,14 +52,12 @@
 import org.drools.rule.LineMappings;
 import org.drools.rule.Package;
 import org.drools.rule.Rule;
-import org.drools.semantics.java.ClassTypeResolver;
 import org.drools.semantics.java.FunctionBuilder;
 import org.drools.semantics.java.FunctionFixer;
 import org.drools.semantics.java.PackageStore;
 import org.drools.semantics.java.RuleBuilder;
 import org.drools.semantics.java.StaticMethodFunctionResolver;
 import org.drools.spi.FunctionResolver;
-import org.drools.spi.TypeResolver;
 import org.drools.xml.XmlPackageReader;
 import org.xml.sax.SAXException;
 

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/FunctionBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/FunctionBuilder.java	2006-12-10 19:56:41 UTC (rev 8183)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/FunctionBuilder.java	2006-12-10 19:57:12 UTC (rev 8184)
@@ -27,12 +27,12 @@
 import org.antlr.stringtemplate.StringTemplate;
 import org.antlr.stringtemplate.StringTemplateGroup;
 import org.antlr.stringtemplate.language.AngleBracketTemplateLexer;
+import org.codehaus.jfdi.interpreter.TypeResolver;
 import org.drools.RuntimeDroolsException;
 import org.drools.lang.descr.FunctionDescr;
 import org.drools.rule.LineMappings;
 import org.drools.rule.Package;
 import org.drools.spi.AvailableVariables;
-import org.drools.spi.TypeResolver;
 
 public class FunctionBuilder {
     private static final StringTemplateGroup functionGroup = new StringTemplateGroup( new InputStreamReader( FunctionBuilder.class.getResourceAsStream( "javaFunction.stg" ) ),

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/RuleBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/RuleBuilder.java	2006-12-10 19:56:41 UTC (rev 8183)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/RuleBuilder.java	2006-12-10 19:57:12 UTC (rev 8184)
@@ -16,7 +16,10 @@
  * limitations under the License.
  */
 
+import java.io.IOException;
+import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.io.Reader;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -25,15 +28,26 @@
 import java.util.Map;
 import java.util.Set;
 
+import org.antlr.runtime.ANTLRReaderStream;
+import org.antlr.runtime.ANTLRStringStream;
+import org.antlr.runtime.CharStream;
+import org.antlr.runtime.CommonTokenStream;
+import org.antlr.runtime.TokenStream;
 import org.antlr.stringtemplate.StringTemplate;
 import org.antlr.stringtemplate.StringTemplateGroup;
 import org.antlr.stringtemplate.language.AngleBracketTemplateLexer;
+import org.codehaus.jfdi.interpreter.TypeResolver;
+import org.codehaus.jfdi.interpreter.operations.Expr;
+import org.codehaus.jfdi.parser.JFDILexer;
+import org.codehaus.jfdi.parser.JFDIParser;
 import org.drools.RuntimeDroolsException;
 import org.drools.base.ClassFieldExtractorCache;
 import org.drools.base.ClassObjectType;
+import org.drools.base.DroolsJFDIFactory;
 import org.drools.base.FieldFactory;
 import org.drools.base.ShadowProxyFactory;
 import org.drools.base.ValueType;
+import org.drools.base.dataproviders.JFDIDataProvider;
 import org.drools.base.evaluators.Operator;
 import org.drools.base.resolvers.DeclarationVariable;
 import org.drools.base.resolvers.GlobalVariable;
@@ -45,6 +59,7 @@
 import org.drools.facttemplates.FactTemplate;
 import org.drools.facttemplates.FactTemplateFieldExtractor;
 import org.drools.facttemplates.FactTemplateObjectType;
+import org.drools.lang.descr.AccessorDescr;
 import org.drools.lang.descr.AccumulateDescr;
 import org.drools.lang.descr.AndDescr;
 import org.drools.lang.descr.AttributeDescr;
@@ -92,12 +107,12 @@
 import org.drools.rule.VariableConstraint;
 import org.drools.rule.VariableRestriction;
 import org.drools.spi.AvailableVariables;
+import org.drools.spi.DataProvider;
 import org.drools.spi.Evaluator;
 import org.drools.spi.FieldExtractor;
 import org.drools.spi.FieldValue;
 import org.drools.spi.ObjectType;
 import org.drools.spi.Restriction;
-import org.drools.spi.TypeResolver;
 
 /**
  * This builds the rule structure from an AST.
@@ -980,8 +995,29 @@
 
     private From build(final FromDescr fromDescr) {
       final Column column = build( fromDescr.getReturnedColumn() );
-    	return null;    
+      AccessorDescr accessor = (AccessorDescr) fromDescr.getDataSource();      
+      DataProvider dataProvider = null;      
+      try {                    
+          JFDIParser parser = createParser(  accessor.toString() );
+          DroolsJFDIFactory factory = new DroolsJFDIFactory( this.typeResolver );
+          factory.setDeclarationMap( this.declarations );
+          factory.setGlobalsMap( this.pkg.getGlobals() );          
+          parser.setValueHandlerFactory( factory );
+          
+          dataProvider = new JFDIDataProvider(parser.expr(), factory);
+      } catch ( final Exception e ) {
+          this.errors.add( new RuleError( this.rule,
+                                          fromDescr,
+                                          null,
+                                          "Unable to build expression for 'from' node '" + accessor.toString() + "'" ) );
+          return null;
+      }
+      
+      
+      return new From( column,
+                       dataProvider );		        
     }
+    
 //    private From build(final FromDescr fromDescr) {
 //    	return null;
     	// @todo: waiting for JFDI so we can impl this properly
@@ -1133,6 +1169,27 @@
 //        return valueHandler;
 //    }
 
+	protected JFDIParser createParser(String text) throws IOException {
+		JFDIParser parser = new JFDIParser( createTokenStream( text ) );
+        DroolsJFDIFactory factory = new DroolsJFDIFactory( this.typeResolver );
+        parser.setValueHandlerFactory( factory );
+		return parser;
+	}
+	
+	private TokenStream createTokenStream(String text) throws IOException {
+		return new CommonTokenStream( createLexer( text ) );
+	}
+	
+	private JFDILexer createLexer(String text) throws IOException {
+		JFDILexer lexer = new JFDILexer(  new ANTLRStringStream( text ) );
+		return lexer;
+	}
+	
+	private Reader createReader(String text) {
+		InputStream in = getClass().getResourceAsStream( text );
+		return new InputStreamReader( in );
+	}    
+    
     private EvalCondition build(final EvalDescr evalDescr) {
 
         final String className = "eval" + this.counter++;

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/StaticMethodFunctionResolver.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/StaticMethodFunctionResolver.java	2006-12-10 19:56:41 UTC (rev 8183)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/StaticMethodFunctionResolver.java	2006-12-10 19:57:12 UTC (rev 8184)
@@ -4,10 +4,10 @@
 import java.util.Iterator;
 import java.util.List;
 
+import org.codehaus.jfdi.interpreter.TypeResolver;
 import org.drools.RuntimeDroolsException;
 import org.drools.spi.AvailableVariables;
 import org.drools.spi.FunctionResolver;
-import org.drools.spi.TypeResolver;
 
 public class StaticMethodFunctionResolver
     implements

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java	2006-12-10 19:56:41 UTC (rev 8183)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java	2006-12-10 19:57:12 UTC (rev 8184)
@@ -31,6 +31,7 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
 import junit.framework.Assert;
 import junit.framework.TestCase;
@@ -41,6 +42,7 @@
 import org.drools.CheeseEqual;
 import org.drools.Cheesery;
 import org.drools.FactHandle;
+import org.drools.FromTestClass;
 import org.drools.IndexedNumber;
 import org.drools.Person;
 import org.drools.PersonInterface;
@@ -845,98 +847,127 @@
 
     public void testBasicFrom() throws Exception {
         // FIXME
-        // final PackageBuilder builder = new PackageBuilder();
-        // builder.addPackageFromDrl( new InputStreamReader(
-        // getClass().getResourceAsStream( "test_From.drl" ) ) );
-        // final Package pkg = builder.getPackage();
-        //
-        // final RuleBase ruleBase = getRuleBase();
-        // ruleBase.addPackage( pkg );
-        //        
-        // WorkingMemory workingMemory = ruleBase.newWorkingMemory();
-        // List list1 = new ArrayList();
-        // workingMemory.setGlobal( "list1", list1 );
-        // List list2 = new ArrayList();
-        // workingMemory.setGlobal( "list2", list2 );
-        // List list3 = new ArrayList();
-        // workingMemory.setGlobal( "list3", list3 );
-        //        
-        // Cheesery cheesery = new Cheesery();
-        // Cheese stilton = new Cheese( "stilton", 12);
-        // Cheese cheddar = new Cheese( "cheddar", 15);
-        // cheesery.addCheese( stilton );
-        // cheesery.addCheese( cheddar );
-        // workingMemory.setGlobal( "cheesery", cheesery );
-        // workingMemory.assertObject( cheesery );
-        //        
-        // workingMemory.fireAllRules();
-        //        
-        // // from using a global
-        // assertEquals( 2, list1.size() );
-        // assertEquals( cheddar, list1.get( 0 ) );
-        // assertEquals( stilton, list1.get( 1 ) );
-        //        
-        // // from using a declaration
-        // assertEquals( 2, list2.size() );
-        // assertEquals( cheddar, list2.get( 0 ) );
-        // assertEquals( stilton, list2.get( 1 ) );
-        //        
-        // // from using a declaration
-        // assertEquals( 1, list3.size() );
-        // assertEquals( stilton, list3.get( 0 ) );
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_From.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+
+        WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+        List list1 = new ArrayList();
+        workingMemory.setGlobal( "list1",
+                                 list1 );
+        List list2 = new ArrayList();
+        workingMemory.setGlobal( "list2",
+                                 list2 );
+        List list3 = new ArrayList();
+        workingMemory.setGlobal( "list3",
+                                 list3 );
+
+        Cheesery cheesery = new Cheesery();
+        Cheese stilton = new Cheese( "stilton",
+                                     12 );
+        Cheese cheddar = new Cheese( "cheddar",
+                                     15 );
+        cheesery.addCheese( stilton );
+        cheesery.addCheese( cheddar );
+        workingMemory.setGlobal( "cheesery",
+                                 cheesery );
+        workingMemory.assertObject( cheesery );
+
+        workingMemory.fireAllRules();
+
+        // from using a global
+        assertEquals( 2,
+                      list1.size() );
+        assertEquals( cheddar,
+                      list1.get( 0 ) );
+        assertEquals( stilton,
+                      list1.get( 1 ) );
+
+        // from using a declaration
+        assertEquals( 2,
+                      list2.size() );
+        assertEquals( cheddar,
+                      list2.get( 0 ) );
+        assertEquals( stilton,
+                      list2.get( 1 ) );
+
+        // from using a declaration
+        assertEquals( 1,
+                      list3.size() );
+        assertEquals( stilton,
+                      list3.get( 0 ) );
     }
 
     public void testFromWithParams() throws Exception {
         // FIXME
-        // final PackageBuilder builder = new PackageBuilder();
-        // builder.addPackageFromDrl( new InputStreamReader(
-        // getClass().getResourceAsStream( "test_FromWithParams.drl" ) ) );
-        // final Package pkg = builder.getPackage();
-        //
-        // final RuleBase ruleBase = getRuleBase();
-        // ruleBase.addPackage( pkg );
-        //        
-        // WorkingMemory workingMemory = ruleBase.newWorkingMemory();
-        // List list = new ArrayList();
-        // Object globalObject = new Object();
-        // workingMemory.setGlobal( "list", list );
-        // workingMemory.setGlobal( "testObject", new FromTestClass() );
-        // workingMemory.setGlobal( "globalObject", globalObject );
-        //        
-        // Person bob = new Person( "bob" );
-        // workingMemory.assertObject( bob );
-        //        
-        // workingMemory.fireAllRules();
-        //        
-        // assertEquals( 6, list.size() );
-        //
-        // List array = (List) list.get( 0 );
-        // assertEquals(3, array.size());
-        // Person p = (Person) array.get( 0 );
-        // assertSame(p, bob);
-        //        
-        // assertEquals("42", array.get( 1 ));
-        //        
-        // List nested = (List) array.get( 2 );
-        // assertEquals("x", nested.get( 0 ));
-        // assertEquals("y", nested.get( 1 ));
-        //        
-        // Map map = ( Map ) list.get( 1 );
-        // assertEquals( 2, map.keySet().size() );
-        //        
-        // assertTrue( map.keySet().contains( bob ) );
-        // assertSame( globalObject, map.get( bob ) );
-        //        
-        // assertTrue( map.keySet().contains( "key1" ) );
-        // Map nestedMap = ( Map ) map.get( "key1" );
-        // assertEquals( 1, nestedMap.keySet().size() );
-        // assertTrue( nestedMap.keySet().contains( "key2" ) );
-        // assertEquals( "value2", nestedMap.get( "key2" ) );
-        //                
-        // assertEquals( new Integer( 42 ), list.get( 2 ) );
-        // assertEquals( "literal", list.get( 3 ) );
-        // assertSame( bob, list.get( 4 ) );
-        // assertSame( globalObject, list.get( 5 ) );
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_FromWithParams.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+
+        WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+        List list = new ArrayList();
+        Object globalObject = new Object();
+        workingMemory.setGlobal( "list",
+                                 list );
+        workingMemory.setGlobal( "testObject",
+                                 new FromTestClass() );
+        workingMemory.setGlobal( "globalObject",
+                                 globalObject );
+
+        Person bob = new Person( "bob" );
+        workingMemory.assertObject( bob );
+
+        workingMemory.fireAllRules();
+
+        assertEquals( 6,
+                      list.size() );
+
+        List array = (List) list.get( 0 );
+        assertEquals( 3,
+                      array.size() );
+        Person p = (Person) array.get( 0 );
+        assertSame( p,
+                    bob );
+
+        assertEquals( new Integer( 42 ),
+                      array.get( 1 ) );
+
+        List nested = (List) array.get( 2 );
+        assertEquals( "x",
+                      nested.get( 0 ) );
+        assertEquals( "y",
+                      nested.get( 1 ) );
+
+        Map map = (Map) list.get( 1 );
+        assertEquals( 2,
+                      map.keySet().size() );
+
+        assertTrue( map.keySet().contains( bob ) );
+        assertSame( globalObject,
+                    map.get( bob ) );
+
+        assertTrue( map.keySet().contains( "key1" ) );
+        Map nestedMap = (Map) map.get( "key1" );
+        assertEquals( 1,
+                      nestedMap.keySet().size() );
+        assertTrue( nestedMap.keySet().contains( "key2" ) );
+        assertEquals( "value2",
+                      nestedMap.get( "key2" ) );
+
+        assertEquals( new Integer( 42 ),
+                      list.get( 2 ) );
+        assertEquals( "literal",
+                      list.get( 3 ) );
+        assertSame( bob,
+                    list.get( 4 ) );
+        assertSame( globalObject,
+                    list.get( 5 ) );
     }
 
     public void testWithInvalidRule() throws Exception {
@@ -3545,12 +3576,12 @@
     public void testDeclaringAndUsingBindsInSamePattern() throws Exception {
         final RuleBaseConfiguration config = new RuleBaseConfiguration();
         config.setRemoveIdentities( true );
-        
+
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DeclaringAndUsingBindsInSamePattern.drl" ) ) );
         final Package pkg = builder.getPackage();
 
-        final RuleBase ruleBase = getRuleBase(config);
+        final RuleBase ruleBase = getRuleBase( config );
         ruleBase.addPackage( pkg );
         final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
 

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java	2006-12-10 19:56:41 UTC (rev 8183)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java	2006-12-10 19:57:12 UTC (rev 8184)
@@ -517,7 +517,7 @@
         assertNull( ((FieldAccessDescr) accessor.getInvokers().get( 0 )).getArgument() );
         
         assertEquals( "something.doIt", accessor.toString() );
-    }      
+    }          
     
     public void testSimpleAccessorAndArgWithFrom() throws Exception {
         

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/FunctionFixerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/FunctionFixerTest.java	2006-12-10 19:56:41 UTC (rev 8183)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/FunctionFixerTest.java	2006-12-10 19:57:12 UTC (rev 8184)
@@ -21,8 +21,9 @@
 import java.util.List;
 import java.util.Map;
 
+import org.codehaus.jfdi.interpreter.TypeResolver;
+import org.codehaus.jfdi.interpreter.ClassTypeResolver;
 import org.drools.spi.AvailableVariables;
-import org.drools.spi.TypeResolver;
 import org.drools.rule.Package;
 
 import junit.framework.TestCase;

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/StaticMethodFunctionResolverTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/StaticMethodFunctionResolverTest.java	2006-12-10 19:56:41 UTC (rev 8183)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/StaticMethodFunctionResolverTest.java	2006-12-10 19:57:12 UTC (rev 8184)
@@ -7,9 +7,10 @@
 
 import junit.framework.TestCase;
 
+import org.codehaus.jfdi.interpreter.TypeResolver;
+import org.codehaus.jfdi.interpreter.ClassTypeResolver;
 import org.drools.spi.AvailableVariables;
 import org.drools.spi.FunctionResolver;
-import org.drools.spi.TypeResolver;
 
 public class StaticMethodFunctionResolverTest extends TestCase {
     public void test1() throws Exception {




More information about the jboss-svn-commits mailing list