[jboss-svn-commits] JBL Code SVN: r26024 - in labs/jbossrules/trunk: drools-compiler/src/test/resources/org/drools/integrationtests and 1 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Apr 13 22:21:25 EDT 2009
Author: tirelli
Date: 2009-04-13 22:21:25 -0400 (Mon, 13 Apr 2009)
New Revision: 26024
Added:
labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_JBRules2055.drl
Modified:
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
Log:
JBRULES-2055: fixing network analysis for skipModify optimization
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 2009-04-13 18:08:16 UTC (rev 26023)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java 2009-04-14 02:21:25 UTC (rev 26024)
@@ -6361,4 +6361,36 @@
assertEquals( "Hello World",
list.get( 0 ) );
}
+
+ public void testJBRules2055() {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add( ResourceFactory.newClassPathResource( "test_JBRules2055.drl",
+ getClass() ),
+ ResourceType.DRL );
+ KnowledgeBuilderErrors errors = kbuilder.getErrors();
+ if ( errors.size() > 0 ) {
+ for ( KnowledgeBuilderError error : errors ) {
+ System.err.println( error );
+ }
+ throw new IllegalArgumentException( "Could not parse knowledge." );
+ }
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+ List<String> results = new ArrayList<String>();
+ ksession.setGlobal( "results",
+ results );
+ ksession.insert( new Cheese("stilton") );
+ ksession.insert( new Cheese("brie") );
+ ksession.insert( new Cheese("muzzarella") );
+ ksession.insert( new Person( "bob", "stilton" ) );
+ ksession.fireAllRules();
+ assertEquals( 2,
+ results.size() );
+ assertEquals( "stilton",
+ results.get( 0 ) );
+ assertEquals( "brie",
+ results.get( 1 ) );
+
+ }
}
Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_JBRules2055.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_JBRules2055.drl (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_JBRules2055.drl 2009-04-14 02:21:25 UTC (rev 26024)
@@ -0,0 +1,13 @@
+package org.drools
+
+global java.util.List results;
+
+rule "test jira jbrules 2055"
+ when
+ $c : Cheese( $type : type )
+ $p : Person( likes == $type )
+ then
+ results.add( $type );
+ retract( $c );
+ modify( $p ) { setLikes( "brie" ) }
+end
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 2009-04-13 18:08:16 UTC (rev 26023)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java 2009-04-14 02:21:25 UTC (rev 26024)
@@ -282,7 +282,7 @@
}
public void networkUpdated() {
- this.skipOnModify = canSkipOnModify( this.sink.getSinks() );
+ this.skipOnModify = canSkipOnModify( this.sink.getSinks(), true );
}
/**
@@ -361,21 +361,21 @@
* @param sinks
* @return
*/
- private boolean canSkipOnModify(final Sink[] sinks) {
+ private boolean canSkipOnModify(final Sink[] sinks, final boolean rootCall) {
// If we have no alpha or beta node with constraints on this ObjectType, we can just skip modifies
boolean hasConstraints = false;
for ( int i = 0; i < sinks.length && !hasConstraints; i++ ) {
if ( sinks[i] instanceof AlphaNode || sinks[i] instanceof AccumulateNode || sinks[i] instanceof CollectNode || sinks[i] instanceof FromNode ) {
hasConstraints = true;
} else if ( sinks[i] instanceof BetaNode && ((BetaNode) sinks[i]).getConstraints().length > 0 ) {
- hasConstraints = this.usesDeclaration( ((BetaNode) sinks[i]).getConstraints() );
+ hasConstraints = rootCall || this.usesDeclaration( ((BetaNode) sinks[i]).getConstraints() );
} else if ( sinks[i] instanceof EvalConditionNode ) {
hasConstraints = this.usesDeclaration( ((EvalConditionNode) sinks[i]).getCondition() );
}
if ( !hasConstraints && sinks[i] instanceof ObjectSource ) {
- hasConstraints = !this.canSkipOnModify( ((ObjectSource) sinks[i]).getSinkPropagator().getSinks() );
+ hasConstraints = !this.canSkipOnModify( ((ObjectSource) sinks[i]).getSinkPropagator().getSinks(), false );
} else if ( !hasConstraints && sinks[i] instanceof LeftTupleSource ) {
- hasConstraints = !this.canSkipOnModify( ((LeftTupleSource) sinks[i]).getSinkPropagator().getSinks() );
+ hasConstraints = !this.canSkipOnModify( ((LeftTupleSource) sinks[i]).getSinkPropagator().getSinks(), false );
}
}
More information about the jboss-svn-commits
mailing list