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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Sep 22 12:34:54 EDT 2006


Author: tirelli
Date: 2006-09-22 12:34:47 -0400 (Fri, 22 Sep 2006)
New Revision: 6373

Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.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/Rete.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashSet.java
Log:
JBRULES-484: improving memory usage

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java	2006-09-22 16:30:16 UTC (rev 6372)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java	2006-09-22 16:34:47 UTC (rev 6373)
@@ -16,6 +16,10 @@
  * limitations under the License.
  */
 
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
 import org.drools.FactException;
 import org.drools.RuleBaseConfiguration;
 import org.drools.common.BaseNode;
@@ -27,7 +31,6 @@
 import org.drools.spi.PropagationContext;
 import org.drools.util.AbstractHashTable;
 import org.drools.util.FactHashSet;
-import org.drools.util.AbstractHashTable.FactEntry;
 
 /**
  * <code>AlphaNodes</code> are nodes in the <code>Rete</code> network used
@@ -114,11 +117,13 @@
     public void assertObject(final InternalFactHandle handle,
                              final PropagationContext context,
                              final InternalWorkingMemory workingMemory) throws FactException {
-        final FactHashSet memory = (FactHashSet) workingMemory.getNodeMemory( this );
         if ( this.constraint.isAllowed( handle.getObject(),
                                         null,
                                         workingMemory ) ) {
-            memory.add( handle, false );
+            if( hasMemory() ) {
+                final FactHashSet memory = (FactHashSet) workingMemory.getNodeMemory( this );
+                memory.add( handle, false );
+            }
             sink.propagateAssertObject( handle,
                                         context,
                                         workingMemory );
@@ -128,8 +133,12 @@
     public void retractObject(final InternalFactHandle handle,
                               final PropagationContext context,
                               final InternalWorkingMemory workingMemory) {
-        final FactHashSet memory = (FactHashSet) workingMemory.getNodeMemory( this );
-        if ( memory.remove( handle ) ) {
+        boolean propagate = true;
+        if( hasMemory() ) {
+            final FactHashSet memory = (FactHashSet) workingMemory.getNodeMemory( this );
+            propagate = memory.remove( handle ); 
+        }
+        if ( propagate ) {
             this.sink.propagateRetractObject( handle,
                                               context,
                                               workingMemory,
@@ -140,12 +149,15 @@
     public void modifyObject(final InternalFactHandle handle,
                              final PropagationContext context,
                              final InternalWorkingMemory workingMemory) {
-        final FactHashSet memory = (FactHashSet) workingMemory.getNodeMemory( this );
-
+        boolean propagate = true;        
         if ( this.constraint.isAllowed( handle.getObject(),
                                         null,
                                         workingMemory ) ) {
-            if ( memory.add( handle, true ) ) {
+            if( hasMemory() ) {
+                final FactHashSet memory = (FactHashSet) workingMemory.getNodeMemory( this );
+                propagate = memory.add( handle, true );
+            }
+            if ( propagate ) {
                 this.sink.propagateAssertObject( handle,
                                                  context,
                                                  workingMemory );
@@ -156,7 +168,11 @@
                                                  workingMemory );
             }
         } else {
-            if ( memory.remove( handle ) ) {
+            if( hasMemory ) {
+                final FactHashSet memory = (FactHashSet) workingMemory.getNodeMemory( this );
+                propagate = memory.remove( handle ); 
+            }
+            if ( propagate ) {
                 this.sink.propagateRetractObject( handle,
                                                   context,
                                                   workingMemory,
@@ -169,17 +185,34 @@
                               final PropagationContext context) {
         this.attachingNewNode = true;
 
-        final FactHashSet memory = (FactHashSet) workingMemory.getNodeMemory( this );
-        FactEntry[] entries  = ( FactEntry[]) memory.getTable();
-        for ( int i = 0, length  = entries.length; i < length; i++ ) {
-            FactEntry current = entries[i];
-            while  ( current != null ) {
-                this.sink.propagateNewObjectSink( current.getFactHandle(),
+        FactHashSet memory = null;
+
+        // if it was not storing facts in memory previously, create memory and
+        // start storing facts in the local memory
+        if( ! hasMemory() ) {
+            setHasMemory( true );
+            memory = (FactHashSet) workingMemory.getNodeMemory( this );
+            for(Iterator it = this.objectSource.getPropagatedFacts( workingMemory ).iterator(); it.hasNext(); ) {
+                InternalFactHandle handle = (InternalFactHandle) it.next();
+                memory.add( handle, false );
+                this.sink.propagateNewObjectSink( handle,
                                                   context,
                                                   workingMemory );
-                current = ( FactEntry ) current.getNext();
             }
-        }        
+        } else {
+            // if already has memory, just iterate and propagate
+            memory = (FactHashSet) workingMemory.getNodeMemory( this );
+            AbstractHashTable.FactEntry[] entries  = (AbstractHashTable.FactEntry[]) memory.getTable();
+            for ( int i = 0, length  = entries.length; i < length; i++ ) {
+                AbstractHashTable.FactEntry current = entries[i];
+                while  ( current != null ) {
+                    this.sink.propagateNewObjectSink( current.getFactHandle(),
+                                                      context,
+                                                      workingMemory );
+                    current = ( AbstractHashTable.FactEntry ) current.getNext();
+                }
+            }        
+        }
 
         this.attachingNewNode = false;
     }
@@ -268,5 +301,24 @@
      */
     public void setPreviousObjectSinkNode(ObjectSinkNode previous) {
         this.previousObjectSinkNode = previous;
-    }    
+    }   
+    
+    public List getPropagatedFacts(InternalWorkingMemory workingMemory) {
+        List facts = null;
+        if( hasMemory() ) {
+            final FactHashSet memory = (FactHashSet) workingMemory.getNodeMemory( this );
+            AbstractHashTable.FactEntry[] entries  = (AbstractHashTable.FactEntry[]) memory.getTable();
+            facts = new ArrayList(entries.length);
+            for ( int i = 0, length  = entries.length; i < length; i++ ) {
+                AbstractHashTable.FactEntry current = entries[i];
+                while  ( current != null ) {
+                    facts.add( current.getFactHandle() );
+                    current = ( AbstractHashTable.FactEntry ) current.getNext();
+                }
+            }
+        } else {
+            facts = this.objectSource.getPropagatedFacts(workingMemory);
+        }
+        return facts;
+    }
 }

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	2006-09-22 16:30:16 UTC (rev 6372)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSource.java	2006-09-22 16:34:47 UTC (rev 6373)
@@ -17,12 +17,11 @@
  */
 
 import java.io.Serializable;
-import java.util.Iterator;
 import java.util.List;
 
 import org.drools.common.BaseNode;
 import org.drools.common.DefaultFactHandle;
-import org.drools.spi.PropagationContext;
+import org.drools.common.InternalWorkingMemory;
 
 /**
  * A source of <code>FactHandle</code>s for an <code>ObjectSink</code>.
@@ -117,4 +116,6 @@
             }
         }         
     }
+    
+    public abstract List getPropagatedFacts(InternalWorkingMemory workingMemory);
 }

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	2006-09-22 16:30:16 UTC (rev 6372)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java	2006-09-22 16:34:47 UTC (rev 6373)
@@ -17,7 +17,9 @@
  */
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.List;
 
 import org.drools.RuleBaseConfiguration;
 import org.drools.common.BaseNode;
@@ -173,7 +175,7 @@
     public void updateNewNode(final InternalWorkingMemory workingMemory,
                               final PropagationContext context) {
         this.attachingNewNode = true;
-
+        
         final PrimitiveLongMap memory = (PrimitiveLongMap) workingMemory.getNodeMemory( this );        
 
         for ( final Iterator it = memory.values().iterator(); it.hasNext(); ) {            
@@ -265,4 +267,15 @@
         return this.objectType.equals( other.objectType );
     }
 
+    public List getPropagatedFacts(InternalWorkingMemory workingMemory) {
+        final PrimitiveLongMap memory = (PrimitiveLongMap) workingMemory.getNodeMemory( this );
+        final List facts = new ArrayList();
+
+        for ( final Iterator it = memory.values().iterator(); it.hasNext(); ) {            
+            final DefaultFactHandle handle = (DefaultFactHandle) it.next();
+            facts.add( handle );
+        }
+        return facts;
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java	2006-09-22 16:30:16 UTC (rev 6372)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java	2006-09-22 16:34:47 UTC (rev 6373)
@@ -315,4 +315,14 @@
         return this.objectTypeNodes.equals( other.objectTypeNodes );
     }
 
+    public List getPropagatedFacts(InternalWorkingMemory workingMemory) {
+        List facts = new ArrayList();
+        for ( final Iterator i = workingMemory.getFactHandleMap().entrySet().iterator(); i.hasNext(); ) {
+            final Map.Entry entry = (Map.Entry) i.next();
+            final DefaultFactHandle handle = (DefaultFactHandle) entry.getValue();
+            facts.add(handle);
+        }
+        return facts;
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java	2006-09-22 16:30:16 UTC (rev 6372)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java	2006-09-22 16:34:47 UTC (rev 6373)
@@ -16,6 +16,10 @@
  * limitations under the License.
  */
 
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
 import org.drools.common.BaseNode;
 import org.drools.common.DefaultFactHandle;
 import org.drools.common.InternalFactHandle;
@@ -132,4 +136,15 @@
                                  workingMemories );
     }
 
+    public List getPropagatedFacts(InternalWorkingMemory workingMemory) {
+        List tuples = this.tupleSource.getPropagatedTuples( workingMemory, this );
+        List facts = new ArrayList();
+        
+        for(Iterator it = tuples.iterator(); it.hasNext(); ) {
+            ReteTuple tuple = (ReteTuple) it.next();
+            facts.add( (InternalFactHandle) tuple.get( this.column ) );
+        }
+        return facts;
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashSet.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashSet.java	2006-09-22 16:30:16 UTC (rev 6372)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashSet.java	2006-09-22 16:34:47 UTC (rev 6373)
@@ -6,6 +6,8 @@
 import org.drools.common.InternalFactHandle;
 
 public class FactHashSet extends AbstractHashTable {
+    private static final long serialVersionUID = -45167109828358945L;
+
     public FactHashSet() {
         this( 16,
               0.75f );
@@ -29,6 +31,7 @@
                 if ( hashCode == current.hashCode && handle.getId() == current.handle.getId() )  {
                     return false;
                 }
+                current = (FactHashSet.FactEntry) current.getNext();
             }
         }
 




More information about the jboss-svn-commits mailing list