[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