[jboss-svn-commits] JBL Code SVN: r10546 - 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 Mar 26 20:18:34 EDT 2007


Author: tirelli
Date: 2007-03-26 20:18:34 -0400 (Mon, 26 Mar 2007)
New Revision: 10546

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_skipModify.drl
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Sink.java
Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSink.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/TupleSink.java
Log:
Fixing optimization for skip modify

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java	2007-03-26 23:54:30 UTC (rev 10545)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java	2007-03-27 00:18:34 UTC (rev 10546)
@@ -80,6 +80,10 @@
 import org.drools.event.AgendaEventListener;
 import org.drools.event.BeforeActivationFiredEvent;
 import org.drools.event.DefaultAgendaEventListener;
+import org.drools.event.ObjectAssertedEvent;
+import org.drools.event.ObjectModifiedEvent;
+import org.drools.event.ObjectRetractedEvent;
+import org.drools.event.WorkingMemoryEventListener;
 import org.drools.facttemplates.Fact;
 import org.drools.facttemplates.FactTemplate;
 import org.drools.integrationtests.helloworld.Message;
@@ -181,27 +185,27 @@
         final List list = new ArrayList();
         workingMemory.setGlobal( "list",
                                  list );
-        Cheese nullCheese = new Cheese(null, 2);
+        Cheese nullCheese = new Cheese( null,
+                                        2 );
         workingMemory.assertObject( nullCheese );
 
-        Person notNullPerson = new Person("shoes butt back");
-        notNullPerson.setBigDecimal( new BigDecimal("42.42") );
-        
+        Person notNullPerson = new Person( "shoes butt back" );
+        notNullPerson.setBigDecimal( new BigDecimal( "42.42" ) );
+
         workingMemory.assertObject( notNullPerson );
-        
-        Person nullPerson = new Person("whee");
+
+        Person nullPerson = new Person( "whee" );
         nullPerson.setBigDecimal( null );
-        
+
         workingMemory.assertObject( nullPerson );
-        
-        
+
         workingMemory.fireAllRules();
-        System.out.println(list.get( 0 ));
-        assertEquals( 3, list.size() );
-        
-        
+        System.out.println( list.get( 0 ) );
+        assertEquals( 3,
+                      list.size() );
+
     }
-    
+
     public void testEmptyColumn() throws Exception {
         // pre build the package
         final PackageBuilder builder = new PackageBuilder();
@@ -969,7 +973,7 @@
         assertEquals( stilton,
                       list3.get( 0 ) );
     }
- 
+
     public void testFromWithParams() throws Exception {
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_FromWithParams.drl" ) ) );
@@ -1694,9 +1698,9 @@
 
         final XmlDumper xmlDumper = new XmlDumper();
         final String xmlResult = xmlDumper.dump( pkg );
-        
+
         //System.out.println( xmlResult );
-        
+
         builder = new PackageBuilder();
         builder.addPackageFromXml( new StringReader( xmlResult ) );
 
@@ -3847,12 +3851,15 @@
     public void testDynamicRules() throws Exception {
         final RuleBase ruleBase = getRuleBase();
         final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
-        Cheese a = new Cheese( "stilton", 10);
-        Cheese b = new Cheese( "stilton", 15);
-        Cheese c = new Cheese( "stilton", 20);
-        workingMemory.assertObject(a);
-        workingMemory.assertObject(b);
-        workingMemory.assertObject(c);
+        Cheese a = new Cheese( "stilton",
+                               10 );
+        Cheese b = new Cheese( "stilton",
+                               15 );
+        Cheese c = new Cheese( "stilton",
+                               20 );
+        workingMemory.assertObject( a );
+        workingMemory.assertObject( b );
+        workingMemory.assertObject( c );
 
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DynamicRules.drl" ) ) );
@@ -3867,10 +3874,14 @@
         final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
 
         // Assert some simple facts
-        FactA a = new FactA("hello", new Integer(1), new Float(3.14));
-        FactB b = new FactB("hello", new Integer(2), new Float(6.28));
-        workingMemory.assertObject(a);
-        workingMemory.assertObject(b);
+        FactA a = new FactA( "hello",
+                             new Integer( 1 ),
+                             new Float( 3.14 ) );
+        FactB b = new FactB( "hello",
+                             new Integer( 2 ),
+                             new Float( 6.28 ) );
+        workingMemory.assertObject( a );
+        workingMemory.assertObject( b );
 
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DynamicRules2.drl" ) ) );
@@ -3889,7 +3900,7 @@
             ruleBase.addPackage( pkg );
         } catch ( RuntimeException e ) {
             e.printStackTrace();
-            fail("No exeception should be raised.");
+            fail( "No exeception should be raised." );
         }
 
     }
@@ -3907,8 +3918,8 @@
                                  result );
 
         final Primitives p1 = new Primitives();
-        p1.setPrimitiveArrayAttribute( new int[] { 1, 2, 3 } );
-        p1.setArrayAttribute( new String[] { "a","b" } );
+        p1.setPrimitiveArrayAttribute( new int[]{1, 2, 3} );
+        p1.setArrayAttribute( new String[]{"a", "b"} );
 
         workingMemory.assertObject( p1 );
 
@@ -3916,11 +3927,11 @@
         assertEquals( 3,
                       result.size() );
         assertEquals( 3,
-                      ((Integer)result.get( 0 )).intValue());
+                      ((Integer) result.get( 0 )).intValue() );
         assertEquals( 2,
-                      ((Integer)result.get( 1 )).intValue());
+                      ((Integer) result.get( 1 )).intValue() );
         assertEquals( 3,
-                      ((Integer)result.get( 2 )).intValue());
+                      ((Integer) result.get( 2 )).intValue() );
 
     }
 
@@ -3937,8 +3948,9 @@
             workingMemory.setGlobal( "results",
                                      result );
 
-            final Person person = new Person("bob");
-            final Cheese cheese = new Cheese("brie", 10);
+            final Person person = new Person( "bob" );
+            final Cheese cheese = new Cheese( "brie",
+                                              10 );
 
             workingMemory.assertObject( person );
             workingMemory.assertObject( cheese );
@@ -3949,7 +3961,7 @@
 
         } catch ( Exception e ) {
             e.printStackTrace();
-            fail("Should not raise any exception");
+            fail( "Should not raise any exception" );
         }
     }
 
@@ -3968,7 +3980,7 @@
 
         // asserting the sensor object
         final Sensor sensor = new Sensor( 150,
-                                        100 );
+                                          100 );
         final FactHandle sensorHandle = workingMemory.assertObject( sensor );
 
         workingMemory.fireAllRules();
@@ -3981,7 +3993,8 @@
 
         // modifying sensor
         sensor.setTemperature( 125 );
-        workingMemory.modifyObject( sensorHandle, sensor );
+        workingMemory.modifyObject( sensorHandle,
+                                    sensor );
         workingMemory.fireAllRules();
 
         // alarm must continue to sound
@@ -3990,10 +4003,10 @@
         assertEquals( 2,
                       workingMemory.getObjects().size() );
 
-
         // modifying sensor
         sensor.setTemperature( 80 );
-        workingMemory.modifyObject( sensorHandle, sensor );
+        workingMemory.modifyObject( sensorHandle,
+                                    sensor );
         workingMemory.fireAllRules();
 
         // no alarms anymore
@@ -4003,35 +4016,43 @@
                       workingMemory.getObjects().size() );
 
     }
-    
+
     public void testRuleFlow() throws Exception {
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.drl" ) ) );
         final Package pkg = builder.getPackage();
         ProcessBuilder processBuilder = new ProcessBuilder();
-        processBuilder.addProcessFromFile(new InputStreamReader( getClass().getResourceAsStream( "ruleflow.rf" ) ) );
+        processBuilder.addProcessFromFile( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.rf" ) ) );
 
         final RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        ruleBase.addProcess( processBuilder.getProcesses()[0]);
-        
+        ruleBase.addProcess( processBuilder.getProcesses()[0] );
+
         final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
         final List list = new ArrayList();
         workingMemory.setGlobal( "list",
                                  list );
 
         workingMemory.fireAllRules();
-        assertEquals(0, list.size());
-        
-        IProcessInstance processInstance = workingMemory.startProcess("0");
-        assertEquals(IProcessInstance.STATE_ACTIVE, processInstance.getState());
+        assertEquals( 0,
+                      list.size() );
+
+        IProcessInstance processInstance = workingMemory.startProcess( "0" );
+        assertEquals( IProcessInstance.STATE_ACTIVE,
+                      processInstance.getState() );
         workingMemory.fireAllRules();
-        assertEquals(4, list.size());
-        assertEquals("Rule1", list.get(0));
-        assertEquals("Rule3", list.get(1));
-        assertEquals("Rule2", list.get(2));
-        assertEquals("Rule4", list.get(3));
-        assertEquals(IProcessInstance.STATE_COMPLETED, processInstance.getState());
+        assertEquals( 4,
+                      list.size() );
+        assertEquals( "Rule1",
+                      list.get( 0 ) );
+        assertEquals( "Rule3",
+                      list.get( 1 ) );
+        assertEquals( "Rule2",
+                      list.get( 2 ) );
+        assertEquals( "Rule4",
+                      list.get( 3 ) );
+        assertEquals( IProcessInstance.STATE_COMPLETED,
+                      processInstance.getState() );
     }
 
     public void testRuleFlowGroup() throws Exception {
@@ -4041,20 +4062,22 @@
 
         final RuleBase ruleBase = getRuleBase();
         ruleBase.addPackage( pkg );
-        
+
         final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
         final List list = new ArrayList();
         workingMemory.setGlobal( "list",
                                  list );
 
-        workingMemory.assertObject("Test");
+        workingMemory.assertObject( "Test" );
         workingMemory.fireAllRules();
-        assertEquals(0, list.size());
+        assertEquals( 0,
+                      list.size() );
 
-        workingMemory.getAgenda().activateRuleFlowGroup("Group1");
+        workingMemory.getAgenda().activateRuleFlowGroup( "Group1" );
         workingMemory.fireAllRules();
 
-        assertEquals(1, list.size());
+        assertEquals( 1,
+                      list.size() );
     }
 
     public void testDuplicateVariableBinding() throws Exception {
@@ -4070,8 +4093,10 @@
             workingMemory.setGlobal( "results",
                                      result );
 
-            final Cheese stilton = new Cheese("stilton", 20);
-            final Cheese brie    = new Cheese("brie", 10);
+            final Cheese stilton = new Cheese( "stilton",
+                                               20 );
+            final Cheese brie = new Cheese( "brie",
+                                            10 );
 
             workingMemory.assertObject( stilton );
             workingMemory.assertObject( brie );
@@ -4079,24 +4104,31 @@
             workingMemory.fireAllRules();
             assertEquals( 5,
                           result.size() );
-            assertEquals( stilton.getPrice(), ((Integer)result.get( stilton.getType() )).intValue());
-            assertEquals( brie.getPrice(), ((Integer)result.get( brie.getType() )).intValue());
+            assertEquals( stilton.getPrice(),
+                          ((Integer) result.get( stilton.getType() )).intValue() );
+            assertEquals( brie.getPrice(),
+                          ((Integer) result.get( brie.getType() )).intValue() );
 
-            assertEquals( stilton.getPrice(), ((Integer)result.get( stilton )).intValue());
-            assertEquals( brie.getPrice(), ((Integer)result.get( brie )).intValue());
+            assertEquals( stilton.getPrice(),
+                          ((Integer) result.get( stilton )).intValue() );
+            assertEquals( brie.getPrice(),
+                          ((Integer) result.get( brie )).intValue() );
 
-            assertEquals( stilton.getPrice(), ((Integer)result.get( "test3"+stilton.getType() )).intValue());
-            
-            workingMemory.assertObject( new Person("bob", brie.getType()) );
+            assertEquals( stilton.getPrice(),
+                          ((Integer) result.get( "test3" + stilton.getType() )).intValue() );
+
+            workingMemory.assertObject( new Person( "bob",
+                                                    brie.getType() ) );
             workingMemory.fireAllRules();
-            
+
             assertEquals( 6,
                           result.size() );
-            assertEquals( brie.getPrice(), ((Integer)result.get( "test3"+brie.getType() )).intValue());
+            assertEquals( brie.getPrice(),
+                          ((Integer) result.get( "test3" + brie.getType() )).intValue() );
 
         } catch ( Exception e ) {
             e.printStackTrace();
-            fail("Should not raise any exception");
+            fail( "Should not raise any exception" );
         }
     }
 
@@ -4105,17 +4137,17 @@
             final PackageBuilder builder = new PackageBuilder();
             builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_duplicateVariableBindingError.drl" ) ) );
             final Package pkg = builder.getPackage();
-            
+
             assertFalse( pkg.isValid() );
-            assertEquals( 6, pkg.getErrorSummary().split( "\n" ).length);
-            
+            assertEquals( 6,
+                          pkg.getErrorSummary().split( "\n" ).length );
+
         } catch ( Exception e ) {
             e.printStackTrace();
-            fail("Should not raise any exception");
+            fail( "Should not raise any exception" );
         }
     }
 
-
     public void testShadowProxyInHirarchies() throws Exception {
         try {
             final PackageBuilder builder = new PackageBuilder();
@@ -4126,13 +4158,13 @@
             ruleBase.addPackage( pkg );
             final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
 
-            workingMemory.assertObject( new Child("gp") );
+            workingMemory.assertObject( new Child( "gp" ) );
 
             workingMemory.fireAllRules();
 
         } catch ( Exception e ) {
             e.printStackTrace();
-            fail("Should not raise any exception");
+            fail( "Should not raise any exception" );
         }
     }
 
@@ -4145,15 +4177,20 @@
             final RuleBase ruleBase = getRuleBase();
             ruleBase.addPackage( pkg );
             final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
-            
+
             List results = new ArrayList();
-            workingMemory.setGlobal( "results", results );
+            workingMemory.setGlobal( "results",
+                                     results );
 
             Order order = new Order( 10 );
-            OrderItem item1 = new OrderItem( order, 1 );
-            OrderItem item2 = new OrderItem( order, 2 );
-            OrderItem anotherItem1 = new OrderItem( null, 3 );
-            OrderItem anotherItem2 = new OrderItem( null, 4 );
+            OrderItem item1 = new OrderItem( order,
+                                             1 );
+            OrderItem item2 = new OrderItem( order,
+                                             2 );
+            OrderItem anotherItem1 = new OrderItem( null,
+                                                    3 );
+            OrderItem anotherItem2 = new OrderItem( null,
+                                                    4 );
             workingMemory.assertObject( order );
             workingMemory.assertObject( item1 );
             workingMemory.assertObject( item2 );
@@ -4161,14 +4198,15 @@
             workingMemory.assertObject( anotherItem2 );
 
             workingMemory.fireAllRules();
-            
-            assertEquals( 2, results.size() );
+
+            assertEquals( 2,
+                          results.size() );
             assertTrue( results.contains( item1 ) );
             assertTrue( results.contains( item2 ) );
 
         } catch ( Exception e ) {
             e.printStackTrace();
-            fail("Should not raise any exception");
+            fail( "Should not raise any exception" );
         }
     }
 
@@ -4189,12 +4227,12 @@
         RandomNumber rn = new RandomNumber();
         rn.setValue( 10 );
         workingMemory.assertObject( rn );
-        
+
         Guess guess = new Guess();
-        guess.setValue( new Integer(5) );
-        
+        guess.setValue( new Integer( 5 ) );
+
         FactHandle handle = workingMemory.assertObject( guess );
-        
+
         workingMemory.fireAllRules();
 
         // HIGHER
@@ -4202,10 +4240,11 @@
                       list.size() );
         assertEquals( "HIGHER",
                       list.get( 0 ) );
-        
-        guess.setValue( new Integer(15) );
-        workingMemory.modifyObject( handle, guess );
 
+        guess.setValue( new Integer( 15 ) );
+        workingMemory.modifyObject( handle,
+                                    guess );
+
         workingMemory.fireAllRules();
 
         // LOWER
@@ -4213,10 +4252,11 @@
                       list.size() );
         assertEquals( "LOWER",
                       list.get( 1 ) );
-        
-        guess.setValue( new Integer(10) );
-        workingMemory.modifyObject( handle, guess );
 
+        guess.setValue( new Integer( 10 ) );
+        workingMemory.modifyObject( handle,
+                                    guess );
+
         workingMemory.fireAllRules();
 
         // CORRECT
@@ -4224,8 +4264,37 @@
                       list.size() );
         assertEquals( "CORRECT",
                       list.get( 2 ) );
+
+    }
+
+    public void testSkipModify() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_skipModify.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
         
+        final List results = new ArrayList();
+        workingMemory.setGlobal( "results",
+                                 results );
 
+        Cheese cheese = new Cheese( "brie",
+                                    10 );
+        FactHandle handle = workingMemory.assertObject( cheese );
+
+        Person bob = new Person( "bob",
+                                 "stilton" );
+        workingMemory.assertObject( bob );
+
+        cheese.setType( "stilton" );
+        workingMemory.modifyObject( handle, cheese );
+        workingMemory.fireAllRules();
+        assertEquals( 2,
+                      results.size() );
+        
+
     }
-    
+
 }

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_skipModify.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_skipModify.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_skipModify.drl	2007-03-27 00:18:34 UTC (rev 10546)
@@ -0,0 +1,25 @@
+package org.drools;
+
+global java.util.List results;
+
+rule testSkipModify
+   when 
+       Cheese( $type : type )
+       Person( )
+       Person( likes == $type )
+       Person( $likes : likes, ( $likes.equals( $type ) ) )
+       eval( $likes.equals( $type ) )
+   then
+       results.add( "FIRED" );
+end
+
+rule testSkipModify2
+   when 
+       Cheese( )
+       Person( )
+       Person( likes == "stilton" )
+       Person( $likes : likes, ( $likes.equals( "stilton" ) ) )
+       eval( $likes.equals( "stilton" ) )
+   then
+       results.add( "FIRED" );
+end


Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_skipModify.drl
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSink.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSink.java	2007-03-26 23:54:30 UTC (rev 10545)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSink.java	2007-03-27 00:18:34 UTC (rev 10546)
@@ -30,7 +30,7 @@
  * @author <a href="mailto:bob at werken.com">Bob McWhirter</a>
  *
  */
-public interface ObjectSink {
+public interface ObjectSink extends Sink {
 
     /**
      * Assert a new <code>FactHandleImpl</code>.

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	2007-03-26 23:54:30 UTC (rev 10545)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSource.java	2007-03-27 00:18:34 UTC (rev 10546)
@@ -21,6 +21,8 @@
 import org.drools.common.BaseNode;
 import org.drools.common.DefaultFactHandle;
 import org.drools.common.InternalWorkingMemory;
+import org.drools.rule.Declaration;
+import org.drools.spi.Constraint;
 import org.drools.spi.PropagationContext;
 
 /**
@@ -50,8 +52,6 @@
 
     private int alphaNodeHashingThreshold;    
     
-    protected boolean skipOnModify = false;
-    
     // ------------------------------------------------------------
     // Constructors
     // ------------------------------------------------------------
@@ -105,8 +105,6 @@
         } else {
             ((CompositeObjectSinkAdapter) this.sink).addObjectSink( objectSink );
         }
-        
-        this.skipOnModify = canSkipOnModify();
     }
 
     /**
@@ -129,8 +127,6 @@
                 this.sink = new SingleObjectSinkAdapter( sinkAdapter.getSinks()[0] );
             }
         }   
-        
-        this.skipOnModify = canSkipOnModify();
     }
 
     public abstract void updateSink(ObjectSink sink,
@@ -141,17 +137,4 @@
         return this.sink;
     }
     
-    private boolean canSkipOnModify() {
-        // If we have no alpha or beta node with constraints on this ObjectType, we can just skip modifies
-        ObjectSink[] sinks = this.sink.getSinks();
-        boolean hasConstraints = false;
-        for ( int i = 0; i < sinks.length; i++ ) {
-            if ( sinks[i] instanceof AlphaNode ||( sinks[i] instanceof BetaNode && ((BetaNode) sinks[i]).getConstraints().length > 0 ) ) {
-                hasConstraints = true;
-            }
-        }
-
-        // Can only skip if we have no constraints
-        return !hasConstraints;     
-    }
 }

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	2007-03-26 23:54:30 UTC (rev 10545)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java	2007-03-27 00:18:34 UTC (rev 10546)
@@ -26,6 +26,8 @@
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.NodeMemory;
 import org.drools.common.PropagationContextImpl;
+import org.drools.rule.Declaration;
+import org.drools.spi.Constraint;
 import org.drools.spi.ObjectType;
 import org.drools.spi.PropagationContext;
 import org.drools.util.FactHashTable;
@@ -73,6 +75,8 @@
     /** The parent Rete node */
     private final Rete        rete;   
 
+    protected boolean skipOnModify = false;
+    
     // ------------------------------------------------------------
     // Constructors
     // ------------------------------------------------------------
@@ -299,4 +303,64 @@
         return this.objectType.equals( other.objectType );
     }
 
+    /**
+     * @inheritDoc
+     */
+    protected void addObjectSink(final ObjectSink objectSink) {
+        super.addObjectSink( objectSink );
+        this.skipOnModify = canSkipOnModify( this.sink.getSinks() );
+    }
+
+    /**
+     * @inheritDoc
+     */
+    protected void removeObjectSink(final ObjectSink objectSink) {
+        super.removeObjectSink( objectSink );
+        this.skipOnModify = canSkipOnModify( this.sink.getSinks() );
+    }
+
+
+    /**
+     * Checks if a modify action on this object type may
+     * be skipped because no constraint is applied to it
+     *  
+     * @param sinks
+     * @return
+     */
+    private boolean canSkipOnModify( Sink[] sinks ) {
+        // 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 ) {
+                hasConstraints = this.usesDeclaration( ((AlphaNode) sinks[i]).getConstraint() );
+            } else if ( sinks[i] instanceof BetaNode && ((BetaNode) sinks[i]).getConstraints().length > 0 ) {
+                hasConstraints = this.usesDeclaration( ((BetaNode) sinks[i]).getConstraints() );
+            } 
+            if( !hasConstraints && sinks[i] instanceof ObjectSource ) {
+                hasConstraints = this.canSkipOnModify( ((ObjectSource)sinks[i]).getSinkPropagator().getSinks() );
+            } else if ( sinks[i] instanceof TupleSource ) {
+                hasConstraints = this.canSkipOnModify( ((TupleSource)sinks[i]).getSinkPropagator().getSinks() );
+            }
+        }
+
+        // Can only skip if we have no constraints
+        return !hasConstraints;     
+    }
+    
+    private boolean usesDeclaration( Constraint[] constraints ) {
+        boolean usesDecl = false;
+        for( int i = 0; !usesDecl && i < constraints.length; i++ ) {
+            usesDecl = this.usesDeclaration( constraints[i] );
+        }
+        return usesDecl;
+    }
+
+    private boolean usesDeclaration( Constraint constraint ) {
+        boolean usesDecl = false;
+        Declaration[] declarations = constraint.getRequiredDeclarations();
+        for( int j = 0; !usesDecl && j < declarations.length; j++ ) {
+            usesDecl = ( declarations[j].getColumn().getObjectType() == this.objectType );
+        }
+        return usesDecl;
+    }
 }

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Sink.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Sink.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Sink.java	2007-03-27 00:18:34 UTC (rev 10546)
@@ -0,0 +1,10 @@
+package org.drools.reteoo;
+
+/**
+ * A simple markup interfaces for Sink types
+ * 
+ * @author etirelli
+ */
+interface Sink {
+
+}
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Sink.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSink.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSink.java	2007-03-26 23:54:30 UTC (rev 10545)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSink.java	2007-03-27 00:18:34 UTC (rev 10546)
@@ -32,7 +32,7 @@
  */
 interface TupleSink
     extends
-    Serializable {
+    Serializable, Sink {
 
     /**
      * Assert a new <code>ReteTuple</code>.




More information about the jboss-svn-commits mailing list