[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