[jboss-svn-commits] JBL Code SVN: r5919 - in labs/jbossrules/trunk/drools-compiler/src: main/java/org/drools/compiler main/java/org/drools/lang/descr main/java/org/drools/semantics/java main/resources/org/drools/semantics/java test/java/org/drools test/java/org/drools/compiler test/java/org/drools/integrationtests test/resources/org/drools/integrationtests
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Wed Aug 16 14:06:39 EDT 2006
Author: /services/svn/bin/commit-email.pl: `/opt/subversion/bin/svnlook info /services/jbf-svn/code -r 5919' failed with this output:
Date: svnlook: Inconsistent line ending style
New Revision: 5919
Added:
labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_From.drl
Modified:
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/FromDescr.java
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/FunctionFixer.java
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/RuleBuilder.java
labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/semantics/java/javaInvokers.stg
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Cheesery.java
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderTest.java
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java
Log:
2006-08-16 14:06:31 -0400 (Wed, 16 Aug 2006)
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-08-16 16:37:30 UTC (rev 5918)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java 2006-08-16 18:06:31 UTC (rev 5919)
@@ -371,19 +371,6 @@
}
/**
- * @deprecated Do not use for compiling rules. Do a whole package at a time.
- */
- public void compileRule(final RuleBuilder builder,
- final Rule rule,
- final RuleDescr ruleDescr) {
-
- addRuleSemantics( builder,
- rule,
- ruleDescr );
- this.compileAll();
- }
-
- /**
* This will setup the semantic components of the rule for compiling later on.
* It will not actually call the compiler
*/
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/FromDescr.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/FromDescr.java 2006-08-16 16:37:30 UTC (rev 5918)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/FromDescr.java 2006-08-16 18:06:31 UTC (rev 5919)
@@ -1,7 +1,10 @@
package org.drools.lang.descr;
-public class FromDescr extends PatternDescr {
+import java.util.List;
+public class FromDescr extends PatternDescr
+ implements
+ ConditionalElementDescr {
private ColumnDescr column;
private DeclarativeInvokerDescr dataSource;
@@ -25,5 +28,15 @@
public ColumnDescr getReturnedColumn() {
return column;
}
+
+ public void addDescr(PatternDescr patternDescr) {
+ //
+ }
+
+ public List getDescrs() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
}
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/FunctionFixer.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/FunctionFixer.java 2006-08-16 16:37:30 UTC (rev 5918)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/FunctionFixer.java 2006-08-16 18:06:31 UTC (rev 5919)
@@ -61,7 +61,7 @@
final int endIndex = findEndParenthesis( raw,
matcher );
if ( endIndex < 0 ) {
- // this means that the first '(' is inside quotes - jump it ant try again
+ // this means that the first '(' is inside quotes - jump it and try again
startIndex = matcher.start( 3 );
continue;
} else {
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-08-16 16:37:30 UTC (rev 5918)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/RuleBuilder.java 2006-08-16 18:06:31 UTC (rev 5919)
@@ -35,6 +35,7 @@
import org.drools.base.FieldFactory;
import org.drools.base.FieldImpl;
import org.drools.base.ValueType;
+import org.drools.base.dataproviders.MethodDataProvider;
import org.drools.base.evaluators.Operator;
import org.drools.compiler.RuleError;
import org.drools.facttemplates.FactTemplate;
@@ -44,11 +45,16 @@
import org.drools.lang.descr.AttributeDescr;
import org.drools.lang.descr.ColumnDescr;
import org.drools.lang.descr.ConditionalElementDescr;
+import org.drools.lang.descr.DeclarativeInvokerDescr;
import org.drools.lang.descr.EvalDescr;
import org.drools.lang.descr.ExistsDescr;
+import org.drools.lang.descr.FieldAccessDescr;
import org.drools.lang.descr.FieldBindingDescr;
import org.drools.lang.descr.FieldConstraintDescr;
+import org.drools.lang.descr.FromDescr;
+import org.drools.lang.descr.FunctionCallDescr;
import org.drools.lang.descr.LiteralRestrictionDescr;
+import org.drools.lang.descr.MethodAccessDescr;
import org.drools.lang.descr.NotDescr;
import org.drools.lang.descr.OrDescr;
import org.drools.lang.descr.PatternDescr;
@@ -65,6 +71,7 @@
import org.drools.rule.Declaration;
import org.drools.rule.EvalCondition;
import org.drools.rule.Exists;
+import org.drools.rule.From;
import org.drools.rule.GroupElement;
import org.drools.rule.LiteralConstraint;
import org.drools.rule.LiteralRestriction;
@@ -80,6 +87,7 @@
import org.drools.rule.Rule;
import org.drools.rule.VariableConstraint;
import org.drools.rule.VariableRestriction;
+import org.drools.spi.DataProvider;
import org.drools.spi.Evaluator;
import org.drools.spi.Extractor;
import org.drools.spi.FieldExtractor;
@@ -237,7 +245,7 @@
for ( final Iterator it = ruleDescr.getLhs().getDescrs().iterator(); it.hasNext(); ) {
final Object object = it.next();
if ( object instanceof ConditionalElementDescr ) {
- if ( object instanceof AndDescr ) {
+ if ( object.getClass() == AndDescr.class ) {
final And and = new And();
this.columnCounter.setParent( and );
build( this.rule,
@@ -246,7 +254,7 @@
false, // do not decrement offset
false ); // do not decrement first offset
this.rule.addPattern( and );
- } else if ( object instanceof OrDescr ) {
+ } else if ( object.getClass() == OrDescr.class ) {
final Or or = new Or();
this.columnCounter.setParent( or );
build( this.rule,
@@ -255,7 +263,7 @@
true, // when OR is used, offset MUST be decremented
false ); // do not decrement first offset
this.rule.addPattern( or );
- } else if ( object instanceof NotDescr ) {
+ } else if ( object.getClass() == NotDescr.class ) {
// We cannot have declarations created inside a not visible outside it, so track no declarations so they can be removed
this.notDeclarations = new HashMap();
final Not not = new Not();
@@ -273,7 +281,7 @@
}
this.notDeclarations = null;
- } else if ( object instanceof ExistsDescr ) {
+ } else if ( object.getClass() == ExistsDescr.class ) {
// We cannot have declarations created inside a not visible outside it, so track no declarations so they can be removed
this.notDeclarations = new HashMap();
final Exists exists = new Exists();
@@ -290,13 +298,16 @@
this.notDeclarations = null;
this.rule.addPattern( exists );
- } else if ( object instanceof EvalDescr ) {
+ } else if ( object.getClass() == EvalDescr.class ) {
final EvalCondition eval = build( (EvalDescr) object );
if ( eval != null ) {
this.rule.addPattern( eval );
}
- }
- } else if ( object instanceof ColumnDescr ) {
+ } else if ( object.getClass() == FromDescr.class ) {
+ final From from = build( (FromDescr) object);
+ this.rule.addPattern( from );
+ }
+ } else if ( object.getClass() == ColumnDescr.class ) {
final Column column = build( (ColumnDescr) object );
if ( column != null ) {
this.rule.addPattern( column );
@@ -321,7 +332,7 @@
for ( final Iterator it = descr.getDescrs().iterator(); it.hasNext(); ) {
final Object object = it.next();
if ( object instanceof ConditionalElementDescr ) {
- if ( object instanceof AndDescr ) {
+ if ( object.getClass() == AndDescr.class ) {
final And and = new And();
this.columnCounter.setParent( and );
build( rule,
@@ -330,7 +341,7 @@
false, // do not decrement offset
false ); // do not decrement first offset
ce.addChild( and );
- } else if ( object instanceof OrDescr ) {
+ } else if ( object.getClass() == OrDescr.class ) {
final Or or = new Or();
this.columnCounter.setParent( or );
build( rule,
@@ -339,7 +350,7 @@
true, // when OR is used, offset MUST be decremented
false ); // do not decrement first offset
ce.addChild( or );
- } else if ( object instanceof NotDescr ) {
+ } else if ( object.getClass() == NotDescr.class ) {
final Not not = new Not();
this.columnCounter.setParent( not );
build( rule,
@@ -348,7 +359,7 @@
true, // when NOT is used, offset MUST be decremented
true ); // when NOT is used, offset MUST be decremented for first column
ce.addChild( not );
- } else if ( object instanceof ExistsDescr ) {
+ } else if ( object.getClass() == ExistsDescr.class ) {
final Exists exists = new Exists();
this.columnCounter.setParent( exists );
build( rule,
@@ -357,13 +368,16 @@
true, // when EXIST is used, offset MUST be decremented
true ); // when EXIST is used, offset MUST be decremented for first column
ce.addChild( exists );
- } else if ( object instanceof EvalDescr ) {
+ } else if ( object.getClass() == EvalDescr.class ) {
final EvalCondition eval = build( (EvalDescr) object );
if ( eval != null ) {
ce.addChild( eval );
}
+ } else if ( object.getClass() == FromDescr.class ) {
+ final From from = build( (FromDescr) object);
+ this.rule.addPattern( from );
}
- } else if ( object instanceof ColumnDescr ) {
+ } else if ( object.getClass() == ColumnDescr.class ) {
if ( decrementOffset && decrementFirst ) {
this.columnOffset--;
} else {
@@ -387,15 +401,15 @@
}
ObjectType objectType = null;
-
- FactTemplate factTemplate = this.pkg.getFactTemplate( columnDescr.getObjectType() );
-
- if ( factTemplate != null ){
+
+ FactTemplate factTemplate = this.pkg.getFactTemplate( columnDescr.getObjectType() );
+
+ if ( factTemplate != null ) {
objectType = new FactTemplateObjectType( factTemplate );
- } else {
+ } else {
try {
//clazz = Class.forName( columnDescr.getObjectType() );
- objectType = new ClassObjectType( this.typeResolver.resolveType( columnDescr.getObjectType() )) ;
+ objectType = new ClassObjectType( this.typeResolver.resolveType( columnDescr.getObjectType() ) );
} catch ( final ClassNotFoundException e ) {
this.errors.add( new RuleError( this.rule,
columnDescr,
@@ -582,17 +596,17 @@
RestrictionDescr restrictionDescr) {
Restriction restriction = null;
if ( restrictionDescr instanceof LiteralRestrictionDescr ) {
- restriction = build( extractor,
- fieldConstraintDescr,
- (LiteralRestrictionDescr) restrictionDescr );
+ restriction = buildRestriction( extractor,
+ fieldConstraintDescr,
+ (LiteralRestrictionDescr) restrictionDescr );
} else if ( restrictionDescr instanceof VariableRestrictionDescr ) {
- restriction = build( extractor,
- fieldConstraintDescr,
- (VariableRestrictionDescr) restrictionDescr );
+ restriction = buildRestriction( extractor,
+ fieldConstraintDescr,
+ (VariableRestrictionDescr) restrictionDescr );
} else if ( restrictionDescr instanceof ReturnValueRestrictionDescr ) {
- restriction = build( extractor,
- fieldConstraintDescr,
- (ReturnValueRestrictionDescr) restrictionDescr );
+ restriction = buildRestriction( extractor,
+ fieldConstraintDescr,
+ (ReturnValueRestrictionDescr) restrictionDescr );
}
@@ -630,9 +644,9 @@
}
}
- private VariableRestriction build(final FieldExtractor extractor,
- final FieldConstraintDescr fieldConstraintDescr,
- final VariableRestrictionDescr variableRestrictionDescr) {
+ private VariableRestriction buildRestriction(final FieldExtractor extractor,
+ final FieldConstraintDescr fieldConstraintDescr,
+ final VariableRestrictionDescr variableRestrictionDescr) {
if ( variableRestrictionDescr.getIdentifier() == null || variableRestrictionDescr.getIdentifier().equals( "" ) ) {
this.errors.add( new RuleError( this.rule,
variableRestrictionDescr,
@@ -662,9 +676,9 @@
evaluator );
}
- private LiteralRestriction build(final FieldExtractor extractor,
- final FieldConstraintDescr fieldConstraintDescr,
- final LiteralRestrictionDescr literalRestrictionDescr) {
+ private LiteralRestriction buildRestriction(final FieldExtractor extractor,
+ final FieldConstraintDescr fieldConstraintDescr,
+ final LiteralRestrictionDescr literalRestrictionDescr) {
FieldValue field = null;
if ( literalRestrictionDescr.isStaticFieldValue() ) {
final int lastDot = literalRestrictionDescr.getText().lastIndexOf( '.' );
@@ -709,9 +723,9 @@
evaluator );
}
- private ReturnValueRestriction build(final FieldExtractor extractor,
- final FieldConstraintDescr fieldConstraintDescr,
- final ReturnValueRestrictionDescr returnValueRestrictionDescr) {
+ private ReturnValueRestriction buildRestriction(final FieldExtractor extractor,
+ final FieldConstraintDescr fieldConstraintDescr,
+ final ReturnValueRestrictionDescr returnValueRestrictionDescr) {
final String classMethodName = "returnValue" + this.counter++;
returnValueRestrictionDescr.setClassMethodName( classMethodName );
@@ -875,6 +889,29 @@
predicateDescr );
}
+ private From build(FromDescr fromDescr) {
+ Column column = build( fromDescr.getReturnedColumn() );
+
+ DeclarativeInvokerDescr invokerDescr = fromDescr.getDataSource();
+
+ DataProvider dataProvider = null;
+ if ( invokerDescr.getClass() == FieldAccessDescr.class ) {
+ //FieldAccessDescr fieldAccessDescr = ( FieldAccessDescr ) invokerDescr;
+ } else if ( invokerDescr.getClass() == FunctionCallDescr.class ) {
+ //FunctionCallDescr functionCallDescr = ( FunctionCallDescr) invokerDescr;
+ } else if ( invokerDescr.getClass() == MethodAccessDescr.class ) {
+ MethodAccessDescr methodAccessDescr = (MethodAccessDescr) invokerDescr;
+ dataProvider = new MethodDataProvider( methodAccessDescr.getVariableName(),
+ methodAccessDescr.getMethodName(),
+ methodAccessDescr.getArguments(),
+ this.declarations,
+ this.pkg.getGlobals() );
+ }
+
+ return new From( column,
+ dataProvider );
+ }
+
private EvalCondition build(final EvalDescr evalDescr) {
final String classMethodName = "eval" + this.counter++;
@@ -978,11 +1015,16 @@
(String[]) usedIdentifiers[1].toArray( new String[usedIdentifiers[1].size()] ),
ruleDescr.getConsequence() );
+ // Must use the rule declarations, so we use the same order as used in the generated invoker
final List list = Arrays.asList( this.rule.getDeclarations() );
final int[] indexes = new int[declarations.length];
for ( int i = 0, length = declarations.length; i < length; i++ ) {
indexes[i] = list.indexOf( declarations[i] );
+ 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" );
+ }
}
st.setAttribute( "indexes",
@@ -1069,14 +1111,15 @@
final ObjectType objectType,
final String fieldName) {
FieldExtractor extractor = null;
-
+
if ( objectType.getValueType() == ValueType.FACTTEMPLATE_TYPE ) {
//@todo use extractor cache
- FactTemplate factTemplate = ( ( FactTemplateObjectType ) objectType ).getFactTemplate();
- extractor = new FactTemplateFieldExtractor( factTemplate, factTemplate.getFieldTemplateIndex( fieldName ));
- } else {
+ FactTemplate factTemplate = ((FactTemplateObjectType) objectType).getFactTemplate();
+ extractor = new FactTemplateFieldExtractor( factTemplate,
+ factTemplate.getFieldTemplateIndex( fieldName ) );
+ } else {
try {
- extractor = classFieldExtractorCache.getExtractor( ( ( ClassObjectType ) objectType ).getClassType(),
+ extractor = classFieldExtractorCache.getExtractor( ((ClassObjectType) objectType).getClassType(),
fieldName );
} catch ( final RuntimeDroolsException e ) {
this.errors.add( new RuleError( this.rule,
Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/semantics/java/javaInvokers.stg
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/semantics/java/javaInvokers.stg 2006-08-16 16:37:30 UTC (rev 5918)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/semantics/java/javaInvokers.stg 2006-08-16 18:06:31 UTC (rev 5919)
@@ -58,7 +58,7 @@
public class <invokerClassName> implements org.drools.spi.ReturnValueExpression, org.drools.spi.CompiledInvoker
{
- private static final long serialVersionUID = 7952983928232702826L;
+ private static final long serialVersionUID = 320;
public Object evaluate(org.drools.spi.Tuple tuple,
org.drools.rule.Declaration[] declarations,
@@ -86,7 +86,7 @@
public class <invokerClassName> implements org.drools.spi.PredicateExpression, org.drools.spi.CompiledInvoker
{
- private static final long serialVersionUID = 7952983928232702826L;
+ private static final long serialVersionUID = 320;
public boolean evaluate(Object object,
org.drools.spi.Tuple tuple,
@@ -121,7 +121,7 @@
public class <invokerClassName> implements org.drools.spi.EvalExpression, org.drools.spi.CompiledInvoker
{
- private static final long serialVersionUID = 7952983928232702826L;
+ private static final long serialVersionUID = 320;
public boolean evaluate(org.drools.spi.Tuple tuple,
org.drools.rule.Declaration[] declarations,
@@ -148,7 +148,7 @@
public class <invokerClassName> implements org.drools.spi.Consequence
{
- private static final long serialVersionUID = 7952983928232702826L;
+ private static final long serialVersionUID = 320;
public void evaluate(org.drools.spi.KnowledgeHelper knowledgeHelper,
org.drools.WorkingMemory workingMemory) throws Exception {
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Cheesery.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Cheesery.java 2006-08-16 16:37:30 UTC (rev 5918)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Cheesery.java 2006-08-16 18:06:31 UTC (rev 5919)
@@ -27,17 +27,21 @@
*
*/
private static final long serialVersionUID = 4654655548777389065L;
- public final static int MAKING_CHEESE = 0;
- public final static int SELLING_CHEESE = 1;
+ public final static int MAKING_CHEESE = 0;
+ public final static int SELLING_CHEESE = 1;
- private final List cheeses = new ArrayList();
+ private final List cheeses = new ArrayList();
- private int status;
+ private int status;
public List getCheeses() {
return this.cheeses;
}
+ public void addCheese(Cheese cheese) {
+ this.cheeses.add( cheese );
+ }
+
public void setStatus(final int status) {
this.status = status;
}
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderTest.java 2006-08-16 16:37:30 UTC (rev 5918)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderTest.java 2006-08-16 18:06:31 UTC (rev 5919)
@@ -599,7 +599,7 @@
and.getChildren() );
final Column column = (Column) and.getChildren().get( 0 );
- final LiteralConstraint literalConstarint = (LiteralConstraint) column.getConstraints().get( 0 );
+ final LiteralConstraint literalConstraint = (LiteralConstraint) column.getConstraints().get( 0 );
}
public void testNot() throws Exception {
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-08-16 16:37:30 UTC (rev 5918)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java 2006-08-16 18:06:31 UTC (rev 5919)
@@ -790,6 +790,29 @@
list.size() );
}
+
+ public void testBasicFrom() throws Exception {
+ 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 list = new ArrayList();
+ workingMemory.setGlobal( "list", list );
+
+ Cheesery cheesery = new Cheesery();
+ Cheese stilton = new Cheese( "stilton", 12);
+ cheesery.addCheese( stilton );
+ workingMemory.setGlobal( "cheesery", cheesery );
+
+ workingMemory.fireAllRules();
+
+ assertEquals( 1, list.size() );
+ }
+
public void testWithInvalidRule() throws Exception {
final PackageBuilder builder = new PackageBuilder();
builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "invalid_rule.drl" ) ) );
Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_From.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_From.drl 2006-08-16 16:37:30 UTC (rev 5918)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_From.drl 2006-08-16 18:06:31 UTC (rev 5919)
@@ -0,0 +1,18 @@
+package org.drools.test;
+
+#we don't use the import, as class is fully qualified below
+#import org.drools.integrationtests.helloworld.Message
+import org.drools.Cheese;
+import org.drools.Cheesery;
+import java.util.List;
+
+global List list;
+global Cheesery cheesery;
+
+rule "test from"
+ when
+ $cheese : Cheese() from cheesery.getCheeses()
+ then
+ System.out.println( list );
+ list.add( $cheese );
+end
More information about the jboss-svn-commits
mailing list