[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