[jboss-svn-commits] JBL Code SVN: r10812 - in labs/jbossrules/trunk/drools-compiler/src: main/resources/org/drools/rule/builder/dialect/java and 3 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sat Apr 7 17:03:01 EDT 2007


Author: mark.proctor at jboss.com
Date: 2007-04-07 17:03:01 -0400 (Sat, 07 Apr 2007)
New Revision: 10812

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_FactBindings.drl
Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaConsequenceBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.stg
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Person.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java
Log:
JBRULES-778 column fact handle used in consequences even for field bindings
-handle is reset to null if its a bound field, knowledgehelper attempts to lookup 
 the handle from the working memory if its null.

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaConsequenceBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaConsequenceBuilder.java	2007-04-07 21:02:52 UTC (rev 10811)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaConsequenceBuilder.java	2007-04-07 21:03:01 UTC (rev 10812)
@@ -25,6 +25,7 @@
 import org.drools.rule.Declaration;
 import org.drools.rule.builder.BuildContext;
 import org.drools.rule.builder.ConsequenceBuilder;
+import org.drools.spi.ColumnExtractor;
 
 /**
  * @author etirelli
@@ -58,6 +59,7 @@
                                                                   (String) ruleDescr.getConsequence() );
 
         final Declaration[] declarations = new Declaration[usedIdentifiers[0].size()];
+
         for ( int i = 0, size = usedIdentifiers[0].size(); i < size; i++ ) {
             declarations[i] = (Declaration) context.getDeclarationResolver().getDeclaration( (String) usedIdentifiers[0].get( i ) );
         }
@@ -90,9 +92,13 @@
         // Must use the rule declarations, so we use the same order as used in the generated invoker
         final List list = Arrays.asList( context.getRule().getDeclarations() );
 
-        final int[] indexes = new int[declarations.length];
+        final int[] indexes = new int[declarations.length];       
+        
+        // have to user a String[] as boolean[] is broken in stringtemplate
+        final String[] notColumns = new String[declarations.length];
         for ( int i = 0, length = declarations.length; i < length; i++ ) {
             indexes[i] = list.indexOf( declarations[i] );
+            notColumns[i] = (declarations[i].getExtractor() instanceof ColumnExtractor) ? null : "true";
             if ( indexes[i] == -1 ) {
                 // some defensive code, this should never happen
                 throw new RuntimeDroolsException( "Unable to find declaration in list while generating the consequence invoker" );
@@ -101,6 +107,8 @@
 
         st.setAttribute( "indexes",
                          indexes );
+        
+        st.setAttribute( "notColumns", notColumns);
 
         st.setAttribute( "text",
                          ruleDescr.getConsequence() );

Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.stg
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.stg	2007-04-07 21:02:52 UTC (rev 10811)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.stg	2007-04-07 21:03:01 UTC (rev 10812)
@@ -182,7 +182,7 @@
 }     
 >>
 
-consequenceInvoker(package, invokerClassName, ruleClassName, methodName, declarations, declarationTypes, indexes, globals, globalTypes, text) ::= <<
+consequenceInvoker(package, invokerClassName, ruleClassName, methodName, declarations, declarationTypes, indexes, notColumns, globals, globalTypes, text) ::= <<
 package <package>;
 
 public class <invokerClassName> implements org.drools.spi.Consequence
@@ -196,9 +196,11 @@
         org.drools.rule.Rule rule = knowledgeHelper.getRule();
         org.drools.rule.Declaration[] declarations = rule.getDeclarations();                                                  
 
-        <declarations, indexes:{ declr, index| org.drools.common.InternalFactHandle <declr.identifier>__Handle__ = ( org.drools.common.InternalFactHandle ) tuple.get( knowledgeHelper.getDeclaration( declarations[<index>].getIdentifier() ) );<\n>}>
-
-        <declarationTypes, declarations, indexes :{ type, declr, index| <type> <declr.identifier> = ( <type> )  declarations[<index>].<declr.extractor.nativeReadMethod.name>( <declr.identifier>__Handle__.getObject() );<\n>}>
+        <declarationTypes, declarations, indexes, notColumns :{ type, declr, index, notColumn | 
+          org.drools.common.InternalFactHandle <declr.identifier>__Handle__ = ( org.drools.common.InternalFactHandle ) tuple.get( knowledgeHelper.getDeclaration( declarations[<index>].getIdentifier() ) );        
+          <type> <declr.identifier> = ( <type> )  declarations[<index>].<declr.extractor.nativeReadMethod.name>( <declr.identifier>__Handle__.getObject() );
+          <if(notColumn)><declr.identifier>__Handle__ = null;<endif>
+        }>
         
         <globalTypes, globals:{ type, identifier | <type> <identifier> = ( <type> ) workingMemory.getGlobal( "<identifier>" );<\n>}>    
         

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Person.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Person.java	2007-04-07 21:02:52 UTC (rev 10811)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Person.java	2007-04-07 21:03:01 UTC (rev 10812)
@@ -24,6 +24,8 @@
     private boolean           alive;
 
     private String            status;
+    
+    private Cheese			  cheese;
 
     public Person() {
     	
@@ -210,4 +212,14 @@
     public void setLikes(String likes) {
         this.likes = likes;
     }
+
+	public Cheese getCheese() {
+		return cheese;
+	}
+
+	public void setCheese(Cheese cheese) {
+		this.cheese = cheese;
+	}
+    
+    
 }
\ No newline at end of file

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	2007-04-07 21:02:52 UTC (rev 10811)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java	2007-04-07 21:03:01 UTC (rev 10812)
@@ -174,7 +174,49 @@
         assertEquals( 1,
                       list.size() );
     }
+    
+    public void testFactBindings() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_FactBindings.drl" ) ) );
+        final Package pkg = builder.getPackage();
 
+        // add the package to a rulebase
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+
+        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+        
+        final List events = new ArrayList();
+        WorkingMemoryEventListener listener = new DefaultWorkingMemoryEventListener() {
+        	public void objectModified(ObjectModifiedEvent event) {
+        		events.add( event );
+        	}
+        };
+        
+        workingMemory.addEventListener( listener );
+
+//        final List list = new ArrayList();
+//        workingMemory.setGlobal( "list",
+//                                 list );  
+        Person bigCheese = new Person("big cheese");
+        Cheese cheddar = new Cheese( "cheddar", 15 );
+        bigCheese.setCheese( cheddar );
+        
+        FactHandle bigCheeseHandle = workingMemory.assertObject( bigCheese );
+        FactHandle cheddarHandle = workingMemory.assertObject( cheddar );
+        workingMemory.fireAllRules();
+        
+        ObjectModifiedEvent event = ( ObjectModifiedEvent ) events.get( 0 );
+        assertSame( cheddarHandle, event.getFactHandle() );
+        assertSame( cheddar, event.getOldObject() );
+        assertSame( cheddar, event.getObject() );
+        
+        event = ( ObjectModifiedEvent ) events.get( 1 );
+        assertSame( bigCheeseHandle, event.getFactHandle() );
+        assertSame( bigCheese, event.getOldObject() );
+        assertSame( bigCheese, event.getObject() );        
+    }
+
     public void testNullHandling() throws Exception {
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_NullHandling.drl" ) ) );

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_FactBindings.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_FactBindings.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_FactBindings.drl	2007-04-07 21:03:01 UTC (rev 10812)
@@ -0,0 +1,13 @@
+package org.drools.test;
+ 
+import org.drools.Cheese;
+import org.drools.Person;
+ 
+rule "simple rule"
+	no-loop true
+    when
+        $person : Person( name == "big cheese", $cheese : cheese )
+    then
+       	modify( $cheese );
+    	modify( $person );
+end 
\ No newline at end of file




More information about the jboss-svn-commits mailing list