[jboss-svn-commits] JBL Code SVN: r15345 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/common and 3 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Sep 24 14:50:09 EDT 2007
Author: tirelli
Date: 2007-09-24 14:50:09 -0400 (Mon, 24 Sep 2007)
New Revision: 15345
Modified:
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FirstOrderLogicTest.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AbstractCompositeConstraint.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AbstractCompositeRestriction.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Accumulate.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Collect.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Forall.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/From.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/GroupElement.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LogicTransformer.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Pattern.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/RuleConditionElement.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Constraint.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Restriction.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/spi/MockConstraint.java
Log:
JBRULES-1205: Fixing CCE when using OR CEs in rules
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FirstOrderLogicTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FirstOrderLogicTest.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FirstOrderLogicTest.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -726,23 +726,57 @@
final Cheese provolone = new Cheese( "provolone",
5 );
final Cheesery cheesery = new Cheesery();
-
+
cheesery.addCheese( cheddar );
cheesery.addCheese( provolone );
-
+
FactHandle handle = workingMemory.insert( cheesery );
workingMemory.fireAllRules();
assertEquals( 0,
list.size() );
- cheesery.addCheese( new Cheese( "stilton", 10 ) );
+ cheesery.addCheese( new Cheese( "stilton",
+ 10 ) );
cheesery.removeCheese( cheddar );
- workingMemory.update( handle, cheesery );
+ workingMemory.update( handle,
+ cheesery );
workingMemory.fireAllRules();
assertEquals( 2,
list.size() );
}
+ public void testOr() throws Exception {
+ final PackageBuilder builder = new PackageBuilder();
+ builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_OrNesting.drl" ) ) );
+ final Package pkg = builder.getPackage();
+ final RuleBase ruleBase = getRuleBase();
+ ruleBase.addPackage( pkg );
+ final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+ final List list = new ArrayList();
+ workingMemory.setGlobal( "results",
+ list );
+
+ final Cheese cheddar = new Cheese( "cheddar",
+ 7 );
+ final Cheese provolone = new Cheese( "provolone",
+ 5 );
+ final Cheese brie = new Cheese( "brie",
+ 15 );
+ final Person mark = new Person( "mark",
+ "stilton" );
+
+ FactHandle ch = workingMemory.insert( cheddar );
+ FactHandle ph = workingMemory.insert( provolone );
+ FactHandle bh = workingMemory.insert( brie );
+ FactHandle markh = workingMemory.insert( mark );
+
+ workingMemory.fireAllRules();
+ assertEquals( 1,
+ list.size() );
+
+ }
+
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -48,6 +48,10 @@
public Declaration[] getRequiredDeclarations() {
return this.declarations;
}
+
+ public void replaceDeclaration(Declaration oldDecl,
+ Declaration newDecl) {
+ }
public Pattern getOtherPattern() {
return this.otherPattern;
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -39,6 +39,10 @@
public Declaration[] getRequiredDeclarations() {
return InstanceNotEqualsConstraint.declarations;
}
+
+ public void replaceDeclaration(Declaration oldDecl,
+ Declaration newDecl) {
+ }
public Pattern getOtherPattern() {
return this.otherPattern;
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -64,6 +64,10 @@
public Declaration[] getRequiredDeclarations() {
return this.declarations;
}
+
+ public void replaceDeclaration(Declaration oldDecl,
+ Declaration newDecl) {
+ }
public ContextEntry getContextEntry() {
return new TupleStartEqualsConstraintContextEntry();
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AbstractCompositeConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AbstractCompositeConstraint.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AbstractCompositeConstraint.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -126,6 +126,24 @@
public Declaration[] getRequiredDeclarations() {
return this.requiredDeclarations;
}
+
+ /**
+ * {@inheritDoc}
+ */
+ public void replaceDeclaration(Declaration oldDecl,
+ Declaration newDecl) {
+ for( int i = 0; i < this.alphaConstraints.length; i++ ) {
+ this.alphaConstraints[i].replaceDeclaration( oldDecl, newDecl );
+ }
+ for( int i = 0; i < this.betaConstraints.length; i++ ) {
+ this.betaConstraints[i].replaceDeclaration( oldDecl, newDecl );
+ }
+ for( int i = 0; i < this.requiredDeclarations.length; i++ ) {
+ if( this.requiredDeclarations[i] == oldDecl ) {
+ this.requiredDeclarations[i] = newDecl;
+ }
+ }
+ }
/**
* {@inheritDoc}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AbstractCompositeRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AbstractCompositeRestriction.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AbstractCompositeRestriction.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -37,6 +37,14 @@
return (Declaration[]) set.toArray( new Declaration[set.size()] );
}
+ public void replaceDeclaration(Declaration oldDecl,
+ Declaration newDecl) {
+ for ( int i = 0; i < this.restrictions.length; i++ ) {
+ this.restrictions[i].replaceDeclaration( oldDecl,
+ newDecl );
+ }
+ }
+
private static int hashCode(final Object[] array) {
final int PRIME = 31;
if ( array == null ) {
@@ -80,6 +88,9 @@
public static class CompositeContextEntry
implements
ContextEntry {
+
+ private static final long serialVersionUID = -1773986268630111227L;
+
public ContextEntry[] contextEntries;
private ContextEntry entry;
@@ -103,7 +114,7 @@
final InternalFactHandle handle) {
for ( int i = 0, length = this.contextEntries.length; i < length; i++ ) {
this.contextEntries[i].updateFromFactHandle( workingMemory,
- handle );
+ handle );
}
}
@@ -111,7 +122,7 @@
final ReteTuple tuple) {
for ( int i = 0, length = this.contextEntries.length; i < length; i++ ) {
this.contextEntries[i].updateFromTuple( workingMemory,
- tuple );
+ tuple );
}
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Accumulate.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Accumulate.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Accumulate.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -17,6 +17,7 @@
package org.drools.rule;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import org.drools.RuntimeDroolsException;
@@ -221,4 +222,8 @@
return this.accumulator.createWorkingMemoryContext();
}
+ public List getNestedElements() {
+ return Collections.singletonList( this.source );
+ }
+
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Collect.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Collect.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Collect.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -18,6 +18,7 @@
import java.util.Collection;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import org.drools.RuntimeDroolsException;
@@ -87,4 +88,8 @@
public Declaration resolveDeclaration(final String identifier) {
return (Declaration) this.sourcePattern.getInnerDeclarations().get( identifier );
}
+
+ public List getNestedElements() {
+ return Collections.singletonList( this.sourcePattern );
+ }
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -17,6 +17,7 @@
*/
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import org.drools.RuntimeDroolsException;
@@ -129,4 +130,8 @@
return null;
}
+ public List getNestedElements() {
+ return Collections.EMPTY_LIST;
+ }
+
};
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Forall.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Forall.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Forall.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -123,4 +123,11 @@
this.remainingPatterns.add( pattern );
}
+ public List getNestedElements() {
+ List elements = new ArrayList( 1 + this.remainingPatterns.size() );
+ elements.add( this.basePattern );
+ elements.addAll( this.remainingPatterns );
+ return elements;
+ }
+
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/From.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/From.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/From.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -2,6 +2,7 @@
import java.io.Serializable;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import org.drools.spi.DataProvider;
@@ -42,5 +43,9 @@
public Declaration resolveDeclaration(final String identifier) {
return null;
}
+
+ public List getNestedElements() {
+ return Collections.EMPTY_LIST;
+ }
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/GroupElement.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/GroupElement.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/GroupElement.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -294,6 +294,10 @@
public String toString() {
return this.type.toString() + this.children.toString();
}
+
+ public List getNestedElements() {
+ return this.children;
+ }
/**
* A public interface for CE types
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -29,14 +29,12 @@
/**
*
*/
- private static final long serialVersionUID = 400L;
+ private static final long serialVersionUID = 400L;
- private final FieldExtractor extractor;
+ private final FieldExtractor extractor;
- private final LiteralRestriction restriction;
+ private final LiteralRestriction restriction;
- private final static Declaration[] emptyDeclarations = new Declaration[]{};
-
public LiteralConstraint(final FieldExtractor extractor,
final Evaluator evaluator,
final FieldValue field) {
@@ -64,10 +62,6 @@
return this.extractor;
}
- public Declaration[] getRDeclarations() {
- return LiteralConstraint.emptyDeclarations;
- }
-
/**
* Literal constraints cannot have required declarations, so always return an empty array.
* @return
@@ -77,6 +71,12 @@
return this.restriction.getRequiredDeclarations();
}
+ public void replaceDeclaration(Declaration oldDecl,
+ Declaration newDecl) {
+ this.restriction.replaceDeclaration( oldDecl,
+ newDecl );
+ }
+
public boolean isAllowed(final Object object,
final InternalWorkingMemory workingMemory) {
return this.restriction.isAllowed( this.extractor,
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -85,6 +85,10 @@
public Declaration[] getRequiredDeclarations() {
return LiteralRestriction.requiredDeclarations;
}
+
+ public void replaceDeclaration(Declaration oldDecl,
+ Declaration newDecl) {
+ }
public String toString() {
return "[LiteralRestriction evaluator=" + this.evaluator + " value=" + this.field + "]";
@@ -117,6 +121,8 @@
private static class LiteralContextEntry
implements
ContextEntry {
+
+ private static final long serialVersionUID = 2621864784428098347L;
public FieldExtractor extractor;
public Object object;
public ContextEntry next;
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LogicTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LogicTransformer.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LogicTransformer.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -22,7 +22,11 @@
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
+import java.util.Stack;
+import org.drools.spi.Constraint;
+import org.drools.spi.DeclarationScopeResolver;
+
/**
* LogicTransformation is reponsible for removing redundant nodes and move Or
* nodes upwards.
@@ -101,10 +105,66 @@
wrapper.addChild( cloned );
ands = new GroupElement[]{wrapper};
}
+
+ for( int i = 0; i < ands.length; i++ ) {
+ // fix the cloned declarations
+ this.fixClonedDeclarations( ands[i] );
+ }
+
return ands;
}
/**
+ * During the logic transformation, we eventually clone CEs,
+ * specially patterns and corresponding declarations. So now
+ * we need to fix any references to cloned declarations.
+ * @param ands
+ */
+ private void fixClonedDeclarations(GroupElement and) {
+ Stack contextStack = new Stack();
+ DeclarationScopeResolver resolver = new DeclarationScopeResolver( new Map[0], contextStack );
+
+ contextStack.push( and );
+ processElement( resolver, contextStack, and );
+ contextStack.pop( );
+ }
+
+ /**
+ * recurse through the rule condition elements updating the declaration objecs
+ * @param resolver
+ * @param contextStack
+ * @param element
+ */
+ private void processElement( final DeclarationScopeResolver resolver, final Stack contextStack, final RuleConditionElement element ) {
+ if( element instanceof Pattern ) {
+ Pattern pattern = (Pattern) element;
+ for( Iterator it = pattern.getNestedElements().iterator(); it.hasNext(); ) {
+ processElement( resolver, contextStack, (RuleConditionElement)it.next() );
+ }
+ for( Iterator it = pattern.getConstraints().iterator(); it.hasNext(); ) {
+ Object next = it.next();
+ if( next instanceof Declaration ) {
+ continue;
+ }
+ Constraint constraint = (Constraint) next;
+ Declaration[] decl = constraint.getRequiredDeclarations();
+ for( int i = 0; i < decl.length; i++ ) {
+ Declaration resolved = resolver.getDeclaration( decl[i].getIdentifier() );
+ if( resolved != null && resolved != decl[i] ) {
+ constraint.replaceDeclaration( decl[i], resolved );
+ }
+ }
+ }
+ } else {
+ contextStack.push( element );
+ for( Iterator it = element.getNestedElements().iterator(); it.hasNext(); ) {
+ processElement( resolver, contextStack, (RuleConditionElement)it.next() );
+ }
+ contextStack.pop();
+ }
+ }
+
+ /**
* Traverses a Tree, during the process it transforms Or nodes moving the
* upwards and it removes duplicate logic statement, this does not include
* Not nodes.
@@ -233,6 +293,8 @@
for ( int j = 0; j < others.length; j++ ) {
if ( others[j] != null ) {
// always add clone of them to avoid offset conflicts in declarations
+
+ // HERE IS THE MESSY PROBLEM: need to change further references to the appropriate cloned ref
and.getChildren().add( j,
((RuleConditionElement) others[j]).clone() );
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -35,6 +35,12 @@
return this.restrictions.getRequiredDeclarations();
}
+ public void replaceDeclaration(Declaration oldDecl,
+ Declaration newDecl) {
+ this.restrictions.replaceDeclaration( oldDecl,
+ newDecl );
+ }
+
public String toString() {
return "[MultiRestrictionConstraint fieldExtractor=" + this.extractor + " restrictions =" + this.restrictions + "]";
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Pattern.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Pattern.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Pattern.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -98,8 +98,13 @@
public Object clone() {
final String identifier = (this.declaration != null) ? this.declaration.getIdentifier() : null;
final Pattern clone = new Pattern( this.index,
+ this.offset,
this.objectType,
- identifier );
+ identifier,
+ this.declaration != null ? this.declaration.isInternalFact() : false );
+ if( this.getSource() != null ) {
+ clone.setSource( (PatternSource) this.getSource().clone() );
+ }
for ( final Iterator it = this.constraints.iterator(); it.hasNext(); ) {
final Object constr = it.next();
@@ -246,4 +251,8 @@
return (this.source == null) ? other.source == null : this.source.equals( other.source );
}
+ public List getNestedElements() {
+ return this.source != null ? Collections.singletonList( this.source ) : Collections.EMPTY_LIST;
+ }
+
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -113,6 +113,25 @@
public Declaration[] getLocalDeclarations() {
return this.localDeclarations;
}
+
+ public void replaceDeclaration(Declaration oldDecl,
+ Declaration newDecl) {
+ for( int i = 0; i < this.requiredDeclarations.length; i++) {
+ if( this.requiredDeclarations[i] == oldDecl ) {
+ this.requiredDeclarations[i] = newDecl;
+ }
+ }
+ for( int i = 0; i < this.previousDeclarations.length; i++) {
+ if( this.previousDeclarations[i] == oldDecl ) {
+ this.previousDeclarations[i] = newDecl;
+ }
+ }
+ for( int i = 0; i < this.localDeclarations.length; i++) {
+ if( this.localDeclarations[i] == oldDecl ) {
+ this.localDeclarations[i] = newDecl;
+ }
+ }
+ }
public void setPredicateExpression(final PredicateExpression expression) {
this.expression = expression;
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -49,6 +49,12 @@
return this.restriction.getRequiredDeclarations();
}
+ public void replaceDeclaration(Declaration oldDecl,
+ Declaration newDecl) {
+ this.restriction.replaceDeclaration( oldDecl,
+ newDecl );
+ }
+
public void setReturnValueExpression(final ReturnValueExpression expression) {
this.restriction.setReturnValueExpression( expression );
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -95,10 +95,10 @@
this.evaluator = evaluator;
this.contextEntry = new ReturnValueContextEntry( fieldExtractor,
- previousDeclarations,
- localDeclarations );
+ this.previousDeclarations,
+ this.localDeclarations );
- this.requiredDeclarations = new Declaration[previousDeclarations.length + localDeclarations.length];
+ this.requiredDeclarations = new Declaration[this.previousDeclarations.length + this.localDeclarations.length];
System.arraycopy( this.previousDeclarations,
0,
this.requiredDeclarations,
@@ -122,6 +122,25 @@
public Declaration[] getLocalDeclarations() {
return this.localDeclarations;
}
+
+ public void replaceDeclaration(Declaration oldDecl,
+ Declaration newDecl) {
+ for( int i = 0; i < this.requiredDeclarations.length; i++) {
+ if( this.requiredDeclarations[i] == oldDecl ) {
+ this.requiredDeclarations[i] = newDecl;
+ }
+ }
+ for( int i = 0; i < this.previousDeclarations.length; i++) {
+ if( this.previousDeclarations[i] == oldDecl ) {
+ this.previousDeclarations[i] = newDecl;
+ }
+ }
+ for( int i = 0; i < this.localDeclarations.length; i++) {
+ if( this.localDeclarations[i] == oldDecl ) {
+ this.localDeclarations[i] = newDecl;
+ }
+ }
+ }
public void setReturnValueExpression(final ReturnValueExpression expression) {
this.expression = expression;
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/RuleConditionElement.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/RuleConditionElement.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/RuleConditionElement.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -16,6 +16,7 @@
package org.drools.rule;
+import java.util.List;
import java.util.Map;
import org.drools.spi.RuleComponent;
@@ -60,5 +61,12 @@
* @return
*/
public Object clone();
+
+ /**
+ * Returs a list of RuleConditionElement's that are nested
+ * inside the current element
+ * @return
+ */
+ public List getNestedElements();
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -51,6 +51,12 @@
public Declaration[] getRequiredDeclarations() {
return this.restriction.getRequiredDeclarations();
}
+
+ public void replaceDeclaration(Declaration oldDecl,
+ Declaration newDecl) {
+ this.restriction.replaceDeclaration( oldDecl,
+ newDecl );
+ }
public FieldExtractor getFieldExtractor() {
return this.fieldExtractor;
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -33,7 +33,7 @@
private static final long serialVersionUID = 400L;
- private final Declaration declaration;
+ private Declaration declaration;
private final Declaration[] requiredDeclarations;
@@ -47,13 +47,23 @@
this.declaration = declaration;
this.requiredDeclarations = new Declaration[]{declaration};
this.evaluator = evaluator;
- this.contextEntry = this.createContextEntry( this.evaluator, fieldExtractor );
+ this.contextEntry = this.createContextEntry( this.evaluator,
+ fieldExtractor );
}
public Declaration[] getRequiredDeclarations() {
return this.requiredDeclarations;
}
+ public void replaceDeclaration(Declaration oldDecl,
+ Declaration newDecl) {
+ if ( this.declaration == oldDecl ) {
+ this.declaration = newDecl;
+ this.requiredDeclarations[0] = newDecl;
+ this.contextEntry.declaration = newDecl;
+ }
+ }
+
public Evaluator getEvaluator() {
return this.evaluator;
}
@@ -64,19 +74,22 @@
return this.evaluator.evaluate( workingMemory,
this.contextEntry.extractor,
object,
- this.contextEntry.declaration.getExtractor(), object );
+ this.contextEntry.declaration.getExtractor(),
+ object );
}
public boolean isAllowedCachedLeft(final ContextEntry context,
final Object object) {
return this.evaluator.evaluateCachedLeft( ((VariableContextEntry) context).workingMemory,
- (VariableContextEntry) context, object );
+ (VariableContextEntry) context,
+ object );
}
public boolean isAllowedCachedRight(final ReteTuple tuple,
final ContextEntry context) {
return this.evaluator.evaluateCachedRight( ((VariableContextEntry) context).workingMemory,
- (VariableContextEntry) context, tuple.get( this.declaration ).getObject() );
+ (VariableContextEntry) context,
+ tuple.get( this.declaration ).getObject() );
}
public String toString() {
@@ -110,9 +123,9 @@
other.requiredDeclarations );
}
- private final VariableContextEntry createContextEntry(final Evaluator eval, final FieldExtractor fieldExtractor) {
- if( Operator.MEMBEROF.equals( eval.getOperator() ) ||
- Operator.NOTMEMBEROF.equals( eval.getOperator() ) ) {
+ private final VariableContextEntry createContextEntry(final Evaluator eval,
+ final FieldExtractor fieldExtractor) {
+ if ( Operator.MEMBEROF.equals( eval.getOperator() ) || Operator.NOTMEMBEROF.equals( eval.getOperator() ) ) {
return new ObjectVariableContextEntry( fieldExtractor,
this.declaration );
} else {
@@ -142,13 +155,13 @@
public static abstract class VariableContextEntry
implements
ContextEntry {
- public FieldExtractor extractor;
- public Object object;
- public Declaration declaration;
- public ReteTuple reteTuple;
- public ContextEntry entry;
- public boolean leftNull;
- public boolean rightNull;
+ public FieldExtractor extractor;
+ public Object object;
+ public Declaration declaration;
+ public ReteTuple reteTuple;
+ public ContextEntry entry;
+ public boolean leftNull;
+ public boolean rightNull;
public InternalWorkingMemory workingMemory;
public VariableContextEntry(final FieldExtractor extractor,
@@ -180,11 +193,11 @@
public Declaration getVariableDeclaration() {
return this.declaration;
}
-
+
public boolean isLeftNull() {
return this.leftNull;
}
-
+
public boolean isRightNull() {
return this.rightNull;
}
@@ -206,16 +219,20 @@
final ReteTuple tuple) {
this.reteTuple = tuple;
this.workingMemory = workingMemory;
- this.leftNull = this.declaration.getExtractor().isNullValue( workingMemory, tuple.get( this.declaration ).getObject() );
- this.left = this.declaration.getExtractor().getValue( workingMemory, tuple.get( this.declaration ).getObject() );
+ this.leftNull = this.declaration.getExtractor().isNullValue( workingMemory,
+ tuple.get( this.declaration ).getObject() );
+ this.left = this.declaration.getExtractor().getValue( workingMemory,
+ tuple.get( this.declaration ).getObject() );
}
public void updateFromFactHandle(final InternalWorkingMemory workingMemory,
final InternalFactHandle handle) {
this.object = handle.getObject();
this.workingMemory = workingMemory;
- this.rightNull = this.extractor.isNullValue( workingMemory, handle.getObject() );
- this.right = this.extractor.getValue( workingMemory, handle.getObject() );
+ this.rightNull = this.extractor.isNullValue( workingMemory,
+ handle.getObject() );
+ this.right = this.extractor.getValue( workingMemory,
+ handle.getObject() );
}
}
@@ -236,10 +253,12 @@
final ReteTuple tuple) {
this.reteTuple = tuple;
this.workingMemory = workingMemory;
- this.leftNull = this.declaration.getExtractor().isNullValue( workingMemory, tuple.get( this.declaration ).getObject() );
-
- if (!leftNull) {
- this.left = this.declaration.getExtractor().getLongValue( workingMemory, tuple.get( this.declaration ).getObject() );
+ this.leftNull = this.declaration.getExtractor().isNullValue( workingMemory,
+ tuple.get( this.declaration ).getObject() );
+
+ if ( !leftNull ) {
+ this.left = this.declaration.getExtractor().getLongValue( workingMemory,
+ tuple.get( this.declaration ).getObject() );
} else {
this.left = 0;
}
@@ -249,10 +268,12 @@
final InternalFactHandle handle) {
this.object = handle.getObject();
this.workingMemory = workingMemory;
- this.rightNull = this.extractor.isNullValue( workingMemory, handle.getObject() );
-
+ this.rightNull = this.extractor.isNullValue( workingMemory,
+ handle.getObject() );
+
if ( !rightNull ) { // avoid a NullPointerException
- this.right = this.extractor.getLongValue( workingMemory, handle.getObject() );
+ this.right = this.extractor.getLongValue( workingMemory,
+ handle.getObject() );
} else {
this.right = 0;
}
@@ -276,10 +297,12 @@
final ReteTuple tuple) {
this.reteTuple = tuple;
this.workingMemory = workingMemory;
- this.leftNull = this.declaration.getExtractor().isNullValue( workingMemory, tuple.get( this.declaration ).getObject() );
-
- if (!leftNull) {
- this.left = this.declaration.getExtractor().getCharValue( workingMemory, tuple.get( this.declaration ).getObject() );
+ this.leftNull = this.declaration.getExtractor().isNullValue( workingMemory,
+ tuple.get( this.declaration ).getObject() );
+
+ if ( !leftNull ) {
+ this.left = this.declaration.getExtractor().getCharValue( workingMemory,
+ tuple.get( this.declaration ).getObject() );
} else {
this.left = 0;
}
@@ -289,10 +312,12 @@
final InternalFactHandle handle) {
this.object = handle.getObject();
this.workingMemory = workingMemory;
- this.rightNull = this.extractor.isNullValue( workingMemory, handle.getObject() );
-
+ this.rightNull = this.extractor.isNullValue( workingMemory,
+ handle.getObject() );
+
if ( !rightNull ) { // avoid a NullPointerException
- this.right = this.extractor.getCharValue( workingMemory, handle.getObject() );
+ this.right = this.extractor.getCharValue( workingMemory,
+ handle.getObject() );
} else {
this.right = 0;
}
@@ -316,10 +341,12 @@
final ReteTuple tuple) {
this.reteTuple = tuple;
this.workingMemory = workingMemory;
- this.leftNull = this.declaration.getExtractor().isNullValue( workingMemory, tuple.get( this.declaration ).getObject() );
-
- if (!leftNull) {
- this.left = this.declaration.getExtractor().getDoubleValue( workingMemory, tuple.get( this.declaration ).getObject() );
+ this.leftNull = this.declaration.getExtractor().isNullValue( workingMemory,
+ tuple.get( this.declaration ).getObject() );
+
+ if ( !leftNull ) {
+ this.left = this.declaration.getExtractor().getDoubleValue( workingMemory,
+ tuple.get( this.declaration ).getObject() );
} else {
this.left = 0;
}
@@ -329,10 +356,12 @@
final InternalFactHandle handle) {
this.object = handle.getObject();
this.workingMemory = workingMemory;
- this.rightNull = this.extractor.isNullValue( workingMemory, handle.getObject() );
-
+ this.rightNull = this.extractor.isNullValue( workingMemory,
+ handle.getObject() );
+
if ( !rightNull ) { // avoid a NullPointerException
- this.right = this.extractor.getDoubleValue( workingMemory, handle.getObject() );
+ this.right = this.extractor.getDoubleValue( workingMemory,
+ handle.getObject() );
} else {
this.right = 0;
}
@@ -355,10 +384,12 @@
final ReteTuple tuple) {
this.reteTuple = tuple;
this.workingMemory = workingMemory;
- this.leftNull = this.declaration.getExtractor().isNullValue( workingMemory, tuple.get( this.declaration ).getObject() );
-
+ this.leftNull = this.declaration.getExtractor().isNullValue( workingMemory,
+ tuple.get( this.declaration ).getObject() );
+
if ( !leftNull ) {
- this.left = this.declaration.getExtractor().getBooleanValue( workingMemory, tuple.get( this.declaration ).getObject() );
+ this.left = this.declaration.getExtractor().getBooleanValue( workingMemory,
+ tuple.get( this.declaration ).getObject() );
} else {
this.left = false;
}
@@ -368,10 +399,12 @@
final InternalFactHandle handle) {
this.object = handle.getObject();
this.workingMemory = workingMemory;
- this.rightNull = this.extractor.isNullValue( workingMemory, handle.getObject() );
-
+ this.rightNull = this.extractor.isNullValue( workingMemory,
+ handle.getObject() );
+
if ( !rightNull ) { // avoid a NullPointerException
- this.right = this.extractor.getBooleanValue( workingMemory, handle.getObject() );
+ this.right = this.extractor.getBooleanValue( workingMemory,
+ handle.getObject() );
} else {
this.right = false;
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Constraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Constraint.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Constraint.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -22,5 +22,21 @@
extends
RuleComponent {
+ /**
+ * Returns all the declarations required by the given
+ * constraint implementation.
+ *
+ * @return
+ */
Declaration[] getRequiredDeclarations();
+
+ /**
+ * A constraint may be required to replace an old
+ * declaration object by a new updated one
+ *
+ * @param oldDecl
+ * @param newDecl
+ */
+ void replaceDeclaration(Declaration oldDecl,
+ Declaration newDecl);
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Restriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Restriction.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Restriction.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -23,5 +23,16 @@
ContextEntry context);
public ContextEntry getContextEntry();
+
+ /**
+ * A restriction may be required to replace an old
+ * declaration object by a new updated one
+ *
+ * @param oldDecl
+ * @param newDecl
+ */
+ void replaceDeclaration(Declaration oldDecl,
+ Declaration newDecl);
+
}
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/spi/MockConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/spi/MockConstraint.java 2007-09-24 18:43:19 UTC (rev 15344)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/spi/MockConstraint.java 2007-09-24 18:50:09 UTC (rev 15345)
@@ -45,6 +45,10 @@
public Declaration[] getRequiredDeclarations() {
return this.declarations;
}
+
+ public void replaceDeclaration(Declaration oldDecl,
+ Declaration newDecl) {
+ }
public ContextEntry getContextEntry() {
return new ContextEntry() {
More information about the jboss-svn-commits
mailing list