[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