[jboss-svn-commits] JBL Code SVN: r6685 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools/reteoo main/java/org/drools/util test/java/org/drools/examples/manners
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sun Oct 8 08:52:32 EDT 2006
Author: mark.proctor at jboss.com
Date: 2006-10-08 08:52:23 -0400 (Sun, 08 Oct 2006)
New Revision: 6685
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/CompositeObjectSinkAdapter.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/NotNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectHashTable.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/ReteTuple.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashTable.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FieldIndexHashTable.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ReflectiveVisitor.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleHashTable.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/BaseMannersTest.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java
Log:
JBRULES-498 Optimised HashMap implementations
-Various Fixes
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-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java 2006-10-08 12:52:23 UTC (rev 6685)
@@ -61,7 +61,7 @@
/**
* Construct an <code>AlphaNode</code> with a unique id using the provided
* <code>FieldConstraint</code> and the given <code>ObjectSource</code>.
- * Nodes created in this way will not have a local memory by default.
+ * Nodes created in this way will have a local memory by default.
*
* @param id
* @param constraint
@@ -70,7 +70,7 @@
AlphaNode(final int id,
final FieldConstraint constraint,
final ObjectSource objectSource) {
- this(id, constraint, objectSource, false);
+ this(id, constraint, objectSource, true);
}
/**
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java 2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java 2006-10-08 12:52:23 UTC (rev 6685)
@@ -334,26 +334,26 @@
}
}
- public void propagateNewObjectSink(InternalFactHandle handle,
- PropagationContext context,
- InternalWorkingMemory workingMemory) {
- final ObjectSink sink = this.otherSinks.getLast();
- sink.assertObject( handle,
- context,
- workingMemory );
-
- }
-
public ObjectSink[] getSinks() {
- ObjectSink[] sinkArray = new ObjectSink[this.otherSinks.size()];
-
- int i = 0;
-
- for ( ObjectSinkNode sink = this.otherSinks.getFirst(); sink != null; sink = sink.getNextObjectSinkNode() ) {
- sinkArray[i++] = sink;
+ List list = new ArrayList();
+
+ if ( this.otherSinks != null ) {
+ for ( ObjectSinkNode sink = this.otherSinks.getFirst(); sink != null; sink = sink.getNextObjectSinkNode() ) {
+ list.add( sink );
+ }
}
+
+ if ( this.hashedSinks != null ) {
+ for ( ObjectSinkNode sink = this.hashedSinks.getFirst(); sink != null; sink = sink.getNextObjectSinkNode() ) {
+ list.add( sink );
+ }
+ }
+
+ if( this.hashedFieldIndexes != null ) {
+
+ }
- return sinkArray;
+ return ( ObjectSink[] ) list.toArray( new ObjectSink[ list.size() ] );
}
public int size() {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java 2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java 2006-10-08 12:52:23 UTC (rev 6685)
@@ -190,15 +190,18 @@
final PropagationContext context,
final InternalWorkingMemory workingMemory) {
final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
-
- if ( memory.getTupleMemory().remove( leftTuple ) == null ) {
+ ReteTuple tuple = ( ReteTuple ) memory.getTupleMemory().remove( leftTuple );
+ if ( tuple == null) {
+ leftTuple.release();
return;
}
Iterator it = memory.getObjectMemory().iterator( leftTuple );
for ( FactEntry entry = ( FactEntry ) it.next(); entry != null; entry = ( FactEntry ) it.next() ) {
sink.propagateRetractTuple( leftTuple, entry.getFactHandle(), context, workingMemory );
- }
+ }
+ tuple.release();
+ leftTuple.release();
}
/* (non-Javadoc)
@@ -221,4 +224,8 @@
}
}
}
+
+ public String toString() {
+ return "[JoinNode]";
+ }
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java 2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java 2006-10-08 12:52:23 UTC (rev 6685)
@@ -185,6 +185,7 @@
this.sink.createAndPropagateRetractTuple( tuple,
context,
workingMemory );
+ tuple.release();
}
public void updateSink(TupleSink sink,
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/NotNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/NotNode.java 2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/NotNode.java 2006-10-08 12:52:23 UTC (rev 6685)
@@ -213,27 +213,17 @@
// Must use the tuple in memory as it has the tuple matches count
ReteTuple tuple = ( ReteTuple ) memory.getTupleMemory().remove( leftTuple );
if ( tuple == null ) {
+ leftTuple.release();
return;
- }
-
- int matches = tuple.getMatches();
- int previousMatches = matches;
-
- Iterator it = memory.getObjectMemory().iterator( tuple );
- for ( FactEntry entry = ( FactEntry ) it.next(); entry != null; entry = ( FactEntry ) it.next() ) {
- InternalFactHandle handle = entry.getFactHandle();
- if ( this.constraints.isAllowed( handle, tuple, workingMemory ) ) {
- matches--;
- }
}
- tuple.setMatches( matches );
-
- if (previousMatches != 0 && matches == 0 ) {
- this.sink.propagateRetractTuple( tuple,
+ if ( tuple.getMatches() == 0) {
+ this.sink.propagateRetractTuple( leftTuple,
context,
workingMemory );
- }
+ }
+ tuple.release();
+ leftTuple.release();
}
/* (non-Javadoc)
@@ -259,4 +249,8 @@
//
// this.attachingNewNode = true;
}
+
+ public String toString() {
+ return "[NotNode]";
+ }
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectHashTable.java 2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectHashTable.java 2006-10-08 12:52:23 UTC (rev 6685)
@@ -1,6 +1,7 @@
package org.drools.reteoo;
import org.drools.common.InternalFactHandle;
+import org.drools.util.Entry;
import org.drools.util.Iterator;
public interface ObjectHashTable {
@@ -17,4 +18,6 @@
public int size();
+ public Entry[] getTable();
+
}
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-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java 2006-10-08 12:52:23 UTC (rev 6685)
@@ -139,7 +139,8 @@
final Object object = handle.getObject();
- ObjectTypeNode[] cachedNodes = (ObjectTypeNode[]) memory.get( object.getClass() );
+ // @todo : this is a nasty hack to make manners run, fix asap!!!
+ ObjectTypeNode[] cachedNodes = (ObjectTypeNode[]) memory.get( object.getClass().getSuperclass() );
if ( cachedNodes == null ) {
// it is possible that there are no ObjectTypeNodes for an object being retracted
return;
@@ -199,6 +200,10 @@
removeObjectSink( objectTypeNode );
//@todo: we really should attempt to clear the memory cache for this ObjectTypeNode
}
+
+ public ObjectHashMap getObjectTypeNodes() {
+ return this.objectTypeNodes;
+ }
public Object createMemory(final RuleBaseConfiguration config) {
return new ObjectHashMap();
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteTuple.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteTuple.java 2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteTuple.java 2006-10-08 12:52:23 UTC (rev 6685)
@@ -8,7 +8,6 @@
import org.drools.spi.Activation;
import org.drools.spi.Tuple;
import org.drools.util.BaseEntry;
-import org.drools.util.LinkedList;
public class ReteTuple extends BaseEntry
implements
@@ -21,6 +20,8 @@
private ReteTuple parent;
+ private Activation activation;
+
private long recency;
private int hashCode;
@@ -89,6 +90,10 @@
return get( declaration.getColumn().getIndex() );
}
+ public Activation getActivation() {
+ return this.activation;
+ }
+
public InternalFactHandle[] getFactHandles() {
List list = new ArrayList();
ReteTuple entry = this;
@@ -102,12 +107,23 @@
public long getRecency() {
return this.recency;
- }
+ }
+
+ public void setActivation(Activation activation) {
+ this.activation = activation;
+ }
+
public int hashCode() {
- return this.handle.hashCode();
+ return this.hashCode;
}
+ public void release() {
+ this.parent = null;
+ this.activation = null;
+ setNext( null );
+ }
+
/**
* We use this equals method to avoid the cast
* @param tuple
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java 2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java 2006-10-08 12:52:23 UTC (rev 6685)
@@ -35,6 +35,7 @@
import org.drools.spi.PropagationContext;
import org.drools.util.Iterator;
import org.drools.util.ObjectHashMap;
+import org.drools.util.TupleHashTable;
import org.drools.util.ObjectHashMap.ObjectEntry;
/**
@@ -154,7 +155,8 @@
}
agenda.scheduleItem( item );
- memory.getTupleMemory().put( tuple, item, false );
+ tuple.setActivation( item );
+ memory.getTupleMemory().add( tuple );
item.setActivated( true );
workingMemory.getAgendaEventSupport().fireActivationCreated( item );
@@ -208,7 +210,9 @@
// If the AgendaGroup is already in the priority queue it just
// returns.
agendaGroup.add( item );
- memory.getTupleMemory().put( tuple, item, false );
+ tuple.setActivation( item );
+ memory.getTupleMemory().add( tuple );
+
item.setActivated( true );
// We only want to fire an event on a truly new Activation and not on an Activation as a result of a modify
@@ -218,13 +222,14 @@
}
}
- public void retractTuple(final ReteTuple tuple,
+ public void retractTuple(ReteTuple leftTuple,
final PropagationContext context,
final InternalWorkingMemory workingMemory) {
final TerminalNodeMemory memory = (TerminalNodeMemory) workingMemory.getNodeMemory( this );
- final Activation activation = ( Activation ) memory.getTupleMemory().remove( tuple );
+ ReteTuple tuple = ( ReteTuple ) memory.getTupleMemory().remove( leftTuple );
//an activation is null if the tuple was never propagated as an assert
- if ( activation != null ){
+ if ( tuple != null && tuple.getActivation() != null ){
+ Activation activation = tuple.getActivation();
if ( activation.isActivated() ) {
activation.remove();
workingMemory.getAgendaEventSupport().fireActivationCancelled( activation );
@@ -233,7 +238,9 @@
workingMemory.getTruthMaintenanceSystem().removeLogicalDependencies( activation,
context,
this.rule );
+ tuple.release();
}
+ leftTuple.release();
}
public String toString() {
@@ -359,10 +366,10 @@
private ActivationGroup activationGroup;
- private ObjectHashMap tupleMemory;
+ private TupleHashTable tupleMemory;
public TerminalNodeMemory() {
- this.tupleMemory = new ObjectHashMap();
+ this.tupleMemory = new TupleHashTable();
}
public AgendaGroupImpl getAgendaGroup() {
@@ -381,7 +388,7 @@
this.activationGroup = activationGroup;
}
- public ObjectHashMap getTupleMemory() {
+ public TupleHashTable getTupleMemory() {
return this.tupleMemory;
}
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java 2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java 2006-10-08 12:52:23 UTC (rev 6685)
@@ -19,7 +19,6 @@
protected ObjectComparator comparator;
protected Entry[] table;
-
private HashTableIterator iterator;
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashTable.java 2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashTable.java 2006-10-08 12:52:23 UTC (rev 6685)
@@ -52,7 +52,7 @@
// We aren't checking the key exists, or it didn't find the key
FactEntry entry = new FactEntry( handle,
hashCode );
- entry.next = (FactEntry) this.table[index];
+ entry.next = this.table[index];
this.table[index] = entry;
if ( this.size++ >= this.threshold ) {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FieldIndexHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FieldIndexHashTable.java 2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FieldIndexHashTable.java 2006-10-08 12:52:23 UTC (rev 6685)
@@ -25,6 +25,8 @@
private FieldIndexHashTableIterator tupleValueIterator;
private HashCodeHashTableIterator hashCodeValueIterator;
+
+ private int factSize;
public FieldIndexHashTable(FieldExtractor extractor,
Declaration declaration) {
@@ -158,6 +160,7 @@
public boolean add(InternalFactHandle handle) {
FieldIndexEntry entry = getOrCreate( this.extractor.getValue( handle.getObject() ) );
entry.add( handle );
+ this.factSize++;
return true;
}
@@ -181,6 +184,7 @@
FieldIndexEntry next = (FieldIndexEntry) current.next;
if ( hashCode == current.hashCode && value.equals( current.getValue() ) ) {
current.remove( handle );
+ this.factSize--;
// If the FactEntryIndex is empty, then remove it from the hash map
if ( current.first == null ) {
if ( previous == current ) {
@@ -266,6 +270,10 @@
}
return entry;
}
+
+ public int size() {
+ return this.factSize;
+ }
public static class FieldIndexEntry
implements
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ReflectiveVisitor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ReflectiveVisitor.java 2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ReflectiveVisitor.java 2006-10-08 12:52:23 UTC (rev 6685)
@@ -34,13 +34,14 @@
static final String newline = System.getProperty( "line.separator" );
public void visit(final Object object) {
+ Method method = null;
try {
if ( object != null ) {
- final Method method = getMethod( object.getClass() );
+ method = getMethod( object.getClass() );
method.invoke( this,
new Object[]{object} );
} else {
- final Method method = getClass().getMethod( "visitNull",
+ method = getClass().getMethod( "visitNull",
(Class[]) null );
method.invoke( this,
(Object[]) null );
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleHashTable.java 2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleHashTable.java 2006-10-08 12:52:23 UTC (rev 6685)
@@ -22,6 +22,7 @@
int index = indexOf( hashCode,
table.length );
+ tuple.setNext( this.table[index] );
this.table[index] = tuple;
if ( this.size++ >= this.threshold ) {
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/BaseMannersTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/BaseMannersTest.java 2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/BaseMannersTest.java 2006-10-08 12:52:23 UTC (rev 6685)
@@ -518,7 +518,6 @@
throw new ConsequenceException( e );
}
}
-
};
rule.setConsequence( consequence );
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java 2006-10-08 12:09:35 UTC (rev 6684)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java 2006-10-08 12:52:23 UTC (rev 6685)
@@ -23,6 +23,8 @@
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.WorkingMemory;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.reteoo.MemoryVisitor;
public class ReteooMannersTest extends BaseMannersTest {
@@ -30,7 +32,7 @@
final RuleBase ruleBase = RuleBaseFactory.newRuleBase( RuleBase.RETEOO );
ruleBase.addPackage( this.pkg );
- final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+ final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
// workingMemory.addEventListener( new DefaultAgendaEventListener() {
// public void activationCreated(ActivationCreatedEvent event) {
@@ -55,7 +57,7 @@
//
// });
- final InputStream is = getClass().getResourceAsStream( "/manners32.dat" );
+ final InputStream is = getClass().getResourceAsStream( "/manners128.dat" );
final List list = getInputObjects( is );
for ( final Iterator it = list.iterator(); it.hasNext(); ) {
final Object object = it.next();
@@ -67,6 +69,9 @@
final long start = System.currentTimeMillis();
workingMemory.fireAllRules();
System.err.println( System.currentTimeMillis() - start );
+
+ MemoryVisitor visitor = new MemoryVisitor( ( InternalWorkingMemory ) workingMemory );
+ visitor.visit( ruleBase );
// final ReteooJungViewer viewer = new ReteooJungViewer(ruleBase);
//
More information about the jboss-svn-commits
mailing list