[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