[jboss-svn-commits] JBL Code SVN: r6565 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools/common main/java/org/drools/reteoo main/java/org/drools/spi main/java/org/drools/util test/java/org/drools/reteoo
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Tue Oct 3 19:00:30 EDT 2006
Author: mark.proctor at jboss.com
Date: 2006-10-03 19:00:21 -0400 (Tue, 03 Oct 2006)
New Revision: 6565
Removed:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ObjectTypeResolver.java
Modified:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalRuleBase.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/ObjectSinkPropagator.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/ReteooBuilder.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleObjectSinkAdapter.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/ObjectHashMap.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockObjectSink.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeNodeTest.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteTest.java
Log:
JBRULES-498 Optimised HashMap implementations
-Rete and ObjectTypeNode and their test now pass
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalRuleBase.java 2006-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalRuleBase.java 2006-10-03 23:00:21 UTC (rev 6565)
@@ -61,10 +61,6 @@
PropagationContext context,
ReteooWorkingMemory workingMemory) throws FactException;
- public void modifyObject(FactHandle handle,
- PropagationContext context,
- ReteooWorkingMemory workingMemory) throws FactException;
-
/**
* Retract a fact object.
*
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-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java 2006-10-03 23:00:21 UTC (rev 6565)
@@ -1,11 +1,7 @@
package org.drools.reteoo;
import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
import org.drools.base.evaluators.Operator;
import org.drools.common.InternalFactHandle;
@@ -15,8 +11,11 @@
import org.drools.spi.FieldConstraint;
import org.drools.spi.FieldExtractor;
import org.drools.spi.PropagationContext;
+import org.drools.util.Iterator;
import org.drools.util.LinkedList;
import org.drools.util.LinkedListNode;
+import org.drools.util.ObjectHashMap;
+import org.drools.util.ObjectHashMap.ObjectEntry;
public class CompositeObjectSinkAdapter
implements
@@ -27,7 +26,7 @@
private LinkedList hashedFieldIndexes;
- private Map hashedSinkMap;
+ private ObjectHashMap hashedSinkMap;
private HashKey hashKey;
@@ -54,9 +53,11 @@
hashSinks( fieldIndex );
}
Object value = literalConstraint.getField().getValue();
+ // no need to check, we know the sink does not exist
hashedSinkMap.put( new HashKey( index,
value ),
- sink );
+ sink,
+ false );
} else {
if ( this.hashedSinks == null ) {
this.hashedSinks = new ObjectSinkNodeList();
@@ -124,7 +125,7 @@
List list = new ArrayList();
if ( this.hashedSinkMap == null ) {
- this.hashedSinkMap = new HashMap();
+ this.hashedSinkMap = new ObjectHashMap();
}
for ( ObjectSinkNode sink = this.hashedSinks.getFirst(); sink != null; sink = sink.getNextObjectSinkNode() ) {
@@ -141,7 +142,7 @@
}
}
- for ( Iterator it = list.iterator(); it.hasNext(); ) {
+ for ( java.util.Iterator it = list.iterator(); it.hasNext(); ) {
ObjectSinkNode sink = ( ObjectSinkNode ) it.next();
this.hashedSinks.remove( sink );
}
@@ -281,39 +282,6 @@
}
- public void propagateModifyObject(InternalFactHandle handle,
- PropagationContext context,
- InternalWorkingMemory workingMemory) {
-
- if ( this.hashedSinkMap != null ) {
- for ( Iterator it = this.hashedSinkMap.values().iterator(); it.hasNext(); ) {
- ObjectSink sink = (ObjectSink) it.next();
- sink.modifyObject( handle,
- context,
- workingMemory );
- }
- }
-
- if ( this.hashedSinks != null ) {
- // we can't retrieve hashed sinks, as the field value might have changed, so we have to iterate and propagate to all hashed sinks
- for ( ObjectSinkNode sink = this.hashedSinks.getFirst(); sink != null; sink = sink.getNextObjectSinkNode() ) {
- sink.modifyObject( handle,
- context,
- workingMemory );
- }
- }
-
- if ( this.otherSinks != null ) {
- // propagate others
- for ( ObjectSinkNode sink = this.otherSinks.getFirst(); sink != null; sink = sink.getNextObjectSinkNode() ) {
- sink.modifyObject( handle,
- context,
- workingMemory );
- }
- }
-
- }
-
public void propagateRetractObject(InternalFactHandle handle,
PropagationContext context,
InternalWorkingMemory workingMemory,
@@ -337,9 +305,10 @@
}
}
} else if ( this.hashedSinkMap != null ) {
- for ( Iterator it = this.hashedSinkMap.values().iterator(); it.hasNext(); ) {
- ObjectSink sink = (ObjectSink) it.next();
- sink.modifyObject( handle,
+ Iterator it = this.hashedSinkMap.iterator();
+ for ( ObjectEntry entry = (ObjectEntry) it.next(); entry != null; entry = (ObjectEntry) it.next() ) {
+ ObjectSink sink = (ObjectSink) entry.getValue();
+ sink.retractObject( handle,
context,
workingMemory );
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSinkPropagator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSinkPropagator.java 2006-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSinkPropagator.java 2006-10-03 23:00:21 UTC (rev 6565)
@@ -16,9 +16,5 @@
InternalWorkingMemory workingMemory,
boolean useHash);
- public void propagateModifyObject(InternalFactHandle handle,
- PropagationContext context,
- InternalWorkingMemory workingMemory);
-
public ObjectSink[] getSinks();
}
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-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java 2006-10-03 23:00:21 UTC (rev 6565)
@@ -18,7 +18,6 @@
import java.io.Serializable;
import java.util.ArrayList;
-import java.util.Iterator;
import java.util.List;
import org.drools.RuleBaseConfiguration;
@@ -30,7 +29,11 @@
import org.drools.common.PropagationContextImpl;
import org.drools.spi.ObjectType;
import org.drools.spi.PropagationContext;
+import org.drools.util.FactHashTable;
+import org.drools.util.Iterator;
+import org.drools.util.ObjectHashMap;
import org.drools.util.PrimitiveLongMap;
+import org.drools.util.AbstractHashTable.FactEntry;
/**
* <code>ObjectTypeNodes<code> are responsible for filtering and propagating the matching
@@ -65,7 +68,7 @@
/**
*
*/
- private static final long serialVersionUID = 1397702820739948690L;
+ private static final long serialVersionUID = 320L;
/** The <code>ObjectType</code> semantic module. */
private final ObjectType objectType;
@@ -136,9 +139,9 @@
public void assertObject(final InternalFactHandle handle,
final PropagationContext context,
final InternalWorkingMemory workingMemory) {
- final PrimitiveLongMap memory = (PrimitiveLongMap) workingMemory.getNodeMemory( this );
- memory.put( handle.getId(),
- handle );
+ final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( this );
+ // we do not need to check if the fact exists already
+ memory.add( handle, false );
this.sink.propagateAssertObject( handle, context, workingMemory );
}
@@ -157,26 +160,17 @@
public void retractObject(final InternalFactHandle handle,
final PropagationContext context,
final InternalWorkingMemory workingMemory) {
- final PrimitiveLongMap memory = (PrimitiveLongMap) workingMemory.getNodeMemory( this );
- memory.remove( handle.getId() );
+ final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( this );
+ memory.remove( handle );
this.sink.propagateRetractObject( handle, context, workingMemory, true );
- }
+ }
-
- public void modifyObject(final InternalFactHandle handle,
- final PropagationContext context,
- final InternalWorkingMemory workingMemory) {
- this.sink.propagateModifyObject( handle, context, workingMemory );
- }
-
-
public void updateSink(ObjectSink sink, PropagationContext context, InternalWorkingMemory workingMemory) {
- final PrimitiveLongMap memory = (PrimitiveLongMap) workingMemory.getNodeMemory( this );
-
- for ( final Iterator it = memory.values().iterator(); it.hasNext(); ) {
- final DefaultFactHandle handle = (DefaultFactHandle) it.next();
- sink.assertObject( handle, context, workingMemory );
+ final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( this );
+ Iterator it = memory.iterator();
+ for ( FactEntry entry = ( FactEntry ) it.next(); entry != null; entry = ( FactEntry ) it.next() ) {
+ sink.assertObject( entry.getFactHandle(), context, workingMemory );
}
}
@@ -190,7 +184,7 @@
public void attach(final InternalWorkingMemory[] workingMemories) {
attach();
- // we need to call updateNewNode on Rete, because someone
+ // we need to call updateSink on Rete, because someone
// might have already added facts matching this ObjectTypeNode
// to working memories
for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
@@ -199,8 +193,9 @@
PropagationContext.RULE_ADDITION,
null,
null );
- this.rete.updateNewNode( workingMemory,
- propagationContext );
+ this.rete.updateSink( this,
+ propagationContext,
+ workingMemory );
}
}
@@ -232,8 +227,7 @@
* to switch back to a standard HashMap.
*/
public Object createMemory(final RuleBaseConfiguration config) {
- return new PrimitiveLongMap( 32,
- 8 );
+ return new FactHashTable();
}
public String toString() {
@@ -260,16 +254,5 @@
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-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java 2006-10-03 23:00:21 UTC (rev 6565)
@@ -18,24 +18,20 @@
import java.io.Serializable;
import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
-import java.util.Map;
import org.drools.FactException;
import org.drools.RuleBaseConfiguration;
import org.drools.common.BaseNode;
-import org.drools.common.DefaultFactHandle;
import org.drools.common.InternalFactHandle;
import org.drools.common.InternalWorkingMemory;
import org.drools.common.NodeMemory;
import org.drools.facttemplates.Fact;
import org.drools.facttemplates.FactImpl;
-import org.drools.spi.ObjectType;
-import org.drools.spi.ObjectTypeResolver;
import org.drools.spi.PropagationContext;
+import org.drools.util.Iterator;
+import org.drools.util.ObjectHashMap;
+import org.drools.util.ObjectHashMap.ObjectEntry;
/**
* The Rete-OO network.
@@ -68,27 +64,17 @@
/**
*
*/
- private static final long serialVersionUID = -7166421271509211041L;
+ private static final long serialVersionUID = 320L;
/** The <code>Map</code> of <code>ObjectTypeNodes</code>. */
- private final Map objectTypeNodes = new HashMap();
- private ObjectTypeNode lastAddedNode = null;
+ private final ObjectHashMap objectTypeNodes;
- private final ObjectTypeResolver resolver;
-
// ------------------------------------------------------------
// Constructors
// ------------------------------------------------------------
- /**
- * Construct.
- */
public Rete() {
- this( null );
- }
-
- public Rete(final ObjectTypeResolver resolver) {
super( 0 );
- this.resolver = resolver;
+ this.objectTypeNodes = new ObjectHashMap();
}
// ------------------------------------------------------------
@@ -110,7 +96,7 @@
public void assertObject(final InternalFactHandle handle,
final PropagationContext context,
final InternalWorkingMemory workingMemory) {
- final HashMap memory = (HashMap) workingMemory.getNodeMemory( this );
+ final ObjectHashMap memory = (ObjectHashMap) workingMemory.getNodeMemory( this );
final Object object = handle.getObject();
@@ -126,7 +112,8 @@
if ( cachedNodes == null ) {
cachedNodes = getMatchingNodes( object );
memory.put( key,
- cachedNodes );
+ cachedNodes,
+ false );
}
for ( int i = 0, length = cachedNodes.length; i < length; i++ ) {
@@ -148,17 +135,16 @@
public void retractObject(final InternalFactHandle handle,
final PropagationContext context,
final InternalWorkingMemory workingMemory) {
- final HashMap memory = (HashMap) workingMemory.getNodeMemory( this );
+ final ObjectHashMap memory = (ObjectHashMap) workingMemory.getNodeMemory( this );
final Object object = handle.getObject();
ObjectTypeNode[] cachedNodes = (ObjectTypeNode[]) memory.get( object.getClass() );
if ( cachedNodes == null ) {
- cachedNodes = getMatchingNodes( object );
- memory.put( object.getClass(),
- cachedNodes );
+ // it is possible that there are no ObjectTypeNodes for an object being retracted
+ return;
}
-
+
for ( int i = 0; i < cachedNodes.length; i++ ) {
cachedNodes[i].retractObject( handle,
context,
@@ -166,85 +152,21 @@
}
}
- public void modifyObject(final InternalFactHandle handle,
- final PropagationContext context,
- final InternalWorkingMemory workingMemory) {
- final HashMap memory = (HashMap) workingMemory.getNodeMemory( this );
-
- final Object object = handle.getObject();
-
- ObjectTypeNode[] cachedNodes = (ObjectTypeNode[]) memory.get( object.getClass() );
- if ( cachedNodes == null ) {
- cachedNodes = getMatchingNodes( object );
- memory.put( object.getClass(),
- cachedNodes );
- }
-
- for ( int i = 0; i < cachedNodes.length; i++ ) {
- cachedNodes[i].modifyObject( handle,
- context,
- workingMemory );
- }
- }
-
private ObjectTypeNode[] getMatchingNodes(final Object object) throws FactException {
final List cache = new ArrayList();
- for ( final Iterator it = objectTypeNodeIterator(); it.hasNext(); ) {
- final ObjectTypeNode node = (ObjectTypeNode) it.next();
+ Iterator it = this.objectTypeNodes.iterator();
+ for ( ObjectEntry entry = (ObjectEntry)it.next(); entry != null; entry = (ObjectEntry)it.next() ) {
+ final ObjectTypeNode node = (ObjectTypeNode) entry.getValue();
if ( node.matches( object ) ) {
cache.add( node );
- }
+ }
}
+
return (ObjectTypeNode[]) cache.toArray( new ObjectTypeNode[cache.size()] );
- }
+ }
/**
- * Retrieve all <code>ObjectTypeNode</code> children of this node.
- *
- * @return The <code>Set</code> of <code>ObjectTypeNodes</code>.
- */
- Collection getObjectTypeNodes() {
- return this.objectTypeNodes.values();
- }
-
- /**
- * Retrieve an <code>Iterator</code> over the <code>ObjectTypeNode</code>
- * children of this node.
- *
- * @return An <code>Iterator</code> over <code>ObjectTypeNodes</code>.
- */
- Iterator objectTypeNodeIterator() {
- return this.objectTypeNodes.values().iterator();
- }
-
- /**
- * Retrieve an <code>ObjectTypeNode</code> keyed by
- * <code>ObjectType</code>.
- *
- * @param objectType
- * The <code>ObjectType</code> key.
- *
- * @return The matching <code>ObjectTypeNode</code> if one has already
- * been created, else <code>null</code>.
- */
- ObjectTypeNode getObjectTypeNode(final ObjectType objectType) {
- return (ObjectTypeNode) this.objectTypeNodes.get( objectType );
- }
-
- /**
- * Add an <code>ObjectTypeNode</code> child to this <code>Rete</code>.
- *
- * @param node
- * The node to add.
- */
- private void addObjectTypeNode(final ObjectTypeNode node) {
- this.lastAddedNode = node;
- this.objectTypeNodes.put( node.getObjectType(),
- node );
- }
-
- /**
* Adds the <code>TupleSink</code> so that it may receive
* <code>Tuples</code> propagated from this <code>TupleSource</code>.
*
@@ -253,7 +175,10 @@
* <code>Tuples</code>.
*/
protected void addObjectSink(final ObjectSink objectSink) {
- addObjectTypeNode( (ObjectTypeNode) objectSink );
+ ObjectTypeNode node = ( ObjectTypeNode ) objectSink;
+ this.objectTypeNodes.put( node.getObjectType(),
+ node,
+ false );
}
protected void removeObjectSink(final ObjectSink objectSink) {
@@ -261,41 +186,22 @@
}
public void attach() {
- // do nothing this is the root node
+ throw new UnsupportedOperationException( "cannot call attach() from the root Rete node");
}
public void attach(final InternalWorkingMemory[] workingMemories) {
- // do nothing this is the root node
+ throw new UnsupportedOperationException( "cannot call attach() from the root Rete node");
}
- // when a new ObjectTypeNode is added, check for possible
- // propagations into the new node
- public void updateNewNode(final InternalWorkingMemory workingMemory,
- final PropagationContext context) {
- if ( this.lastAddedNode != null ) {
- final ObjectType objType = this.lastAddedNode.getObjectType();
- for ( final Iterator i = workingMemory.getFactHandleMap().entrySet().iterator(); i.hasNext(); ) {
- final Map.Entry entry = (Map.Entry) i.next();
- final DefaultFactHandle handle = (DefaultFactHandle) entry.getValue();
- if ( objType.matches( handle.getObject() ) ) {
- this.lastAddedNode.assertObject( handle,
- context,
- workingMemory );
- }
- }
- this.lastAddedNode = null;
- }
- }
-
public void remove(final BaseNode node,
final InternalWorkingMemory[] workingMemories) {
- final ObjectTypeNode objectTypeNode = (ObjectTypeNode) node;
+ final ObjectTypeNode objectTypeNode = (ObjectTypeNode) node;
removeObjectSink( objectTypeNode );
//@todo: we really should attempt to clear the memory cache for this ObjectTypeNode
}
public Object createMemory(final RuleBaseConfiguration config) {
- return new HashMap();
+ return new ObjectHashMap();
}
public int hashCode() {
@@ -318,11 +224,16 @@
public void updateSink(ObjectSink sink,
PropagationContext context,
InternalWorkingMemory workingMemory) {
- for ( final Iterator i = workingMemory.getFactHandleMap().entrySet().iterator(); i.hasNext(); ) {
- final Map.Entry entry = (Map.Entry) i.next();
- final DefaultFactHandle handle = (DefaultFactHandle) entry.getValue();
- sink.assertObject( handle, context, workingMemory );
- }
+ ObjectTypeNode node = ( ObjectTypeNode) sink;
+ for ( final java.util.Iterator i = workingMemory.getFactHandleMap().entrySet().iterator(); i.hasNext(); ) {
+ final java.util.Map.Entry entry = (java.util.Map.Entry) i.next();
+ final InternalFactHandle handle = (InternalFactHandle) entry.getValue();
+ if ( node.matches( handle.getObject() ) ) {
+ node.assertObject( handle,
+ context,
+ workingMemory );
+ }
+ }
}
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java 2006-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java 2006-10-03 23:00:21 UTC (rev 6565)
@@ -52,7 +52,6 @@
import org.drools.rule.Rule;
import org.drools.spi.FieldConstraint;
import org.drools.spi.FieldValue;
-import org.drools.spi.ObjectTypeResolver;
/**
* Builds the Rete-OO network for a <code>Package</code>.
@@ -83,8 +82,6 @@
private transient ReteooWorkingMemory[] workingMemories;
- private final ObjectTypeResolver resolver;
-
/** Nodes that have been attached. */
private final Map attachedNodes;
@@ -110,11 +107,9 @@
* Construct a <code>Builder</code> against an existing <code>Rete</code>
* network.
*/
- ReteooBuilder(final ReteooRuleBase ruleBase,
- final ObjectTypeResolver resolver) {
+ ReteooBuilder(final ReteooRuleBase ruleBase) {
this.ruleBase = ruleBase;
this.rete = this.ruleBase.getRete();
- this.resolver = resolver;
this.attachedNodes = new HashMap();
this.rules = new HashMap();
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java 2006-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java 2006-10-03 23:00:21 UTC (rev 6565)
@@ -30,14 +30,10 @@
import org.drools.WorkingMemory;
import org.drools.common.AbstractRuleBase;
import org.drools.common.DefaultFactHandle;
-import org.drools.common.PropagationContextImpl;
-import org.drools.common.AbstractWorkingMemory.WorkingMemoryRetractAction;
import org.drools.rule.CompositePackageClassLoader;
import org.drools.rule.InvalidPatternException;
import org.drools.rule.Rule;
-import org.drools.spi.ClassObjectTypeResolver;
import org.drools.spi.FactHandleFactory;
-import org.drools.spi.ObjectTypeResolver;
import org.drools.spi.PropagationContext;
/**
@@ -125,10 +121,8 @@
this.globals = new HashMap();
this.workingMemories = new WeakHashMap();
- final ObjectTypeResolver resolver = new ClassObjectTypeResolver();
- this.rete = new Rete( resolver );
- this.reteooBuilder = new ReteooBuilder( this,
- resolver );
+ this.rete = new Rete( );
+ this.reteooBuilder = new ReteooBuilder( this );
}
/**
@@ -196,14 +190,6 @@
workingMemory );
}
- public void modifyObject(final FactHandle handle,
- final PropagationContext context,
- final ReteooWorkingMemory workingMemory) throws FactException {
- getRete().modifyObject( (DefaultFactHandle) handle,
- context,
- workingMemory );
- }
-
/**
* Retract a fact object.
*
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleObjectSinkAdapter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleObjectSinkAdapter.java 2006-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleObjectSinkAdapter.java 2006-10-03 23:00:21 UTC (rev 6565)
@@ -20,13 +20,6 @@
this.sink.assertObject( handle, context, workingMemory );
}
-
- public void propagateModifyObject(InternalFactHandle handle,
- PropagationContext context,
- InternalWorkingMemory workingMemory) {
- this.sink.modifyObject( handle, context, workingMemory );
-
- }
public void propagateRetractObject(InternalFactHandle handle,
PropagationContext context,
@@ -36,14 +29,6 @@
}
- public void propagateNewObjectSink(InternalFactHandle handle,
- PropagationContext context,
- InternalWorkingMemory workingMemory) {
- // do nothing as this cannot have new sinks
- throw new RuntimeException( "This is a bug you cannot update new data through this single sink adapter" );
-
- }
-
public ObjectSink[] getSinks() {
return new ObjectSink[] { this.sink };
}
Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ObjectTypeResolver.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ObjectTypeResolver.java 2006-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ObjectTypeResolver.java 2006-10-03 23:00:21 UTC (rev 6565)
@@ -1,25 +0,0 @@
-package org.drools.spi;
-
-/*
- * Copyright 2005 JBoss Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.io.Serializable;
-
-public interface ObjectTypeResolver
- extends
- Serializable {
- ObjectType resolve(Object object);
-}
\ No newline at end of file
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-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java 2006-10-03 23:00:21 UTC (rev 6565)
@@ -155,6 +155,10 @@
public int size() {
return this.size;
}
+
+ public boolean isEmpty() {
+ return this.size == 0;
+ }
protected int indexOf(int hashCode,
int dataSize) {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ObjectHashMap.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ObjectHashMap.java 2006-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ObjectHashMap.java 2006-10-03 23:00:21 UTC (rev 6565)
@@ -28,6 +28,7 @@
int index = indexOf( hashCode,
table.length );
+ //@todo when in debug for ReteTest and the testCached method, something slows down here???
// scan the linked entries to see if it exists
if ( checkExists ) {
ObjectEntry current = (ObjectEntry) this.table[index];
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockObjectSink.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockObjectSink.java 2006-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockObjectSink.java 2006-10-03 23:00:21 UTC (rev 6565)
@@ -23,13 +23,16 @@
import org.drools.common.InternalWorkingMemory;
import org.drools.spi.PropagationContext;
-public class MockObjectSink
+public class MockObjectSink
implements
- ObjectSink {
+ ObjectSinkNode {
private final List asserted = new ArrayList();
private final List retracted = new ArrayList();
private final List modified = new ArrayList();
+ private ObjectSinkNode previousObjectSinkNode;
+ private ObjectSinkNode nextObjectSinkNode;
+
public void assertObject(final InternalFactHandle handle,
final PropagationContext context,
final InternalWorkingMemory workingMemory) {
@@ -61,4 +64,40 @@
return this.modified;
}
+ /**
+ * Returns the next node
+ * @return
+ * The next ObjectSinkNode
+ */
+ public ObjectSinkNode getNextObjectSinkNode() {
+ return this.nextObjectSinkNode;
+ }
+
+ /**
+ * Sets the next node
+ * @param next
+ * The next ObjectSinkNode
+ */
+ public void setNextObjectSinkNode(ObjectSinkNode next) {
+ this.nextObjectSinkNode = next;
+ }
+
+ /**
+ * Returns the previous node
+ * @return
+ * The previous ObjectSinkNode
+ */
+ public ObjectSinkNode getPreviousObjectSinkNode() {
+ return this.previousObjectSinkNode;
+ }
+
+ /**
+ * Sets the previous node
+ * @param previous
+ * The previous ObjectSinkNode
+ */
+ public void setPreviousObjectSinkNode(ObjectSinkNode previous) {
+ this.previousObjectSinkNode = previous;
+ }
+
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeNodeTest.java 2006-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeNodeTest.java 2006-10-03 23:00:21 UTC (rev 6565)
@@ -16,6 +16,7 @@
* limitations under the License.
*/
+import java.lang.reflect.Field;
import java.util.List;
import org.drools.DroolsTestCase;
@@ -23,9 +24,12 @@
import org.drools.RuleBaseFactory;
import org.drools.base.ClassObjectType;
import org.drools.common.DefaultFactHandle;
+import org.drools.common.InternalFactHandle;
import org.drools.common.PropagationContextImpl;
import org.drools.spi.ObjectType;
import org.drools.spi.PropagationContext;
+import org.drools.util.FactHashTable;
+import org.drools.util.ObjectHashMap;
import org.drools.util.PrimitiveLongMap;
public class ObjectTypeNodeTest extends DroolsTestCase {
@@ -42,16 +46,20 @@
assertEquals( 1,
objectTypeNode.getId() );
- assertLength( 0,
- source.getObjectTypeNodes() );
+ Field field = Rete.class.getDeclaredField( "objectTypeNodes" );
+ field.setAccessible( true );
+ ObjectHashMap map = ( ObjectHashMap ) field.get( source );
+
+ assertEquals( 0,
+ map.size() );
objectTypeNode.attach();
- assertLength( 1,
- source.getObjectTypeNodes() );
+ assertEquals( 1,
+ map.size() );
assertSame( objectTypeNode,
- source.getObjectTypeNode( objectType ) );
+ map.get( objectType ) );
}
public void testAssertObject() throws Exception {
@@ -60,10 +68,11 @@
null,
null );
+ ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
final ReteooWorkingMemory workingMemory = new ReteooWorkingMemory( 1,
- (ReteooRuleBase) RuleBaseFactory.newRuleBase() );
+ ruleBase );
- final Rete source = new Rete();
+ final Rete source = ruleBase.getRete();
final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 1,
new ClassObjectType( String.class ),
@@ -74,26 +83,25 @@
final Object string1 = "cheese";
- final DefaultFactHandle handle1 = (DefaultFactHandle) workingMemory.assertObject( string1 );
+ final InternalFactHandle handle1 = (InternalFactHandle) workingMemory.assertObject( string1 );
- /* should assert as ObjectType matches */
+ // should assert as ObjectType matches
objectTypeNode.assertObject( handle1,
context,
workingMemory );
- /* make sure just string1 was asserted */
+ // make sure just string1 was asserted
final List asserted = sink.getAsserted();
assertLength( 1,
asserted );
assertSame( string1,
workingMemory.getObject( (DefaultFactHandle) ((Object[]) asserted.get( 0 ))[0] ) );
- /* check asserted object was added to memory */
- final PrimitiveLongMap memory = (PrimitiveLongMap) workingMemory.getNodeMemory( objectTypeNode );
+ // check asserted object was added to memory
+ final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( objectTypeNode );
assertEquals( 1,
memory.size() );
- assertSame( handle1,
- memory.get( handle1.getId() ) );
+ assertTrue( memory.contains( handle1 ) );
}
public void testMemory() {
@@ -104,7 +112,7 @@
new ClassObjectType( String.class ),
new Rete() );
- final PrimitiveLongMap memory = (PrimitiveLongMap) workingMemory.getNodeMemory( objectTypeNode );
+ final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( objectTypeNode );
assertNotNull( memory );
}
@@ -159,7 +167,7 @@
context,
workingMemory );
/* check asserted object was added to memory */
- final PrimitiveLongMap memory = (PrimitiveLongMap) workingMemory.getNodeMemory( objectTypeNode );
+ final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( objectTypeNode );
assertEquals( 1,
memory.size() );
@@ -179,7 +187,7 @@
((Object[]) retracted.get( 0 ))[0] );
}
- public void testUpdateNewNode() throws FactException {
+ public void testUpdateSink() throws FactException {
// Tests that when new child is added only the last added child is
// updated
// When the attachingNewNode flag is set
@@ -217,27 +225,22 @@
context,
workingMemory );
- assertLength( 2,
- sink1.getAsserted() );
+ assertEquals( 2,
+ sink1.getAsserted().size() );
- objectTypeNode.attachingNewNode = true;
-
final MockObjectSink sink2 = new MockObjectSink();
objectTypeNode.addObjectSink( sink2 );
- assertLength( 0,
- sink2.getAsserted() );
+ assertEquals( 0,
+ sink2.getAsserted().size() );
- objectTypeNode.updateNewNode( workingMemory,
- null );
+ objectTypeNode.updateSink( sink2,
+ null,
+ workingMemory );
- objectTypeNode.attachingNewNode = false;
+ assertEquals( 2,
+ sink2.getAsserted().size() );
- assertLength( 2,
- sink1.getAsserted() );
- assertLength( 2,
- sink2.getAsserted() );
-
final Object string3 = "water";
final DefaultFactHandle handle3 = new DefaultFactHandle( 3,
@@ -247,11 +250,11 @@
context,
workingMemory );
- assertLength( 3,
- sink1.getAsserted() );
+ assertEquals( 3,
+ sink1.getAsserted().size() );
- assertLength( 3,
- sink2.getAsserted() );
+ assertEquals( 3,
+ sink2.getAsserted().size() );
}
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteTest.java 2006-10-03 22:47:09 UTC (rev 6564)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteTest.java 2006-10-03 23:00:21 UTC (rev 6565)
@@ -16,6 +16,7 @@
* limitations under the License.
*/
+import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
@@ -28,6 +29,7 @@
import org.drools.RuleBaseFactory;
import org.drools.base.ClassObjectType;
import org.drools.common.DefaultFactHandle;
+import org.drools.util.ObjectHashMap;
/**
* @author mproctor
@@ -55,16 +57,16 @@
rete );
stringTypeNode.attach();
- final Collection objectTypeNodes = rete.getObjectTypeNodes();
+ Field field = Rete.class.getDeclaredField( "objectTypeNodes" );
+ field.setAccessible( true );
+ ObjectHashMap map = ( ObjectHashMap ) field.get( rete );
// Check the ObjectTypeNodes are correctly added to Rete
assertEquals( 2,
- objectTypeNodes.size() );
+ map.size() );
- assertContains( objectTypeNode,
- objectTypeNodes );
- assertContains( stringTypeNode,
- objectTypeNodes );
+ assertNotNull( map.get( new ClassObjectType( Object.class ) ) );
+ assertNotNull( map.get( new ClassObjectType( String.class ) ) );
}
/**
@@ -83,14 +85,22 @@
new ClassObjectType( List.class ),
rete );
objectTypeNode.attach();
+ MockObjectSink sink = new MockObjectSink();
+ objectTypeNode.addObjectSink( sink );
+
objectTypeNode = new ObjectTypeNode( 1,
new ClassObjectType( Collection.class ),
rete );
objectTypeNode.attach();
+ sink = new MockObjectSink();
+ objectTypeNode.addObjectSink( sink );
+
objectTypeNode = new ObjectTypeNode( 1,
new ClassObjectType( ArrayList.class ),
rete );
objectTypeNode.attach();
+ sink = new MockObjectSink();
+ objectTypeNode.addObjectSink( sink );
// ArrayList matches all three ObjectTypeNodes
final DefaultFactHandle h1 = new DefaultFactHandle( 1,
@@ -105,7 +115,7 @@
null,
workingMemory );
- final Map map = (HashMap) workingMemory.getNodeMemory( rete );
+ final ObjectHashMap map = (ObjectHashMap) workingMemory.getNodeMemory( rete );
assertLength( 3,
(ObjectTypeNode[]) map.get( ArrayList.class ) );
@@ -130,7 +140,8 @@
new ClassObjectType( List.class ),
rete );
objectTypeNode.attach();
- objectTypeNode.addObjectSink( new MockObjectSink() );
+ MockObjectSink sink1 = new MockObjectSink();
+ objectTypeNode.addObjectSink( sink1 );
// There are no String ObjectTypeNodes, make sure its not propagated
@@ -142,7 +153,6 @@
null,
workingMemory );
- final MockObjectSink sink1 = (MockObjectSink) objectTypeNode.getObjectSinksAsList().get( 0 );
assertLength( 0,
sink1.getAsserted() );
@@ -179,7 +189,8 @@
new ClassObjectType( List.class ),
rete );
objectTypeNode.attach();
- objectTypeNode.addObjectSink( new MockObjectSink() );
+ MockObjectSink sink1 = new MockObjectSink();
+ objectTypeNode.addObjectSink( sink1 );
// There are no String ObjectTypeNodes, make sure its not propagated
final String string = "String";
@@ -189,8 +200,6 @@
rete.assertObject( h1,
null,
workingMemory );
-
- final MockObjectSink sink1 = (MockObjectSink) objectTypeNode.getObjectSinksAsList().get( 0 );
assertLength( 0,
sink1.getRetracted() );
@@ -199,6 +208,11 @@
final DefaultFactHandle h2 = new DefaultFactHandle( 1,
list );
+ // need to assert first, to force it to build up the cache
+ rete.assertObject( h2,
+ null,
+ workingMemory );
+
rete.retractObject( h2,
null,
workingMemory );
More information about the jboss-svn-commits
mailing list