[jboss-svn-commits] JBL Code SVN: r18129 - in labs/jbossrules/trunk: 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
Fri Jan 25 14:22:30 EST 2008


Author: tirelli
Date: 2008-01-25 14:22:30 -0500 (Fri, 25 Jan 2008)
New Revision: 18129

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_ForallSinglePatternWithExists.drl
Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FirstOrderLogicTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.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/EntryPoint.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/LogicTransformer.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/RuleConditionElement.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/DeclarationScopeResolver.java
Log:
JBRULES-1437: fixing implicit declarations bug

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java	2008-01-25 18:45:06 UTC (rev 18128)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java	2008-01-25 19:22:30 UTC (rev 18129)
@@ -558,6 +558,7 @@
         final Declaration declaration = new Declaration( identifier,
                                                          extractor,
                                                          pattern );
+
         return declaration;
     }
 

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	2008-01-25 18:45:06 UTC (rev 18128)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FirstOrderLogicTest.java	2008-01-25 19:22:30 UTC (rev 18129)
@@ -894,4 +894,30 @@
 
     }
 
+    public void testForallSinglePatternWithExists() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_ForallSinglePatternWithExists.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 );
+        
+        workingMemory.insert( new Cheese( "stilton", 10 ) );
+        workingMemory.insert( new Cheese( "brie", 10 ) );
+        workingMemory.insert( new Cheese( "brie", 10 ) );
+        workingMemory.insert( new Order( 1, "bob" ) );
+        workingMemory.insert( new Person( "bob", "stilton", 10 ) );
+        workingMemory.insert( new Person( "mark", "stilton" ) );
+        
+        workingMemory.fireAllRules();
+        
+        //assertEquals( 1, list.size() );
+        
+    }
+
 }

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_ForallSinglePatternWithExists.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_ForallSinglePatternWithExists.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_ForallSinglePatternWithExists.drl	2008-01-25 19:22:30 UTC (rev 18129)
@@ -0,0 +1,13 @@
+package org.drools;
+
+global java.util.List results;
+
+rule "test forall single pattern"	
+	when
+	    Order( )
+	    $p1 : Person( )
+	    forall( Cheese( price == $p1.age ) )
+	    exists( OrderItem() or Order() )
+	then 
+		results.add("OK");		
+end
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_ForallSinglePatternWithExists.drl
___________________________________________________________________
Name: svn:executable
   + *

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java	2008-01-25 18:45:06 UTC (rev 18128)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java	2008-01-25 19:22:30 UTC (rev 18129)
@@ -292,7 +292,7 @@
             return false;
         }
 
-        return this.constraints.equals( other );
+        return this.constraints.equals( other.constraints );
     }
 
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java	2008-01-25 18:45:06 UTC (rev 18128)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java	2008-01-25 19:22:30 UTC (rev 18129)
@@ -209,7 +209,7 @@
 
         final SingleBetaConstraints other = (SingleBetaConstraints) object;
 
-        return this.constraint == other.constraint || this.constraint.equals( other );
+        return this.constraint == other.constraint || this.constraint.equals( other.constraint );
     }
 
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java	2008-01-25 18:45:06 UTC (rev 18128)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java	2008-01-25 19:22:30 UTC (rev 18129)
@@ -262,6 +262,6 @@
             source = source.objectSource;
         }
 
-        return "[JoinNode - " + ((ObjectTypeNode) source).getObjectType() + "]";
+        return "[JoinNode("+this.getId()+") - " + ((ObjectTypeNode) source).getObjectType() + "]";
     }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java	2008-01-25 18:45:06 UTC (rev 18128)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java	2008-01-25 19:22:30 UTC (rev 18129)
@@ -219,4 +219,26 @@
         this.previousTupleSinkNode = previous;
     }
 
+    public int hashCode() {
+        return this.tupleSource.hashCode() * 17 + ((this.tupleMemoryEnabled) ? 1234 : 4321 );
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    public boolean equals(final Object object) {
+        if ( this == object ) {
+            return true;
+        }
+
+        if ( object == null || !(object instanceof RightInputAdapterNode) ) {
+            return false;
+        }
+
+        final RightInputAdapterNode other = (RightInputAdapterNode) object;
+
+        return this.tupleMemoryEnabled == other.tupleMemoryEnabled && this.tupleSource.equals( other.tupleSource );
+    }
 }

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	2008-01-25 18:45:06 UTC (rev 18128)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Accumulate.java	2008-01-25 19:22:30 UTC (rev 18129)
@@ -226,4 +226,8 @@
         return Collections.singletonList( this.source );
     }
 
+    public boolean isPatternScopeDelimiter() {
+        return true;
+    }
+
 }

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	2008-01-25 18:45:06 UTC (rev 18128)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Collect.java	2008-01-25 19:22:30 UTC (rev 18129)
@@ -92,4 +92,8 @@
     public List getNestedElements() {
         return Collections.singletonList( this.sourcePattern );
     }
+
+    public boolean isPatternScopeDelimiter() {
+        return true;
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EntryPoint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EntryPoint.java	2008-01-25 18:45:06 UTC (rev 18128)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EntryPoint.java	2008-01-25 19:22:30 UTC (rev 18129)
@@ -139,4 +139,8 @@
     public String toString() {
         return "EntryPoint::"+this.entryPointId;
     }
+
+    public boolean isPatternScopeDelimiter() {
+        return true;
+    }
 }

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	2008-01-25 18:45:06 UTC (rev 18128)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java	2008-01-25 19:22:30 UTC (rev 18129)
@@ -134,4 +134,8 @@
         return Collections.EMPTY_LIST;
     }
 
+    public boolean isPatternScopeDelimiter() {
+        return true;
+    }
+
 };
\ 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	2008-01-25 18:45:06 UTC (rev 18128)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Forall.java	2008-01-25 19:22:30 UTC (rev 18129)
@@ -130,4 +130,8 @@
         return elements;
     }
 
+    public boolean isPatternScopeDelimiter() {
+        return true;
+    }
+
 }

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	2008-01-25 18:45:06 UTC (rev 18128)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/From.java	2008-01-25 19:22:30 UTC (rev 18129)
@@ -48,4 +48,8 @@
         return Collections.EMPTY_LIST;
     }
 
+    public boolean isPatternScopeDelimiter() {
+        return true;
+    }
+
 }

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	2008-01-25 18:45:06 UTC (rev 18128)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/GroupElement.java	2008-01-25 19:22:30 UTC (rev 18129)
@@ -300,6 +300,10 @@
         return this.children;
     }
 
+    public boolean isPatternScopeDelimiter() {
+        return this.type.isPatternScopeDelimiter();
+    }
+
     /**
      * A public interface for CE types
      */
@@ -338,6 +342,16 @@
          * visible outside of an element of this type
          */
         public Map getOuterDeclarations(List children);
+        
+        /**
+         * Returns true in case this RuleConditionElement delimits
+         * a pattern visibility scope.
+         * 
+         * For instance, AND CE is not a scope delimiter, while 
+         * NOT CE is a scope delimiter
+         * @return
+         */
+        public boolean isPatternScopeDelimiter();
     }
 
     private static abstract class AbstractType
@@ -428,6 +442,10 @@
             return "AND";
         }
 
+        public boolean isPatternScopeDelimiter() {
+            return false;
+        }
+
     }
 
     /**
@@ -470,6 +488,10 @@
         public String toString() {
             return "OR";
         }
+
+        public boolean isPatternScopeDelimiter() {
+            return false;
+        }
     }
 
     /**
@@ -519,6 +541,10 @@
         public String toString() {
             return "NOT";
         }
+
+        public boolean isPatternScopeDelimiter() {
+            return true;
+        }
     }
 
     /**
@@ -568,6 +594,10 @@
         public String toString() {
             return "EXISTS";
         }
+
+        public boolean isPatternScopeDelimiter() {
+            return true;
+        }
     }
 
 }
\ No newline at end of file

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	2008-01-25 18:45:06 UTC (rev 18128)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LogicTransformer.java	2008-01-25 19:22:30 UTC (rev 18129)
@@ -160,6 +160,16 @@
                     if ( resolved != null && resolved != decl[i] ) {
                         constraint.replaceDeclaration( decl[i],
                                                        resolved );
+                    } else if( resolved == null ) {
+                        // it is probably an implicit declaration, so find the corresponding pattern
+                        Pattern old = decl[i].getPattern();
+                        Pattern current = resolver.findPatternByIndex( old.getIndex() );
+                        if ( current != null && old != current ) {
+                            resolved = new Declaration( decl[i].getIdentifier(),
+                                                        decl[i].getExtractor(),
+                                                        current );
+                            constraint.replaceDeclaration( decl[i], resolved );
+                        }
                     }
                 }
             }
@@ -194,20 +204,20 @@
         // first we elimininate any redundancy
         ce.pack();
 
-        Object[] children = (Object[]) ce.getChildren().toArray(); 
+        Object[] children = (Object[]) ce.getChildren().toArray();
         for ( int i = 0; i < children.length; i++ ) {
             if ( children[i] instanceof GroupElement ) {
                 final GroupElement child = (GroupElement) children[i];
 
                 processTree( child );
-                if( ( child.isOr() || child.isAnd() ) && child.getType() == ce.getType() ) {
+                if ( (child.isOr() || child.isAnd()) && child.getType() == ce.getType() ) {
                     child.pack( ce );
                 } else if ( child.isOr() ) {
                     hasChildOr = true;
                 }
             }
         }
-        
+
         if ( hasChildOr ) {
             applyOrTransformation( ce );
         }

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	2008-01-25 18:45:06 UTC (rev 18128)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Pattern.java	2008-01-25 19:22:30 UTC (rev 18129)
@@ -102,7 +102,7 @@
                                            this.objectType,
                                            identifier,
                                            this.declaration != null ? this.declaration.isInternalFact() : false );
-        if( this.getSource() != null ) {
+        if ( this.getSource() != null ) {
             clone.setSource( (PatternSource) this.getSource().clone() );
         }
 
@@ -114,18 +114,19 @@
                                       decl.getExtractor() );
             } else {
                 Constraint constraint = (Constraint) ((Constraint) constr).clone();
-                
+
                 // we must update pattern references in cloned declarations
                 Declaration[] oldDecl = ((Constraint) constr).getRequiredDeclarations();
                 Declaration[] newDecl = constraint.getRequiredDeclarations();
-                for( int i = 0; i < newDecl.length; i++ ) {
-                    if( newDecl[i].getPattern() == this ) {
+                for ( int i = 0; i < newDecl.length; i++ ) {
+                    if ( newDecl[i].getPattern() == this ) {
                         newDecl[i].setPattern( clone );
                         // we still need to call replace because there might be nested declarations to replace
-                        constraint.replaceDeclaration( oldDecl[i], newDecl[i] );
+                        constraint.replaceDeclaration( oldDecl[i],
+                                                       newDecl[i] );
                     }
                 }
-                
+
                 clone.addConstraint( constraint );
             }
         }
@@ -160,17 +161,20 @@
         if ( this.constraints == Collections.EMPTY_LIST ) {
             this.constraints = new ArrayList( 1 );
         }
-        final Declaration declaration = new Declaration( identifier,
-                                                         extractor,
-                                                         this );
-        this.constraints.add( declaration );
-        if ( this.declarations == null ) {
-            this.declarations = new HashMap( 2 ); // default to avoid immediate resize
+
+        Declaration declaration = this.declarations != null ? (Declaration) this.declarations.get( identifier ) : null;
+        if ( declaration == null ) {
+            declaration = new Declaration( identifier,
+                                           extractor,
+                                           this );
+            this.constraints.add( declaration );
+            if ( this.declarations == null ) {
+                this.declarations = new HashMap( 2 ); // default to avoid immediate resize
+            }
+            this.declarations.put( declaration.getIdentifier(),
+                                   declaration );
         }
-        this.declarations.put( declaration.getIdentifier(),
-                               declaration );
         return declaration;
-
     }
 
     public boolean isBound() {
@@ -268,4 +272,8 @@
         return this.source != null ? Collections.singletonList( this.source ) : Collections.EMPTY_LIST;
     }
 
+    public boolean isPatternScopeDelimiter() {
+        return true;
+    }
+
 }
\ No newline at end of file

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	2008-01-25 18:45:06 UTC (rev 18128)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/RuleConditionElement.java	2008-01-25 19:22:30 UTC (rev 18129)
@@ -67,6 +67,16 @@
      * inside the current element
      * @return
      */
-    public List getNestedElements();
+    public List<RuleConditionElement> getNestedElements();
+    
+    /**
+     * Returns true in case this RuleConditionElement delimits
+     * a pattern visibility scope.
+     * 
+     * For instance, AND CE is not a scope delimiter, while 
+     * NOT CE is a scope delimiter
+     * @return
+     */
+    public boolean isPatternScopeDelimiter();
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/DeclarationScopeResolver.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/DeclarationScopeResolver.java	2008-01-25 18:45:06 UTC (rev 18128)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/DeclarationScopeResolver.java	2008-01-25 19:22:30 UTC (rev 18129)
@@ -1,6 +1,7 @@
 package org.drools.spi;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Stack;
 
@@ -129,4 +130,28 @@
         }
         return declarations;
     }
+
+    public Pattern findPatternByIndex(int index) {
+        if ( ! this.buildStack.isEmpty() ) {
+            return findPatternInNestedElements( index, (RuleConditionElement) this.buildStack.get( 0 ) );
+        }
+        return null;
+    }
+    
+    private Pattern findPatternInNestedElements( final int index, final RuleConditionElement rce ) {
+        for( RuleConditionElement element : rce.getNestedElements() ) {
+            if( element instanceof Pattern ) {
+                Pattern p = (Pattern) element;
+                if( p.getIndex() == index ) {
+                    return p;
+                }
+            } else if( ! element.isPatternScopeDelimiter() ) {
+                Pattern p = findPatternInNestedElements( index, element );
+                if( p != null ) {
+                    return p;
+                }
+            }
+        }
+        return null;
+    }
 }




More information about the jboss-svn-commits mailing list