[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