[jboss-svn-commits] JBL Code SVN: r12185 - in labs/jbossrules/trunk: drools-compiler/src/test/resources/org/drools/integrationtests and 1 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon May 28 15:38:56 EDT 2007
Author: tirelli
Date: 2007-05-28 15:38:56 -0400 (Mon, 28 May 2007)
New Revision: 12185
Added:
labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_removeIdentitiesSubNetwork.drl
Modified:
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FirstOrderLogicTest.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/BuildContext.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java
Log:
JBRULES-879: fixing the remove identity features when multiple subnetworks are present. Integration test added.
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-05-28 17:32:28 UTC (rev 12184)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/FirstOrderLogicTest.java 2007-05-28 19:38:56 UTC (rev 12185)
@@ -475,6 +475,53 @@
}
+ public void testRemoveIdentitiesSubNetwork() throws Exception {
+ final PackageBuilder builder = new PackageBuilder();
+ builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_removeIdentitiesSubNetwork.drl" ) ) );
+ final Package pkg = builder.getPackage();
+
+ final RuleBaseConfiguration config = new RuleBaseConfiguration();
+ config.setRemoveIdentities( true );
+ final RuleBase ruleBase = getRuleBase(config);
+ ruleBase.addPackage( pkg );
+ final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+ final List list = new ArrayList();
+ workingMemory.setGlobal( "results",
+ list );
+
+ final Person bob = new Person( "bob", "stilton" );
+ workingMemory.assertObject( bob );
+
+ final Person mark = new Person( "mark", "stilton" );
+ workingMemory.assertObject( mark );
+
+ final Cheese stilton1 = new Cheese( "stilton",
+ 6 );
+ final FactHandle stilton1Handle = workingMemory.assertObject( stilton1 );
+ final Cheese stilton2 = new Cheese( "stilton",
+ 7 );
+ final FactHandle stilton2Handle = workingMemory.assertObject( stilton2 );
+
+ workingMemory.fireAllRules();
+ assertEquals( 0,
+ list.size() );
+
+ workingMemory.retractObject( stilton1Handle );
+
+ workingMemory.fireAllRules();
+ assertEquals( 1,
+ list.size() );
+ assertEquals( mark, list.get( 0 ));
+
+ workingMemory.retractObject( stilton2Handle );
+
+ workingMemory.fireAllRules();
+ assertEquals( 2,
+ list.size() );
+ assertEquals( bob, list.get( 1 ));
+ }
+
private RuleBase loadRuleBase(final Reader reader) throws IOException,
DroolsParserException,
Exception {
Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_removeIdentitiesSubNetwork.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_removeIdentitiesSubNetwork.drl (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_removeIdentitiesSubNetwork.drl 2007-05-28 19:38:56 UTC (rev 12185)
@@ -0,0 +1,21 @@
+package org.drools;
+
+global java.util.List results;
+
+rule "multiple not's"
+when
+ $bob : Person( name == "bob", $likes : likes )
+ not Cheese( type == $likes )
+ not Cheese( type == $likes )
+then
+ results.add( $bob );
+end
+
+rule "subnetwork not's"
+when
+ $mark : Person( name == "mark", $likes : likes )
+ not ( Cheese( type == $likes ) and Cheese( type == $likes ) )
+then
+ results.add( $mark );
+end
+
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/BuildContext.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/BuildContext.java 2007-05-28 17:32:28 UTC (rev 12184)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/BuildContext.java 2007-05-28 19:38:56 UTC (rev 12185)
@@ -16,17 +16,14 @@
package org.drools.reteoo.builder;
-import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.ListIterator;
-import java.util.Map;
import org.drools.common.BetaConstraints;
import org.drools.common.InternalWorkingMemory;
import org.drools.reteoo.ObjectSource;
import org.drools.reteoo.ReteooBuilder;
import org.drools.reteoo.ReteooRuleBase;
-import org.drools.reteoo.ReteooWorkingMemory;
import org.drools.reteoo.TupleSource;
import org.drools.rule.RuleConditionElement;
@@ -44,7 +41,7 @@
private ObjectSource objectSource;
// object type cache to check for cross products
- private Map objectType;
+ private LinkedList objectType;
// offset of the pattern
private int currentPatternOffset;
@@ -70,7 +67,7 @@
this.workingMemories = (InternalWorkingMemory[]) this.rulebase.getWorkingMemories();
this.idGenerator = idGenerator;
- this.objectType = new LinkedHashMap();
+ this.objectType = new LinkedList();
this.buildstack = new LinkedList();
this.tupleSource = null;
@@ -91,7 +88,14 @@
*/
public void setCurrentPatternOffset(final int currentPatternIndex) {
this.currentPatternOffset = currentPatternIndex;
+ this.syncObjectTypesWithPatternOffset();
}
+
+ public void syncObjectTypesWithPatternOffset() {
+ while( this.objectType.size() > this.currentPatternOffset ) {
+ this.objectType.removeLast();
+ }
+ }
/**
* @return the objectSource
@@ -110,14 +114,14 @@
/**
* @return the objectType
*/
- public Map getObjectType() {
+ public LinkedList getObjectType() {
return this.objectType;
}
/**
* @param objectType the objectType to set
*/
- public void setObjectType(final Map objectType) {
+ public void setObjectType(final LinkedList objectType) {
this.objectType = objectType;
}
@@ -141,6 +145,7 @@
public void decrementCurrentPatternOffset() {
this.currentPatternOffset--;
+ this.syncObjectTypesWithPatternOffset();
}
/**
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java 2007-05-28 17:32:28 UTC (rev 12184)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java 2007-05-28 19:38:56 UTC (rev 12185)
@@ -19,7 +19,6 @@
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
-import java.util.Map;
import org.drools.base.ClassObjectType;
import org.drools.common.BetaConstraints;
@@ -27,9 +26,9 @@
import org.drools.reteoo.AlphaNode;
import org.drools.reteoo.ObjectSource;
import org.drools.reteoo.ObjectTypeNode;
-import org.drools.rule.Pattern;
import org.drools.rule.Declaration;
import org.drools.rule.InvalidPatternException;
+import org.drools.rule.Pattern;
import org.drools.rule.RuleConditionElement;
import org.drools.spi.AlphaNodeFieldConstraint;
import org.drools.spi.Constraint;
@@ -143,25 +142,16 @@
// Check if this object type exists before
// If it does we need stop instance equals cross product
final Class thisClass = ((ClassObjectType) pattern.getObjectType()).getClassType();
- for ( final Iterator it = context.getObjectType().entrySet().iterator(); it.hasNext(); ) {
- final Map.Entry entry = (Map.Entry) it.next();
- final Class previousClass = ((ClassObjectType) entry.getKey()).getClassType();
+ for ( final Iterator it = context.getObjectType().iterator(); it.hasNext(); ) {
+ final Pattern previousPattern = (Pattern) it.next();
+ final Class previousClass = ((ClassObjectType) previousPattern.getObjectType()).getClassType();
if ( thisClass.isAssignableFrom( previousClass ) ) {
- patterns = (List) entry.getValue();
- for ( final Iterator patternIter = patterns.iterator(); patternIter.hasNext(); ) {
- betaConstraints.add( new InstanceNotEqualsConstraint( (Pattern) patternIter.next() ) );
- }
+ betaConstraints.add( new InstanceNotEqualsConstraint( previousPattern ) );
}
}
- patterns = (List) context.getObjectType().get( pattern.getObjectType() );
- if ( patterns == null ) {
- patterns = new ArrayList();
- }
- patterns.add( pattern );
// Must be added after the checking, otherwise it matches against itself
- context.getObjectType().put( pattern.getObjectType(),
- patterns );
+ context.getObjectType().add( pattern );
}
}
More information about the jboss-svn-commits
mailing list