[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