[jboss-svn-commits] JBL Code SVN: r18351 - in labs/jbossrules/branches/4.0.x: 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
Wed Feb 6 13:22:34 EST 2008


Author: tirelli
Date: 2008-02-06 13:22:34 -0500 (Wed, 06 Feb 2008)
New Revision: 18351

Added:
   labs/jbossrules/branches/4.0.x/drools-compiler/src/test/resources/org/drools/integrationtests/test_DynamicRulesWithSubnetwork.drl
   labs/jbossrules/branches/4.0.x/drools-compiler/src/test/resources/org/drools/integrationtests/test_DynamicRulesWithSubnetwork1.drl
   labs/jbossrules/branches/4.0.x/drools-compiler/src/test/resources/org/drools/integrationtests/test_DynamicRulesWithSubnetwork2.drl
Modified:
   labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/OrderItem.java
   labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java
   labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/common/BaseNode.java
   labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java
   labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/BetaNode.java
   labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/CollectNode.java
   labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java
   labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/FromNode.java
   labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java
   labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/ObjectSource.java
   labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
   labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/QueryTerminalNode.java
   labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/Rete.java
   labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java
   labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java
   labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java
   labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/TupleSource.java
   labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/builder/BuildUtils.java
   labs/jbossrules/branches/4.0.x/drools-core/src/test/java/org/drools/reteoo/BaseNodeTest.java
   labs/jbossrules/branches/4.0.x/drools-core/src/test/java/org/drools/reteoo/MockObjectSource.java
   labs/jbossrules/branches/4.0.x/drools-core/src/test/java/org/drools/reteoo/MockTupleSink.java
   labs/jbossrules/branches/4.0.x/drools-core/src/test/java/org/drools/reteoo/MockTupleSource.java
Log:
JBRULES-1315: fixing rule removal

Modified: labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/OrderItem.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/OrderItem.java	2008-02-06 18:19:15 UTC (rev 18350)
+++ labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/OrderItem.java	2008-02-06 18:22:34 UTC (rev 18351)
@@ -20,10 +20,19 @@
  * @author etirelli
  *
  */
-public class OrderItem {
+public class OrderItem implements java.io.Serializable {
+    private static final long serialVersionUID = -7287814895557751224L;
+    
+    public static final int TYPE_BOOK = 1;
+    public static final int TYPE_CD = 2;
+    
+    private String name;
+    private int type;
+    private int price;
     private int   seq;
     private Order order;
 
+
     public OrderItem() {
         this( null,
               0 );
@@ -35,6 +44,38 @@
         this.seq = seq;
     }
 
+    public OrderItem(Order order, int seq, String name, int type, int price) {
+        this.order = order;
+        this.seq = seq;
+        this.name = name;
+        this.type = type;
+        this.price = price;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+    
+    public int getType() {
+        return type;
+    }
+    
+    public void setType(int type) {
+        this.type = type;
+    }
+
+    public int getPrice() {
+        return price;
+    }
+
+    public void setPrice(int price) {
+        this.price = price;
+    }
+
     /**
      * @return the order
      */

Modified: labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java	2008-02-06 18:19:15 UTC (rev 18350)
+++ labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java	2008-02-06 18:22:34 UTC (rev 18351)
@@ -20,6 +20,8 @@
 import org.drools.Cheese;
 import org.drools.FactA;
 import org.drools.FactB;
+import org.drools.Order;
+import org.drools.OrderItem;
 import org.drools.Person;
 import org.drools.PersonInterface;
 import org.drools.Precondition;
@@ -593,6 +595,194 @@
         }
     }
 
+    public void testDynamicRuleRemovalsSubNetwork() throws Exception {
+
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DynamicRulesWithSubnetwork1.drl" ) ) );
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DynamicRulesWithSubnetwork.drl" ) ) );
+        final Package pkg = serialisePackage( builder.getPackage() );
+
+        org.drools.reteoo.ReteooRuleBase reteooRuleBase = null;
+        final RuleBase ruleBase = getRuleBase();
+        reteooRuleBase = (org.drools.reteoo.ReteooRuleBase) ruleBase;
+        ruleBase.addPackage( pkg );
+        final PackageBuilder builder2 = new PackageBuilder();
+        builder2.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DynamicRulesWithSubnetwork2.drl" ) ) );
+        ruleBase.addPackage( serialisePackage( builder2.getPackage() ) );
+
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+        final List list = new ArrayList();
+        workingMemory.setGlobal( "results",
+                                 list );
+        
+        Order order = new Order();
+        
+        OrderItem item1 = new OrderItem(order, 1, "Adventure Guide Brazil", OrderItem.TYPE_BOOK, 24);
+        order.addItem(item1);
+        workingMemory.insert(item1);
+        
+        OrderItem item2 = new OrderItem(order, 2, "Prehistoric Britain", OrderItem.TYPE_BOOK, 15);
+        order.addItem(item2);
+        workingMemory.insert(item2);
+        
+        OrderItem item3 = new OrderItem(order, 3, "Holiday Music", OrderItem.TYPE_CD, 9);
+        order.addItem(item3);
+        workingMemory.insert(item3);
+        
+        OrderItem item4 = new OrderItem(order, 4, "Very Best of Mick Jagger", OrderItem.TYPE_CD, 11);
+        order.addItem(item4);
+        workingMemory.insert(item4);
+        
+        workingMemory.insert(order);
+
+        assertEquals( 11,
+                      workingMemory.getAgenda().getActivations().length );
+
+        reteooRuleBase.removeRule( "org.drools",
+                                   "Apply Discount on all books" );
+        assertEquals( 10,
+                      workingMemory.getAgenda().getActivations().length );
+
+        reteooRuleBase.removeRule( "org.drools",
+                                   "like book" );
+
+        final OrderItem item5 = new OrderItem(order, 5, "Sinatra : Vegas", OrderItem.TYPE_CD,
+                                             5 );
+        assertEquals( 8,
+                      workingMemory.getAgenda().getActivations().length );
+
+        workingMemory.insert( item5 );
+
+        assertEquals( 10,
+                      workingMemory.getAgenda().getActivations().length );
+
+        reteooRuleBase.removePackage( "org.drools" );
+
+        assertEquals( 0,
+                      workingMemory.getAgenda().getActivations().length );
+    }
+
+    public void testDynamicRuleRemovalsUnusedWorkingMemorySubNetwork() throws Exception {
+
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DynamicRulesWithSubnetwork1.drl" ) ) );
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DynamicRulesWithSubnetwork2.drl" ) ) );
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DynamicRulesWithSubnetwork.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        org.drools.reteoo.ReteooRuleBase reteooRuleBase = null;
+
+        final RuleBase ruleBase = getRuleBase();
+        reteooRuleBase = (org.drools.reteoo.ReteooRuleBase) ruleBase;
+
+        ruleBase.addPackage( pkg );
+
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+        if ( reteooRuleBase != null ) {
+            assertEquals( 1,
+                          reteooRuleBase.getPackages().length );
+            assertEquals( 4,
+                          reteooRuleBase.getPackages()[0].getRules().length );
+
+            reteooRuleBase.removeRule( "org.drools",
+                                       "Apply Discount on all books" );
+            assertEquals( 3,
+                          reteooRuleBase.getPackages()[0].getRules().length );
+
+            reteooRuleBase.removeRule( "org.drools",
+                                       "like book" );
+            assertEquals( 2,
+                          reteooRuleBase.getPackages()[0].getRules().length );
+
+            reteooRuleBase.removePackage( "org.drools" );
+            assertEquals( 0,
+                          reteooRuleBase.getPackages().length );
+        }
+    }
+
+
+    public void testRemovePackageSubNetwork() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DynamicRulesWithSubnetwork.drl" ) ) );
+
+        final RuleBase ruleBase = getRuleBase();
+        final String packageName = builder.getPackage().getName();
+        ruleBase.addPackage( serialisePackage( builder.getPackage() ) );
+
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        List results = new ArrayList();
+        workingMemory.setGlobal( "results", results );
+
+        Order order = new Order();
+        
+        OrderItem item1 = new OrderItem(order, 1, "Adventure Guide Brazil", OrderItem.TYPE_BOOK, 24);
+        OrderItem item2 = new OrderItem(order, 2, "Prehistoric Britain", OrderItem.TYPE_BOOK, 15);
+        OrderItem item3 = new OrderItem(order, 3, "Holiday Music", OrderItem.TYPE_CD, 9);
+        OrderItem item4 = new OrderItem(order, 4, "Very Best of Mick Jagger", OrderItem.TYPE_CD, 11);
+        OrderItem item5 = new OrderItem(order, 5, "The Master and Margarita", OrderItem.TYPE_BOOK, 29);
+        
+        order.addItem( item1 );
+        order.addItem( item2 );
+        order.addItem( item3 );
+        order.addItem( item4 );
+        order.addItem( item5 );
+        
+        workingMemory.insert( order );
+        workingMemory.fireAllRules();
+        assertEquals( 1, results.size() );
+        assertEquals( 3, ((List) results.get(0)).size() );
+        results.clear();
+
+        final RuleBase ruleBaseWM = workingMemory.getRuleBase();
+        ruleBaseWM.removePackage( packageName );
+        final PackageBuilder builder1 = new PackageBuilder();
+        builder1.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DynamicRulesWithSubnetwork.drl" ) ) );
+        ruleBaseWM.addPackage( serialisePackage( builder1.getPackage() ) );
+        workingMemory.fireAllRules();
+        assertEquals( 1, results.size() );
+        assertEquals( 3, ((List) results.get(0)).size() );
+        results.clear();
+
+        ruleBaseWM.removePackage( packageName );
+        ruleBaseWM.addPackage( serialisePackage( builder1.getPackage() ) );
+        assertEquals( 1, results.size() );
+        assertEquals( 3, ((List) results.get(0)).size() );
+        results.clear();
+
+        ruleBaseWM.removePackage( packageName );
+        ruleBaseWM.addPackage( serialisePackage( builder1.getPackage() ) );
+        assertEquals( 1, results.size() );
+        assertEquals( 3, ((List) results.get(0)).size() );
+        results.clear();
+    }
+
+
+    public void testRuleBaseAddRemoveSubNetworks() throws Exception {
+        try {
+            RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+
+            //add and remove
+            PackageBuilder builder = new PackageBuilder();
+            builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DynamicRulesWithSubnetwork.drl" ) ) );
+            Package pkg = serialisePackage( builder.getPackage() );
+            ruleBase.addPackage( pkg );
+            ruleBase.removePackage( pkg.getName() );
+
+            //add and remove again
+            builder = new PackageBuilder();
+            builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DynamicRulesWithSubnetwork.drl" ) ) );
+            pkg = serialisePackage( builder.getPackage() );
+            ruleBase.addPackage( pkg );
+            ruleBase.removePackage( pkg.getName() );
+        } catch ( Exception e ) {
+            e.printStackTrace();
+            fail("Should not raise any exception");
+        }
+    }
+
+    
     public class SubvertedClassLoader extends URLClassLoader {
 
         private static final long serialVersionUID = 400L;

Added: labs/jbossrules/branches/4.0.x/drools-compiler/src/test/resources/org/drools/integrationtests/test_DynamicRulesWithSubnetwork.drl
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-compiler/src/test/resources/org/drools/integrationtests/test_DynamicRulesWithSubnetwork.drl	                        (rev 0)
+++ labs/jbossrules/branches/4.0.x/drools-compiler/src/test/resources/org/drools/integrationtests/test_DynamicRulesWithSubnetwork.drl	2008-02-06 18:22:34 UTC (rev 18351)
@@ -0,0 +1,14 @@
+package org.drools;
+ 
+import java.util.ArrayList
+ 
+global java.util.List results; 
+ 
+rule "Apply Discount on all books"
+	when
+		$order : Order()
+		$items : ArrayList() from collect (OrderItem(type == OrderItem.TYPE_BOOK) from $order.itemsValues)
+	then
+	    results.add( $items );
+end
+

Added: labs/jbossrules/branches/4.0.x/drools-compiler/src/test/resources/org/drools/integrationtests/test_DynamicRulesWithSubnetwork1.drl
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-compiler/src/test/resources/org/drools/integrationtests/test_DynamicRulesWithSubnetwork1.drl	                        (rev 0)
+++ labs/jbossrules/branches/4.0.x/drools-compiler/src/test/resources/org/drools/integrationtests/test_DynamicRulesWithSubnetwork1.drl	2008-02-06 18:22:34 UTC (rev 18351)
@@ -0,0 +1,10 @@
+package org.drools;
+ 
+global java.util.List results
+
+rule "like book"
+    when
+        OrderItem( type:type == OrderItem.TYPE_BOOK, price >= 15 )
+    then
+		results.add( type );
+end  

Added: labs/jbossrules/branches/4.0.x/drools-compiler/src/test/resources/org/drools/integrationtests/test_DynamicRulesWithSubnetwork2.drl
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-compiler/src/test/resources/org/drools/integrationtests/test_DynamicRulesWithSubnetwork2.drl	                        (rev 0)
+++ labs/jbossrules/branches/4.0.x/drools-compiler/src/test/resources/org/drools/integrationtests/test_DynamicRulesWithSubnetwork2.drl	2008-02-06 18:22:34 UTC (rev 18351)
@@ -0,0 +1,17 @@
+package org.drools;
+ 
+global java.util.List results
+
+rule "like OrderItem"
+    when
+        OrderItem( t:type )
+    then
+		results.add( t );
+end    
+
+rule "like OrderItem2"
+    when
+        OrderItem( t:type )
+    then
+		results.add( t );
+end    

Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/common/BaseNode.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/common/BaseNode.java	2008-02-06 18:19:15 UTC (rev 18350)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/common/BaseNode.java	2008-02-06 18:22:34 UTC (rev 18351)
@@ -1,5 +1,7 @@
 package org.drools.common;
 
+import org.drools.reteoo.RuleRemovalContext;
+
 /*
  * Copyright 2005 JBoss Inc
  * 
@@ -28,8 +30,6 @@
     NetworkNode {
     protected final int id;
 
-    protected int       sharedCount = 0;
-
     /**
      * All nodes have a unique id, set in the constructor.
      * 
@@ -59,64 +59,16 @@
      * Removes the node from teh network. Usually from the parent <code>ObjectSource</code> or <code>TupleSource</code>
      *
      */
-    public abstract void remove(BaseNode node,
+    public abstract void remove(RuleRemovalContext context,
+                                BaseNode node,
                                 InternalWorkingMemory[] workingMemories);
 
-    //    /**
-    //     * When nodes are added to the network that already has data. that existing data must be repropagated to the new node.
-    //     * This new propagation may result in one or more assertions, so a PropagationContext and the workingMemory for the facts
-    //     * must be provided.
-    //     * 
-    //     * @param workingMemory
-    //     *      The WorkingMemory
-    //     * @param context
-    //     *      The PropagationContext
-    //     *      
-    //     */
-    //    public abstract void updateNewNode(InternalWorkingMemory workingMemory,
-    //                                       PropagationContext context);    
-
     /**
-     * Each time a node is shared a counter is increased.
-     *
-     */
-    public void addShare() {
-        ++this.sharedCount;
-    }
-
-    /**
-     * Each time a node is unshared a counter is decreased.
-     *
-     */
-    public void removeShare() {
-        --this.sharedCount;
-    }
-
-    /**
-     * Indicates whether the node is shared.
-     * @return
-     */
-    public boolean isShared() {
-        return this.sharedCount > 0;
-    }
-
-    /**
      * Returns true in case the current node is in use (is referenced by any other node)
      * @return
      */
-    public boolean isInUse() {
-        return this.sharedCount >= 0;
-    }
+    public abstract boolean isInUse();
 
-    /**
-     * Returns the number of times the node is shared
-     * @return
-     *      int value indicating the share count.
-     */
-    public int getSharedCount() {
-        return this.sharedCount;
-    }
-
     /** 
      * The hashCode return is simply the unique id of the node. It is expected that base classes will also implement equals(Object object). 
      */

Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java	2008-02-06 18:19:15 UTC (rev 18350)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java	2008-02-06 18:22:34 UTC (rev 18351)
@@ -185,19 +185,19 @@
         }
     }
 
-    public void remove(final BaseNode node,
+    public void remove(final RuleRemovalContext context,
+                       final BaseNode node,
                        final InternalWorkingMemory[] workingMemories) {
-
         if ( !node.isInUse() ) {
             removeObjectSink( (ObjectSink) node );
         }
-        removeShare();
         if ( !this.isInUse() ) {
             for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
                 workingMemories[i].clearNodeMemory( this );
             }
         }
-        this.objectSource.remove( this,
+        this.objectSource.remove( context,
+                                  this,
                                   workingMemories );
     }
 

Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/BetaNode.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/BetaNode.java	2008-02-06 18:19:15 UTC (rev 18350)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/BetaNode.java	2008-02-06 18:22:34 UTC (rev 18351)
@@ -22,7 +22,6 @@
 import org.drools.RuleBaseConfiguration;
 import org.drools.common.BaseNode;
 import org.drools.common.BetaConstraints;
-import org.drools.common.EmptyBetaConstraints;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.NodeMemory;
 import org.drools.common.PropagationContextImpl;
@@ -156,22 +155,27 @@
 
     }
 
-    public void remove(final BaseNode node,
+    public void remove(final RuleRemovalContext context,
+                       final BaseNode node,
                        final InternalWorkingMemory[] workingMemories) {
+        context.visitTupleSource( this );
         if ( !node.isInUse() ) {
             removeTupleSink( (TupleSink) node );
         }
-        removeShare();
-
         if ( !this.isInUse() ) {
             for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
                 workingMemories[i].clearNodeMemory( this );
             }
         }
-        this.rightInput.remove( this,
+        this.rightInput.remove( context,
+                                this,
                                 workingMemories );
-        this.leftInput.remove( this,
-                               workingMemories );
+        
+        if( !context.alreadyVisited( this.leftInput )) {
+            this.leftInput.remove( context,
+                                   this,
+                                   workingMemories );
+        }
 
     }
 

Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/CollectNode.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/CollectNode.java	2008-02-06 18:19:15 UTC (rev 18350)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/CollectNode.java	2008-02-06 18:22:34 UTC (rev 18351)
@@ -20,7 +20,6 @@
 import java.util.Collection;
 
 import org.drools.common.BetaConstraints;
-import org.drools.common.EmptyBetaConstraints;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.builder.BuildContext;

Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java	2008-02-06 18:19:15 UTC (rev 18350)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java	2008-02-06 18:22:34 UTC (rev 18351)
@@ -219,19 +219,23 @@
         }
     }
 
-    public void remove(final BaseNode node,
+    public void remove(final RuleRemovalContext context,
+                       final BaseNode node,
                        final InternalWorkingMemory[] workingMemories) {
+        context.visitTupleSource( this );
         if ( !node.isInUse() ) {
             removeTupleSink( (TupleSink) node );
         }
-        removeShare();
         if ( !this.isInUse() ) {
             for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
                 workingMemories[i].clearNodeMemory( this );
             }
         }
-        this.tupleSource.remove( this,
-                                 workingMemories );
+        if( ! context.alreadyVisited( this.tupleSource ) ) {
+            this.tupleSource.remove( context,
+                                     this,
+                                     workingMemories );
+        }
 
     }
     

Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/FromNode.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/FromNode.java	2008-02-06 18:19:15 UTC (rev 18350)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/FromNode.java	2008-02-06 18:22:34 UTC (rev 18351)
@@ -32,9 +32,9 @@
 
     private TupleSinkNode              previousTupleSinkNode;
     private TupleSinkNode              nextTupleSinkNode;
-    
-    protected boolean                 tupleMemoryEnabled;      
 
+    protected boolean                  tupleMemoryEnabled;
+
     public FromNode(final int id,
                     final DataProvider dataProvider,
                     final TupleSource tupleSource,
@@ -93,9 +93,9 @@
                                                 workingMemory );
             }
         }
-        
+
         this.betaConstraints.resetTuple();
-        
+
         if ( !list.isEmpty() ) {
             memory.getCreatedHandles().put( leftTuple,
                                             list );
@@ -143,21 +143,25 @@
         }
     }
 
-    public void remove(final BaseNode node,
+    public void remove(final RuleRemovalContext context,
+                       final BaseNode node,
                        final InternalWorkingMemory[] workingMemories) {
 
+        context.visitTupleSource( this );
+
         if ( !node.isInUse() ) {
             removeTupleSink( (TupleSink) node );
         }
-        removeShare();
-
         if ( !this.isInUse() ) {
             for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
                 workingMemories[i].clearNodeMemory( this );
             }
         }
-        this.tupleSource.remove( this,
-                                 workingMemories );
+        if ( !context.alreadyVisited( this.tupleSource ) ) {
+            this.tupleSource.remove( context,
+                                     this,
+                                     workingMemories );
+        }
     }
 
     public void updateSink(final TupleSink sink,
@@ -174,11 +178,10 @@
             }
             for ( LinkedListEntry entry = (LinkedListEntry) list.getFirst(); entry != null; entry = (LinkedListEntry) entry.getNext() ) {
                 final InternalFactHandle handle = (InternalFactHandle) entry.getObject();
-                this.sink.propagateRetractTuple( tuple,
-                                                 handle,
-                                                 context,
-                                                 workingMemory );
-                workingMemory.getFactHandleFactory().destroyFactHandle( handle );
+                this.sink.propagateAssertTuple( tuple,
+                                                handle,
+                                                context,
+                                                workingMemory );
             }
         }
     }
@@ -187,14 +190,14 @@
         return new BetaMemory( new TupleHashTable(),
                                null );
     }
-    
+
     public boolean isTupleMemoryEnabled() {
         return tupleMemoryEnabled;
     }
 
     public void setTupleMemoryEnabled(boolean tupleMemoryEnabled) {
         this.tupleMemoryEnabled = tupleMemoryEnabled;
-    }    
+    }
 
     /**
      * Returns the next node

Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java	2008-02-06 18:19:15 UTC (rev 18350)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java	2008-02-06 18:22:34 UTC (rev 18351)
@@ -175,18 +175,20 @@
         }
     }
 
-    public void remove(final BaseNode node,
+    public void remove(final RuleRemovalContext context,
+                       final BaseNode node,
                        final InternalWorkingMemory[] workingMemories) {
+        context.visitTupleSource( this );
         if ( !node.isInUse() ) {
             removeTupleSink( (TupleSink) node );
         }
-        removeShare();
         if ( !this.isInUse() ) {
             for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
                 workingMemories[i].clearNodeMemory( this );
             }
         }
-        this.objectSource.remove( this,
+        this.objectSource.remove( context, 
+                                  this,
                                   workingMemories );
     }    
     

Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/ObjectSource.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/ObjectSource.java	2008-02-06 18:19:15 UTC (rev 18350)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/ObjectSource.java	2008-02-06 18:22:34 UTC (rev 18351)
@@ -134,4 +134,8 @@
     public ObjectSinkPropagator getSinkPropagator() {
         return this.sink;
     }
+    
+    public boolean isInUse() {
+        return this.sink.size() > 0;
+    }
 }

Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java	2008-02-06 18:19:15 UTC (rev 18350)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java	2008-02-06 18:22:34 UTC (rev 18351)
@@ -220,29 +220,22 @@
         }
     }
 
-    public void remove(final BaseNode node,
+    public void remove(final RuleRemovalContext context,
+                       final BaseNode node,
                        final InternalWorkingMemory[] workingMemories) {
         if ( !node.isInUse() ) {
             removeObjectSink( (ObjectSink) node );
         }
-        removeShare();
-        if ( !this.isInUse() ) {
-            for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
-                workingMemories[i].clearNodeMemory( this );
-            }
-            this.rete.removeObjectSink( this );
-        }
+        // JBRULES-1315: never remove OTNs
+//        if ( !this.isInUse() ) {
+//            for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
+//                workingMemories[i].clearNodeMemory( this );
+//            }
+//            this.rete.removeObjectSink( this );
+//        }
     }
 
     /**
-     * Rete needs to know that this ObjectTypeNode has had new nodes attached to
-     * it one one of its ancestors
-     */
-    public void addShare() {
-        super.addShare();
-    }
-
-    /**
      * Creates memory for the node using PrimitiveLongMap as its optimised for storage and reteivals of Longs.
      * However PrimitiveLongMap is not ideal for spase data. So it should be monitored incase its more optimal
      * to switch back to a standard HashMap.

Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/QueryTerminalNode.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/QueryTerminalNode.java	2008-02-06 18:19:15 UTC (rev 18350)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/QueryTerminalNode.java	2008-02-06 18:22:34 UTC (rev 18351)
@@ -150,18 +150,24 @@
         }
     }
 
-    public void remove(final BaseNode node,
+    public void remove(final RuleRemovalContext context,
+                       final BaseNode node,
                        final InternalWorkingMemory[] workingMemories) {
         for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
             workingMemories[i].clearNodeMemory( this );
         }
         
-        removeShare();
-        
-        this.tupleSource.remove( this,
-                                 workingMemories );
+        if( ! context.alreadyVisited( this.tupleSource ) ) {
+            this.tupleSource.remove( context,
+                                     this,
+                                     workingMemories );
+        }
     }
 
+    public boolean isInUse() {
+        return false;
+    }
+
     public void updateNewNode(final InternalWorkingMemory workingMemory,
                               final PropagationContext context) {
         // There are no child nodes to update, do nothing.

Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/Rete.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/Rete.java	2008-02-06 18:19:15 UTC (rev 18350)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/Rete.java	2008-02-06 18:22:34 UTC (rev 18351)
@@ -243,7 +243,8 @@
         throw new UnsupportedOperationException( "cannot call attach() from the root Rete node" );
     }
 
-    public void remove(final BaseNode node,
+    public void remove(final RuleRemovalContext context,
+                       final BaseNode node,
                        final InternalWorkingMemory[] workingMemories) {
         final ObjectTypeNode objectTypeNode = (ObjectTypeNode) node;
         removeObjectSink( objectTypeNode );
@@ -436,6 +437,8 @@
 
             ObjectType objectType = new ClassObjectType( clazz );
             this.concreteObjectTypeNode = (ObjectTypeNode) ruleBase.getRete().getObjectTypeNodes().get( objectType );
+            
+            // JBRULES-1315: do not add OTN dynamically anymore
             if ( this.concreteObjectTypeNode == null ) {
                 BuildContext context = new BuildContext( ruleBase,
                                                          ((ReteooRuleBase) ruleBase.getRete().getRuleBase()).getReteooBuilder().getIdGenerator() );
@@ -468,6 +471,10 @@
         public ObjectTypeNode getConcreteObjectTypeNode() {
             return this.concreteObjectTypeNode;
         }
+        
+        public void setConcreteObjectTypeNode( ObjectTypeNode node ) {
+            this.concreteObjectTypeNode = node;
+        }
 
         private void defineShadowProxyData(Class clazz) {
             Rete rete = this.ruleBase.getRete();

Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java	2008-02-06 18:19:15 UTC (rev 18350)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java	2008-02-06 18:22:34 UTC (rev 18351)
@@ -220,10 +220,13 @@
         final Object object = this.rules.remove( rule );
 
         final BaseNode[] nodes = (BaseNode[]) object;
+        final RuleRemovalContext context = new RuleRemovalContext();
         for ( int i = 0, length = nodes.length; i < length; i++ ) {
             final BaseNode node = nodes[i];
-            node.remove( null,
+            node.remove( context,
+                         null,
                          this.workingMemories );
+            context.clear();
         }
     }
 

Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java	2008-02-06 18:19:15 UTC (rev 18350)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java	2008-02-06 18:22:34 UTC (rev 18351)
@@ -165,14 +165,17 @@
         }
     }
 
-    public void remove(final BaseNode node,
+    public void remove(final RuleRemovalContext context,
+                       final BaseNode node,
                        final InternalWorkingMemory[] workingMemories) {
         if ( !node.isInUse() ) {
             removeObjectSink( (ObjectSink) node );
         }
-        removeShare();
-        this.tupleSource.remove( this,
-                                 workingMemories );
+        if( ! context.alreadyVisited( this.tupleSource ) ) {
+            this.tupleSource.remove( context,
+                                     this,
+                                     workingMemories );
+        }
     }
     
     public boolean isTupleMemoryEnabled() {

Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java	2008-02-06 18:19:15 UTC (rev 18350)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java	2008-02-06 18:22:34 UTC (rev 18351)
@@ -432,7 +432,8 @@
         }
     }
 
-    public void remove(final BaseNode node,
+    public void remove(final RuleRemovalContext context,
+                       final BaseNode node,
                        final InternalWorkingMemory[] workingMemories) {
         for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
             final InternalWorkingMemory workingMemory = workingMemories[i];
@@ -461,12 +462,17 @@
             workingMemory.clearNodeMemory( this );
         }
 
-        removeShare();
-        
-        this.tupleSource.remove( this,
-                                 workingMemories );
+        if( !context.alreadyVisited( this.tupleSource ) ) {
+            this.tupleSource.remove( context, 
+                                     this,
+                                     workingMemories );
+        }
     }
 
+    public boolean isInUse() {
+        return false;
+    }
+
     public Object createMemory(final RuleBaseConfiguration config) {
         return new TerminalNodeMemory();
     }

Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/TupleSource.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/TupleSource.java	2008-02-06 18:19:15 UTC (rev 18350)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/TupleSource.java	2008-02-06 18:22:34 UTC (rev 18351)
@@ -112,5 +112,9 @@
 
     public abstract void updateSink(TupleSink sink,
                                     PropagationContext context,
-                                    InternalWorkingMemory workingMemory);    
+                                    InternalWorkingMemory workingMemory);
+    
+    public boolean isInUse() {
+        return this.sink.size() > 0;
+    }
 }

Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/builder/BuildUtils.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/builder/BuildUtils.java	2008-02-06 18:19:15 UTC (rev 18350)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/reteoo/builder/BuildUtils.java	2008-02-06 18:22:34 UTC (rev 18351)
@@ -93,7 +93,6 @@
             otn = (ObjectTypeNode) context.getRuleBase().getRete().getObjectTypeNodes().get( otn.getObjectType() );
             if ( otn != null ) {
                 node = otn;
-                node.addShare();
             }
         } else if( isSharingEnabledForNode( context, candidate ) ) {
             if ( (context.getTupleSource() != null) && ( candidate instanceof TupleSink ) ) {
@@ -119,7 +118,6 @@
                 // shared node found
                 // undo previous id assignment
                 context.releaseLastId();
-                node.addShare();
             }
         }
         

Modified: labs/jbossrules/branches/4.0.x/drools-core/src/test/java/org/drools/reteoo/BaseNodeTest.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/test/java/org/drools/reteoo/BaseNodeTest.java	2008-02-06 18:19:15 UTC (rev 18350)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/test/java/org/drools/reteoo/BaseNodeTest.java	2008-02-06 18:22:34 UTC (rev 18351)
@@ -60,7 +60,8 @@
 
         }
 
-        public void remove(final BaseNode node,
+        public void remove(final RuleRemovalContext context,
+                           final BaseNode node,
                            final InternalWorkingMemory[] workingMemories) {
             // TODO Auto-generated method stub
 
@@ -71,6 +72,10 @@
 
         }
 
+        public boolean isInUse() {
+            return true;
+        }
+
     }
 
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/4.0.x/drools-core/src/test/java/org/drools/reteoo/MockObjectSource.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/test/java/org/drools/reteoo/MockObjectSource.java	2008-02-06 18:19:15 UTC (rev 18350)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/test/java/org/drools/reteoo/MockObjectSource.java	2008-02-06 18:22:34 UTC (rev 18351)
@@ -71,7 +71,8 @@
         }
     }
 
-    public void remove(final BaseNode node,
+    public void remove(final RuleRemovalContext context,
+                       final BaseNode node,
                        final InternalWorkingMemory[] workingMemories) {
         // TODO Auto-generated method stub
 

Modified: labs/jbossrules/branches/4.0.x/drools-core/src/test/java/org/drools/reteoo/MockTupleSink.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/test/java/org/drools/reteoo/MockTupleSink.java	2008-02-06 18:19:15 UTC (rev 18350)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/test/java/org/drools/reteoo/MockTupleSink.java	2008-02-06 18:22:34 UTC (rev 18351)
@@ -96,7 +96,8 @@
 
     }
 
-    public void remove(final BaseNode node,
+    public void remove(final RuleRemovalContext context,
+                       final BaseNode node,
                        final InternalWorkingMemory[] workingMemories) {
         // TODO Auto-generated method stub
 

Modified: labs/jbossrules/branches/4.0.x/drools-core/src/test/java/org/drools/reteoo/MockTupleSource.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/test/java/org/drools/reteoo/MockTupleSource.java	2008-02-06 18:19:15 UTC (rev 18350)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/test/java/org/drools/reteoo/MockTupleSource.java	2008-02-06 18:22:34 UTC (rev 18351)
@@ -53,7 +53,8 @@
         this.updated++;
     }
 
-    public void remove(final BaseNode node,
+    public void remove(final RuleRemovalContext context,
+                       final BaseNode node,
                        final InternalWorkingMemory[] workingMemories) {
         // TODO Auto-generated method stub
 




More information about the jboss-svn-commits mailing list