[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