[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