[jboss-svn-commits] JBL Code SVN: r6391 - in labs/jbossrules/trunk/drools-core/src/main/java/org/drools: common reteoo util
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sat Sep 23 18:38:35 EDT 2006
Author: mark.proctor at jboss.com
Date: 2006-09-23 18:38:21 -0400 (Sat, 23 Sep 2006)
New Revision: 6391
Removed:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaMemory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/beta/
Modified:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BaseNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultFactHandle.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeTupleSinkAdapter.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/InitialFactHandle.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/ObjectSinkPropagator.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/TupleSink.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSinkPropagator.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSource.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
Log:
JBRULES-498 Optimised HashMap impls
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java 2006-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java 2006-09-23 22:38:21 UTC (rev 6391)
@@ -94,7 +94,7 @@
protected GlobalResolver globalResolver;
protected static final Object NULL = new Serializable() {
- private static final long serialVersionUID = -6666310064415179894L;
+ private static final long serialVersionUID = 320L;
};
/** The eventSupport */
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BaseNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BaseNode.java 2006-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BaseNode.java 2006-09-23 22:38:21 UTC (rev 6391)
@@ -30,8 +30,6 @@
NetworkNode {
protected final int id;
- protected boolean attachingNewNode = false;
-
protected boolean hasMemory = false;
protected int sharedCount = 0;
@@ -86,19 +84,19 @@
public abstract void remove(BaseNode node,
InternalWorkingMemory[] workingMemories);
- /**
- * When nodes are added to the network that already has data. that existing data must be repropagated to the new node.
- * This new propagation may result in one or more assertions, so a PropagationContext and the workingMemory for the facts
- * must be provided.
- *
- * @param workingMemory
- * The WorkingMemory
- * @param context
- * The PropagationContext
- *
- */
- public abstract void updateNewNode(InternalWorkingMemory workingMemory,
- PropagationContext context);
+// /**
+// * When nodes are added to the network that already has data. that existing data must be repropagated to the new node.
+// * This new propagation may result in one or more assertions, so a PropagationContext and the workingMemory for the facts
+// * must be provided.
+// *
+// * @param workingMemory
+// * The WorkingMemory
+// * @param context
+// * The PropagationContext
+// *
+// */
+// public abstract void updateNewNode(InternalWorkingMemory workingMemory,
+// PropagationContext context);
/**
* Each time a node is shared a counter is increased.
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultFactHandle.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultFactHandle.java 2006-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultFactHandle.java 2006-09-23 22:38:21 UTC (rev 6391)
@@ -99,7 +99,7 @@
* @see Object
*/
public int hashCode() {
- return (int) this.id;
+ return (int)(this.id ^ (this.id >>> 32));
}
/**
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-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java 2006-09-23 22:38:21 UTC (rev 6391)
@@ -102,15 +102,19 @@
public void attach(final InternalWorkingMemory[] workingMemories) {
attach();
-
+
+ // we are attaching this node with existing working memories
+ // so this node must also have memory
+ this.hasMemory = true;
for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
final InternalWorkingMemory workingMemory = workingMemories[i];
final PropagationContext propagationContext = new PropagationContextImpl( workingMemory.getNextPropagationIdCounter(),
PropagationContext.RULE_ADDITION,
null,
null );
- this.objectSource.updateNewNode( workingMemory,
- propagationContext );
+ this.objectSource.updateSink( this,
+ propagationContext,
+ workingMemory );
}
}
@@ -181,10 +185,7 @@
}
}
- public void updateNewNode(final InternalWorkingMemory workingMemory,
- final PropagationContext context) {
- this.attachingNewNode = true;
-
+ public void updateSink(ObjectSink sink, PropagationContext context, InternalWorkingMemory workingMemory) {
FactHashSet memory = null;
// if it was not storing facts in memory previously, create memory and
@@ -195,9 +196,7 @@
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 );
+ sink.assertObject( handle, context, workingMemory );
}
} else {
// if already has memory, just iterate and propagate
@@ -206,15 +205,11 @@
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 );
+ sink.assertObject( current.getFactHandle(), context, workingMemory );
current = ( AbstractHashTable.FactEntry ) current.getNext();
}
}
- }
-
- this.attachingNewNode = false;
+ }
}
public void remove(final BaseNode node,
Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaMemory.java 2006-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaMemory.java 2006-09-23 22:38:21 UTC (rev 6391)
@@ -1,202 +0,0 @@
-/*
- * 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.
- */
-
-package org.drools.reteoo;
-
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.drools.RuleBaseConfiguration;
-import org.drools.WorkingMemory;
-import org.drools.common.BetaNodeConstraints;
-import org.drools.common.InternalFactHandle;
-import org.drools.reteoo.beta.BetaLeftMemory;
-import org.drools.reteoo.beta.BetaMemoryFactory;
-import org.drools.reteoo.beta.BetaRightMemory;
-import org.drools.spi.Tuple;
-
-/**
- * Memory for left and right inputs of a <code>BetaNode</code>. The LeftMemory is a <code>LinkedList</code> for all incoming
- * <code>Tuples</code> and the right memory is a LinkedHashMap which stores each incoming <code>FactHandle</code> with
- * its <code>ObjectMatche</code>. A LinkedHashMap is used as iteration must be in assertion order otherwise you break
- * LIFO based agenda evaluation.
- *
- * @see ReteTuple
- * @see ObjectMatches
- *
- * @author <a href="mailto:mark.proctor at jboss.com">Mark Proctor</a>
- * @author <a href="mailto:bob at werken.com">Bob McWhirter</a>
- */
-class BetaMemory
- implements
- Serializable {
- // ------------------------------------------------------------
- // Instance members
- // ------------------------------------------------------------
-
- /**
- *
- */
- private static final long serialVersionUID = -5494203883277782421L;
-
- /** Left-side tuples. */
- private BetaLeftMemory leftMemory;
-
- /** Right-side tuples. */
- private BetaRightMemory rightMemory;
-
- /**
- * This map is needed to link FactHandles to ObjectMatches specifically to
- * support random access operations like remove(fact);
- */
- private Map rightObjectMap;
-
- // ------------------------------------------------------------
- // Constructors
- // ------------------------------------------------------------
-
- /**
- * Construct a BetaMemory with a LinkedList for the <code>Tuples</code> and a <code>LinkedHashMap</code> for the
- * <code>FactHandle</code>s
- */
- BetaMemory(final RuleBaseConfiguration config,
- final BetaNodeConstraints binder) {
- this.leftMemory = BetaMemoryFactory.newLeftMemory( config,
- binder );
- this.rightMemory = BetaMemoryFactory.newRightMemory( config,
- binder );
- this.rightObjectMap = new HashMap();
- }
-
- public BetaLeftMemory getLeftTupleMemory() {
- return this.leftMemory;
- }
-
- public BetaRightMemory getRightObjectMemory() {
- return this.rightMemory;
- }
-
- /**
- * @return A tuple iterator with possible matches for the handle
- */
- public Iterator leftTupleIterator(final WorkingMemory wm,
- final InternalFactHandle handle) {
- return this.leftMemory.iterator( wm,
- handle );
- }
-
- /**
- * The iterator iterates the propagated FactHandles in assertion order
- * @return The an Iterator for the right memory
- */
- Iterator rightObjectIterator(final WorkingMemory wm,
- final Tuple tuple) {
- return this.rightMemory.iterator( wm,
- tuple );
- }
-
- /**
- * Add a <code>ReteTuple</code> to the memory.
- * @param tuple
- */
- void add(final WorkingMemory wm,
- final ReteTuple tuple) {
- this.leftMemory.add( wm,
- tuple );
- }
-
- /**
- * Remove the <code>ReteTuple</code> from the left memory.
- * @param tuple
- */
- void remove(final WorkingMemory wm,
- final ReteTuple tuple) {
- this.leftMemory.remove( wm,
- tuple );
- }
-
- /**
- * Adds a <code>FactHandleImp</code> to the right memory <code>LinkedHashMap</code>. On being added to
- * The right memory an <code>ObjectMatches</code> class is created and added as the key's value and then returned.
- *
- * @see ObjectMatches
- *
- * @param handle
- * @return
- * The ObjectMatches to hold the tuples that match with the <code>FactHandleImpl</code>
- */
- ObjectMatches add(final WorkingMemory wm,
- final InternalFactHandle handle) {
- final ObjectMatches objectMatches = new ObjectMatches( handle );
- this.rightObjectMap.put( handle,
- objectMatches );
- this.rightMemory.add( wm,
- objectMatches );
- return objectMatches;
- }
-
- ObjectMatches add(final WorkingMemory wm,
- final ObjectMatches objectMatches) {
- this.rightObjectMap.put( objectMatches.getFactHandle(),
- objectMatches );
- this.rightMemory.add( wm,
- objectMatches );
- return objectMatches;
- }
-
- /**
- * Remove the <code>FactHandleImpl<code> from the right memroy <code>LinkedHashMap</code>. The key's ObjectMatches
- * value is returned.
- *
- * @param handle
- * @return
- * The ObjectMatches that held the tuples that match with the <code>FactHandleImpl</code>
- */
- ObjectMatches remove(final WorkingMemory wm,
- final InternalFactHandle handle) {
- final ObjectMatches matches = (ObjectMatches) this.rightObjectMap.remove( handle );
- this.rightMemory.remove( wm,
- matches );
- return matches;
- }
-
- /**
- * @return The boolean value indicating the empty status of the left tuple memory
- */
- public boolean isLeftMemoryEmpty() {
- return this.leftMemory.isEmpty();
- }
-
- /**
- * @return The boolean value indicating the empty status of the right fact handle memory
- */
- public boolean isRightMemoryEmpty() {
- return this.rightMemory.isEmpty();
- }
-
- /**
- * Produce debug string.
- *
- * @return The debug string.
- */
- public String toString() {
- return "[JoinMemory]";
- //return "[JoinMemory \n\tleft=" + this.leftMemory + "\n\tright=" + this.rightMemory + "]";
- }
-
-}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeTupleSinkAdapter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeTupleSinkAdapter.java 2006-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeTupleSinkAdapter.java 2006-09-23 22:38:21 UTC (rev 6391)
@@ -35,7 +35,9 @@
for ( TupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextTupleSinkNode() ) {
sink.assertTuple( new ReteTuple( tuple,
- handle), context, workingMemory );
+ handle ),
+ context,
+ workingMemory );
}
}
@@ -43,34 +45,85 @@
PropagationContext context,
InternalWorkingMemory workingMemory) {
for ( TupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextTupleSinkNode() ) {
- sink.assertTuple( new ReteTuple( tuple), context, workingMemory );
+ sink.assertTuple( new ReteTuple( tuple ),
+ context,
+ workingMemory );
}
}
+ public LinkedList createAndPropagateAssertTupleWithMemory(InternalFactHandle handle,
+ PropagationContext context,
+ InternalWorkingMemory workingMemory) {
+ LinkedList list = new LinkedList();
+ // while this is the root fact, one branch propagates into one or more TerminalNodes, so we
+ // have to remember the activations.
+ for ( TupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextTupleSinkNode() ) {
+ ReteTuple tuple = new ReteTuple( handle );
+ list.add( new LinkedListEntry( tuple ) );
+ sink.assertTuple( tuple,
+ context,
+ workingMemory );
+ }
+ return list;
+ }
+
public void createAndPropagateAssertTuple(InternalFactHandle handle,
- PropagationContext context,
- InternalWorkingMemory workingMemory) {
+ PropagationContext context,
+ InternalWorkingMemory workingMemory) {
+ // This is the root fact, so we don't need to clone it.
+ ReteTuple tuple = new ReteTuple( handle );
for ( TupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextTupleSinkNode() ) {
- sink.assertTuple( new ReteTuple( handle ), context, workingMemory );
+ sink.assertTuple( tuple,
+ context,
+ workingMemory );
}
}
-
- public void createAndPropagateRetractTuple(InternalFactHandle handle,
+
+ public void createAndPropagateRetractTuple(LinkedList list,
+ PropagationContext context,
+ InternalWorkingMemory workingMemory) {
+ LinkedListEntry entry = (LinkedListEntry) list.getFirst();
+ for ( TupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextTupleSinkNode() ) {
+ sink.retractTuple( (ReteTuple) entry.getObject(),
+ context,
+ workingMemory );
+ entry = (LinkedListEntry) entry.getNext();
+ }
+ }
+
+ public void createAndPropagateModifyTuple(LinkedList list,
PropagationContext context,
InternalWorkingMemory workingMemory) {
- for ( TupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextTupleSinkNode() ) {
- sink.retractTuple( new ReteTuple( handle ), context, workingMemory );
- }
+ LinkedListEntry entry = (LinkedListEntry) list.getFirst();
+
+ for ( TupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextTupleSinkNode() ) {
+ sink.modifyTuple( (ReteTuple) entry.getObject(),
+ context,
+ workingMemory );
+ entry = (LinkedListEntry) entry.getNext();
+ }
}
-
- public void createAndPropagateModifyTuple(InternalFactHandle handle,
+
+ public void createAndPropagateRetractTuple(ReteTuple tuple,
PropagationContext context,
InternalWorkingMemory workingMemory) {
- for ( TupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextTupleSinkNode() ) {
- sink.modifyTuple( new ReteTuple( handle ), context, workingMemory );
- }
- }
+ for ( TupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextTupleSinkNode() ) {
+ sink.retractTuple( tuple,
+ context,
+ workingMemory );
+ }
+ }
+ public void createAndPropagateModifyTuple(ReteTuple tuple,
+ PropagationContext context,
+ InternalWorkingMemory workingMemory) {
+ for ( TupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextTupleSinkNode() ) {
+ sink.modifyTuple( tuple,
+ context,
+ workingMemory );
+ }
+ }
+
public TupleSink[] getSinks() {
TupleSink[] sinkArray = new TupleSink[this.sinks.size()];
@@ -82,70 +135,70 @@
return sinkArray;
}
-// public void propagateNewTupleSink(TupleMatch tupleMatch,
-// PropagationContext context,
-// InternalWorkingMemory workingMemory) {
-//
-// final TupleSink sink = sinks.getLast();
-// final ReteTuple tuple = new ReteTuple( tupleMatch.getTuple(),
-// tupleMatch.getObjectMatches().getFactHandle(),
-// sink );
-// tupleMatch.addJoinedTuple( tuple );
-// tuple.assertTuple( context,
-// workingMemory );
-// }
-//
-// public void propagateNewTupleSink(ReteTuple tuple,
-// PropagationContext context,
-// InternalWorkingMemory workingMemory) {
-//
-// final TupleSink sink = sinks.getLast();
-// ReteTuple child = new ReteTuple( tuple,
-// sink );
-// tuple.addChildEntry( child );
-// child.assertTuple( context,
-// workingMemory );
-// }
-//
-// public void propagateNewTupleSink(InternalFactHandle handle,
-// LinkedList list,
-// PropagationContext context,
-// InternalWorkingMemory workingMemory) {
-// TupleSink sink = this.sinks.getLast();
-// ReteTuple tuple = new ReteTuple( handle,
-// sink );
-// list.add( new LinkedListEntry( tuple ) );
-// tuple.assertTuple( context,
-// workingMemory );
-// }
-//
-// /**
-// * @inheritDoc
-// */
-// public List getPropagatedTuples(final Map memory,
-// final InternalWorkingMemory workingMemory,
-// final TupleSink sink) {
-// int index = 0;
-// for ( TupleSinkNode node = this.sinks.getFirst(); node != null; node = node.getNextTupleSinkNode() ) {
-// if ( node.equals( sink ) ) {
-// break;
-// }
-// index++;
-// }
-//
-// final List propagatedTuples = new ArrayList( memory.size() );
-//
-// for ( final Iterator it = memory.values().iterator(); it.hasNext(); ) {
-// final LinkedList tuples = (LinkedList) it.next();
-// LinkedListEntry wrapper = (LinkedListEntry) tuples.getFirst();
-// for ( int i = 0; i < index; i++ ) {
-// wrapper = (LinkedListEntry) wrapper.getNext();
-// }
-// propagatedTuples.add( wrapper.getObject() );
-// }
-//
-// return propagatedTuples;
-// }
+ // public void propagateNewTupleSink(TupleMatch tupleMatch,
+ // PropagationContext context,
+ // InternalWorkingMemory workingMemory) {
+ //
+ // final TupleSink sink = sinks.getLast();
+ // final ReteTuple tuple = new ReteTuple( tupleMatch.getTuple(),
+ // tupleMatch.getObjectMatches().getFactHandle(),
+ // sink );
+ // tupleMatch.addJoinedTuple( tuple );
+ // tuple.assertTuple( context,
+ // workingMemory );
+ // }
+ //
+ // public void propagateNewTupleSink(ReteTuple tuple,
+ // PropagationContext context,
+ // InternalWorkingMemory workingMemory) {
+ //
+ // final TupleSink sink = sinks.getLast();
+ // ReteTuple child = new ReteTuple( tuple,
+ // sink );
+ // tuple.addChildEntry( child );
+ // child.assertTuple( context,
+ // workingMemory );
+ // }
+ //
+ // public void propagateNewTupleSink(InternalFactHandle handle,
+ // LinkedList list,
+ // PropagationContext context,
+ // InternalWorkingMemory workingMemory) {
+ // TupleSink sink = this.sinks.getLast();
+ // ReteTuple tuple = new ReteTuple( handle,
+ // sink );
+ // list.add( new LinkedListEntry( tuple ) );
+ // tuple.assertTuple( context,
+ // workingMemory );
+ // }
+ //
+ // /**
+ // * @inheritDoc
+ // */
+ // public List getPropagatedTuples(final Map memory,
+ // final InternalWorkingMemory workingMemory,
+ // final TupleSink sink) {
+ // int index = 0;
+ // for ( TupleSinkNode node = this.sinks.getFirst(); node != null; node = node.getNextTupleSinkNode() ) {
+ // if ( node.equals( sink ) ) {
+ // break;
+ // }
+ // index++;
+ // }
+ //
+ // final List propagatedTuples = new ArrayList( memory.size() );
+ //
+ // for ( final Iterator it = memory.values().iterator(); it.hasNext(); ) {
+ // final LinkedList tuples = (LinkedList) it.next();
+ // LinkedListEntry wrapper = (LinkedListEntry) tuples.getFirst();
+ // for ( int i = 0; i < index; i++ ) {
+ // wrapper = (LinkedListEntry) wrapper.getNext();
+ // }
+ // propagatedTuples.add( wrapper.getObject() );
+ // }
+ //
+ // return propagatedTuples;
+ // }
public int size() {
return this.sinks.size();
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/InitialFactHandle.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/InitialFactHandle.java 2006-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/InitialFactHandle.java 2006-09-23 22:38:21 UTC (rev 6391)
@@ -23,7 +23,7 @@
/**
*
*/
- private static final long serialVersionUID = -9081273269528006282L;
+ private static final long serialVersionUID = 320L;
private final InternalFactHandle delegate;
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-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java 2006-09-23 22:38:21 UTC (rev 6391)
@@ -374,20 +374,18 @@
/* (non-Javadoc)
* @see org.drools.reteoo.BaseNode#updateNewNode(org.drools.reteoo.WorkingMemoryImpl, org.drools.spi.PropagationContext)
*/
- public void updateNewNode(final InternalWorkingMemory workingMemory,
- final PropagationContext context) {
- this.attachingNewNode = true;
+ public void updateSink(final TupleSink sink,
+ final InternalWorkingMemory workingMemory,
+ final PropagationContext context) {
final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
for ( final Iterator it = memory.getRightObjectMemory().iterator(); it.hasNext(); ) {
final ObjectMatches objectMatches = (ObjectMatches) it.next();
- for ( TupleMatch tupleMatch = objectMatches.getFirstTupleMatch(); tupleMatch != null; tupleMatch = (TupleMatch) tupleMatch.getNext() ) {
- this.sink.propagateNewTupleSink( tupleMatch, context, workingMemory );
+ for ( TupleMatch tupleMatch = objectMatches.getFirstTupleMatch(); tupleMatch != null; tupleMatch = (TupleMatch) tupleMatch.getNext() ) {
+ this.sink.propagateAssertTuple( tupleMatch.getTuple(), context, workingMemory );
}
}
-
- this.attachingNewNode = false;
}
/**
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-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java 2006-09-23 22:38:21 UTC (rev 6391)
@@ -16,6 +16,7 @@
* limitations under the License.
*/
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -34,6 +35,8 @@
import org.drools.util.LinkedList;
import org.drools.util.LinkedListNode;
import org.drools.util.LinkedListEntry;
+import org.drools.util.ObjectHashMap;
+import org.drools.util.ObjectHashMap.ObjectEntry;
/**
* All asserting Facts must propagated into the right <code>ObjectSink</code> side of a BetaNode, if this is the first Column
@@ -53,8 +56,8 @@
/**
*
*/
- private static final long serialVersionUID = 320L;
- private final ObjectSource objectSource;
+ private static final long serialVersionUID = 320L;
+ private final ObjectSource objectSource;
private final BetaNodeConstraints binder;
/**
@@ -67,10 +70,12 @@
* The parent node, where Facts are propagated from
*/
public LeftInputAdapterNode(final int id,
- final ObjectSource source) {
+ final ObjectSource source,
+ final boolean hashMemory) {
this( id,
source,
- null );
+ null,
+ hashMemory );
}
/**
@@ -87,11 +92,12 @@
*/
public LeftInputAdapterNode(final int id,
final ObjectSource source,
- final BetaNodeConstraints binder) {
+ final BetaNodeConstraints binder,
+ final boolean hashMemory) {
super( id );
this.objectSource = source;
this.binder = binder;
- setHasMemory( true );
+ setHasMemory( hashMemory );
}
public FieldConstraint[] getConstraints() {
@@ -114,8 +120,9 @@
PropagationContext.RULE_ADDITION,
null,
null );
- this.objectSource.updateNewNode( workingMemory,
- propagationContext );
+ this.objectSource.updateSink( this,
+ propagationContext,
+ workingMemory );
}
}
@@ -133,15 +140,23 @@
public void assertObject(final InternalFactHandle handle,
final PropagationContext context,
final InternalWorkingMemory workingMemory) {
- final Map memory = (Map) workingMemory.getNodeMemory( this );
-
if ( (this.binder == null) || (this.binder.isAllowed( handle,
null,
workingMemory )) ) {
- memory.put( handle,
- this.sink.createAndAssertTuple( handle,
- context,
- workingMemory ) );
+ if ( this.hasMemory ) {
+ LinkedList list = this.sink.createAndPropagateAssertTupleWithMemory( handle,
+ context,
+ workingMemory );
+ ObjectHashMap map = (ObjectHashMap) workingMemory.getNodeMemory( this );
+ // no need to scan, we know it doesn't exist
+ map.put( handle,
+ list,
+ false );
+ } else {
+ this.sink.createAndPropagateAssertTuple( handle,
+ context,
+ workingMemory );
+ }
}
}
@@ -159,83 +174,66 @@
public void retractObject(final InternalFactHandle handle,
final PropagationContext context,
final InternalWorkingMemory workingMemory) {
- final Map memory = (Map) workingMemory.getNodeMemory( this );
- final LinkedList list = (LinkedList) memory.remove( handle );
-
- // the handle might have been filtered out by the binder
- if ( list != null ) {
- for ( LinkedListNode node = list.removeFirst(); node != null; node = list.removeFirst() ) {
- ReteTuple tuple = (ReteTuple) ((LinkedListEntry) node).getObject();
- tuple.retractTuple( context,
- workingMemory );
- }
+ if ( this.hasMemory ) {
+ ObjectHashMap map = (ObjectHashMap) workingMemory.getNodeMemory( this );
+ LinkedList list = (LinkedList) map.remove( handle );
+ this.sink.createAndPropagateRetractTuple( list,
+ context,
+ workingMemory );
+ } else {
+ ReteTuple tuple = new ReteTuple( handle );
+ this.sink.createAndPropagateRetractTuple( tuple,
+ context,
+ workingMemory );
}
}
public void modifyObject(final InternalFactHandle handle,
final PropagationContext context,
final InternalWorkingMemory workingMemory) {
- final Map memory = (Map) workingMemory.getNodeMemory( this );
+ if ( this.hasMemory ) {
+ ObjectHashMap map = (ObjectHashMap) workingMemory.getNodeMemory( this );
+ LinkedList list = (LinkedList) map.get( handle );
+ this.sink.createAndPropagateModifyTuple( list,
+ context,
+ workingMemory );
+ } else {
+ ReteTuple tuple = new ReteTuple( handle );
+ this.sink.createAndPropagateModifyTuple( tuple,
+ context,
+ workingMemory );
+ }
+ }
- if ( (this.binder == null) || (this.binder.isAllowed( handle,
- null,
- workingMemory )) ) {
- final LinkedList list = (LinkedList) memory.get( handle );
-
- if ( list != null ) {
- // already existed, so propagate as a modify
- for ( LinkedListNode node = list.getFirst(); node != null; node = node.getNext() ) {
- ReteTuple tuple = (ReteTuple) ((LinkedListEntry) node).getObject();
- tuple.modifyTuple( context,
- workingMemory );
+ public void updateSink(TupleSink sink,
+ PropagationContext context,
+ InternalWorkingMemory workingMemory) {
+ if ( this.hasMemory ) {
+ // We have memory so iterate over all entries making new Tuples and adding them
+ // to the memory before propagating
+ ObjectHashMap map = (ObjectHashMap) workingMemory.getNodeMemory( this );
+ ObjectEntry[] entries = (ObjectEntry[]) map.getTable();
+ for ( int i = 0, length = entries.length; i < length; i++ ) {
+ ObjectEntry current = entries[i];
+ while ( current != null ) {
+ InternalFactHandle handle = (InternalFactHandle) current.getKey();
+ LinkedList list = (LinkedList) current.getValue();
+ ReteTuple tuple = new ReteTuple( handle );
+ list.add( new LinkedListEntry( tuple ) );
+ sink.assertTuple( tuple,
+ context,
+ workingMemory );
+ current = (ObjectEntry) current.getNext();
}
- } else {
- // didn't existed, so propagate as an assert
- memory.put( handle,
- this.sink.createAndAssertTuple( handle,
- context,
- workingMemory ) );
}
} else {
- final LinkedList list = (LinkedList) memory.remove( handle );
-
- if ( list != null ) {
- for ( LinkedListNode node = list.getFirst(); node != null; node = node.getNext() ) {
- ReteTuple tuple = (ReteTuple) ((LinkedListEntry) node).getObject();
- tuple.retractTuple( context,
- workingMemory );
- }
- }
+ ObjectSinkAdapter adapter = new ObjectSinkAdapter( sink );
+ this.objectSource.updateSink( adapter,
+ context,
+ workingMemory );
}
}
- /* (non-Javadoc)
- * @see org.drools.reteoo.BaseNode#updateNewNode(org.drools.reteoo.WorkingMemoryImpl, org.drools.spi.PropagationContext)
- */
- public void updateNewNode(final InternalWorkingMemory workingMemory,
- final PropagationContext context) {
- this.attachingNewNode = true;
-
- // Get the newly attached TupleSink
- // final TupleSink sink = (TupleSink) getTupleSinks().get( getTupleSinks().size() - 1 );
-
- // Iterate the memory and assert all tuples into the newly attached TupleSink
- final Map memory = (Map) workingMemory.getNodeMemory( this );
-
- for ( final Iterator it = memory.entrySet().iterator(); it.hasNext(); ) {
- Entry entry = (Entry) it.next();
-
- final InternalFactHandle handle = (InternalFactHandle) entry.getKey();
- final LinkedList list = (LinkedList) entry.getValue();
- this.sink.propagateNewTupleSink( handle,
- list,
- context,
- workingMemory );
- }
-
- this.attachingNewNode = false;
- }
-
public void remove(final BaseNode node,
final InternalWorkingMemory[] workingMemories) {
if ( !node.isInUse() ) {
@@ -251,14 +249,6 @@
workingMemories );
}
- /**
- * LeftInputAdapter uses a HashMap for memory. The key is the received <code>FactHandleImpl</code> and the
- * created <code>ReteTuple</code> is the value.
- */
- public Object createMemory(final RuleBaseConfiguration config) {
- return new HashMap();
- }
-
public int hashCode() {
return this.objectSource.hashCode();
}
@@ -285,9 +275,73 @@
*/
public List getPropagatedTuples(final InternalWorkingMemory workingMemory,
final TupleSink sink) {
- final Map memory = (Map) workingMemory.getNodeMemory( this );
- return this.sink.getPropagatedTuples( memory,
- workingMemory,
- sink );
+ List tupeList = new ArrayList();
+ if ( this.hasMemory ) {
+ ObjectHashMap map = (ObjectHashMap) workingMemory.getNodeMemory( this );
+ ObjectEntry[] entries = (ObjectEntry[]) map.getTable();
+ for ( int i = 0, length = entries.length; i < length; i++ ) {
+ ObjectEntry current = entries[i];
+ while ( current != null ) {
+ LinkedList list = (LinkedList) current.getValue();
+ for ( LinkedListEntry entry = ( LinkedListEntry ) list.getFirst(); entry != null; entry = ( LinkedListEntry ) entry.getNext() ) {
+ tupeList.add( entry.getObject() );
+ }
+ current = (ObjectEntry) current.getNext();
+ }
+ }
+ } else{
+ ObjectSinkAdapter adapter = new ObjectSinkAdapter( tupeList );
+ }
+ return tupeList;
}
+
+ public Object createMemory(RuleBaseConfiguration config) {
+ return new ObjectHashMap();
+ }
+
+ /**
+ * Used with the updateSink method, so that the parent ObjectSource
+ * can update the TupleSink
+ * @author mproctor
+ *
+ */
+ private static class ObjectSinkAdapter
+ implements
+ ObjectSink {
+ private TupleSink sink;
+ private List list;
+
+ public ObjectSinkAdapter(List list) {
+ this.list = list;
+ }
+
+ public ObjectSinkAdapter(TupleSink sink) {
+ this.sink = sink;
+ }
+
+ public void assertObject(InternalFactHandle handle,
+ PropagationContext context,
+ InternalWorkingMemory workingMemory) {
+ ReteTuple tuple = new ReteTuple( handle );
+ if ( this.sink != null ) {
+ this.sink.assertTuple( tuple,
+ context,
+ workingMemory );
+ } else {
+ this.list.add( tuple );
+ }
+ }
+
+ public void modifyObject(InternalFactHandle handle,
+ PropagationContext context,
+ InternalWorkingMemory workingMemory) {
+ throw new UnsupportedOperationException( "ObjectSinkAdapter onlys supports assertObject method calls" );
+ }
+
+ public void retractObject(InternalFactHandle handle,
+ PropagationContext context,
+ InternalWorkingMemory workingMemory) {
+ throw new UnsupportedOperationException( "ObjectSinkAdapter onlys supports assertObject method calls" );
+ }
+ }
}
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-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSinkPropagator.java 2006-09-23 22:38:21 UTC (rev 6391)
@@ -20,9 +20,5 @@
PropagationContext context,
InternalWorkingMemory workingMemory);
- public ObjectSink[] getSinks();
-
- public void propagateNewObjectSink(InternalFactHandle handle,
- PropagationContext context,
- InternalWorkingMemory workingMemory);
+ public ObjectSink[] getSinks();
}
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-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectSource.java 2006-09-23 22:38:21 UTC (rev 6391)
@@ -22,6 +22,7 @@
import org.drools.common.BaseNode;
import org.drools.common.DefaultFactHandle;
import org.drools.common.InternalWorkingMemory;
+import org.drools.spi.PropagationContext;
/**
* A source of <code>FactHandle</code>s for an <code>ObjectSink</code>.
@@ -117,5 +118,7 @@
}
}
+ public abstract void updateSink(ObjectSink sink, PropagationContext context, InternalWorkingMemory workingMemory);
+
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-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java 2006-09-23 22:38:21 UTC (rev 6391)
@@ -168,24 +168,16 @@
final InternalWorkingMemory workingMemory) {
this.sink.propagateModifyObject( handle, context, workingMemory );
}
-
- /* (non-Javadoc)
- * @see org.drools.reteoo.BaseNode#updateNewNode(org.drools.reteoo.WorkingMemoryImpl, org.drools.spi.PropagationContext)
- */
- public void updateNewNode(final InternalWorkingMemory workingMemory,
- final PropagationContext context) {
- this.attachingNewNode = true;
-
+
+ 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();
- this.sink.propagateNewObjectSink( handle, context, workingMemory );
+ sink.assertObject( handle, context, workingMemory );
}
+ }
- this.attachingNewNode = false;
- }
-
/**
* Rete needs to know that this ObjectTypeNode has been added
*/
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSink.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSink.java 2006-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSink.java 2006-09-23 22:38:21 UTC (rev 6391)
@@ -18,8 +18,10 @@
import java.io.Serializable;
+import org.drools.common.InternalFactHandle;
import org.drools.common.InternalWorkingMemory;
import org.drools.spi.PropagationContext;
+import org.drools.spi.Tuple;
import org.drools.util.LinkedListNode;
/**
@@ -56,5 +58,4 @@
void modifyTuple(ReteTuple tuple,
PropagationContext context,
InternalWorkingMemory workingMemory);
-
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSinkPropagator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSinkPropagator.java 2006-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSinkPropagator.java 2006-09-23 22:38:21 UTC (rev 6391)
@@ -3,6 +3,7 @@
import org.drools.common.InternalFactHandle;
import org.drools.common.InternalWorkingMemory;
import org.drools.spi.PropagationContext;
+import org.drools.util.LinkedList;
public interface TupleSinkPropagator {
public void propagateAssertTuple(ReteTuple tuple,
@@ -14,36 +15,48 @@
PropagationContext context,
InternalWorkingMemory workingMemory);
+ public LinkedList createAndPropagateAssertTupleWithMemory(InternalFactHandle handle,
+ PropagationContext context,
+ InternalWorkingMemory workingMemory);
+
public void createAndPropagateAssertTuple(InternalFactHandle handle,
- PropagationContext context,
- InternalWorkingMemory workingMemory);
-
- public void createAndPropagateRetractTuple(InternalFactHandle handle,
PropagationContext context,
- InternalWorkingMemory workingMemory);
-
- public void createAndPropagateModifyTuple(InternalFactHandle handle,
+ InternalWorkingMemory workingMemory);
+
+ public void createAndPropagateRetractTuple(ReteTuple tuple,
PropagationContext context,
InternalWorkingMemory workingMemory);
+ public void createAndPropagateRetractTuple(LinkedList list,
+ PropagationContext context,
+ InternalWorkingMemory workingMemory);
+
+ public void createAndPropagateModifyTuple(ReteTuple tuple,
+ PropagationContext context,
+ InternalWorkingMemory workingMemory);
+
+ public void createAndPropagateModifyTuple(LinkedList list,
+ PropagationContext context,
+ InternalWorkingMemory workingMemory);
+
public TupleSink[] getSinks();
-// public void propagateNewTupleSink(TupleMatch tupleMatch,
-// PropagationContext context,
-// InternalWorkingMemory workingMemory);
-//
-// public void propagateNewTupleSink(InternalFactHandle handle,
-// LinkedList list,
-// PropagationContext context,
-// InternalWorkingMemory workingMemory);
-//
-// public void propagateNewTupleSink(ReteTuple tuple,
-// PropagationContext context,
-// InternalWorkingMemory workingMemory);
-//
-// public List getPropagatedTuples(final Map memory,
-// final InternalWorkingMemory workingMemory,
-// final TupleSink sink);
+ // public void propagateNewTupleSink(TupleMatch tupleMatch,
+ // PropagationContext context,
+ // InternalWorkingMemory workingMemory);
+ //
+ // public void propagateNewTupleSink(InternalFactHandle handle,
+ // LinkedList list,
+ // PropagationContext context,
+ // InternalWorkingMemory workingMemory);
+ //
+ // public void propagateNewTupleSink(ReteTuple tuple,
+ // PropagationContext context,
+ // InternalWorkingMemory workingMemory);
+ //
+ // public List getPropagatedTuples(final Map memory,
+ // final InternalWorkingMemory workingMemory,
+ // final TupleSink sink);
public int size();
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSource.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSource.java 2006-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSource.java 2006-09-23 22:38:21 UTC (rev 6391)
@@ -115,5 +115,7 @@
*/
public abstract List getPropagatedTuples(InternalWorkingMemory workingMemory,
TupleSink sink);
+
+ public abstract void updateSink(TupleSink sink, PropagationContext context, InternalWorkingMemory workingMemory);
}
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-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java 2006-09-23 22:38:21 UTC (rev 6391)
@@ -16,7 +16,6 @@
protected int threshold;
protected float loadFactor;
- protected boolean checkExists;
protected ObjectComparator comparator;
protected Entry[] table;
@@ -32,13 +31,8 @@
this.threshold = (int) (capacity * loadFactor);
this.table = new Entry[capacity];
this.comparator = EqualityEquals.getInstance();
- this.checkExists = false;
}
- public void setCheckExists(boolean checkExists) {
- this.checkExists = checkExists;
- }
-
public void setComparator(ObjectComparator comparator) {
this.comparator = comparator;
}
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-09-23 21:31:37 UTC (rev 6390)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ObjectHashMap.java 2006-09-23 22:38:21 UTC (rev 6391)
@@ -4,6 +4,7 @@
package org.drools.util;
public class ObjectHashMap extends AbstractHashTable {
+
public ObjectHashMap() {
this( 16,
0.75f );
@@ -14,9 +15,15 @@
super( capacity,
loadFactor );
}
+
+ public Object put(Object key,
+ Object value) {
+ return put(key, value, true);
+ }
public Object put(Object key,
- Object value) {
+ Object value,
+ boolean checkExists ) {
int hashCode = hash( key );
int index = indexOf( hashCode,
table.length );
@@ -113,7 +120,7 @@
return hashCode & (dataSize - 1);
}
- private static class ObjectEntry
+ public static class ObjectEntry
implements
Entry {
private Object key;
More information about the jboss-svn-commits
mailing list