[jboss-svn-commits] JBL Code SVN: r9429 - labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sat Feb 10 17:12:51 EST 2007


Author: mark.proctor at jboss.com
Date: 2007-02-10 17:12:51 -0500 (Sat, 10 Feb 2007)
New Revision: 9429

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/ObjectSource.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
Log:
-magic

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	2007-02-10 16:49:03 UTC (rev 9428)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaNode.java	2007-02-10 22:12:51 UTC (rev 9429)
@@ -27,6 +27,7 @@
 import org.drools.common.NodeMemory;
 import org.drools.common.PropagationContextImpl;
 import org.drools.spi.AlphaNodeFieldConstraint;
+import org.drools.spi.BetaNodeFieldConstraint;
 import org.drools.spi.PropagationContext;
 import org.drools.util.LinkedList;
 import org.drools.util.LinkedListEntry;
@@ -103,21 +104,19 @@
         this.leftInput = leftInput;
         this.rightInput = rightInput;
         this.constraints = constraints;
-    }
-
-    public AlphaNodeFieldConstraint[] getConstraints() {
-    
-        // Sanity check
+        
         if ( this.constraints == null ) {
-            return null;
+            throw new RuntimeException( "cannot have null constraints, must atleast be an instanceof EmptyBetaCosntraints" );
         }
+    }
 
+    public BetaNodeFieldConstraint[] getConstraints() {
         final LinkedList constraints = this.constraints.getConstraints();
 
-        final AlphaNodeFieldConstraint[] array = new AlphaNodeFieldConstraint[constraints.size()];
+        final BetaNodeFieldConstraint[] array = new BetaNodeFieldConstraint[constraints.size()];
         int i = 0;
         for ( LinkedListEntry entry = (LinkedListEntry) constraints.getFirst(); entry != null; entry = (LinkedListEntry) entry.getNext() ) {
-            array[i++] = (AlphaNodeFieldConstraint) entry.getObject();
+            array[i++] = (BetaNodeFieldConstraint) entry.getObject();
         }
         return array;
     }

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-02-10 16:49:03 UTC (rev 9428)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSource.java	2007-02-10 22:12:51 UTC (rev 9429)
@@ -48,8 +48,10 @@
 
     protected ObjectSource         objectSource;
 
-    private int alphaNodeHashingThreshold;
+    private int alphaNodeHashingThreshold;    
     
+    protected boolean skipOnModify = false;
+    
     // ------------------------------------------------------------
     // Constructors
     // ------------------------------------------------------------
@@ -103,6 +105,8 @@
         } else {
             ((CompositeObjectSinkAdapter) this.sink).addObjectSink( objectSink );
         }
+        
+        this.skipOnModify = canSkipOnModify();
     }
 
     /**
@@ -124,7 +128,9 @@
             if ( sinkAdapter.size() == 1 ) {
                 this.sink = new SingleObjectSinkAdapter( sinkAdapter.getSinks()[0] );
             }
-        }         
+        }   
+        
+        this.skipOnModify = canSkipOnModify();
     }
 
     public abstract void updateSink(ObjectSink sink,
@@ -134,4 +140,18 @@
     public ObjectSinkPropagator getSinkPropagator() {
         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-02-10 16:49:03 UTC (rev 9428)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java	2007-02-10 22:12:51 UTC (rev 9429)
@@ -21,6 +21,7 @@
 import org.drools.RuleBaseConfiguration;
 import org.drools.base.ShadowProxy;
 import org.drools.common.BaseNode;
+import org.drools.common.EmptyBetaConstraints;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.NodeMemory;
@@ -70,7 +71,7 @@
     private final ObjectType  objectType;
 
     /** The parent Rete node */
-    private final Rete        rete;
+    private final Rete        rete;   
 
     // ------------------------------------------------------------
     // Constructors
@@ -92,7 +93,7 @@
         super( id, null, alphaNodeHashingThreshold );
         this.rete = rete;
         this.objectType = objectType;
-        setHasMemory( true );
+        setHasMemory( true );       
     }
 
     // ------------------------------------------------------------
@@ -136,7 +137,7 @@
     public void assertObject(final InternalFactHandle handle,
                              final PropagationContext context,
                              final InternalWorkingMemory workingMemory) {
-        final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( this );
+        final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( this );        
 
         // checks if shadow is enabled
         if ( this.objectType.isShadowEnabled() ) {
@@ -149,9 +150,14 @@
                 ((ShadowProxy) handle.getObject()).updateProxy();
             }
         }
-        // we do not need to check if the fact exists already
+        
+        if (context.getType() == PropagationContext.MODIFICATION && this.skipOnModify ) {
+            // we do this after the shadowproxy update, just so that its up to date for the future
+            return;
+        }                
+
         memory.add( handle,
-                    false );
+                    false );        
 
         this.sink.propagateAssertObject( handle,
                                          context,
@@ -172,8 +178,12 @@
     public void retractObject(final InternalFactHandle handle,
                               final PropagationContext context,
                               final InternalWorkingMemory workingMemory) {
+        if (context.getType() == PropagationContext.MODIFICATION && this.skipOnModify ) {
+            return;
+        }         
+        
         final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( this );
-        memory.remove( handle );
+        memory.remove( handle );               
 
         this.sink.propagateRetractObject( handle,
                                           context,




More information about the jboss-svn-commits mailing list