[jboss-svn-commits] JBL Code SVN: r6617 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools/reteoo main/java/org/drools/util test/java/org/drools/reteoo
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Thu Oct 5 10:30:46 EDT 2006
Author: mark.proctor at jboss.com
Date: 2006-10-05 10:30:40 -0400 (Thu, 05 Oct 2006)
New Revision: 6617
Removed:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleTupleSink.java
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/LeftInputAdapterNode.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/SingleObjectSinkAdapter.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleTupleSinkAdapter.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSinkPropagator.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/LeftInputAdapterNodeTest.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockTupleSink.java
Log:
JBRULES-498 Optimised HashMap implementations
-Make LeftInputAdapterNode work and its unit tests
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-10-05 12:47:12 UTC (rev 6616)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeTupleSinkAdapter.java 2006-10-05 14:30:40 UTC (rev 6617)
@@ -1,15 +1,8 @@
package org.drools.reteoo;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
import org.drools.common.InternalFactHandle;
import org.drools.common.InternalWorkingMemory;
import org.drools.spi.PropagationContext;
-import org.drools.util.LinkedList;
-import org.drools.util.LinkedListEntry;
public class CompositeTupleSinkAdapter
implements
@@ -49,7 +42,7 @@
context,
workingMemory );
}
- }
+ }
public void propagateRetractTuple(ReteTuple tuple,
InternalFactHandle handle,
@@ -62,37 +55,18 @@
workingMemory );
}
}
-
- public void propagateModifyTuple(ReteTuple tuple,
- InternalFactHandle handle,
- PropagationContext context,
- InternalWorkingMemory workingMemory) {
-
+
+ public void propagateRetractTuple(ReteTuple tuple,
+ PropagationContext context,
+ InternalWorkingMemory workingMemory) {
for ( TupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextTupleSinkNode() ) {
- sink.modifyTuple( new ReteTuple( tuple,
- handle ),
- context,
- workingMemory );
+ sink.retractTuple( 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,
+ public ReteTuple createAndPropagateAssertTuple(InternalFactHandle handle,
PropagationContext context,
InternalWorkingMemory workingMemory) {
// This is the root fact, so we don't need to clone it.
@@ -102,33 +76,9 @@
context,
workingMemory );
}
+ return tuple;
}
- 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) {
- 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 createAndPropagateRetractTuple(ReteTuple tuple,
PropagationContext context,
InternalWorkingMemory workingMemory) {
@@ -138,17 +88,7 @@
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()];
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-05 12:47:12 UTC (rev 6616)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java 2006-10-05 14:30:40 UTC (rev 6617)
@@ -99,13 +99,13 @@
public FieldConstraint[] getConstraints() {
LinkedList constraints = this.constraints.getConstraints();
-
- FieldConstraint[] array = new FieldConstraint[ constraints.size() ];
+
+ FieldConstraint[] array = new FieldConstraint[constraints.size()];
int i = 0;
- for ( LinkedListEntry entry = ( LinkedListEntry ) constraints.getFirst(); entry != null; entry = ( LinkedListEntry ) entry.getNext() ) {
- array[i++] = ( FieldConstraint ) entry.getObject();
+ for ( LinkedListEntry entry = (LinkedListEntry) constraints.getFirst(); entry != null; entry = (LinkedListEntry) entry.getNext() ) {
+ array[i++] = (FieldConstraint) entry.getObject();
}
- return array;
+ return array;
}
/* (non-Javadoc)
@@ -145,21 +145,17 @@
final PropagationContext context,
final InternalWorkingMemory workingMemory) {
if ( (this.constraints == null) || (this.constraints.isAllowed( handle,
- null,
- workingMemory )) ) {
+ null,
+ workingMemory )) ) {
+ ReteTuple tuple = this.sink.createAndPropagateAssertTuple( 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,
+ tuple,
false );
- } else {
- this.sink.createAndPropagateAssertTuple( handle,
- context,
- workingMemory );
}
}
}
@@ -178,36 +174,32 @@
public void retractObject(final InternalFactHandle handle,
final PropagationContext context,
final InternalWorkingMemory workingMemory) {
+ ReteTuple tuple = null;
if ( this.hasMemory ) {
ObjectHashMap map = (ObjectHashMap) workingMemory.getNodeMemory( this );
- LinkedList list = (LinkedList) map.remove( handle );
- this.sink.createAndPropagateRetractTuple( list,
- context,
- workingMemory );
+ tuple = ( ReteTuple ) map.remove( handle );
} else {
- ReteTuple tuple = new ReteTuple( handle );
- this.sink.createAndPropagateRetractTuple( tuple,
- context,
- workingMemory );
+ tuple = new ReteTuple( handle );
}
+
+ this.sink.createAndPropagateRetractTuple( tuple,
+ 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
+ // We have memory so iterate over all entries
ObjectHashMap map = (ObjectHashMap) workingMemory.getNodeMemory( this );
Iterator it = map.iterator();
- for ( ObjectEntry entry = ( ObjectEntry ) it.next(); entry != null; it.next() ) {
+ for ( ObjectEntry entry = (ObjectEntry) it.next(); entry != null; it.next() ) {
InternalFactHandle handle = (InternalFactHandle) entry.getKey();
- LinkedList list = (LinkedList) entry.getValue();
- ReteTuple tuple = new ReteTuple( handle );
- list.add( new LinkedListEntry( tuple ) );
+ ReteTuple tuple = (ReteTuple) entry.getValue();
sink.assertTuple( tuple,
context,
- workingMemory );
+ workingMemory );
}
} else {
ObjectSinkAdapter adapter = new ObjectSinkAdapter( sink );
@@ -267,9 +259,10 @@
implements
ObjectSink {
private TupleSink sink;
+
public ObjectSinkAdapter(TupleSink sink) {
this.sink = sink;
- }
+ }
public void assertObject(InternalFactHandle handle,
PropagationContext context,
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-05 12:47:12 UTC (rev 6616)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteTuple.java 2006-10-05 14:30:40 UTC (rev 6617)
@@ -139,7 +139,11 @@
return false;
}
- return this.parent.equals( other.parent );
+ if( this.parent == null ) {
+ return ( other.parent == null );
+ } else {
+ return this.parent.equals( other.parent );
+ }
}
public boolean equals(Object 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-05 12:47:12 UTC (rev 6616)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleObjectSinkAdapter.java 2006-10-05 14:30:40 UTC (rev 6617)
@@ -10,13 +10,13 @@
private ObjectSink sink;
- public SingleObjectSinkAdapter(ObjectSink sink) {
+ public SingleObjectSinkAdapter(ObjectSink sink) {
this.sink = sink;
}
public void propagateAssertObject(InternalFactHandle handle,
PropagationContext context,
- InternalWorkingMemory workingMemory) {
+ InternalWorkingMemory workingMemory) {
this.sink.assertObject( handle, context, workingMemory );
}
Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleTupleSink.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleTupleSink.java 2006-10-05 12:47:12 UTC (rev 6616)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleTupleSink.java 2006-10-05 14:30:40 UTC (rev 6617)
@@ -1,34 +0,0 @@
-package org.drools.reteoo;
-
-import org.drools.common.InternalWorkingMemory;
-import org.drools.spi.PropagationContext;
-
-public class SingleTupleSink implements TupleSink {
- private TupleSink sink;
- public SingleTupleSink(TupleSink sink) {
- this.sink = sink;
- }
-
- public void assertTuple(ReteTuple tuple,
- PropagationContext context,
- InternalWorkingMemory workingMemory) {
- sink.assertTuple( tuple, context, workingMemory );
-
- }
-
- public void modifyTuple(ReteTuple tuple,
- PropagationContext context,
- InternalWorkingMemory workingMemory) {
- sink.modifyTuple( tuple, context, workingMemory );
-
- }
-
- public void retractTuple(ReteTuple tuple,
- PropagationContext context,
- InternalWorkingMemory workingMemory) {
- this.retractTuple( tuple, context, workingMemory );
-
- }
-
-
-}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleTupleSinkAdapter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleTupleSinkAdapter.java 2006-10-05 12:47:12 UTC (rev 6616)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/SingleTupleSinkAdapter.java 2006-10-05 14:30:40 UTC (rev 6617)
@@ -1,15 +1,8 @@
package org.drools.reteoo;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
import org.drools.common.InternalFactHandle;
import org.drools.common.InternalWorkingMemory;
import org.drools.spi.PropagationContext;
-import org.drools.util.LinkedList;
-import org.drools.util.LinkedListEntry;
public class SingleTupleSinkAdapter
implements
@@ -19,100 +12,133 @@
public SingleTupleSinkAdapter(TupleSink sink) {
this.sink = sink;
}
-
+
public void propagateAssertTuple(ReteTuple tuple,
InternalFactHandle handle,
- TupleMatch tupleMatch,
PropagationContext context,
InternalWorkingMemory workingMemory) {
- ReteTuple joined = new ReteTuple( tuple,
- handle,
- sink );
- tupleMatch.addJoinedTuple( joined );
- joined.assertTuple( context,
- workingMemory );
+ this.sink.assertTuple( new ReteTuple( tuple,
+ handle ),
+ context,
+ workingMemory );
}
- public LinkedList createAndPropagateAssertTuple(InternalFactHandle handle,
- PropagationContext context,
- InternalWorkingMemory workingMemory) {
- final LinkedList list = new LinkedList();
- ReteTuple tuple = new ReteTuple( handle,
- sink );
- list.add( new LinkedListEntry( tuple ) );
- tuple.assertTuple( context,
- workingMemory );
- return list;
- }
-
public void propagateAssertTuple(ReteTuple tuple,
PropagationContext context,
InternalWorkingMemory workingMemory) {
- final ReteTuple child = new ReteTuple( tuple,
- sink );
- // no TupleMatch so instead add as a linked tuple
- tuple.addChildEntry( child );
- child.assertTuple( context,
- workingMemory );
- }
+ this.sink.assertTuple( new ReteTuple( tuple ),
+ context,
+ workingMemory );
+ }
- /**
- * @inheritDoc
- */
- public void propagateAssertTuple(final ReteTuple tuple,
- final InternalFactHandle handle,
- final PropagationContext context,
- final InternalWorkingMemory workingMemory) {
- final ReteTuple joined = new ReteTuple( tuple,
- handle,
- sink );
- tuple.addChildEntry( joined );
- joined.assertTuple( context,
- workingMemory );
- }
-
- public TupleSink[] getSinks() {
- return new TupleSink[]{this.sink};
- }
-
- public void propagateNewTupleSink(TupleMatch tupleMatch,
+ public void propagateRetractTuple(ReteTuple tuple,
+ InternalFactHandle handle,
PropagationContext context,
InternalWorkingMemory workingMemory) {
- // do nothing, as we have no new tuple sinks
- throw new RuntimeException( "This is a bug you cannot update new data through this single sink adapter" );
+ this.sink.retractTuple( new ReteTuple( tuple,
+ handle ),
+ context,
+ workingMemory );
}
-
- public void propagateNewTupleSink(InternalFactHandle handle,
- LinkedList list,
+
+ public void propagateRetractTuple(ReteTuple tuple,
PropagationContext context,
InternalWorkingMemory workingMemory) {
- // do nothing, as we have no new tuple sinks
- throw new RuntimeException( "This is a bug you cannot update new data through this single sink adapter" );
+ this.sink.retractTuple( new ReteTuple( tuple ),
+ context,
+ workingMemory );
+ }
+ public ReteTuple createAndPropagateAssertTuple(InternalFactHandle handle,
+ PropagationContext context,
+ InternalWorkingMemory workingMemory) {
+ // This is the root fact, so we don't need to clone it.
+ ReteTuple tuple = new ReteTuple( handle );
+ this.sink.assertTuple( tuple,
+ context,
+ workingMemory );
+ return tuple;
}
- public void propagateNewTupleSink(ReteTuple tuple,
- PropagationContext context,
- InternalWorkingMemory workingMemory) {
- // do nothing, as we have no new tuple sinks
- throw new RuntimeException( "This is a bug you cannot update new data through this single sink adapter" );
+ public void createAndPropagateRetractTuple(ReteTuple tuple,
+ PropagationContext context,
+ InternalWorkingMemory workingMemory) {
+ this.sink.retractTuple( tuple,
+ context,
+ workingMemory );
}
+
+ public TupleSink[] getSinks() {
+ return new TupleSink[] { this.sink };
+ }
- public List getPropagatedTuples(final Map memory,
- final InternalWorkingMemory workingMemory,
- final TupleSink sink) {
- final List propagatedTuples = new ArrayList( memory.size() );
+ // 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;
+ // }
- for ( final Iterator it = memory.values().iterator(); it.hasNext(); ) {
- final LinkedList tuples = (LinkedList) it.next();
- propagatedTuples.add( ((LinkedListEntry) tuples.getFirst()).getObject() );
- }
-
- return propagatedTuples;
- }
-
public int size() {
- return 1;
+ return ( this.sink != null ) ? 1 : 0;
}
+}
-}
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-10-05 12:47:12 UTC (rev 6616)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleSinkPropagator.java 2006-10-05 14:30:40 UTC (rev 6617)
@@ -22,22 +22,10 @@
public void propagateRetractTuple(ReteTuple tuple,
PropagationContext context,
- InternalWorkingMemory workingMemory);
-
- public void propagateModifyTuple(ReteTuple tuple,
- InternalFactHandle handle,
- PropagationContext context,
- InternalWorkingMemory workingMemory);
-
- public void propagateModifyTuple(ReteTuple tuple,
- PropagationContext context,
- InternalWorkingMemory workingMemory);
+ InternalWorkingMemory workingMemory);
- public LinkedList createAndPropagateAssertTupleWithMemory(InternalFactHandle handle,
- PropagationContext context,
- InternalWorkingMemory workingMemory);
- public void createAndPropagateAssertTuple(InternalFactHandle handle,
+ public ReteTuple createAndPropagateAssertTuple(InternalFactHandle handle,
PropagationContext context,
InternalWorkingMemory workingMemory);
@@ -45,18 +33,6 @@
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,
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-05 12:47:12 UTC (rev 6616)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/ObjectHashMap.java 2006-10-05 14:30:40 UTC (rev 6617)
@@ -89,12 +89,12 @@
}
current.setNext( null );
this.size--;
- return current;
+ return current.getValue();
}
previous = current;
current = next;
}
- return current;
+ return null;
}
public Entry getBucket(int hashCode) {
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LeftInputAdapterNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LeftInputAdapterNodeTest.java 2006-10-05 12:47:12 UTC (rev 6616)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LeftInputAdapterNodeTest.java 2006-10-05 14:30:40 UTC (rev 6617)
@@ -16,17 +16,20 @@
* limitations under the License.
*/
+import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
import org.drools.DroolsTestCase;
import org.drools.RuleBaseFactory;
+import org.drools.common.BaseNode;
import org.drools.common.DefaultFactHandle;
import org.drools.common.PropagationContextImpl;
import org.drools.spi.PropagationContext;
import org.drools.spi.Tuple;
import org.drools.util.LinkedList;
import org.drools.util.LinkedListEntry;
+import org.drools.util.ObjectHashMap;
public class LeftInputAdapterNodeTest extends DroolsTestCase {
@@ -53,20 +56,24 @@
final LeftInputAdapterNode liaNode = new LeftInputAdapterNode( 1,
source );
+ Field field = ObjectSource.class.getDeclaredField( "sink" );
+ field.setAccessible( true );
+ ObjectSinkPropagator sink = ( ObjectSinkPropagator ) field.get( source );
+
assertEquals( 1,
liaNode.getId() );
+ assertNull( sink );
- assertLength( 0,
- source.getObjectSinksAsList() );
-
liaNode.attach();
+
+ sink = ( ObjectSinkPropagator ) field.get( source );
- assertLength( 1,
- source.getObjectSinksAsList() );
+ assertEquals( 1,
+ sink.getSinks().length );
assertSame( liaNode,
- source.getObjectSinks().getLastObjectSink() );
+ sink.getSinks()[0] );
}
/**
@@ -74,7 +81,7 @@
*
* @throws Exception
*/
- public void testAssertObject() throws Exception {
+ public void testAssertObjectWithoutMemory() throws Exception {
final PropagationContext context = new PropagationContextImpl( 0,
PropagationContext.ASSERTION,
null,
@@ -103,15 +110,54 @@
assertSame( string1,
workingMemory.getObject( tuple0.get( 0 ) ) );
+ }
+
+ /**
+ * Tests the assertion of objects into LeftInputAdapterNode
+ *
+ * @throws Exception
+ */
+ public void testAssertObjectWithMemory() throws Exception {
+ final PropagationContext context = new PropagationContextImpl( 0,
+ PropagationContext.ASSERTION,
+ null,
+ null );
+
+ final ReteooWorkingMemory workingMemory = new ReteooWorkingMemory( 1,
+ (ReteooRuleBase) RuleBaseFactory.newRuleBase() );
+
+ final LeftInputAdapterNode liaNode = new LeftInputAdapterNode( 1,
+ new MockObjectSource( 15 ) );
+
+ final MockTupleSink sink = new MockTupleSink();
+ liaNode.addTupleSink( sink );
+
+ //force liaNode to have memory
+ Field field = BaseNode.class.getDeclaredField( "hasMemory" );
+ field.setAccessible( true );
+ field.set( liaNode, new Boolean( true ) );
+
+ final Object string1 = "cheese";
+
+ // assert object
+ final DefaultFactHandle f0 = (DefaultFactHandle) workingMemory.assertObject( string1 );
+ liaNode.assertObject( f0,
+ context,
+ workingMemory );
+
+ final List asserted = sink.getAsserted();
+ assertLength( 1,
+ asserted );
+ final Tuple tuple0 = (Tuple) ((Object[]) asserted.get( 0 ))[0];
+ assertSame( string1,
+ workingMemory.getObject( tuple0.get( 0 ) ) );
+
// check node memory
- final Map map = (Map) workingMemory.getNodeMemory( liaNode );
- final LinkedList list0 = (LinkedList) map.get( f0 );
- assertEquals( 1,
- list0.size() );
+ final ObjectHashMap map = (ObjectHashMap) workingMemory.getNodeMemory( liaNode );
assertSame( tuple0,
- ((LinkedListEntry) list0.getFirst()).getObject() );
+ map.get( f0 ) );
- // check memory stacks correctly
+ // check memory works with multiple handles
final DefaultFactHandle f1 = (DefaultFactHandle) workingMemory.assertObject( "test1" );
liaNode.assertObject( f1,
context,
@@ -121,24 +167,21 @@
asserted );
final Tuple tuple1 = (Tuple) ((Object[]) asserted.get( 1 ))[0];
- final LinkedList list1 = (LinkedList) map.get( f1 );
- assertEquals( 1,
- list1.size() );
assertSame( tuple1,
- ((LinkedListEntry) list1.getFirst()).getObject() );
+ map.get( f1 ) );
assertNotSame( tuple0,
tuple1 );
- }
-
+ }
+
/**
* Tests the retractions from a LeftInputAdapterNode.
* Object Assertions result in tuple propagations, so we
* test the remove(...) method
* @throws Exception
*/
- public void testRetractObject() throws Exception {
+ public void testRetractObjectWithoutMemory() throws Exception {
final PropagationContext context = new PropagationContextImpl( 0,
PropagationContext.ASSERTION,
null,
@@ -156,7 +199,7 @@
final DefaultFactHandle f0 = (DefaultFactHandle) workingMemory.assertObject( "f1" );
- /* assert object */
+ // assert object
liaNode.assertObject( f0,
context,
workingMemory );
@@ -167,12 +210,56 @@
context,
workingMemory );
- final Map map = (Map) workingMemory.getNodeMemory( liaNode );
+ assertEquals( tuple,
+ ((Object[]) sink.getRetracted().get( 0 ))[0] );
+ assertNotSame( tuple,
+ ((Object[]) sink.getRetracted().get( 0 ))[0] );
+
+ }
+
+ public void testRetractObjectWithMemory() throws Exception {
+ final PropagationContext context = new PropagationContextImpl( 0,
+ PropagationContext.ASSERTION,
+ null,
+ null );
+
+ final ReteooWorkingMemory workingMemory = new ReteooWorkingMemory( 1,
+ (ReteooRuleBase) RuleBaseFactory.newRuleBase() );
+
+ final MockObjectSource source = new MockObjectSource( 15 );
+
+ final LeftInputAdapterNode liaNode = new LeftInputAdapterNode( 1,
+ source );
+ //force liaNode to have memory
+ Field field = BaseNode.class.getDeclaredField( "hasMemory" );
+ field.setAccessible( true );
+ field.set( liaNode, new Boolean( true ) );
+
+ final MockTupleSink sink = new MockTupleSink();
+ liaNode.addTupleSink( sink );
+
+ final DefaultFactHandle f0 = (DefaultFactHandle) workingMemory.assertObject( "f1" );
+
+ // assert object
+ liaNode.assertObject( f0,
+ context,
+ workingMemory );
+
+ final Tuple tuple = (Tuple) ((Object[]) sink.getAsserted().get( 0 ))[0];
+
+ final ObjectHashMap map = (ObjectHashMap) workingMemory.getNodeMemory( liaNode );
+ assertSame( tuple, map.get( f0 ) );
+
+ liaNode.retractObject( f0,
+ context,
+ workingMemory );
+
+
assertNull( map.get( f0 ) );
assertSame( tuple,
((Object[]) sink.getRetracted().get( 0 ))[0] );
- }
+ }
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockTupleSink.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockTupleSink.java 2006-10-05 12:47:12 UTC (rev 6616)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockTupleSink.java 2006-10-05 14:30:40 UTC (rev 6617)
@@ -39,7 +39,7 @@
private static final long serialVersionUID = -5292603482246485028L;
private final List asserted = new ArrayList();
private final List retracted = new ArrayList();
- private final List modified = new ArrayList();
+
public MockTupleSink() {
super( 0 );
@@ -49,26 +49,20 @@
super( id );
}
- public void assertTuple(final Tuple tuple,
+ public void assertTuple(final ReteTuple tuple,
final PropagationContext context,
- final ReteooWorkingMemory workingMemory) {
+ final InternalWorkingMemory workingMemory) {
this.asserted.add( new Object[]{tuple, context, workingMemory} );
}
- public void retractTuple(final Tuple tuple,
+ public void retractTuple(final ReteTuple tuple,
final PropagationContext context,
- final ReteooWorkingMemory workingMemory) {
+ final InternalWorkingMemory workingMemory) {
this.retracted.add( new Object[]{tuple, context, workingMemory} );
}
- public void modifyTuple(final Tuple tuple,
- final PropagationContext context,
- final ReteooWorkingMemory workingMemory) {
- this.modified.add( new Object[]{tuple, context, workingMemory} );
- }
-
public List getAsserted() {
return this.asserted;
}
@@ -77,10 +71,6 @@
return this.retracted;
}
- public List getModified() {
- return this.modified;
- }
-
public void ruleAttached() {
// TODO Auto-generated method stub
}
@@ -102,8 +92,9 @@
}
- public void updateNewNode(final InternalWorkingMemory workingMemory,
- final PropagationContext context) throws FactException {
+ public void updateSink(final TupleSink sink,
+ final PropagationContext context,
+ final InternalWorkingMemory workingMemory) throws FactException {
// TODO Auto-generated method stub
}
More information about the jboss-svn-commits
mailing list