[jboss-svn-commits] JBL Code SVN: r18498 - in labs/jbossrules/branches/4.0.x: drools-compiler/src/test/java/org/drools/integrationtests and 5 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Feb 18 18:21:53 EST 2008
Author: tirelli
Date: 2008-02-18 18:21:53 -0500 (Mon, 18 Feb 2008)
New Revision: 18498
Added:
labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/MutableTypeConstraint.java
Modified:
labs/jbossrules/branches/4.0.x/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java
labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java
labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java
labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java
labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java
labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/AbstractCompositeConstraint.java
labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/AndConstraint.java
labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/ContextEntry.java
labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java
labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java
labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/OrConstraint.java
labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/Pattern.java
labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java
labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java
labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/VariableConstraint.java
labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/spi/Constraint.java
labs/jbossrules/branches/4.0.x/drools-core/src/test/java/org/drools/spi/MockConstraint.java
Log:
JBRULES-1472: fixing the mix of alpha and beta constraints
Modified: labs/jbossrules/branches/4.0.x/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java 2008-02-18 18:45:20 UTC (rev 18497)
+++ labs/jbossrules/branches/4.0.x/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java 2008-02-18 23:21:53 UTC (rev 18498)
@@ -52,6 +52,7 @@
import org.drools.rule.LiteralConstraint;
import org.drools.rule.LiteralRestriction;
import org.drools.rule.MultiRestrictionFieldConstraint;
+import org.drools.rule.MutableTypeConstraint;
import org.drools.rule.OrCompositeRestriction;
import org.drools.rule.OrConstraint;
import org.drools.rule.Pattern;
@@ -69,6 +70,7 @@
import org.drools.spi.FieldValue;
import org.drools.spi.ObjectType;
import org.drools.spi.Restriction;
+import org.drools.spi.Constraint.ConstraintType;
/**
* A builder for patterns
@@ -207,9 +209,13 @@
it.next(),
and );
}
+
if ( container == null ) {
pattern.addConstraint( and );
} else {
+ if( and.getType().equals( Constraint.ConstraintType.UNKNOWN ) ) {
+ this.setConstraintType( pattern, (MutableTypeConstraint) and );
+ }
container.addConstraint( and );
}
} else if ( constraint instanceof OrDescr ) {
@@ -220,9 +226,13 @@
it.next(),
or );
}
+
if ( container == null ) {
pattern.addConstraint( or );
} else {
+ if( or.getType().equals( Constraint.ConstraintType.UNKNOWN ) ) {
+ this.setConstraintType( pattern, (MutableTypeConstraint) or );
+ }
container.addConstraint( or );
}
} else {
@@ -325,10 +335,32 @@
if ( container == null ) {
pattern.addConstraint( constraint );
} else {
+ if( constraint.getType().equals( Constraint.ConstraintType.UNKNOWN ) ) {
+ this.setConstraintType( pattern, (MutableTypeConstraint) constraint );
+ }
container.addConstraint( constraint );
}
}
+ /**
+ * @param pattern
+ * @param constraint
+ */
+ private void setConstraintType(final Pattern container,
+ final MutableTypeConstraint constraint) {
+ final Declaration[] declarations = constraint.getRequiredDeclarations();
+
+ boolean isAlphaConstraint = true;
+ for ( int i = 0; isAlphaConstraint && i < declarations.length; i++ ) {
+ if ( !declarations[i].isGlobal() && declarations[i].getPattern() != container ) {
+ isAlphaConstraint = false;
+ }
+ }
+
+ ConstraintType type = isAlphaConstraint ? ConstraintType.ALPHA : ConstraintType.BETA;
+ constraint.setType( type );
+ }
+
private void rewriteToEval(final RuleBuildContext context,
final Pattern pattern,
final FieldConstraintDescr fieldConstraintDescr,
Modified: labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java 2008-02-18 18:45:20 UTC (rev 18497)
+++ labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java 2008-02-18 23:21:53 UTC (rev 18498)
@@ -3096,7 +3096,7 @@
chili2.setAge( 38 );
chili2.setHair( "indigigo" );
- final Person oldChili1 = new Person( "old chili2" );
+ final Person oldChili1 = new Person( "old chili1" );
oldChili1.setAge( 45 );
oldChili1.setHair( "green" );
@@ -3128,7 +3128,6 @@
results.get( 2 ) );
assertEquals( veryold,
results.get( 3 ) );
-
}
public void testMatchesNotMatchesCheese() throws Exception {
Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java 2008-02-18 18:45:20 UTC (rev 18497)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java 2008-02-18 23:21:53 UTC (rev 18498)
@@ -139,4 +139,8 @@
this.right = null;
}
}
+
+ public ConstraintType getType() {
+ return ConstraintType.BETA;
+ }
}
Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java 2008-02-18 18:45:20 UTC (rev 18497)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java 2008-02-18 23:21:53 UTC (rev 18498)
@@ -17,9 +17,9 @@
*/
import org.drools.reteoo.ReteTuple;
-import org.drools.rule.Pattern;
import org.drools.rule.ContextEntry;
import org.drools.rule.Declaration;
+import org.drools.rule.Pattern;
import org.drools.spi.BetaNodeFieldConstraint;
public class InstanceNotEqualsConstraint
@@ -92,6 +92,10 @@
return new InstanceNotEqualsConstraint( this.otherPattern );
}
+ public ConstraintType getType() {
+ return ConstraintType.BETA;
+ }
+
public static class InstanceNotEqualsConstraintContextEntry
implements
ContextEntry {
Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java 2008-02-18 18:45:20 UTC (rev 18497)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java 2008-02-18 23:21:53 UTC (rev 18498)
@@ -150,4 +150,8 @@
this.right = null;
}
}
+
+ public ConstraintType getType() {
+ return ConstraintType.BETA;
+ }
}
Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java 2008-02-18 18:45:20 UTC (rev 18497)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java 2008-02-18 23:21:53 UTC (rev 18498)
@@ -20,6 +20,7 @@
import java.util.LinkedList;
import java.util.List;
+import org.drools.RuntimeDroolsException;
import org.drools.base.ClassObjectType;
import org.drools.base.DroolsQuery;
import org.drools.common.InstanceNotEqualsConstraint;
@@ -29,12 +30,14 @@
import org.drools.reteoo.ObjectTypeNode;
import org.drools.rule.Declaration;
import org.drools.rule.InvalidPatternException;
+import org.drools.rule.MutableTypeConstraint;
import org.drools.rule.Pattern;
import org.drools.rule.PatternSource;
import org.drools.rule.RuleConditionElement;
import org.drools.spi.AlphaNodeFieldConstraint;
import org.drools.spi.Constraint;
import org.drools.spi.ObjectType;
+import org.drools.spi.Constraint.ConstraintType;
/**
* A builder for patterns
@@ -129,21 +132,14 @@
}
final Constraint constraint = (Constraint) object;
- final Declaration[] declarations = constraint.getRequiredDeclarations();
-
- boolean isAlphaConstraint = true;
- for ( int i = 0; isAlphaConstraint && i < declarations.length; i++ ) {
- if ( !declarations[i].isGlobal() && declarations[i].getPattern() != pattern ) {
- isAlphaConstraint = false;
- }
- }
-
- if ( isAlphaConstraint ) {
+ if ( constraint.getType().equals( Constraint.ConstraintType.ALPHA ) ) {
alphaConstraints.add( constraint );
- } else {
+ } else if ( constraint.getType().equals( Constraint.ConstraintType.BETA ) ) {
utils.checkUnboundDeclarations( context,
constraint.getRequiredDeclarations() );
betaConstraints.add( constraint );
+ } else {
+ throw new RuntimeDroolsException( "Unknown constraint type: "+constraint.getType()+". This is a bug. Please contact development team.");
}
}
}
Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/AbstractCompositeConstraint.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/AbstractCompositeConstraint.java 2008-02-18 18:45:20 UTC (rev 18497)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/AbstractCompositeConstraint.java 2008-02-18 23:21:53 UTC (rev 18498)
@@ -17,12 +17,14 @@
import java.util.Arrays;
+import org.drools.RuntimeDroolsException;
import org.drools.common.InternalFactHandle;
import org.drools.common.InternalWorkingMemory;
import org.drools.reteoo.ReteTuple;
import org.drools.spi.AlphaNodeFieldConstraint;
import org.drools.spi.BetaNodeFieldConstraint;
import org.drools.spi.Constraint;
+import org.drools.spi.Constraint.ConstraintType;
import org.drools.util.ArrayUtils;
/**
@@ -30,10 +32,7 @@
*
* @author etirelli
*/
-public abstract class AbstractCompositeConstraint
- implements
- AlphaNodeFieldConstraint,
- BetaNodeFieldConstraint {
+public abstract class AbstractCompositeConstraint extends MutableTypeConstraint {
protected AlphaNodeFieldConstraint[] alphaConstraints = new AlphaNodeFieldConstraint[0];
protected BetaNodeFieldConstraint[] betaConstraints = new BetaNodeFieldConstraint[0];
@@ -81,11 +80,12 @@
* @param constraint
*/
public void addConstraint(Constraint constraint) {
- if ( constraint instanceof AlphaNodeFieldConstraint ) {
+ if ( constraint.getType() == ConstraintType.ALPHA ) {
this.addAlphaConstraint( (AlphaNodeFieldConstraint) constraint );
- }
- if ( constraint instanceof BetaNodeFieldConstraint ) {
+ } else if ( constraint.getType() == ConstraintType.BETA ) {
this.addBetaConstraint( (BetaNodeFieldConstraint) constraint );
+ } else {
+ throw new RuntimeDroolsException( "Constraint type MUST be known in advance.");
}
}
@@ -151,7 +151,8 @@
* {@inheritDoc}
*/
public ContextEntry createContextEntry() {
- return new MultiFieldConstraintContextEntry( this.betaConstraints );
+ return new MultiFieldConstraintContextEntry( this.alphaConstraints,
+ this.betaConstraints );
}
public int hashCode() {
@@ -183,6 +184,20 @@
}
public abstract Object clone();
+
+ public void setType(ConstraintType type) {
+ super.setType( type );
+ for( int i = 0; i < alphaConstraints.length; i++ ) {
+ if( this.alphaConstraints[i] instanceof MutableTypeConstraint ) {
+ ((MutableTypeConstraint)this.alphaConstraints[i]).setType( type );
+ }
+ }
+ for( int i = 0; i < betaConstraints.length; i++ ) {
+ if( this.betaConstraints[i] instanceof MutableTypeConstraint ) {
+ ((MutableTypeConstraint)this.betaConstraints[i]).setType( type );
+ }
+ }
+ }
/**
* A context entry for composite restrictions
@@ -193,16 +208,24 @@
implements
ContextEntry {
- private static final long serialVersionUID = 400L;
+ private static final long serialVersionUID = 400L;
- public final ContextEntry[] contexts;
- public ContextEntry next;
+ public final ContextEntry[] alphas;
+ public final ContextEntry[] betas;
+ public ContextEntry next;
+ public InternalWorkingMemory workingMemory;
+ public InternalFactHandle handle;
- public MultiFieldConstraintContextEntry(BetaNodeFieldConstraint[] constraints) {
- contexts = new ContextEntry[constraints.length];
- for ( int i = 0; i < contexts.length; i++ ) {
- contexts[i] = constraints[i].createContextEntry();
+ public MultiFieldConstraintContextEntry(final AlphaNodeFieldConstraint[] alphas,
+ final BetaNodeFieldConstraint[] betas) {
+ this.alphas = new ContextEntry[alphas.length];
+ for ( int i = 0; i < alphas.length; i++ ) {
+ this.alphas[i] = alphas[i].createContextEntry();
}
+ this.betas = new ContextEntry[betas.length];
+ for ( int i = 0; i < betas.length; i++ ) {
+ this.betas[i] = betas[i].createContextEntry();
+ }
}
public ContextEntry getNext() {
@@ -215,31 +238,59 @@
public void updateFromFactHandle(InternalWorkingMemory workingMemory,
InternalFactHandle handle) {
- for ( int i = 0; i < contexts.length; i++ ) {
- contexts[i].updateFromFactHandle( workingMemory,
- handle );
+ this.workingMemory = workingMemory;
+ this.handle = handle;
+ for ( int i = 0; i < alphas.length; i++ ) {
+ if ( alphas[i] != null ) {
+ alphas[i].updateFromFactHandle( workingMemory,
+ handle );
+ }
}
+ for ( int i = 0; i < betas.length; i++ ) {
+ betas[i].updateFromFactHandle( workingMemory,
+ handle );
+ }
}
public void updateFromTuple(InternalWorkingMemory workingMemory,
ReteTuple tuple) {
- for ( int i = 0; i < contexts.length; i++ ) {
- contexts[i].updateFromTuple( workingMemory,
- tuple );
+ this.workingMemory = workingMemory;
+ for ( int i = 0; i < alphas.length; i++ ) {
+ if ( alphas[i] != null ) {
+ alphas[i].updateFromTuple( workingMemory,
+ tuple );
+ }
}
+ for ( int i = 0; i < betas.length; i++ ) {
+ betas[i].updateFromTuple( workingMemory,
+ tuple );
+ }
}
-
+
public void resetTuple() {
- for ( int i = 0, length = this.contexts.length; i < length; i++ ) {
- this.contexts[i].resetTuple();
+ this.workingMemory = null;
+ for ( int i = 0, length = this.alphas.length; i < length; i++ ) {
+ if ( alphas[i] != null ) {
+ this.alphas[i].resetTuple();
+ }
}
+ for ( int i = 0, length = this.betas.length; i < length; i++ ) {
+ this.betas[i].resetTuple();
+ }
}
-
+
public void resetFactHandle() {
- for ( int i = 0, length = this.contexts.length; i < length; i++ ) {
- this.contexts[i].resetFactHandle();
+ this.workingMemory = null;
+ this.handle = null;
+ for ( int i = 0, length = this.alphas.length; i < length; i++ ) {
+ if ( alphas[i] != null ) {
+ this.alphas[i].resetFactHandle();
+ }
}
- }
+ for ( int i = 0, length = this.betas.length; i < length; i++ ) {
+ this.betas[i].resetFactHandle();
+ }
+ }
}
Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/AndConstraint.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/AndConstraint.java 2008-02-18 18:45:20 UTC (rev 18497)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/AndConstraint.java 2008-02-18 23:21:53 UTC (rev 18498)
@@ -42,14 +42,12 @@
*/
public boolean isAllowed(Object object,
InternalWorkingMemory workingMemory,
- final ContextEntry ctx ) {
- if ( this.alphaConstraints.length > 0 ) {
- for ( int i = 0; i < this.alphaConstraints.length; i++ ) {
- if ( !this.alphaConstraints[i].isAllowed( object,
- workingMemory,
- ctx ) ) {
- return false;
- }
+ final ContextEntry ctx) {
+ for ( int i = 0; i < this.alphaConstraints.length; i++ ) {
+ if ( !this.alphaConstraints[i].isAllowed( object,
+ workingMemory,
+ ctx ) ) {
+ return false;
}
}
return true;
@@ -60,14 +58,20 @@
*/
public boolean isAllowedCachedLeft(ContextEntry context,
Object object) {
- if ( this.betaConstraints.length > 0 ) {
- for ( int i = 0; i < this.betaConstraints.length; i++ ) {
- if ( !this.betaConstraints[i].isAllowedCachedLeft( ((MultiFieldConstraintContextEntry)context).contexts[i],
- object ) ) {
- return false;
- }
+ for ( int i = 0; i < this.alphaConstraints.length; i++ ) {
+ if ( ! this.alphaConstraints[i].isAllowed( object,
+ ((MultiFieldConstraintContextEntry) context).workingMemory,
+ ((MultiFieldConstraintContextEntry) context).alphas[i] ) ) {
+ return false;
}
}
+ for ( int i = 0; i < this.betaConstraints.length; i++ ) {
+ if ( ! this.betaConstraints[i].isAllowedCachedLeft( ((MultiFieldConstraintContextEntry) context).betas[i],
+ object ) ) {
+ return false;
+ }
+ }
+
return true;
}
@@ -76,17 +80,22 @@
*/
public boolean isAllowedCachedRight(ReteTuple tuple,
ContextEntry context) {
- if ( this.betaConstraints.length > 0 ) {
- for ( int i = 0; i < this.betaConstraints.length; i++ ) {
- if ( !this.betaConstraints[i].isAllowedCachedRight( tuple,
- ((MultiFieldConstraintContextEntry)context).contexts[i] ) ) {
- return false;
- }
+ for ( int i = 0; i < this.alphaConstraints.length; i++ ) {
+ if ( ! this.alphaConstraints[i].isAllowed( ((MultiFieldConstraintContextEntry) context).handle,
+ ((MultiFieldConstraintContextEntry) context).workingMemory,
+ ((MultiFieldConstraintContextEntry) context).alphas[i] ) ) {
+ return false;
}
}
+ for ( int i = 0; i < this.betaConstraints.length; i++ ) {
+ if ( ! this.betaConstraints[i].isAllowedCachedRight( tuple,
+ ((MultiFieldConstraintContextEntry) context).betas[i] ) ) {
+ return false;
+ }
+ }
return true;
}
-
+
public int hashCode() {
final int PRIME = 31;
int result = 1;
@@ -110,26 +119,25 @@
other.betaConstraints ) && Arrays.equals( this.requiredDeclarations,
other.requiredDeclarations );
}
-
+
public Object clone() {
AndConstraint clone = new AndConstraint();
-
+
// clone alpha constraints
- clone.alphaConstraints = new AlphaNodeFieldConstraint[ this.alphaConstraints.length ];
- for( int i = 0; i < this.alphaConstraints.length; i++ ) {
+ clone.alphaConstraints = new AlphaNodeFieldConstraint[this.alphaConstraints.length];
+ for ( int i = 0; i < this.alphaConstraints.length; i++ ) {
clone.alphaConstraints[i] = (AlphaNodeFieldConstraint) this.alphaConstraints[i].clone();
clone.updateRequiredDeclarations( clone.alphaConstraints[i] );
}
-
+
// clone beta constraints
- clone.betaConstraints = new BetaNodeFieldConstraint[ this.betaConstraints.length ];
- for( int i = 0; i < this.betaConstraints.length; i++ ) {
+ clone.betaConstraints = new BetaNodeFieldConstraint[this.betaConstraints.length];
+ for ( int i = 0; i < this.betaConstraints.length; i++ ) {
clone.betaConstraints[i] = (BetaNodeFieldConstraint) this.betaConstraints[i].clone();
clone.updateRequiredDeclarations( clone.betaConstraints[i] );
}
-
+
return clone;
}
-
}
Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/ContextEntry.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/ContextEntry.java 2008-02-18 18:45:20 UTC (rev 18497)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/ContextEntry.java 2008-02-18 23:21:53 UTC (rev 18498)
@@ -23,5 +23,5 @@
public void resetTuple();
public void resetFactHandle();
-
+
}
Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java 2008-02-18 18:45:20 UTC (rev 18497)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java 2008-02-18 23:21:53 UTC (rev 18498)
@@ -18,6 +18,7 @@
import org.drools.common.InternalWorkingMemory;
import org.drools.spi.AlphaNodeFieldConstraint;
+import org.drools.spi.Constraint;
import org.drools.spi.Evaluator;
import org.drools.spi.FieldExtractor;
import org.drools.spi.FieldValue;
@@ -26,9 +27,6 @@
implements
AlphaNodeFieldConstraint {
- /**
- *
- */
private static final long serialVersionUID = 400L;
private final FieldExtractor extractor;
@@ -120,4 +118,8 @@
// no need for context info
return null;
}
+
+ public ConstraintType getType() {
+ return Constraint.ConstraintType.ALPHA;
+ }
}
\ No newline at end of file
Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java 2008-02-18 18:45:20 UTC (rev 18497)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java 2008-02-18 23:21:53 UTC (rev 18498)
@@ -2,19 +2,11 @@
import org.drools.common.InternalWorkingMemory;
import org.drools.reteoo.ReteTuple;
-import org.drools.spi.AlphaNodeFieldConstraint;
-import org.drools.spi.BetaNodeFieldConstraint;
import org.drools.spi.FieldExtractor;
import org.drools.spi.Restriction;
-public class MultiRestrictionFieldConstraint
- implements
- AlphaNodeFieldConstraint,
- BetaNodeFieldConstraint {
+public class MultiRestrictionFieldConstraint extends MutableTypeConstraint {
- /**
- *
- */
private static final long serialVersionUID = 400L;
private final FieldExtractor extractor;
Added: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/MutableTypeConstraint.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/MutableTypeConstraint.java (rev 0)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/MutableTypeConstraint.java 2008-02-18 23:21:53 UTC (rev 18498)
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2008 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Created on Feb 12, 2008
+ */
+
+package org.drools.rule;
+
+import org.drools.spi.AlphaNodeFieldConstraint;
+import org.drools.spi.BetaNodeFieldConstraint;
+import org.drools.spi.Constraint;
+
+/**
+ * A base class for constraints
+ *
+ * @author etirelli
+ */
+public abstract class MutableTypeConstraint
+ implements
+ AlphaNodeFieldConstraint,
+ BetaNodeFieldConstraint {
+
+ private Constraint.ConstraintType type = Constraint.ConstraintType.UNKNOWN;
+
+ public void setType( ConstraintType type ) {
+ this.type = type;
+ }
+
+ public ConstraintType getType() {
+ return this.type;
+ }
+
+ public abstract Object clone();
+}
Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/OrConstraint.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/OrConstraint.java 2008-02-18 18:45:20 UTC (rev 18497)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/OrConstraint.java 2008-02-18 23:21:53 UTC (rev 18498)
@@ -44,7 +44,7 @@
*/
public boolean isAllowed(Object object,
InternalWorkingMemory workingMemory,
- final ContextEntry ctx ) {
+ final ContextEntry ctx) {
if ( this.alphaConstraints.length > 0 ) {
for ( int i = 0; i < this.alphaConstraints.length; i++ ) {
if ( this.alphaConstraints[i].isAllowed( object,
@@ -63,16 +63,24 @@
*/
public boolean isAllowedCachedLeft(ContextEntry context,
Object object) {
- if ( this.betaConstraints.length > 0 ) {
- for ( int i = 0; i < this.betaConstraints.length; i++ ) {
- if ( this.betaConstraints[i].isAllowedCachedLeft( ((MultiFieldConstraintContextEntry)context).contexts[i],
- object ) ) {
- return true;
- }
+ if( this.alphaConstraints.length == 0 && this.betaConstraints.length == 0 ) {
+ return true;
+ }
+ for ( int i = 0; i < this.alphaConstraints.length; i++ ) {
+ if ( this.alphaConstraints[i].isAllowed( object,
+ ((MultiFieldConstraintContextEntry) context).workingMemory,
+ ((MultiFieldConstraintContextEntry) context).alphas[i] ) ) {
+ return true;
}
- return false;
}
- return true;
+ for ( int i = 0; i < this.betaConstraints.length; i++ ) {
+ if ( this.betaConstraints[i].isAllowedCachedLeft( ((MultiFieldConstraintContextEntry) context).betas[i],
+ object ) ) {
+ return true;
+ }
+ }
+
+ return false;
}
/**
@@ -80,10 +88,20 @@
*/
public boolean isAllowedCachedRight(ReteTuple tuple,
ContextEntry context) {
+ if( this.alphaConstraints.length == 0 && this.betaConstraints.length == 0 ) {
+ return true;
+ }
+ for ( int i = 0; i < this.alphaConstraints.length; i++ ) {
+ if ( this.alphaConstraints[i].isAllowed( ((MultiFieldConstraintContextEntry) context).handle.getObject(),
+ ((MultiFieldConstraintContextEntry) context).workingMemory,
+ ((MultiFieldConstraintContextEntry) context).alphas[i] ) ) {
+ return true;
+ }
+ }
if ( this.betaConstraints.length > 0 ) {
for ( int i = 0; i < this.betaConstraints.length; i++ ) {
if ( this.betaConstraints[i].isAllowedCachedRight( tuple,
- ((MultiFieldConstraintContextEntry)context).contexts[i] ) ) {
+ ((MultiFieldConstraintContextEntry) context).betas[i] ) ) {
return true;
}
}
@@ -118,21 +136,21 @@
public Object clone() {
OrConstraint clone = new OrConstraint();
-
+
// clone alpha constraints
- clone.alphaConstraints = new AlphaNodeFieldConstraint[ this.alphaConstraints.length ];
- for( int i = 0; i < this.alphaConstraints.length; i++ ) {
+ clone.alphaConstraints = new AlphaNodeFieldConstraint[this.alphaConstraints.length];
+ for ( int i = 0; i < this.alphaConstraints.length; i++ ) {
clone.alphaConstraints[i] = (AlphaNodeFieldConstraint) this.alphaConstraints[i].clone();
clone.updateRequiredDeclarations( clone.alphaConstraints[i] );
}
-
+
// clone beta constraints
- clone.betaConstraints = new BetaNodeFieldConstraint[ this.betaConstraints.length ];
- for( int i = 0; i < this.betaConstraints.length; i++ ) {
+ clone.betaConstraints = new BetaNodeFieldConstraint[this.betaConstraints.length];
+ for ( int i = 0; i < this.betaConstraints.length; i++ ) {
clone.betaConstraints[i] = (BetaNodeFieldConstraint) this.betaConstraints[i].clone();
clone.updateRequiredDeclarations( clone.betaConstraints[i] );
}
-
+
return clone;
}
}
Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/Pattern.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/Pattern.java 2008-02-18 18:45:20 UTC (rev 18497)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/Pattern.java 2008-02-18 23:21:53 UTC (rev 18498)
@@ -27,6 +27,7 @@
import org.drools.spi.Extractor;
import org.drools.spi.ObjectType;
import org.drools.spi.PatternExtractor;
+import org.drools.spi.Constraint.ConstraintType;
public class Pattern
implements
@@ -152,6 +153,9 @@
if ( this.constraints == Collections.EMPTY_LIST ) {
this.constraints = new ArrayList( 1 );
}
+ if( constraint.getType().equals( Constraint.ConstraintType.UNKNOWN ) ) {
+ this.setConstraintType( (MutableTypeConstraint) constraint );
+ }
this.constraints.add( constraint );
}
@@ -267,5 +271,22 @@
public List getNestedElements() {
return this.source != null ? Collections.singletonList( this.source ) : Collections.EMPTY_LIST;
}
+
+ /**
+ * @param constraint
+ */
+ private void setConstraintType(final MutableTypeConstraint constraint) {
+ final Declaration[] declarations = constraint.getRequiredDeclarations();
+ boolean isAlphaConstraint = true;
+ for ( int i = 0; isAlphaConstraint && i < declarations.length; i++ ) {
+ if ( !declarations[i].isGlobal() && declarations[i].getPattern() != this ) {
+ isAlphaConstraint = false;
+ }
+ }
+
+ ConstraintType type = isAlphaConstraint ? ConstraintType.ALPHA : ConstraintType.BETA;
+ constraint.setType( type );
+ }
+
}
\ No newline at end of file
Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java 2008-02-18 18:45:20 UTC (rev 18497)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java 2008-02-18 23:21:53 UTC (rev 18498)
@@ -22,15 +22,10 @@
import org.drools.common.InternalFactHandle;
import org.drools.common.InternalWorkingMemory;
import org.drools.reteoo.ReteTuple;
-import org.drools.spi.AlphaNodeFieldConstraint;
-import org.drools.spi.BetaNodeFieldConstraint;
import org.drools.spi.Extractor;
import org.drools.spi.PredicateExpression;
-public class PredicateConstraint
- implements
- BetaNodeFieldConstraint,
- AlphaNodeFieldConstraint {
+public class PredicateConstraint extends MutableTypeConstraint {
/**
*
Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java 2008-02-18 18:45:20 UTC (rev 18497)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java 2008-02-18 23:21:53 UTC (rev 18498)
@@ -20,20 +20,12 @@
import org.drools.common.InternalWorkingMemory;
import org.drools.reteoo.ReteTuple;
import org.drools.rule.ReturnValueRestriction.ReturnValueContextEntry;
-import org.drools.spi.AlphaNodeFieldConstraint;
-import org.drools.spi.BetaNodeFieldConstraint;
import org.drools.spi.Evaluator;
import org.drools.spi.FieldExtractor;
import org.drools.spi.ReturnValueExpression;
-public class ReturnValueConstraint
- implements
- BetaNodeFieldConstraint,
- AlphaNodeFieldConstraint {
+public class ReturnValueConstraint extends MutableTypeConstraint {
- /**
- *
- */
private static final long serialVersionUID = 400L;
private final FieldExtractor fieldExtractor;
Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/VariableConstraint.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/VariableConstraint.java 2008-02-18 18:45:20 UTC (rev 18497)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/VariableConstraint.java 2008-02-18 23:21:53 UTC (rev 18498)
@@ -18,15 +18,10 @@
import org.drools.common.InternalWorkingMemory;
import org.drools.reteoo.ReteTuple;
-import org.drools.spi.AlphaNodeFieldConstraint;
-import org.drools.spi.BetaNodeFieldConstraint;
import org.drools.spi.Evaluator;
import org.drools.spi.FieldExtractor;
-public class VariableConstraint
- implements
- AlphaNodeFieldConstraint,
- BetaNodeFieldConstraint {
+public class VariableConstraint extends MutableTypeConstraint {
private static final long serialVersionUID = 400L;
Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/spi/Constraint.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/spi/Constraint.java 2008-02-18 18:45:20 UTC (rev 18497)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/spi/Constraint.java 2008-02-18 23:21:53 UTC (rev 18498)
@@ -1,5 +1,7 @@
package org.drools.spi;
+import java.io.Serializable;
+
import org.drools.rule.Declaration;
/*
@@ -46,4 +48,61 @@
* @return
*/
public Object clone();
+
+ /**
+ * Returns the type of the constraint, either ALPHA, BETA or UNKNOWN
+ *
+ * @return
+ */
+ public ConstraintType getType();
+
+ /**
+ * A java 1.4 type-safe enum
+ */
+ public static class ConstraintType implements Serializable {
+
+ private static final long serialVersionUID = 4865182371013556266L;
+
+ public static final ConstraintType UNKNOWN = new ConstraintType(0, "UNKNOWN");
+ public static final ConstraintType ALPHA = new ConstraintType(1, "ALPHA");
+ public static final ConstraintType BETA = new ConstraintType(2, "BETA");
+
+ private final int type;
+ private final String desc;
+
+ private ConstraintType( int type, String desc ) {
+ this.type = type;
+ this.desc = desc;
+ }
+
+ /**
+ * @inheritDoc
+ *
+ * @see java.lang.Object#hashCode()
+ */
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + type;
+ return result;
+ }
+
+ /**
+ * @inheritDoc
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ public boolean equals(Object obj) {
+ if ( this == obj ) return true;
+ if ( obj == null ) return false;
+ if ( getClass() != obj.getClass() ) return false;
+ final ConstraintType other = (ConstraintType) obj;
+ if ( type != other.type ) return false;
+ return true;
+ }
+
+ public String toString() {
+ return "ConstraintType::"+this.desc;
+ }
+ }
}
\ No newline at end of file
Modified: labs/jbossrules/branches/4.0.x/drools-core/src/test/java/org/drools/spi/MockConstraint.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/test/java/org/drools/spi/MockConstraint.java 2008-02-18 18:45:20 UTC (rev 18497)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/test/java/org/drools/spi/MockConstraint.java 2008-02-18 23:21:53 UTC (rev 18498)
@@ -97,4 +97,8 @@
return this.isAllowed;
}
+ public ConstraintType getType() {
+ return ConstraintType.BETA;
+ }
+
}
\ No newline at end of file
More information about the jboss-svn-commits
mailing list