[jboss-svn-commits] JBL Code SVN: r32581 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/common and 3 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Thu Apr 15 23:46:08 EDT 2010
Author: tirelli
Date: 2010-04-15 23:46:05 -0400 (Thu, 15 Apr 2010)
New Revision: 32581
Modified:
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BaseNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ConcurrentNodeMemories.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSource.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/PropagationQueuingNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryElementNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryTerminalNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleRemovalContext.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/BuildUtils.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockObjectSource.java
Log:
JBRULES-2312: JBRULES-2465: Fixing node removal and node ID recycling. Test cases added.
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java 2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java 2010-04-16 03:46:05 UTC (rev 32581)
@@ -1,7 +1,12 @@
package org.drools.integrationtests;
+import static org.mockito.Matchers.*;
+import static org.mockito.Mockito.*;
+
+import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
+import java.io.StringReader;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
@@ -23,7 +28,6 @@
import org.drools.Person;
import org.drools.PersonInterface;
import org.drools.Precondition;
-import org.drools.Primitives;
import org.drools.RuleBase;
import org.drools.RuleBaseConfiguration;
import org.drools.RuleBaseFactory;
@@ -35,15 +39,16 @@
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.common.InternalFactHandle;
+import org.drools.compiler.DroolsParserException;
import org.drools.compiler.PackageBuilder;
import org.drools.compiler.PackageBuilderConfiguration;
import org.drools.core.util.DroolsStreamUtils;
import org.drools.definition.KnowledgePackage;
import org.drools.definitions.impl.KnowledgePackageImp;
-import org.drools.impl.StatefulKnowledgeSessionImpl;
+import org.drools.event.rule.AgendaEventListener;
import org.drools.io.ResourceFactory;
import org.drools.marshalling.MarshallerFactory;
-import org.drools.reteoo.ReteooWorkingMemory;
+import org.drools.reteoo.ReteooRuleBase;
import org.drools.rule.Package;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.rule.WorkingMemoryEntryPoint;
@@ -1026,29 +1031,31 @@
ResourceType.DRL );
Collection<KnowledgePackage> pkgs = builder.getKnowledgePackages();
KnowledgePackage pkg = pkgs.iterator().next();
-
+
// serialize out
byte[] out = DroolsStreamUtils.streamOut( ((KnowledgePackageImp) pkg).pkg );
// adding original packages to a kbase just to make sure they are fine
- KnowledgeBaseConfiguration kbaseConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration( null, loader1 );
+ KnowledgeBaseConfiguration kbaseConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration( null,
+ loader1 );
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase( kbaseConf );
kbase.addKnowledgePackages( pkgs );
-
+
// now, create another classloader and make sure it has access to the classes
ClassLoader loader2 = new SubvertedClassLoader( new URL[]{getClass().getResource( "/testEnum.jar" )},
this.getClass().getClassLoader() );
-
+
// create another builder
KnowledgeBuilderConfiguration conf2 = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration( null,
loader2 );
KnowledgeBuilder builder2 = KnowledgeBuilderFactory.newKnowledgeBuilder( conf2 );
builder2.add( ResourceFactory.newByteArrayResource( out ),
- ResourceType.PKG );
+ ResourceType.PKG );
Collection<KnowledgePackage> pkgs2 = builder2.getKnowledgePackages();
-
+
// create another kbase
- KnowledgeBaseConfiguration kbaseConf2 = KnowledgeBaseFactory.newKnowledgeBaseConfiguration( null, loader2 );
+ KnowledgeBaseConfiguration kbaseConf2 = KnowledgeBaseFactory.newKnowledgeBaseConfiguration( null,
+ loader2 );
KnowledgeBase kbase2 = KnowledgeBaseFactory.newKnowledgeBase( kbaseConf2 );
kbase2.addKnowledgePackages( pkgs2 );
@@ -1075,30 +1082,32 @@
ResourceType.DRL );
Collection<KnowledgePackage> pkgs = builder.getKnowledgePackages();
KnowledgePackage pkg = pkgs.iterator().next();
-
+
// serialize out
byte[] out = DroolsStreamUtils.streamOut( pkg );
// adding original packages to a kbase just to make sure they are fine
- KnowledgeBaseConfiguration kbaseConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration( null, loader1 );
+ KnowledgeBaseConfiguration kbaseConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration( null,
+ loader1 );
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase( kbaseConf );
kbase.addKnowledgePackages( pkgs );
-
+
// now, create another classloader and make sure it has access to the classes
ClassLoader loader2 = new SubvertedClassLoader( new URL[]{getClass().getResource( "/testEnum.jar" )},
this.getClass().getClassLoader() );
//loader2.loadClass( "org.drools.Primitives" );
//loader2.loadClass( "org.drools.TestEnum" );
-
+
// set context classloader and use it
ClassLoader ccl = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader( loader2 );
KnowledgePackage pkg2 = (KnowledgePackage) DroolsStreamUtils.streamIn( out );
Collection<KnowledgePackage> pkgs2 = Collections.singleton( pkg2 );
Thread.currentThread().setContextClassLoader( ccl );
-
+
// create another kbase
- KnowledgeBaseConfiguration kbaseConf2 = KnowledgeBaseFactory.newKnowledgeBaseConfiguration( null, loader2 );
+ KnowledgeBaseConfiguration kbaseConf2 = KnowledgeBaseFactory.newKnowledgeBaseConfiguration( null,
+ loader2 );
KnowledgeBase kbase2 = KnowledgeBaseFactory.newKnowledgeBase( kbaseConf2 );
kbase2.addKnowledgePackages( pkgs2 );
@@ -1109,6 +1118,90 @@
}
+ public void testDynamicRuleRemovalsSubNetworkAndNot() throws Exception {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add( ResourceFactory.newInputStreamResource( getClass().getResourceAsStream( "test_DynamicRulesWithNotSubnetwork.drl" ) ),
+ ResourceType.DRL );
+ assertFalse( kbuilder.getErrors().toString(),
+ kbuilder.hasErrors() );
+
+ final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+ final AgendaEventListener alistener = mock( AgendaEventListener.class );
+ ksession.addEventListener( alistener );
+
+ // pattern does not match, so do not activate
+ ksession.insert( new Person( "toni" ) );
+ verify( alistener,
+ never() ).activationCreated( any( org.drools.event.rule.ActivationCreatedEvent.class ) );
+
+ // pattern matches, so create activation
+ ksession.insert( new Person( "bob" ) );
+ verify( alistener,
+ times( 1 ) ).activationCreated( any( org.drools.event.rule.ActivationCreatedEvent.class ) );
+
+ // already active, so no new activation should be created
+ ksession.insert( new Person( "mark" ) );
+ verify( alistener,
+ times( 1 ) ).activationCreated( any( org.drools.event.rule.ActivationCreatedEvent.class ) );
+
+ kbase.removeKnowledgePackage( "org.drools" );
+
+ assertEquals( 0,
+ kbase.getKnowledgePackages().size() );
+
+ // lets re-compile and add it again
+ kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add( ResourceFactory.newInputStreamResource( getClass().getResourceAsStream( "test_DynamicRulesWithNotSubnetwork.drl" ) ),
+ ResourceType.DRL );
+ assertFalse( kbuilder.getErrors().toString(),
+ kbuilder.hasErrors() );
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ // rule should be reactivated, since data is still in the session
+ verify( alistener,
+ times( 2 ) ).activationCreated( any( org.drools.event.rule.ActivationCreatedEvent.class ) );
+
+ }
+
+ public void testSharedLIANodeRemoval() throws IOException, DroolsParserException {
+ String str = "global java.util.List list;\n";
+ str += "rule \"test\"\n";
+ str += "when\n";
+ str += " exists(eval(true))\n";
+ str += "then\n";
+ str += " list.add(\"fired\");\n";
+ str += "end\n";
+
+ PackageBuilder pkgBuilder = new PackageBuilder();
+ pkgBuilder.addPackageFromDrl(new StringReader(str));
+ Assert.assertTrue("Should not have errors", pkgBuilder.getErrors().isEmpty());
+
+ // Add once ...
+ ReteooRuleBase rb = new ReteooRuleBase("dummy");
+ rb.addPackage(pkgBuilder.getPackage());
+
+ // This one works
+ List list = new ArrayList();
+ StatefulSession session = rb.newStatefulSession();
+ session.setGlobal( "list", list );
+ session.fireAllRules();
+ assertEquals(1, list.size() );
+
+
+ list.clear();
+ // ... remove ...
+ rb.removePackage(pkgBuilder.getPackage().getName());
+ rb.addPackage(pkgBuilder.getPackage());
+ session = rb.newStatefulSession();
+ session.setGlobal( "list", list );
+ session.fireAllRules();
+ assertEquals(1, list.size() );
+ }
+
public class SubvertedClassLoader extends URLClassLoader {
private static final long serialVersionUID = 400L;
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java 2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java 2010-04-16 03:46:05 UTC (rev 32581)
@@ -1120,9 +1120,9 @@
assertEquals( 2,
nodes.size() );
assertEquals( "InitialFact",
- ((ClassObjectType) ((ObjectTypeNode) nodes.get( 3 )).getObjectType()).getClassType().getSimpleName() );
+ ((ClassObjectType) ((ObjectTypeNode) nodes.get( 2 )).getObjectType()).getClassType().getSimpleName() );
assertEquals( "Rule 1",
- ((RuleTerminalNode) nodes.get( 5 )).getRule().getName() );
+ ((RuleTerminalNode) nodes.get( 4 )).getRule().getName() );
StatefulSession session = ruleBase.newStatefulSession();
@@ -1171,9 +1171,9 @@
assertEquals( 2,
nodes.size() );
assertEquals( "InitialFact",
- ((ClassObjectType) ((ObjectTypeNode) nodes.get( 3 )).getObjectType()).getClassType().getSimpleName() );
+ ((ClassObjectType) ((ObjectTypeNode) nodes.get( 2 )).getObjectType()).getClassType().getSimpleName() );
assertEquals( "Rule 1",
- ((RuleTerminalNode) nodes.get( 5 )).getRule().getName() );
+ ((RuleTerminalNode) nodes.get( 4 )).getRule().getName() );
StatefulSession session = ruleBase.newStatefulSession();
@@ -1230,9 +1230,9 @@
assertEquals( 2,
nodes.size() );
assertEquals( "Person",
- ((ClassObjectType) ((ObjectTypeNode) nodes.get( 3 )).getObjectType()).getClassType().getSimpleName() );
+ ((ClassObjectType) ((ObjectTypeNode) nodes.get( 2 )).getObjectType()).getClassType().getSimpleName() );
assertEquals( "Rule 1",
- ((RuleTerminalNode) nodes.get( 5 )).getRule().getName() );
+ ((RuleTerminalNode) nodes.get( 4 )).getRule().getName() );
StatefulSession session = ruleBase.newStatefulSession();
@@ -1278,13 +1278,13 @@
assertEquals( 4,
nodes.size() );
assertEquals( "Cheese",
- ((ClassObjectType) ((ObjectTypeNode) nodes.get( 3 )).getObjectType()).getClassType().getSimpleName() );
+ ((ClassObjectType) ((ObjectTypeNode) nodes.get( 2 )).getObjectType()).getClassType().getSimpleName() );
assertEquals( "Person",
- ((ClassObjectType) ((ObjectTypeNode) nodes.get( 6 )).getObjectType()).getClassType().getSimpleName() );
+ ((ClassObjectType) ((ObjectTypeNode) nodes.get( 4 )).getObjectType()).getClassType().getSimpleName() );
assertEquals( "JoinNode",
- nodes.get( 7 ).getClass().getSimpleName() );
+ nodes.get( 5 ).getClass().getSimpleName() );
assertEquals( "Rule 1",
- ((RuleTerminalNode) nodes.get( 8 )).getRule().getName() );
+ ((RuleTerminalNode) nodes.get( 6 )).getRule().getName() );
StatefulSession session = ruleBase.newStatefulSession();
@@ -1336,7 +1336,6 @@
r2d2.setCheese( brie );
session.insert( r2d2 );
- System.out.println( "\n\njointpattern" );
session = getSerialisedStatefulSession( session );
session.fireAllRules();
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java 2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java 2010-04-16 03:46:05 UTC (rev 32581)
@@ -6907,41 +6907,6 @@
ksession.insert( new Pet("Toni") );
}
- public void FIXME_testSharedLIANodeRemoval() throws IOException, DroolsParserException {
- String str = "global java.util.List list;\n";
- str += "rule \"test\"\n";
- str += "when\n";
- str += " exists(eval(true))\n";
- str += "then\n";
- str += " list.add(\"fired\");\n";
- str += "end\n";
-
- PackageBuilder pkgBuilder = new PackageBuilder();
- pkgBuilder.addPackageFromDrl(new StringReader(str));
- Assert.assertTrue("Should not have errors", pkgBuilder.getErrors().isEmpty());
-
- // Add once ...
- ReteooRuleBase rb = new ReteooRuleBase("dummy");
- rb.addPackage(pkgBuilder.getPackage());
-
- // This one works
- List list = new ArrayList();
- StatefulSession session = rb.newStatefulSession();
- session.setGlobal( "list", list );
- session.fireAllRules();
- assertEquals(1, list.size() );
-
-
- list.clear();
- // ... remove ...
- rb.removePackage(pkgBuilder.getPackage().getName());
- rb.addPackage(pkgBuilder.getPackage());
- session = rb.newStatefulSession();
- session.setGlobal( "list", list );
- session.fireAllRules();
- assertEquals(1, list.size() );
- }
-
public void testClassLoaderHits() throws Exception {
final KnowledgeBuilderConfiguration conf = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
//conf.setOption( ClassLoaderCacheOption.DISABLED );
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BaseNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BaseNode.java 2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BaseNode.java 2010-04-16 03:46:05 UTC (rev 32581)
@@ -20,6 +20,7 @@
import java.io.ObjectInput;
import java.io.ObjectOutput;
+import org.drools.reteoo.EntryPointNode;
import org.drools.reteoo.ReteooBuilder;
import org.drools.reteoo.RuleRemovalContext;
@@ -96,7 +97,7 @@
builder,
node,
workingMemories );
- if ( !isInUse() ) {
+ if ( !this.isInUse() && !( this instanceof EntryPointNode ) ) {
builder.getIdGenerator().releaseId( this.getId() );
}
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ConcurrentNodeMemories.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ConcurrentNodeMemories.java 2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ConcurrentNodeMemories.java 2010-04-16 03:46:05 UTC (rev 32581)
@@ -114,7 +114,8 @@
try {
this.lock.lock();
if( node.getId() >= this.memories.length() ) {
- int size = Math.max( this.rulebase.getNodeCount(), node.getId() + 1 );
+ // adding some buffer for new nodes, so that we reduce array copies
+ int size = Math.max( this.rulebase.getNodeCount(), node.getId() + 32 );
AtomicReferenceArray<Object> newMem = new AtomicReferenceArray<Object>( size );
for ( int i = 0; i < this.memories.length(); i++ ) {
newMem.set( i,
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java 2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java 2010-04-16 03:46:05 UTC (rev 32581)
@@ -20,9 +20,7 @@
import java.io.ObjectInput;
import java.io.ObjectOutput;
-import org.drools.FactException;
import org.drools.RuleBaseConfiguration;
-import org.drools.common.BaseNode;
import org.drools.common.InternalFactHandle;
import org.drools.common.InternalWorkingMemory;
import org.drools.common.NodeMemory;
@@ -180,24 +178,6 @@
workingMemory );
}
- protected void doRemove(final RuleRemovalContext context,
- final ReteooBuilder builder,
- final BaseNode node,
- final InternalWorkingMemory[] workingMemories) {
- if ( !node.isInUse() ) {
- removeObjectSink( (ObjectSink) node );
- }
- if ( !this.isInUse() ) {
- for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
- workingMemories[i].clearNodeMemory( this );
- }
- }
- this.source.remove( context,
- builder,
- this,
- workingMemories );
- }
-
/**
* Creates a HashSet for the AlphaNode's memory.
*/
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaNode.java 2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaNode.java 2010-04-16 03:46:05 UTC (rev 32581)
@@ -225,10 +225,8 @@
final ReteooBuilder builder,
final BaseNode node,
final InternalWorkingMemory[] workingMemories) {
- context.visitTupleSource( this );
if ( !node.isInUse() ) {
removeTupleSink( (LeftTupleSink) node );
-
}
if ( !this.isInUse() || context.getCleanupAdapter() != null ) {
for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
@@ -292,13 +290,10 @@
builder,
this,
workingMemories );
- if ( !context.alreadyVisited( this.leftInput ) ) {
- this.leftInput.remove( context,
- builder,
- this,
- workingMemories );
- }
-
+ this.leftInput.remove( context,
+ builder,
+ this,
+ workingMemories );
}
public void modifyObject(InternalFactHandle factHandle,
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java 2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java 2010-04-16 03:46:05 UTC (rev 32581)
@@ -30,7 +30,6 @@
import org.drools.common.InternalFactHandle;
import org.drools.common.InternalWorkingMemory;
import org.drools.common.InternalWorkingMemoryEntryPoint;
-import org.drools.common.NodeMemory;
import org.drools.common.PropagationContextImpl;
import org.drools.common.RuleBasePartitionId;
import org.drools.core.util.Iterator;
@@ -283,10 +282,6 @@
final InternalWorkingMemory[] workingMemories) {
final ObjectTypeNode objectTypeNode = (ObjectTypeNode) node;
removeObjectSink( objectTypeNode );
- for ( int i = 0; i < workingMemories.length; i++ ) {
- // clear the node memory for each working memory.
- workingMemories[i].clearNodeMemory( (NodeMemory) node );
- }
}
public Map<ObjectType, ObjectTypeNode> getObjectTypeNodes() {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java 2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java 2010-04-16 03:46:05 UTC (rev 32581)
@@ -304,23 +304,20 @@
final ReteooBuilder builder,
final BaseNode node,
final InternalWorkingMemory[] workingMemories) {
- context.visitTupleSource( this );
if ( !node.isInUse() ) {
removeTupleSink( (LeftTupleSink) node );
}
if ( !this.isInUse() ) {
- for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
- workingMemories[i].clearNodeMemory( this );
+ for( InternalWorkingMemory workingMemory : workingMemories ) {
+ workingMemory.clearNodeMemory( this );
}
}
- if ( !context.alreadyVisited( this.tupleSource ) ) {
- this.tupleSource.remove( context,
- builder,
- this,
- workingMemories );
- }
+ this.tupleSource.remove( context,
+ builder,
+ this,
+ workingMemories );
}
public boolean isLeftTupleMemoryEnabled() {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java 2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java 2010-04-16 03:46:05 UTC (rev 32581)
@@ -354,8 +354,6 @@
final BaseNode node,
final InternalWorkingMemory[] workingMemories) {
- context.visitTupleSource( this );
-
if ( !node.isInUse() ) {
removeTupleSink( (LeftTupleSink) node );
}
@@ -375,12 +373,10 @@
}
}
- if ( !context.alreadyVisited( this.tupleSource ) ) {
- this.tupleSource.remove( context,
- builder,
- this,
- workingMemories );
- }
+ this.tupleSource.remove( context,
+ builder,
+ this,
+ workingMemories );
}
@SuppressWarnings("unchecked")
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java 2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java 2010-04-16 03:46:05 UTC (rev 32581)
@@ -25,7 +25,6 @@
import org.drools.common.InternalWorkingMemory;
import org.drools.common.PropagationContextImpl;
import org.drools.common.RuleBasePartitionId;
-import org.drools.core.util.RightTupleList;
import org.drools.reteoo.builder.BuildContext;
import org.drools.spi.PropagationContext;
@@ -172,7 +171,6 @@
final ReteooBuilder builder,
final BaseNode node,
final InternalWorkingMemory[] workingMemories) {
- context.visitTupleSource( this );
if ( !node.isInUse() ) {
removeTupleSink( (LeftTupleSink) node );
}
@@ -265,12 +263,6 @@
workingMemory );
}
- public void retractRightTuple(final RightTuple rightTuple,
- final PropagationContext context,
- final InternalWorkingMemory workingMemory) {
- throw new UnsupportedOperationException( "ObjectSinkAdapter onlys supports assertObject method calls" );
- }
-
public void modifyObject(InternalFactHandle factHandle,
ModifyPreviousTuples modifyPreviousTuples,
PropagationContext context,
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSource.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSource.java 2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSource.java 2010-04-16 03:46:05 UTC (rev 32581)
@@ -24,6 +24,7 @@
import org.drools.common.BaseNode;
import org.drools.common.DefaultFactHandle;
import org.drools.common.InternalWorkingMemory;
+import org.drools.common.NodeMemory;
import org.drools.common.RuleBasePartitionId;
import org.drools.spi.PropagationContext;
@@ -192,4 +193,22 @@
public boolean isInUse() {
return this.sink.size() > 0;
}
+
+ protected void doRemove(final RuleRemovalContext context,
+ final ReteooBuilder builder,
+ final BaseNode node,
+ final InternalWorkingMemory[] workingMemories) {
+ if ( !node.isInUse() ) {
+ removeObjectSink( (ObjectSink) node );
+ }
+ if ( !this.isInUse() && this instanceof NodeMemory ) {
+ for( InternalWorkingMemory workingMemory : workingMemories ) {
+ workingMemory.clearNodeMemory( (NodeMemory) this );
+ }
+ }
+ this.source.remove( context,
+ builder,
+ this,
+ workingMemories );
+ }
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java 2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java 2010-04-16 03:46:05 UTC (rev 32581)
@@ -327,19 +327,24 @@
workingMemories );
}
+ /**
+ * OTN needs to override remove to avoid releasing the node ID, since OTN are
+ * never removed from the rulebase in the current implementation
+ */
protected void doRemove(final RuleRemovalContext context,
final ReteooBuilder builder,
final BaseNode node,
final InternalWorkingMemory[] workingMemories) {
- if( context.getCleanupAdapter() != null ) {
- for( InternalWorkingMemory workingMemory : workingMemories ) {
+ if ( context.getCleanupAdapter() != null ) {
+ for ( InternalWorkingMemory workingMemory : workingMemories ) {
CleanupAdapter adapter = context.getCleanupAdapter();
final ObjectHashSet memory = (ObjectHashSet) workingMemory.getNodeMemory( this );
Iterator it = memory.iterator();
for ( ObjectEntry entry = (ObjectEntry) it.next(); entry != null; entry = (ObjectEntry) it.next() ) {
InternalFactHandle handle = (InternalFactHandle) entry.getValue();
- for( LeftTuple leftTuple = handle.getFirstLeftTuple(); leftTuple != null; leftTuple = leftTuple.getLeftParentNext() ) {
- adapter.cleanUp( leftTuple, workingMemory );
+ for ( LeftTuple leftTuple = handle.getFirstLeftTuple(); leftTuple != null; leftTuple = leftTuple.getLeftParentNext() ) {
+ adapter.cleanUp( leftTuple,
+ workingMemory );
}
}
}
@@ -348,11 +353,6 @@
if ( !node.isInUse() ) {
removeObjectSink( (ObjectSink) node );
}
- if ( ! this.isInUse() ) {
- for( InternalWorkingMemory workingMemory : workingMemories ) {
- workingMemory.clearNodeMemory( this );
- }
- }
}
/**
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/PropagationQueuingNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/PropagationQueuingNode.java 2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/PropagationQueuingNode.java 2010-04-16 03:46:05 UTC (rev 32581)
@@ -24,7 +24,6 @@
import org.drools.RuleBaseConfiguration;
import org.drools.RuntimeDroolsException;
-import org.drools.common.BaseNode;
import org.drools.common.InternalFactHandle;
import org.drools.common.InternalWorkingMemory;
import org.drools.common.NodeMemory;
@@ -128,24 +127,6 @@
// this node does not require update, so nothing else to do.
}
- protected void doRemove(final RuleRemovalContext context,
- final ReteooBuilder builder,
- final BaseNode node,
- final InternalWorkingMemory[] workingMemories) {
- if ( !node.isInUse() ) {
- removeObjectSink( (ObjectSink) node );
- }
- if ( !this.isInUse() ) {
- for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
- workingMemories[i].clearNodeMemory( this );
- }
- }
- this.source.remove( context,
- builder,
- this,
- workingMemories );
- }
-
/**
* @see org.drools.reteoo.ObjectSinkNode#getNextObjectSinkNode()
*/
@@ -329,10 +310,6 @@
protected InternalFactHandle handle;
protected PropagationContext context;
- public Action() {
-
- }
-
public Action(InternalFactHandle handle,
PropagationContext context) {
super();
@@ -375,10 +352,6 @@
private static class RetractAction extends Action {
private static final long serialVersionUID = -84784886430845209L;
- public RetractAction() {
-
- }
-
public RetractAction(final InternalFactHandle handle,
final PropagationContext context) {
super( handle,
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryElementNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryElementNode.java 2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryElementNode.java 2010-04-16 03:46:05 UTC (rev 32581)
@@ -1,28 +1,17 @@
package org.drools.reteoo;
-import org.drools.QueryResults;
-import org.drools.RuleBaseConfiguration;
-import org.drools.base.ArrayElements;
-import org.drools.base.DefaultQueryResultsCollector;
import org.drools.base.DroolsQuery;
import org.drools.base.QueryResultCollector;
import org.drools.common.BaseNode;
-import org.drools.common.BetaConstraints;
-import org.drools.common.DisconnectedFactHandle;
-import org.drools.common.EmptyBetaConstraints;
import org.drools.common.InternalFactHandle;
import org.drools.common.InternalWorkingMemory;
-import org.drools.common.NodeMemory;
import org.drools.common.PropagationContextImpl;
import org.drools.common.QueryElementFactHandle;
-import org.drools.core.util.Entry;
import org.drools.reteoo.builder.BuildContext;
import org.drools.rule.Declaration;
import org.drools.rule.EntryPoint;
import org.drools.rule.QueryElement;
import org.drools.rule.Variable;
-import org.drools.spi.AlphaNodeFieldConstraint;
-import org.drools.spi.DataProvider;
import org.drools.spi.PropagationContext;
public class QueryElementNode extends LeftTupleSource
@@ -61,17 +50,14 @@
ReteooBuilder builder,
BaseNode node,
InternalWorkingMemory[] workingMemories) {
- context.visitTupleSource( this );
if ( !node.isInUse() ) {
removeTupleSink( (LeftTupleSink) node );
}
- if ( !context.alreadyVisited( this.tupleSource ) ) {
- this.tupleSource.remove( context,
- builder,
- this,
- workingMemories );
- }
+ this.tupleSource.remove( context,
+ builder,
+ this,
+ workingMemories );
}
public void attach() {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryTerminalNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryTerminalNode.java 2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryTerminalNode.java 2010-04-16 03:46:05 UTC (rev 32581)
@@ -19,23 +19,16 @@
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
-import java.util.LinkedList;
-import java.util.List;
-import org.drools.RuleBaseConfiguration;
-import org.drools.base.ArrayElements;
import org.drools.base.DroolsQuery;
import org.drools.common.BaseNode;
-import org.drools.common.DisconnectedFactHandle;
import org.drools.common.InternalFactHandle;
import org.drools.common.InternalWorkingMemory;
-import org.drools.common.NodeMemory;
import org.drools.common.PropagationContextImpl;
import org.drools.reteoo.builder.BuildContext;
import org.drools.rule.GroupElement;
import org.drools.rule.Query;
import org.drools.rule.Rule;
-import org.drools.rule.Variable;
import org.drools.spi.PropagationContext;
/**
@@ -202,12 +195,10 @@
final ReteooBuilder builder,
final BaseNode node,
final InternalWorkingMemory[] workingMemories) {
- if ( !context.alreadyVisited( this.tupleSource ) ) {
- this.tupleSource.remove( context,
- builder,
- this,
- workingMemories );
- }
+ this.tupleSource.remove( context,
+ builder,
+ this,
+ workingMemories );
}
public boolean isInUse() {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java 2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java 2010-04-16 03:46:05 UTC (rev 32581)
@@ -181,8 +181,7 @@
final ReteooBuilder builder,
final BaseNode node,
final InternalWorkingMemory[] workingMemories) {
- final EntryPointNode entryPointNode = (EntryPointNode) node;
- removeObjectSink( entryPointNode );
+ // for now, we don't remove EntryPointNodes because they might be referenced by external sources
}
public EntryPointNode getEntryPointNode(final EntryPoint entryPoint) {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java 2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java 2010-04-16 03:46:05 UTC (rev 32581)
@@ -238,7 +238,6 @@
this,
null,
workingMemories );
- context.clear();
}
}
@@ -280,6 +279,9 @@
}
public void releaseId(int id) {
+ if( recycledIds.contains( id ) ) {
+ System.out.println("ERROR");
+ }
this.recycledIds.add(id );
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java 2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java 2010-04-16 03:46:05 UTC (rev 32581)
@@ -239,8 +239,8 @@
}
if ( !this.isInUse() ) {
- for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
- ObjectHashMap memory = (ObjectHashMap) workingMemories[i].getNodeMemory( this );
+ for ( InternalWorkingMemory workingMemory : workingMemories ) {
+ ObjectHashMap memory = (ObjectHashMap) workingMemory.getNodeMemory( this );
Iterator it = memory.iterator();
for ( ObjectEntry entry = (ObjectEntry) it.next(); entry != null; entry = (ObjectEntry) it.next() ) {
@@ -249,17 +249,15 @@
leftTuple.unlinkFromRightParent();
InternalFactHandle handle = (InternalFactHandle) entry.getValue();
- workingMemories[i].getFactHandleFactory().destroyFactHandle( handle );
+ workingMemory.getFactHandleFactory().destroyFactHandle( handle );
}
+ workingMemory.clearNodeMemory( this );
}
}
-
- if ( !context.alreadyVisited( this.tupleSource ) ) {
- this.tupleSource.remove( context,
- builder,
- this,
- workingMemories );
- }
+ this.tupleSource.remove( context,
+ builder,
+ this,
+ workingMemories );
}
public boolean isLeftTupleMemoryEnabled() {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleRemovalContext.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleRemovalContext.java 2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleRemovalContext.java 2010-04-16 03:46:05 UTC (rev 32581)
@@ -22,8 +22,6 @@
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
-import java.util.HashMap;
-import java.util.Map;
import org.drools.common.InternalWorkingMemory;
@@ -38,49 +36,18 @@
implements
Externalizable {
- private Map<Integer, LeftTupleSource> visitedNodes;
private CleanupAdapter cleanupAdapter;
public RuleRemovalContext() {
- this.visitedNodes = new HashMap<Integer, LeftTupleSource>();
}
- @SuppressWarnings("unchecked")
public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException {
- visitedNodes = (Map<Integer, LeftTupleSource>) in.readObject();
}
public void writeExternal(ObjectOutput out) throws IOException {
- out.writeObject( visitedNodes );
}
- /**
- * We need to track tuple source nodes that we visit
- * to avoid multiple removal in case of subnetworks
- *
- * @param node
- */
- public void visitTupleSource(LeftTupleSource node) {
- this.visitedNodes.put( new Integer( node.getId() ),
- node );
- }
-
- /**
- * We need to track tuple source nodes that we visit
- * to avoid multiple removal in case of subnetworks
- *
- * @param node
- * @return
- */
- public boolean alreadyVisited(LeftTupleSource node) {
- return this.visitedNodes.containsKey( new Integer( node.getId() ) );
- }
-
- public void clear() {
- this.visitedNodes.clear();
- }
-
public void setCleanupAdapter(CleanupAdapter cleanupAdapter) {
this.cleanupAdapter = cleanupAdapter;
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/BuildUtils.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/BuildUtils.java 2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/BuildUtils.java 2010-04-16 03:46:05 UTC (rev 32581)
@@ -101,10 +101,7 @@
RuleBasePartitionId partition = null;
if ( candidate instanceof EntryPointNode ) {
// entry point nodes are always shared
- EntryPointNode epn = context.getRuleBase().getRete().getEntryPointNode( ((EntryPointNode) candidate).getEntryPoint() );
- if ( epn != null ) {
- node = epn;
- }
+ node = context.getRuleBase().getRete().getEntryPointNode( ((EntryPointNode) candidate).getEntryPoint() );
// all EntryPointNodes belong to the main partition
partition = RuleBasePartitionId.MAIN_PARTITION;
} else if ( candidate instanceof ObjectTypeNode ) {
@@ -131,11 +128,6 @@
} else {
throw new RuntimeDroolsException( "This is a bug on node sharing verification. Please report to development team." );
}
- if ( node != null ) {
- // shared node found
- // undo previous id assignment
- context.releaseId( candidate.getId() );
- }
}
if ( node == null ) {
@@ -161,6 +153,10 @@
}
// adds the node to the context list to track all added nodes
context.getNodes().add( node );
+ } else {
+ // shared node found
+ // undo previous id assignment
+ context.releaseId( candidate.getId() );
}
return node;
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockObjectSource.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockObjectSource.java 2010-04-15 18:50:10 UTC (rev 32580)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockObjectSource.java 2010-04-16 03:46:05 UTC (rev 32581)
@@ -23,7 +23,6 @@
import java.util.Iterator;
import java.util.List;
-import org.drools.common.BaseNode;
import org.drools.common.InternalFactHandle;
import org.drools.common.InternalWorkingMemory;
import org.drools.common.RuleBasePartitionId;
@@ -92,12 +91,6 @@
}
}
- protected void doRemove(final RuleRemovalContext context,
- final ReteooBuilder builder,
- final BaseNode node,
- final InternalWorkingMemory[] workingMemories) {
- }
-
public void attach(final InternalWorkingMemory[] workingMemories) {
// TODO Auto-generated method stub
More information about the jboss-svn-commits
mailing list