[jboss-svn-commits] JBL Code SVN: r5824 - in labs/jbossrules/trunk: drools-compiler/src/test/java/org/drools drools-compiler/src/test/java/org/drools/integrationtests drools-compiler/src/test/resources/org/drools/integrationtests drools-core/src/main/java/org/drools/reteoo

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sat Aug 12 10:33:11 EDT 2006


Author: tirelli
Date: 2006-08-12 10:32:58 -0400 (Sat, 12 Aug 2006)
New Revision: 5824

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_LogicalAssertionWithExists.drl
Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Cheese.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.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/TerminalNode.java
Log:
JBRULES-387:

  * Fixing NOT and JOIN node problems on modify tuple
  * Adding test case



Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Cheese.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Cheese.java	2006-08-12 14:13:27 UTC (rev 5823)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Cheese.java	2006-08-12 14:32:58 UTC (rev 5824)
@@ -43,6 +43,10 @@
         return this.type;
     }
 
+    public void setType( String type ) {
+        this.type = type;
+    }
+
     public void setPrice(final int price) {
         this.price = price;
     }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java	2006-08-12 14:13:27 UTC (rev 5823)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java	2006-08-12 14:32:58 UTC (rev 5824)
@@ -2715,4 +2715,92 @@
         assertEquals(1, list.size() );        
     }
 
+    public void testLogicalAssertionsWithExists() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionWithExists.drl" )) );
+        final Package pkg = builder.getPackage();
+    
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+    
+        Person p1 = new Person( "p1",
+                                "stilton",
+                                20 );
+        p1.setStatus( "europe" );
+        FactHandle c1FactHandle = workingMemory.assertObject( p1 );
+        Person p2 = new Person( "p2",
+                                "stilton",
+                                30 );
+        p2.setStatus( "europe" );
+        FactHandle c2FactHandle = workingMemory.assertObject( p2 );
+        Person p3 = new Person( "p3",
+                                "stilton",
+                                40 );
+        p3.setStatus( "europe" );
+        FactHandle c3FactHandle = workingMemory.assertObject( p3 );
+        workingMemory.fireAllRules();
+        
+        // all 3 in europe, so, 2 cheese
+        List cheeseList = workingMemory.getObjects( String.class );
+        assertEquals( 2,
+                      cheeseList.size() );
+        
+        // europe=[ 1, 2 ], america=[ 3 ]
+        p3.setStatus( "america" );
+        workingMemory.modifyObject( c3FactHandle,
+                                    p3 );
+        workingMemory.fireAllRules();
+        cheeseList = workingMemory.getObjects( String.class );
+        assertEquals( 1,
+                      cheeseList.size() );
+        
+        // europe=[ 1 ], america=[ 2, 3 ]
+        p2.setStatus( "america" );
+        workingMemory.modifyObject( c2FactHandle,
+                                    p2 );
+        workingMemory.fireAllRules();
+        cheeseList = workingMemory.getObjects( String.class );
+        assertEquals( 1,
+                      cheeseList.size() );
+        
+        // europe=[ ], america=[ 1, 2, 3 ]
+        p1.setStatus( "america" );
+        workingMemory.modifyObject( c1FactHandle,
+                                    p1 );
+        workingMemory.fireAllRules();
+        cheeseList = workingMemory.getObjects( String.class );
+        assertEquals( 2,
+                      cheeseList.size() );
+        
+        // europe=[ 2 ], america=[ 1, 3 ]
+        p2.setStatus( "europe" );
+        workingMemory.modifyObject( c2FactHandle,
+                                    p2 );
+        workingMemory.fireAllRules();
+        cheeseList = workingMemory.getObjects( String.class );
+        assertEquals( 1,
+                      cheeseList.size() );
+        
+        // europe=[ 1, 2 ], america=[ 3 ]
+        p1.setStatus( "europe" );
+        workingMemory.modifyObject( c1FactHandle,
+                                    p1 );
+        workingMemory.fireAllRules();
+        cheeseList = workingMemory.getObjects( String.class );
+        assertEquals( 1,
+                      cheeseList.size() );
+        
+        // europe=[ 1, 2, 3 ], america=[ ]
+        p3.setStatus( "europe" );
+        workingMemory.modifyObject( c3FactHandle,
+                                    p3 );
+        workingMemory.fireAllRules();
+        cheeseList = workingMemory.getObjects( String.class );
+        assertEquals( 2,
+                      cheeseList.size() );
+        
+        
+    }
+
 }

Copied: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_LogicalAssertionWithExists.drl (from rev 5823, labs/jbossrules/branches/3.0.x/drools-compiler/src/test/resources/org/drools/integrationtests/test_LogicalAssertionWithExists.drl)

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	2006-08-12 14:13:27 UTC (rev 5823)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java	2006-08-12 14:32:58 UTC (rev 5824)
@@ -17,6 +17,7 @@
  */
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -258,6 +259,11 @@
                          context,
                          workingMemory );
         } else {
+            // TIRELLI's NOTE: the following is necessary because in case memory  
+            // indexing is enabled, the loop over right objects may skip some of the
+            // previously matched objects
+            final Map oldMatches = new HashMap(matches);
+            
             // ensure the tuple is at the top of the memory
             memory.add( workingMemory,
                         leftTuple );
@@ -271,7 +277,7 @@
                 if ( binder.isAllowed( handle,
                                        leftTuple,
                                        workingMemory ) ) {
-                    TupleMatch tupleMatch = (TupleMatch) leftTuple.getTupleMatches().get( handle );
+                    TupleMatch tupleMatch = (TupleMatch) oldMatches.remove( handle );
                     if ( tupleMatch != null ) {
                         // ensures tupleMatch will be in the appropriate order
                         objectMatches.remove( tupleMatch );
@@ -294,6 +300,7 @@
                 } else {
                     final TupleMatch tupleMatch = leftTuple.removeMatch( handle );
                     if ( tupleMatch != null ) {
+                        oldMatches.remove( handle );
                         objectMatches.remove( tupleMatch );
                         propagateRetractTuple( tupleMatch,
                                                context,
@@ -301,6 +308,16 @@
                     }
                 }
             }
+            
+            // TIRELLI's NOTE: the following is necessary because in case memory  
+            // indexing is enabled, the loop over right objects may skip some of the
+            // previously matched objects
+            if(!oldMatches.isEmpty()) {
+                for(Iterator it = oldMatches.values().iterator(); it.hasNext(); ) {
+                    final TupleMatch tupleMatch = (TupleMatch) it.next();
+                    tupleMatch.getObjectMatches().remove( tupleMatch );
+                }
+            }
         }
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java	2006-08-12 14:13:27 UTC (rev 5823)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java	2006-08-12 14:32:58 UTC (rev 5824)
@@ -225,14 +225,18 @@
                             final PropagationContext context,
                             final ReteooWorkingMemory workingMemory) {
         // We have to remove and assert the new tuple as it has modified facts and thus its tuple is newer
-        if ( tuple.getActivation().isActivated() ) {
-            tuple.getActivation().remove();
+        boolean fireActivation = true;
+        Activation activation = tuple.getActivation();
+        
+        if ( activation.isActivated() ) {
+            activation.remove();
+            fireActivation = false;
         }
+
         assertTuple( tuple,
                      context,
                      workingMemory,
-                     false );
-
+                     fireActivation );
     }
 
     public String toString() {




More information about the jboss-svn-commits mailing list