[jboss-svn-commits] JBL Code SVN: r19195 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools/reteoo and 5 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Fri Mar 21 17:07:44 EDT 2008
Author: mark.proctor at jboss.com
Date: 2008-03-21 17:07:44 -0400 (Fri, 21 Mar 2008)
New Revision: 19195
Added:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightTupleSink.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/LeftTupleIndexHashTable.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/LeftTupleList.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/RightTupleIndexHashTable.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/RightTupleList.java
Removed:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHandleIndexHashTable.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashTable.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactList.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleHashTable.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleIndexHashTable.java
Modified:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/NamedEntryPoint.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/QuadroupleBetaConstraints.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.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/EntryPointNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.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/LeftTuple.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTupleMemory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/MemoryVisitor.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/RightTuple.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/BaseBetaConstraintsTest.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeTest.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/EvalConditionNodeTest.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/ObjectTypeNodeTest.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FactHashTableTest.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexEntryTest.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexHashTableTest.java
Log:
JBRULES-1520 RightTuple merge for asynchronous Rete propagations
-most of the basics are in place now, just trying to get manners running.
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -27,13 +27,12 @@
import org.drools.spi.BetaNodeFieldConstraint;
import org.drools.spi.Constraint;
import org.drools.util.AbstractHashTable.FieldIndex;
-import org.drools.util.FactHandleIndexHashTable;
-import org.drools.util.FactHashTable;
-import org.drools.util.FactList;
+import org.drools.util.RightTupleIndexHashTable;
+import org.drools.util.RightTupleList;
import org.drools.util.LinkedList;
import org.drools.util.LinkedListEntry;
-import org.drools.util.TupleHashTable;
-import org.drools.util.TupleIndexHashTable;
+import org.drools.util.LeftTupleList;
+import org.drools.util.LeftTupleIndexHashTable;
import java.io.IOException;
import java.io.ObjectInput;
@@ -240,23 +239,23 @@
final FieldIndex[] indexes = (FieldIndex[]) list.toArray( new FieldIndex[list.size()] );
LeftTupleMemory tupleMemory;
if ( config.isIndexLeftBetaMemory() ) {
- tupleMemory = new TupleIndexHashTable( indexes );
+ tupleMemory = new LeftTupleIndexHashTable( indexes );
} else {
- tupleMemory = new TupleHashTable();
+ tupleMemory = new LeftTupleList();
}
RightTupleMemory factHandleMemory;
if ( config.isIndexRightBetaMemory() ) {
- factHandleMemory = new FactHandleIndexHashTable( indexes );
+ factHandleMemory = new RightTupleIndexHashTable( indexes );
} else {
- factHandleMemory = config.isSequential() ? (RightTupleMemory) new FactList() : (RightTupleMemory) new FactHashTable();
+ factHandleMemory = new RightTupleList();
}
memory = new BetaMemory( config.isSequential() ? null : tupleMemory,
factHandleMemory,
this.createContext() );
} else {
- memory = new BetaMemory( config.isSequential() ? null : new TupleHashTable(),
- config.isSequential() ? (RightTupleMemory) new FactList() : (RightTupleMemory) new FactHashTable(),
+ memory = new BetaMemory( config.isSequential() ? null : new LeftTupleList(),
+ new RightTupleList(),
this.createContext() );
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -26,13 +26,12 @@
import org.drools.rule.VariableConstraint;
import org.drools.spi.BetaNodeFieldConstraint;
import org.drools.util.AbstractHashTable.FieldIndex;
-import org.drools.util.FactHandleIndexHashTable;
-import org.drools.util.FactHashTable;
-import org.drools.util.FactList;
+import org.drools.util.RightTupleIndexHashTable;
+import org.drools.util.RightTupleList;
import org.drools.util.LinkedList;
import org.drools.util.LinkedListEntry;
-import org.drools.util.TupleHashTable;
-import org.drools.util.TupleIndexHashTable;
+import org.drools.util.LeftTupleList;
+import org.drools.util.LeftTupleIndexHashTable;
import java.io.IOException;
import java.io.ObjectInput;
@@ -229,23 +228,23 @@
LeftTupleMemory tupleMemory;
if ( config.isIndexLeftBetaMemory() ) {
- tupleMemory = new TupleIndexHashTable( indexes );
+ tupleMemory = new LeftTupleIndexHashTable( indexes );
} else {
- tupleMemory = new TupleHashTable();
+ tupleMemory = new LeftTupleList();
}
RightTupleMemory factHandleMemory;
if ( config.isIndexRightBetaMemory() ) {
- factHandleMemory = new FactHandleIndexHashTable( indexes );
+ factHandleMemory = new RightTupleIndexHashTable( indexes );
} else {
- factHandleMemory = config.isSequential() ? (RightTupleMemory) new FactList() : (RightTupleMemory) new FactHashTable();
+ factHandleMemory = (RightTupleMemory) new RightTupleList();
}
memory = new BetaMemory( config.isSequential() ? null : tupleMemory,
factHandleMemory,
this.createContext() );
} else {
- memory = new BetaMemory( config.isSequential() ? null : new TupleHashTable(),
- config.isSequential() ? (RightTupleMemory) new FactList() : (RightTupleMemory) new FactHashTable(),
+ memory = new BetaMemory( config.isSequential() ? null : new LeftTupleList(),
+ new RightTupleList(),
this.createContext() );
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -21,10 +21,9 @@
import org.drools.reteoo.RightTupleMemory;
import org.drools.reteoo.LeftTuple;
import org.drools.rule.ContextEntry;
-import org.drools.util.FactHashTable;
-import org.drools.util.FactList;
+import org.drools.util.RightTupleList;
import org.drools.util.LinkedList;
-import org.drools.util.TupleHashTable;
+import org.drools.util.LeftTupleList;
import java.io.IOException;
import java.io.ObjectInput;
@@ -105,8 +104,8 @@
}
public BetaMemory createBetaMemory(final RuleBaseConfiguration config) {
- final BetaMemory memory = new BetaMemory( config.isSequential() ? null : new TupleHashTable(),
- config.isSequential() ? (RightTupleMemory) new FactList() : (RightTupleMemory) new FactHashTable(),
+ final BetaMemory memory = new BetaMemory( config.isSequential() ? null : new LeftTupleList(),
+ new RightTupleList(),
this.createContext() );
return memory;
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/NamedEntryPoint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/NamedEntryPoint.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/NamedEntryPoint.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -271,9 +271,13 @@
-1,
-1,
this.entryPoint );
+
+ ObjectTypeConf typeConf = this.typeConfReg.getObjectTypeConf( this.entryPoint,
+ handle.getObject() );
this.entryPointNode.retractObject( handle,
propagationContext,
+ typeConf,
this.wm );
final Object object = handle.getObject();
@@ -329,9 +333,13 @@
-1,
-1,
entryPoint );
+
+ ObjectTypeConf typeConf = this.typeConfReg.getObjectTypeConf( this.entryPoint,
+ handle.getObject() );
this.entryPointNode.retractObject( handle,
propagationContext,
+ typeConf,
this.wm );
} finally {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/QuadroupleBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/QuadroupleBetaConstraints.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/QuadroupleBetaConstraints.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -26,13 +26,12 @@
import org.drools.rule.VariableConstraint;
import org.drools.spi.BetaNodeFieldConstraint;
import org.drools.util.AbstractHashTable.FieldIndex;
-import org.drools.util.FactHandleIndexHashTable;
-import org.drools.util.FactHashTable;
-import org.drools.util.FactList;
+import org.drools.util.RightTupleIndexHashTable;
+import org.drools.util.RightTupleList;
import org.drools.util.LinkedList;
import org.drools.util.LinkedListEntry;
-import org.drools.util.TupleHashTable;
-import org.drools.util.TupleIndexHashTable;
+import org.drools.util.LeftTupleList;
+import org.drools.util.LeftTupleIndexHashTable;
import java.io.IOException;
import java.io.ObjectInput;
@@ -330,23 +329,23 @@
final FieldIndex[] indexes = (FieldIndex[]) list.toArray( new FieldIndex[list.size()] );
LeftTupleMemory tupleMemory;
if ( conf.isIndexLeftBetaMemory() ) {
- tupleMemory = new TupleIndexHashTable( indexes );
+ tupleMemory = new LeftTupleIndexHashTable( indexes );
} else {
- tupleMemory = new TupleHashTable();
+ tupleMemory = new LeftTupleList();
}
RightTupleMemory factHandleMemory;
if ( conf.isIndexRightBetaMemory() ) {
- factHandleMemory = new FactHandleIndexHashTable( indexes );
+ factHandleMemory = new RightTupleIndexHashTable( indexes );
} else {
- factHandleMemory = conf.isSequential() ? (RightTupleMemory) new FactList() : (RightTupleMemory) new FactHashTable();
+ factHandleMemory = new RightTupleList();
}
memory = new BetaMemory( conf.isSequential() ? null : tupleMemory,
factHandleMemory,
this.createContext() );
} else {
- memory = new BetaMemory( conf.isSequential() ? null : new TupleHashTable(),
- conf.isSequential() ? (RightTupleMemory) new FactList() : (RightTupleMemory) new FactHashTable(),
+ memory = new BetaMemory( conf.isSequential() ? null : new LeftTupleList(),
+ new RightTupleList(),
this.createContext() );
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -30,12 +30,12 @@
import org.drools.rule.VariableConstraint;
import org.drools.spi.BetaNodeFieldConstraint;
import org.drools.util.AbstractHashTable;
-import org.drools.util.FactHashTable;
-import org.drools.util.FactHandleIndexHashTable;
+import org.drools.util.RightTupleList;
+import org.drools.util.RightTupleIndexHashTable;
import org.drools.util.LinkedList;
import org.drools.util.LinkedListEntry;
-import org.drools.util.TupleHashTable;
-import org.drools.util.TupleIndexHashTable;
+import org.drools.util.LeftTupleList;
+import org.drools.util.LeftTupleIndexHashTable;
import org.drools.util.AbstractHashTable.FieldIndex;
public class SingleBetaConstraints
@@ -171,23 +171,23 @@
variableConstraint.getEvaluator() );
LeftTupleMemory tupleMemory;
if ( this.conf.isIndexLeftBetaMemory() ) {
- tupleMemory = new TupleIndexHashTable( new FieldIndex[]{index} );
+ tupleMemory = new LeftTupleIndexHashTable( new FieldIndex[]{index} );
} else {
- tupleMemory = new TupleHashTable();
+ tupleMemory = new LeftTupleList();
}
RightTupleMemory factHandleMemory;
if ( this.conf.isIndexRightBetaMemory() ) {
- factHandleMemory = new FactHandleIndexHashTable( new FieldIndex[]{index} );
+ factHandleMemory = new RightTupleIndexHashTable( new FieldIndex[]{index} );
} else {
- factHandleMemory = new FactHashTable();
+ factHandleMemory = new RightTupleList();
}
memory = new BetaMemory( config.isSequential() ? null : tupleMemory,
factHandleMemory,
this.createContext() );
} else {
- memory = new BetaMemory( config.isSequential() ? null : new TupleHashTable(),
- new FactHashTable(),
+ memory = new BetaMemory( config.isSequential() ? null : new LeftTupleList(),
+ new RightTupleList(),
this.createContext() );
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -31,13 +31,12 @@
import org.drools.rule.ContextEntry;
import org.drools.rule.VariableConstraint;
import org.drools.spi.BetaNodeFieldConstraint;
-import org.drools.util.FactHashTable;
-import org.drools.util.FactHandleIndexHashTable;
-import org.drools.util.FactList;
+import org.drools.util.RightTupleList;
+import org.drools.util.RightTupleIndexHashTable;
import org.drools.util.LinkedList;
import org.drools.util.LinkedListEntry;
-import org.drools.util.TupleHashTable;
-import org.drools.util.TupleIndexHashTable;
+import org.drools.util.LeftTupleList;
+import org.drools.util.LeftTupleIndexHashTable;
import org.drools.util.AbstractHashTable.FieldIndex;
public class TripleBetaConstraints
@@ -276,23 +275,23 @@
final FieldIndex[] indexes = (FieldIndex[]) list.toArray( new FieldIndex[list.size()] );
LeftTupleMemory tupleMemory;
if ( conf.isIndexLeftBetaMemory() ) {
- tupleMemory = new TupleIndexHashTable( indexes );
+ tupleMemory = new LeftTupleIndexHashTable( indexes );
} else {
- tupleMemory = new TupleHashTable();
+ tupleMemory = new LeftTupleList();
}
RightTupleMemory factHandleMemory;
if ( conf.isIndexRightBetaMemory() ) {
- factHandleMemory = new FactHandleIndexHashTable( indexes );
+ factHandleMemory = new RightTupleIndexHashTable( indexes );
} else {
- factHandleMemory = conf.isSequential() ? (RightTupleMemory) new FactList() : (RightTupleMemory) new FactHashTable();
+ factHandleMemory = new RightTupleList();
}
memory = new BetaMemory( conf.isSequential() ? null : tupleMemory,
factHandleMemory,
this.createContext() );
} else {
- memory = new BetaMemory( conf.isSequential() ? null : new TupleHashTable(),
- conf.isSequential() ? (RightTupleMemory) new FactList() : (RightTupleMemory) new FactHashTable(),
+ memory = new BetaMemory( conf.isSequential() ? null : new LeftTupleList(),
+ new RightTupleList(),
this.createContext() );
}
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 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -32,7 +32,7 @@
import org.drools.spi.AlphaNodeFieldConstraint;
import org.drools.spi.PropagationContext;
import org.drools.util.FactEntry;
-import org.drools.util.FactHashTable;
+import org.drools.util.RightTupleList;
import org.drools.util.Iterator;
/**
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -38,7 +38,7 @@
import org.drools.spi.ObjectType;
import org.drools.spi.PropagationContext;
import org.drools.util.FactEntry;
-import org.drools.util.FactHashTable;
+import org.drools.util.RightTupleList;
import org.drools.util.Iterator;
/**
@@ -195,12 +195,6 @@
}
}
- public void retractObject(final InternalFactHandle handle,
- final PropagationContext context,
- final InternalWorkingMemory workingMemory) {
- // do nothing, dummy method to impl the interface
- }
-
/**
* Adds the <code>ObjectSink</code> so that it may receive
* <code>Objects</code> propagated from this <code>ObjectSource</code>.
@@ -276,26 +270,27 @@
public void updateSink(final ObjectSink sink,
final PropagationContext context,
final InternalWorkingMemory workingMemory) {
- // JBRULES-612: the cache MUST be invalidated when a new node type is added to the network, so iterate and reset all caches.
- final ObjectTypeNode node = (ObjectTypeNode) sink;
-
- final ObjectType newObjectType = node.getObjectType();
-
- InternalWorkingMemoryEntryPoint wmEntryPoint = (InternalWorkingMemoryEntryPoint) workingMemory.getWorkingMemoryEntryPoint( this.entryPoint.getEntryPointId() );
-
- for ( ObjectTypeConf objectTypeConf : wmEntryPoint.getObjectTypeConfigurationRegistry().values() ) {
- if ( newObjectType.isAssignableFrom( objectTypeConf.getConcreteObjectTypeNode().getObjectType() ) ) {
- objectTypeConf.resetCache();
- ObjectTypeNode sourceNode = objectTypeConf.getConcreteObjectTypeNode();
- FactHashTable table = (FactHashTable) workingMemory.getNodeMemory( sourceNode );
- Iterator factIter = table.iterator();
- for ( FactEntry factEntry = (FactEntry) factIter.next(); factEntry != null; factEntry = (FactEntry) factIter.next() ) {
- sink.assertObject( factEntry.getFactHandle(),
- context,
- workingMemory );
- }
- }
- }
+ // @todo
+// // JBRULES-612: the cache MUST be invalidated when a new node type is added to the network, so iterate and reset all caches.
+// final ObjectTypeNode node = (ObjectTypeNode) sink;
+//
+// final ObjectType newObjectType = node.getObjectType();
+//
+// InternalWorkingMemoryEntryPoint wmEntryPoint = (InternalWorkingMemoryEntryPoint) workingMemory.getWorkingMemoryEntryPoint( this.entryPoint.getEntryPointId() );
+//
+// for ( ObjectTypeConf objectTypeConf : wmEntryPoint.getObjectTypeConfigurationRegistry().values() ) {
+// if ( newObjectType.isAssignableFrom( objectTypeConf.getConcreteObjectTypeNode().getObjectType() ) ) {
+// objectTypeConf.resetCache();
+// ObjectTypeNode sourceNode = objectTypeConf.getConcreteObjectTypeNode();
+// RightTupleList table = (RightTupleList) workingMemory.getNodeMemory( sourceNode );
+// Iterator factIter = table.iterator();
+// for ( FactEntry factEntry = (FactEntry) factIter.next(); factEntry != null; factEntry = (FactEntry) factIter.next() ) {
+// sink.assertObject( factEntry.getFactHandle(),
+// context,
+// workingMemory );
+// }
+// }
+// }
}
public boolean isObjectMemoryEnabled() {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -30,7 +30,7 @@
import org.drools.rule.EvalCondition;
import org.drools.spi.PropagationContext;
import org.drools.util.Iterator;
-import org.drools.util.TupleHashTable;
+import org.drools.util.LeftTupleList;
/**
* Node which filters <code>ReteTuple</code>s.
@@ -323,7 +323,7 @@
private static final long serialVersionUID = -2754669682742843929L;
- public TupleHashTable tupleMemory;
+ public LeftTupleList tupleMemory;
public Object context;
public EvalMemory() {
@@ -334,13 +334,13 @@
final Object context) {
this.context = context;
if ( tupleMemoryEnabled ) {
- this.tupleMemory = new TupleHashTable();
+ this.tupleMemory = new LeftTupleList();
}
}
public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException {
- tupleMemory = (TupleHashTable) in.readObject();
+ tupleMemory = (LeftTupleList) in.readObject();
context = in.readObject();
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -20,7 +20,7 @@
import org.drools.util.Iterator;
import org.drools.util.LinkedList;
import org.drools.util.LinkedListEntry;
-import org.drools.util.TupleHashTable;
+import org.drools.util.LeftTupleList;
public class FromNode extends LeftTupleSource
implements
@@ -234,7 +234,7 @@
}
public Object createMemory(final RuleBaseConfiguration config) {
- BetaMemory beta = new BetaMemory( new TupleHashTable(),
+ BetaMemory beta = new BetaMemory( new LeftTupleList(),
null,
this.betaConstraints.createContext() );
return new FromMemory( beta,
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 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -25,7 +25,7 @@
import org.drools.reteoo.builder.BuildContext;
import org.drools.spi.PropagationContext;
import org.drools.util.FactEntry;
-import org.drools.util.FactHashTable;
+import org.drools.util.RightTupleList;
import org.drools.util.Iterator;
import java.io.ObjectOutput;
@@ -227,7 +227,7 @@
}
public Object createMemory(final RuleBaseConfiguration config) {
- return new FactHashTable();
+ return new RightTupleList();
}
/**
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTuple.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -12,8 +12,8 @@
import org.drools.spi.Activation;
import org.drools.spi.Tuple;
import org.drools.util.Entry;
-import org.drools.util.FactHashTable;
-import org.drools.util.TupleHashTable;
+import org.drools.util.RightTupleList;
+import org.drools.util.LeftTupleList;
public class LeftTuple
implements
@@ -49,7 +49,7 @@
private LeftTuple rightParentNext;
// node memory
- private TupleHashTable memory;
+ private LeftTupleList memory;
private Entry next;
private Entry previous;
@@ -258,11 +258,11 @@
return entry.handle;
}
- public TupleHashTable getMemory() {
+ public LeftTupleList getMemory() {
return this.memory;
}
- public void setMemory(TupleHashTable memory) {
+ public void setMemory(LeftTupleList memory) {
this.memory = memory;
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTupleMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTupleMemory.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftTupleMemory.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -11,7 +11,7 @@
public void add(LeftTuple tuple);
- public LeftTuple remove(LeftTuple leftTuple);
+ public void remove(LeftTuple leftTuple);
public boolean contains(LeftTuple leftTuple);
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/MemoryVisitor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/MemoryVisitor.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/MemoryVisitor.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -12,10 +12,10 @@
import org.drools.spi.ObjectType;
import org.drools.util.AbstractHashTable;
import org.drools.util.Entry;
-import org.drools.util.FactHandleIndexHashTable;
-import org.drools.util.FactHashTable;
+import org.drools.util.RightTupleIndexHashTable;
+import org.drools.util.RightTupleList;
import org.drools.util.ReflectiveVisitor;
-import org.drools.util.FactHandleIndexHashTable.FieldIndexEntry;
+import org.drools.util.RightTupleIndexHashTable.FieldIndexEntry;
public class MemoryVisitor extends ReflectiveVisitor
implements
@@ -63,7 +63,7 @@
public void visitObjectTypeNode(final ObjectTypeNode node) {
System.out.println( indent() + node );
- final FactHashTable memory = (FactHashTable) this.workingMemory.getNodeMemory( node );
+ final RightTupleList memory = (RightTupleList) this.workingMemory.getNodeMemory( node );
checkObjectHashTable( memory );
this.indent++;
@@ -84,7 +84,7 @@
public void visitAlphaNode(final AlphaNode node) {
System.out.println( indent() + node );
- final FactHashTable memory = (FactHashTable) this.workingMemory.getNodeMemory( node );
+ final RightTupleList memory = (RightTupleList) this.workingMemory.getNodeMemory( node );
checkObjectHashTable( memory );
this.indent++;
@@ -193,16 +193,16 @@
// }
private void checkObjectHashTable(final RightTupleMemory memory) {
- if ( memory instanceof FactHashTable ) {
- checkFactHashTable( (FactHashTable) memory );
- } else if ( memory instanceof FactHandleIndexHashTable ) {
- checkFieldIndexHashTable( (FactHandleIndexHashTable) memory );
+ if ( memory instanceof RightTupleList ) {
+ checkFactHashTable( (RightTupleList) memory );
+ } else if ( memory instanceof RightTupleIndexHashTable ) {
+ checkFieldIndexHashTable( (RightTupleIndexHashTable) memory );
} else {
throw new RuntimeException( memory.getClass() + " should not be here" );
}
}
- private void checkFactHashTable(final FactHashTable memory) {
+ private void checkFactHashTable(final RightTupleList memory) {
final Entry[] entries = memory.getTable();
int count = 0;
for ( int i = 0, length = entries.length; i < length; i++ ) {
@@ -221,7 +221,7 @@
}
}
- private void checkFieldIndexHashTable(final FactHandleIndexHashTable memory) {
+ private void checkFieldIndexHashTable(final RightTupleIndexHashTable memory) {
final Entry[] entries = memory.getTable();
int factCount = 0;
int bucketCount = 0;
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 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -36,7 +36,7 @@
import org.drools.spi.ObjectType;
import org.drools.spi.PropagationContext;
import org.drools.util.FactEntry;
-import org.drools.util.FactHashTable;
+import org.drools.util.RightTupleList;
import org.drools.util.Iterator;
import org.drools.util.ObjectHashSet;
@@ -168,7 +168,7 @@
}
if ( this.objectMemoryEnabled ) {
- final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( this );
+ final ObjectHashSet memory = (ObjectHashSet) workingMemory.getNodeMemory( this );
memory.add( factHandle,
false );
}
@@ -178,12 +178,6 @@
workingMemory );
}
- public void retractRightTuple(final RightTuple rightTuple,
- final PropagationContext context,
- final InternalWorkingMemory workingMemory) {
- throw new UnsupportedOperationException( "ObjectTypeNode.retractRightTuple is not supported." );
- }
-
/**
* Retract the <code>FactHandleimpl</code> from the <code>Rete</code> network. Also remove the
* <code>FactHandleImpl</code> from the node memory.
@@ -226,13 +220,13 @@
public void updateSink(final ObjectSink sink,
final PropagationContext context,
final InternalWorkingMemory workingMemory) {
- final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( this );
- final Iterator it = memory.iterator();
- for ( FactEntry entry = (FactEntry) it.next(); entry != null; entry = (FactEntry) it.next() ) {
- sink.assertObject( entry.getFactHandle(),
- context,
- workingMemory );
- }
+// final ObjectHashSet memory = (ObjectHashSet) workingMemory.getNodeMemory( this );
+ //for ( RightTuple rightTuple = (RightTuple) memory.getFirst( null ); rightTuple != null; rightTuple = (RightTuple) rightTuple.getNext() ) {
+ //@ TODO
+ // sink.assertRightTuple( rightTuple,
+ // context,
+ // workingMemory );
+// }
}
/**
@@ -298,7 +292,7 @@
* to switch back to a standard HashMap.
*/
public Object createMemory(final RuleBaseConfiguration config) {
- return new FactHashTable();
+ return new ObjectHashSet();
}
public boolean isObjectMemoryEnabled() {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightTuple.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightTuple.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightTuple.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -6,7 +6,7 @@
import org.drools.common.InternalFactHandle;
import org.drools.util.Entry;
-import org.drools.util.FactHashTable;
+import org.drools.util.RightTupleList;
public class RightTuple
implements
@@ -16,7 +16,7 @@
private RightTuple handlePrevious;
private RightTuple handleNext;
- private FactHashTable memory;
+ private RightTupleList memory;
private Entry previous;
private Entry next;
@@ -99,11 +99,11 @@
this.blocked = blocked;
}
- public FactHashTable getMemory() {
+ public RightTupleList getMemory() {
return memory;
}
- public void setMemory(FactHashTable memory) {
+ public void setMemory(RightTupleList memory) {
this.memory = memory;
}
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightTupleSink.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightTupleSink.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightTupleSink.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -0,0 +1,10 @@
+package org.drools.reteoo;
+
+import org.drools.common.InternalWorkingMemory;
+import org.drools.spi.PropagationContext;
+
+public interface RightTupleSink {
+ public void retractRightTuple(final RightTuple rightTuple,
+ final PropagationContext context,
+ final InternalWorkingMemory workingMemory);
+}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -46,7 +46,7 @@
import org.drools.spi.RuleFlowGroup;
import org.drools.util.Iterator;
import org.drools.util.LinkedList;
-import org.drools.util.TupleHashTable;
+import org.drools.util.LeftTupleList;
/**
* Leaf Rete-OO node responsible for enacting <code>Action</code> s on a
@@ -198,7 +198,8 @@
}
//we only have to clone the head fact to make sure the graph is not affected during consequence reads after a modify
- final LeftTuple cloned = new LeftTuple( tuple );
+ // @FIXME
+ final LeftTuple cloned = tuple;//new LeftTuple( tuple );
final InternalAgenda agenda = (InternalAgenda) workingMemory.getAgenda();
@@ -386,14 +387,9 @@
final PropagationContext context,
final InternalWorkingMemory workingMemory) {
final TerminalNodeMemory memory = (TerminalNodeMemory) workingMemory.getNodeMemory( this );
- final LeftTuple tuple = memory.getTupleMemory().remove( leftTuple );
- if ( tuple == null ) {
- // tuple should only be null if it was asserted and reached a no-loop causing it to exit early
- // before being added to the node memory and an activation created and attached
- return;
- }
+ memory.getTupleMemory().remove( leftTuple );
- final Activation activation = tuple.getActivation();
+ final Activation activation = leftTuple.getActivation();
if ( activation.getLogicalDependencies() != null && !activation.getLogicalDependencies().isEmpty() ) {
context.addRetractedTuple( this.rule,
activation );
@@ -583,10 +579,10 @@
private RuleFlowGroup ruleFlowGroup;
- private TupleHashTable tupleMemory;
+ private LeftTupleList tupleMemory;
public TerminalNodeMemory() {
- this.tupleMemory = new TupleHashTable();
+ this.tupleMemory = new LeftTupleList();
}
public void readExternal(ObjectInput in) throws IOException,
@@ -594,7 +590,7 @@
agendaGroup = (InternalAgendaGroup) in.readObject();
activationGroup = (ActivationGroup) in.readObject();
ruleFlowGroup = (RuleFlowGroup) in.readObject();
- tupleMemory = (TupleHashTable) in.readObject();
+ tupleMemory = (LeftTupleList) in.readObject();
}
public void writeExternal(ObjectOutput out) throws IOException {
@@ -620,7 +616,7 @@
this.activationGroup = activationGroup;
}
- public TupleHashTable getTupleMemory() {
+ public LeftTupleList getTupleMemory() {
return this.tupleMemory;
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -629,13 +629,13 @@
public int hashCodeOf(final Object object) {
int hashCode = this.startResult;
- hashCode = TupleIndexHashTable.PRIME * hashCode + this.extractor.getHashCode( null, object );
+ hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.extractor.getHashCode( null, object );
return rehash( hashCode );
}
public int hashCodeOf(final LeftTuple tuple) {
int hashCode = this.startResult;
- hashCode = TupleIndexHashTable.PRIME * hashCode + this.declaration.getHashCode( null, tuple.get( this.declaration ).getObject() );
+ hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.declaration.getHashCode( null, tuple.get( this.declaration ).getObject() );
return rehash( hashCode );
}
@@ -726,8 +726,8 @@
public int hashCodeOf(final Object object) {
int hashCode = this.startResult;
- hashCode = TupleIndexHashTable.PRIME * hashCode + this.index0.extractor.getHashCode( null, object );
- hashCode = TupleIndexHashTable.PRIME * hashCode + this.index1.extractor.getHashCode( null, object );
+ hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index0.extractor.getHashCode( null, object );
+ hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index1.extractor.getHashCode( null, object );
return rehash( hashCode );
}
@@ -735,8 +735,8 @@
public int hashCodeOf(final LeftTuple tuple) {
int hashCode = this.startResult;
- hashCode = TupleIndexHashTable.PRIME * hashCode + this.index0.declaration.getHashCode( null, tuple.get( this.index0.declaration ).getObject() );
- hashCode = TupleIndexHashTable.PRIME * hashCode + this.index1.declaration.getHashCode( null, tuple.get( this.index1.declaration ).getObject() );
+ hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index0.declaration.getHashCode( null, tuple.get( this.index0.declaration ).getObject() );
+ hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index1.declaration.getHashCode( null, tuple.get( this.index1.declaration ).getObject() );
return rehash( hashCode );
}
@@ -847,9 +847,9 @@
public int hashCodeOf(final Object object) {
int hashCode = this.startResult;
- hashCode = TupleIndexHashTable.PRIME * hashCode + this.index0.extractor.getHashCode( null, object );;
- hashCode = TupleIndexHashTable.PRIME * hashCode + this.index1.extractor.getHashCode( null, object );;
- hashCode = TupleIndexHashTable.PRIME * hashCode + this.index2.extractor.getHashCode( null, object );;
+ hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index0.extractor.getHashCode( null, object );;
+ hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index1.extractor.getHashCode( null, object );;
+ hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index2.extractor.getHashCode( null, object );;
return rehash( hashCode );
}
@@ -857,9 +857,9 @@
public int hashCodeOf(final LeftTuple tuple) {
int hashCode = this.startResult;
- hashCode = TupleIndexHashTable.PRIME * hashCode + this.index0.declaration.getHashCode( null, tuple.get( this.index0.declaration ).getObject() );
- hashCode = TupleIndexHashTable.PRIME * hashCode + this.index1.declaration.getHashCode( null, tuple.get( this.index1.declaration ).getObject() );
- hashCode = TupleIndexHashTable.PRIME * hashCode + this.index2.declaration.getHashCode( null, tuple.get( this.index2.declaration ).getObject() );
+ hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index0.declaration.getHashCode( null, tuple.get( this.index0.declaration ).getObject() );
+ hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index1.declaration.getHashCode( null, tuple.get( this.index1.declaration ).getObject() );
+ hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index2.declaration.getHashCode( null, tuple.get( this.index2.declaration ).getObject() );
return rehash( hashCode );
}
Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHandleIndexHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHandleIndexHashTable.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHandleIndexHashTable.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -1,415 +0,0 @@
-/**
- *
- */
-package org.drools.util;
-
-import org.drools.common.InternalFactHandle;
-import org.drools.reteoo.RightTupleMemory;
-import org.drools.reteoo.LeftTuple;
-import org.drools.util.TupleIndexHashTable.FieldIndexEntry;
-
-import java.io.ObjectInput;
-import java.io.IOException;
-import java.io.ObjectOutput;
-import java.io.Externalizable;
-
-public class FactHandleIndexHashTable extends AbstractHashTable
- implements
- RightTupleMemory, Externalizable {
-
- private static final long serialVersionUID = 400L;
-
- public static final int PRIME = 31;
-
- private int startResult;
-
- private FieldIndexHashTableIterator tupleValueIterator;
-
- private int factSize;
-
- private Index index;
-
- public FactHandleIndexHashTable() {
- }
-
- public FactHandleIndexHashTable(final FieldIndex[] index) {
- this( 16,
- 0.75f,
- index );
- }
-
- public FactHandleIndexHashTable(final int capacity,
- final float loadFactor,
- final FieldIndex[] index) {
- super( capacity,
- loadFactor );
-
- this.startResult = FactHandleIndexHashTable.PRIME;
- for ( int i = 0, length = index.length; i < length; i++ ) {
- this.startResult = FactHandleIndexHashTable.PRIME * this.startResult + index[i].getExtractor().getIndex();
- }
-
- switch ( index.length ) {
- case 0 :
- throw new IllegalArgumentException( "FieldIndexHashTable cannot use an index[] of length 0" );
- case 1 :
- this.index = new SingleIndex( index,
- this.startResult );
- break;
- case 2 :
- this.index = new DoubleCompositeIndex( index,
- this.startResult );
- break;
- case 3 :
- this.index = new TripleCompositeIndex( index,
- this.startResult );
- break;
- default :
- throw new IllegalArgumentException( "FieldIndexHashTable cannot use an index[] of length great than 3" );
- }
- }
-
- public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- super.readExternal(in);
- startResult = in.readInt();
- tupleValueIterator = (FieldIndexHashTableIterator)in.readObject();
- factSize = in.readInt();
- index = (Index)in.readObject();
- }
-
- public void writeExternal(ObjectOutput out) throws IOException {
- super.writeExternal(out);
- out.writeInt(startResult);
- out.writeObject(tupleValueIterator);
- out.writeInt(factSize);
- out.writeObject(index);
- }
-
- public Iterator iterator() {
- throw new UnsupportedOperationException( "FieldIndexHashTable does not support iterator()" );
- }
-
- public Iterator iterator(final LeftTuple tuple) {
- if ( this.tupleValueIterator == null ) {
- this.tupleValueIterator = new FieldIndexHashTableIterator();
- }
- final FieldIndexEntry entry = get( tuple );
- this.tupleValueIterator.reset( (entry != null) ? entry.first : null );
- return this.tupleValueIterator;
- }
-
- public boolean isIndexed() {
- return true;
- }
-
- public Index getIndex() {
- return this.index;
- }
-
- public Entry getBucket(final Object object) {
- final int hashCode = this.index.hashCodeOf( object );
- final int index = indexOf( hashCode,
- this.table.length );
-
- return this.table[index];
- }
-
- /**
- * Fast re-usable iterator
- *
- */
- public static class FieldIndexHashTableIterator
- implements
- Iterator, Externalizable {
- private Entry entry;
-
- public FieldIndexHashTableIterator() {
-
- }
-
- public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- entry = (Entry)in.readObject();
- }
-
- public void writeExternal(ObjectOutput out) throws IOException {
- out.writeObject(entry);
- }
-
- /* (non-Javadoc)
- * @see org.drools.util.Iterator#next()
- */
- public Object next() {
- final Entry current = this.entry;
- this.entry = (this.entry != null) ? this.entry.getNext() : null;
- return current;
- }
-
- /* (non-Javadoc)
- * @see org.drools.util.Iterator#reset()
- */
- public void reset(final Entry entry) {
- this.entry = entry;
- }
- }
-
- public Entry[] toArray() {
- Entry[] result = new Entry[this.factSize];
- int index = 0;
- for ( int i = 0; i < this.table.length; i++ ) {
- FieldIndexEntry fieldIndexEntry = (FieldIndexEntry)this.table[i];
- while ( fieldIndexEntry != null ) {
- Entry entry = fieldIndexEntry.getFirst();
- while ( entry != null ) {
- result[index++] = entry;
- entry = entry.getNext();
- }
- fieldIndexEntry = ( FieldIndexEntry ) fieldIndexEntry.getNext();
- }
- }
- return result;
- }
-
- public boolean add(final InternalFactHandle handle) {
- final FieldIndexEntry entry = getOrCreate( handle.getObject() );
- entry.add( handle );
- this.factSize++;
- return true;
- }
-
- public boolean add(final InternalFactHandle handle,
- final boolean checkExists) {
- throw new UnsupportedOperationException( "FieldIndexHashTable does not support add(InternalFactHandle handle, boolean checkExists)" );
- }
-
- public boolean remove(final InternalFactHandle handle) {
- final Object object = handle.getObject();
- //this.index.setCachedValue( object );
- final int hashCode = this.index.hashCodeOf( object );
-
- final int index = indexOf( hashCode,
- this.table.length );
-
- // search the table for the Entry, we need to track previous and next, so if the
- // Entry is empty after its had the FactEntry removed, we must remove it from the table
- FieldIndexEntry previous = (FieldIndexEntry) this.table[index];
- FieldIndexEntry current = previous;
- while ( current != null ) {
- final FieldIndexEntry next = (FieldIndexEntry) current.next;
- if ( current.matches( object,
- hashCode ) ) {
- current.remove( handle );
- this.factSize--;
- // If the FactEntryIndex is empty, then remove it from the hash table
- if ( current.first == null ) {
- if ( previous == current ) {
- this.table[index] = next;
- } else {
- previous.next = next;
- }
- current.next = null;
- this.size--;
- }
- return true;
- }
- previous = current;
- current = next;
- }
- return false;
- }
-
- public boolean contains(final InternalFactHandle handle) {
- final Object object = handle.getObject();
- //this.index.setCachedValue( object );
-
- final int hashCode = this.index.hashCodeOf( object );
-
- final int index = indexOf( hashCode,
- this.table.length );
-
- FieldIndexEntry current = (FieldIndexEntry) this.table[index];
- while ( current != null ) {
- if ( current.matches( object,
- hashCode ) ) {
- return true;
- }
- current = (FieldIndexEntry) current.next;
- }
- return false;
- }
-
- public FieldIndexEntry get(final LeftTuple tuple) {
- //this.index.setCachedValue( tuple );
-
- final int hashCode = this.index.hashCodeOf( tuple );
-
- final int index = indexOf( hashCode,
- this.table.length );
- FieldIndexEntry entry = (FieldIndexEntry) this.table[index];
-
- while ( entry != null ) {
- if ( entry.matches( tuple,
- hashCode ) ) {
- return entry;
- }
- entry = (FieldIndexEntry) entry.getNext();
- }
-
- return entry;
- }
-
- /**
- * We use this method to aviod to table lookups for the same hashcode; which is what we would have to do if we did
- * a get and then a create if the value is null.
- *
- * @param value
- * @return
- */
- private FieldIndexEntry getOrCreate(final Object object) {
- //this.index.setCachedValue( object );
-
- final int hashCode = this.index.hashCodeOf( object );
-
- final int index = indexOf( hashCode,
- this.table.length );
- FieldIndexEntry entry = (FieldIndexEntry) this.table[index];
-
- while ( entry != null ) {
- if ( entry.matches( object,
- hashCode ) ) {
- return entry;
- }
- entry = (FieldIndexEntry) entry.next;
- }
-
- if ( entry == null ) {
- entry = new FieldIndexEntry( this.index,
- hashCode );
- entry.next = this.table[index];
- this.table[index] = entry;
-
- if ( this.size++ >= this.threshold ) {
- resize( 2 * this.table.length );
- }
- }
- return entry;
- }
-
- public int size() {
- return this.factSize;
- }
-
- public static class FieldIndexEntry
- implements
- Entry {
-
- private static final long serialVersionUID = 400L;
- private Entry next;
- private FactEntryImpl first;
- private int hashCode;
- private Index index;
-
- public FieldIndexEntry() {
-
- }
-
- public FieldIndexEntry(final Index index,
- final int hashCode) {
- this.index = index;
- this.hashCode = hashCode;
- }
-
- public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- next = (Entry)in.readObject();
- first = (FactEntryImpl)in.readObject();
- hashCode = in.readInt();
- index = (Index)in.readObject();
- }
-
- public void writeExternal(ObjectOutput out) throws IOException {
- out.writeObject(next);
- out.writeObject(first);
- out.writeInt(hashCode);
- out.writeObject(index);
- }
- public Entry getNext() {
- return this.next;
- }
-
- public void setNext(final Entry next) {
- this.next = next;
- }
-
- public FactEntryImpl getFirst() {
- return this.first;
- }
-
- public void add(final InternalFactHandle handle) {
- final FactEntryImpl entry = new FactEntryImpl( handle );
- entry.next = this.first;
- this.first = entry;
- }
-
- public FactEntryImpl get(final InternalFactHandle handle) {
- final long id = handle.getId();
- FactEntryImpl current = this.first;
- while ( current != null ) {
- if ( current.handle.getId() == id ) {
- return current;
- }
- current = (FactEntryImpl) current.next;
- }
- return null;
- }
-
- public FactEntryImpl remove(final InternalFactHandle handle) {
- final long id = handle.getId();
-
- FactEntryImpl previous = this.first;
- FactEntryImpl current = previous;
- while ( current != null ) {
- final FactEntryImpl next = (FactEntryImpl) current.next;
- if ( current.handle.getId() == id ) {
- if ( this.first == current ) {
- this.first = next;
- } else {
- previous.next = next;
- }
- current.next = null;
- return current;
- }
- previous = current;
- current = next;
- }
- return current;
- }
-
- // public boolean matches(int otherHashCode) {
- // return this.hashCode == otherHashCode && this.index.equal( this.first.getFactHandle().getObject() );
- // }
-
- public boolean matches(final Object object,
- final int objectHashCode) {
- return this.hashCode == objectHashCode && this.index.equal( this.first.getFactHandle().getObject(),
- object );
- }
-
- public boolean matches(final LeftTuple tuple,
- final int tupleHashCode) {
- return this.hashCode == tupleHashCode && this.index.equal( this.first.getFactHandle().getObject(),
- tuple );
- }
-
- public int hashCode() {
- return this.hashCode;
- }
-
- public boolean equals(final Object object) {
- final FieldIndexEntry other = (FieldIndexEntry) object;
- return this.hashCode == other.hashCode && this.index == other.index;
- }
-
- public String toString() {
- return "FieldIndexEntry( hashCode=" + this.hashCode + " first=" + this.first + " )";
- }
- }
-}
\ No newline at end of file
Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashTable.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashTable.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -1,115 +0,0 @@
-/**
- *
- */
-package org.drools.util;
-
-import org.drools.common.InternalFactHandle;
-import org.drools.reteoo.RightTupleMemory;
-import org.drools.reteoo.LeftTuple;
-
-public class FactHashTable extends AbstractHashTable
- implements
- RightTupleMemory {
- private static final long serialVersionUID = 400L;
-
- public FactHashTable() {
- this( 16,
- 0.75f );
- }
-
- public FactHashTable(final int capacity,
- final float loadFactor) {
- super( capacity,
- loadFactor );
- }
-
- public Iterator iterator(final LeftTuple tuple) {
- return iterator();
- }
-
- public boolean add(final InternalFactHandle handle) {
- return add( handle,
- true );
- }
-
- public boolean add(final InternalFactHandle handle,
- final boolean checkExists) {
- final int hashCode = this.comparator.hashCodeOf( handle );
- final int index = indexOf( hashCode,
- this.table.length );
-
- // scan the linked entries to see if it exists
- if ( checkExists ) {
- FactEntryImpl current = (FactEntryImpl) this.table[index];
- while ( current != null ) {
- if ( hashCode == current.hashCode && handle.getId() == current.handle.getId() ) {
- return false;
- }
- current = (FactHashTable.FactEntryImpl) current.getNext();
- }
- }
-
- // We aren't checking the key exists, or it didn't find the key
- final FactEntryImpl entry = new FactEntryImpl( handle,
- hashCode );
- entry.next = this.table[index];
- this.table[index] = entry;
-
- if ( this.size++ >= this.threshold ) {
- resize( 2 * this.table.length );
- }
- return true;
- }
-
- public boolean contains(final InternalFactHandle handle) {
- final int hashCode = this.comparator.hashCodeOf( handle );
- final int index = indexOf( hashCode,
- this.table.length );
-
- FactEntryImpl current = (FactEntryImpl) this.table[index];
- while ( current != null ) {
- if ( hashCode == current.hashCode && handle.getId() == current.handle.getId() ) {
- return true;
- }
- current = (FactEntryImpl) current.getNext();
- }
- return false;
- }
-
- public boolean remove(final InternalFactHandle handle) {
- final int hashCode = this.comparator.hashCodeOf( handle );
- final int index = indexOf( hashCode,
- this.table.length );
-
- FactEntryImpl previous = (FactEntryImpl) this.table[index];
- FactEntryImpl current = previous;
- while ( current != null ) {
- final FactEntryImpl next = (FactEntryImpl) current.getNext();
- if ( hashCode == current.hashCode && handle.getId() == current.handle.getId() ) {
- if ( previous == current ) {
- this.table[index] = next;
- } else {
- previous.setNext( next );
- }
- current.setNext( null );
- this.size--;
- return true;
- }
- previous = current;
- current = next;
- }
- return false;
- }
-
- public Entry getBucket(final Object object) {
- final int hashCode = this.comparator.hashCodeOf( object );
- final int index = indexOf( hashCode,
- this.table.length );
-
- return this.table[index];
- }
-
- public boolean isIndexed() {
- return false;
- }
-}
\ No newline at end of file
Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactList.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactList.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactList.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -1,81 +0,0 @@
-/**
- *
- */
-package org.drools.util;
-
-import java.io.Serializable;
-
-import org.drools.common.InternalFactHandle;
-import org.drools.reteoo.RightTupleMemory;
-import org.drools.reteoo.LeftTuple;
-
-public class FactList
- implements
- RightTupleMemory {
- private static final long serialVersionUID = 400L;
-
- private final LinkedList list;
-
- public FactList() {
- this.list = new LinkedList();
- }
-
- public Iterator iterator(final LeftTuple tuple) {
- return iterator();
- }
-
- public boolean add(final InternalFactHandle handle) {
- return add( handle,
- true );
- }
-
- public boolean add(final InternalFactHandle handle,
- final boolean checkExists) {
- this.list.add( new FactEntryImpl( handle ) );
- return true;
- }
-
- public boolean contains(final InternalFactHandle handle) {
- Iterator it = this.list.iterator();
- for ( Object object = it.next(); object != null; object = it.next() ) {
- if ( handle.equals( ((LinkedListEntry)object).getObject() ) ) {
- return true;
- }
- }
- return false;
- }
-
- public boolean remove(final InternalFactHandle handle) {
- Iterator it = this.list.iterator();
- for ( Object object = it.next(); object != null; object = it.next() ) {
- if ( handle.equals( ((LinkedListEntry)object).getObject() ) ) {
- this.list.remove( (LinkedListEntry)object );
- return true;
- }
- }
- return false;
- }
-
- public Iterator iterator() {
- return this.list.iterator();
- }
-
- public int size() {
- return this.list.size();
- }
-
- public boolean isIndexed() {
- return false;
- }
-
- public static class FactEntryImpl extends LinkedListEntry implements FactEntry, Serializable {
- public FactEntryImpl(InternalFactHandle handle) {
- super(handle);
- }
-
- public InternalFactHandle getFactHandle() {
- return (InternalFactHandle) getObject();
- }
-
- }
-}
\ No newline at end of file
Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/LeftTupleIndexHashTable.java (from rev 19176, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleIndexHashTable.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/LeftTupleIndexHashTable.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/LeftTupleIndexHashTable.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -0,0 +1,318 @@
+/**
+ *
+ */
+package org.drools.util;
+
+import org.drools.common.InternalFactHandle;
+import org.drools.reteoo.LeftTuple;
+import org.drools.reteoo.LeftTupleMemory;
+import org.drools.reteoo.RightTuple;
+
+import java.io.ObjectOutput;
+import java.io.ObjectInput;
+import java.io.IOException;
+import java.io.Externalizable;
+
+public class LeftTupleIndexHashTable extends AbstractHashTable
+ implements
+ LeftTupleMemory {
+
+ private static final long serialVersionUID = 400L;
+
+ public static final int PRIME = 31;
+
+ private int startResult;
+
+ private FieldIndexHashTableFullIterator tupleValueFullIterator;
+
+ private int factSize;
+
+ private Index index;
+
+ public LeftTupleIndexHashTable(final FieldIndex[] index) {
+ this( 128,
+ 0.75f,
+ index );
+ }
+
+ public LeftTupleIndexHashTable(final int capacity,
+ final float loadFactor,
+ final FieldIndex[] index) {
+ super( capacity,
+ loadFactor );
+
+ this.startResult = LeftTupleIndexHashTable.PRIME;
+ for ( int i = 0, length = index.length; i < length; i++ ) {
+ this.startResult += LeftTupleIndexHashTable.PRIME * this.startResult + index[i].getExtractor().getIndex();
+ }
+
+ switch ( index.length ) {
+ case 0 :
+ throw new IllegalArgumentException( "FieldIndexHashTable cannot use an index[] of length 0" );
+ case 1 :
+ this.index = new SingleIndex( index,
+ this.startResult );
+ break;
+ case 2 :
+ this.index = new DoubleCompositeIndex( index,
+ this.startResult );
+ break;
+ case 3 :
+ this.index = new TripleCompositeIndex( index,
+ this.startResult );
+ break;
+ default :
+ throw new IllegalArgumentException( "FieldIndexHashTable cannot use an index[] of length great than 3" );
+ }
+ }
+
+ public Iterator iterator() {
+ if ( this.tupleValueFullIterator == null ) {
+ this.tupleValueFullIterator = new FieldIndexHashTableFullIterator( this );
+ }
+ this.tupleValueFullIterator.reset();
+ return this.tupleValueFullIterator;
+ }
+
+ public LeftTuple getFirst(final RightTuple rightTuple) {
+ LeftTupleList bucket = get( rightTuple );
+ if ( bucket != null ) {
+ return bucket.getFirst( null );
+ } else {
+ return null;
+ }
+ }
+
+ public boolean isIndexed() {
+ return true;
+ }
+
+ public Index getIndex() {
+ return this.index;
+ }
+
+ public Entry getBucket(final Object object) {
+ final int hashCode = this.index.hashCodeOf( object );
+ final int index = indexOf( hashCode,
+ this.table.length );
+
+ return this.table[index];
+ }
+
+ public static class FieldIndexHashTableFullIterator
+ implements
+ Iterator {
+ private AbstractHashTable hashTable;
+ private Entry[] table;
+ private int row;
+ private int length;
+ private Entry entry;
+
+ public FieldIndexHashTableFullIterator(final AbstractHashTable hashTable) {
+ this.hashTable = hashTable;
+ }
+
+ /* (non-Javadoc)
+ * @see org.drools.util.Iterator#next()
+ */
+ public Object next() {
+ if ( this.entry == null ) {
+ // keep skipping rows until we come to the end, or find one that is populated
+ while ( this.entry == null ) {
+ this.row++;
+ if ( this.row == this.length ) {
+ return null;
+ }
+ this.entry = (this.table[this.row] != null) ? ((LeftTupleList) this.table[this.row]).first : null;
+ }
+ } else {
+ this.entry = this.entry.getNext();
+ if ( this.entry == null ) {
+ this.entry = (Entry) next();
+ }
+ }
+
+ return this.entry;
+ }
+
+ public void remove() {
+ throw new UnsupportedOperationException( "FieldIndexHashTableFullIterator does not support remove()." );
+ }
+
+ /* (non-Javadoc)
+ * @see org.drools.util.Iterator#reset()
+ */
+ public void reset() {
+ this.table = this.hashTable.getTable();
+ this.length = this.table.length;
+ this.row = -1;
+ this.entry = null;
+ }
+ }
+
+ public LeftTuple[] toArray() {
+ LeftTuple[] result = new LeftTuple[this.factSize];
+ int index = 0;
+ for ( int i = 0; i < this.table.length; i++ ) {
+ LeftTupleList bucket = (LeftTupleList) this.table[i];
+ while ( bucket != null ) {
+ LeftTuple entry = (LeftTuple) bucket.getFirst( null );
+ while ( entry != null ) {
+ result[index++] = entry;
+ entry = (LeftTuple) entry.getNext();
+ }
+ bucket = (LeftTupleList) bucket.getNext();
+ }
+ }
+ return result;
+ }
+
+ public void add(final LeftTuple tuple) {
+ final LeftTupleList entry = getOrCreate( tuple );
+ tuple.setMemory( entry );
+ entry.add( tuple );
+ this.factSize++;
+ }
+
+ public void remove(final LeftTuple leftTuple) {
+ if ( leftTuple.getMemory() != null ) {
+ LeftTupleList memory = leftTuple.getMemory();
+ memory.remove( leftTuple );
+ if ( memory.first == null ) {
+ final int index = indexOf( memory.hashCode(),
+ this.table.length );
+ LeftTupleList previous = null;
+ LeftTupleList current = (LeftTupleList) this.table[index];
+ while ( current != memory ) {
+ previous = current;
+ current = (LeftTupleList) current.getNext();
+ }
+
+ if ( previous != null ) {
+ previous.next = current.next;
+ } else {
+ this.table[index] = current.next;
+ }
+ this.size--;
+ }
+ return;
+ }
+
+ final int hashCode = this.index.hashCodeOf( leftTuple );
+ final int index = indexOf( hashCode,
+ this.table.length );
+
+ // search the table for the Entry, we need to track previous, so if the Entry
+ // is empty we can remove it.
+ LeftTupleList previous = null;
+ LeftTupleList current = (LeftTupleList) this.table[index];
+ while ( current != null ) {
+ if ( current.matches( leftTuple,
+ hashCode ) ) {
+ current.remove( leftTuple );
+ this.factSize--;
+
+ if ( current.first == null ) {
+ if ( previous != null ) {
+ previous.next = current.next;
+ } else {
+ this.table[index] = current.next;
+ }
+ this.size--;
+ }
+ break;
+ }
+ previous = current;
+ current = (LeftTupleList) current.next;
+ }
+ leftTuple.setNext( null );
+ leftTuple.setPrevious( null );
+ }
+
+ public boolean contains(final LeftTuple tuple) {
+ final int hashCode = this.index.hashCodeOf( tuple );
+
+ final int index = indexOf( hashCode,
+ this.table.length );
+
+ LeftTupleList current = (LeftTupleList) this.table[index];
+ while ( current != null ) {
+ if ( current.matches( tuple,
+ hashCode ) ) {
+ return true;
+ }
+ current = (LeftTupleList) current.next;
+ }
+ return false;
+ }
+
+ public LeftTupleList get(final RightTuple rightTuple) {
+ final Object object = rightTuple.getFactHandle().getObject();
+ final int hashCode = this.index.hashCodeOf( object );
+
+ final int index = indexOf( hashCode,
+ this.table.length );
+ LeftTupleList entry = (LeftTupleList) this.table[index];
+
+ while ( entry != null ) {
+ if ( entry.matches( object,
+ hashCode ) ) {
+ return entry;
+ }
+ entry = (LeftTupleList) entry.getNext();
+ }
+
+ return entry;
+ }
+
+ /**
+ * We use this method to aviod to table lookups for the same hashcode; which is what we would have to do if we did
+ * a get and then a create if the value is null.
+ *
+ * @param value
+ * @return
+ */
+ private LeftTupleList getOrCreate(final LeftTuple tuple) {
+ final int hashCode = this.index.hashCodeOf( tuple );
+
+ final int index = indexOf( hashCode,
+ this.table.length );
+ LeftTupleList entry = (LeftTupleList) this.table[index];
+
+ // search to find an existing entry
+ while ( entry != null ) {
+ if ( entry.matches( tuple,
+ hashCode ) ) {
+ return entry;
+ }
+ entry = (LeftTupleList) entry.next;
+ }
+
+ // entry does not exist, so create
+ if ( entry == null ) {
+ entry = new LeftTupleList( this.index,
+ hashCode );
+ entry.next = this.table[index];
+ this.table[index] = entry;
+
+ if ( this.size++ >= this.threshold ) {
+ resize( 2 * this.table.length );
+ }
+ }
+ return entry;
+ }
+
+ public int size() {
+ return this.factSize;
+ }
+
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ Iterator it = iterator();
+ for ( LeftTuple leftTuple = (LeftTuple) it.next(); leftTuple != null; leftTuple = (LeftTuple) it.next() ) {
+ builder.append( leftTuple + "\n" );
+ }
+
+ return builder.toString();
+ }
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/LeftTupleList.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/LeftTupleList.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/LeftTupleList.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -0,0 +1,213 @@
+/**
+ *
+ */
+package org.drools.util;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.drools.common.InternalFactHandle;
+import org.drools.reteoo.LeftTuple;
+import org.drools.reteoo.LeftTupleMemory;
+import org.drools.reteoo.RightTuple;
+import org.drools.util.AbstractHashTable.Index;
+
+public class LeftTupleList
+ implements
+ LeftTupleMemory,
+ Entry {
+
+ public static final long serialVersionUID = 400L;
+ // private Entry previous;
+ public Entry next;
+
+ public LeftTuple first;
+
+ private final int hashCode;
+ private final Index index;
+
+ private TupleHashTableIterator iterator;
+
+ private int size;
+
+ public LeftTupleList() {
+ // this is not an index bucket
+ this.hashCode = 0;
+ this.index = null;
+ }
+
+ public LeftTupleList(final Index index,
+ final int hashCode) {
+ this.index = index;
+ this.hashCode = hashCode;
+ }
+
+ public LeftTuple getFirst(RightTuple rightTuple) {
+ return this.first;
+ }
+
+ public void add(final LeftTuple leftTuple) {
+ if ( this.first != null ) {
+ leftTuple.setNext( this.first );
+ this.first.setPrevious( leftTuple );
+ }
+
+ this.first = leftTuple;
+
+ this.size++;
+ }
+
+ public void remove(final LeftTuple leftTuple) {
+ LeftTuple previous = (LeftTuple) leftTuple.getPrevious();
+ LeftTuple next = (LeftTuple) leftTuple.getNext();
+
+ if ( previous != null && next != null ) {
+ //remove from middle
+ previous.setNext( next );
+ next.setPrevious( previous );
+ } else if ( next != null ) {
+ //remove from first
+ this.first = next;
+ next.setPrevious( null );
+ } else if ( previous != null ) {
+ //remove from end
+ previous.setNext( null );
+ } else {
+ this.first = null;
+ }
+
+ leftTuple.setPrevious( null );
+ leftTuple.setNext( null );
+
+ this.size--;
+ }
+
+ public boolean contains(final LeftTuple leftTuple) {
+ return get( leftTuple ) != null;
+ }
+
+ public Object get(final LeftTuple leftTtuple) {
+ LeftTuple current = this.first;
+ while ( current != null ) {
+ if ( leftTtuple.equals( current ) ) {
+ return current;
+ }
+ current = (LeftTuple) current.getNext();
+ }
+ return null;
+ }
+
+ public int size() {
+ return this.size;
+ }
+
+ public LeftTuple[] toArray() {
+ LeftTuple[] tuples = new LeftTuple[this.size];
+
+ LeftTuple current = first;
+ for ( int i = 0; i < this.size; i++ ) {
+ tuples[i] = current;
+ current = (LeftTuple) current.getNext();
+ }
+
+ return tuples;
+ }
+
+ public Entry getBucket(final Object object) {
+ return this.first;
+ }
+
+ public Iterator iterator() {
+ if ( this.iterator == null ) {
+ this.iterator = new TupleHashTableIterator();
+ }
+ this.iterator.reset( this.first );
+ return this.iterator;
+ }
+
+ public static class TupleHashTableIterator
+ implements
+ Iterator {
+ private LeftTuple current;
+
+ public void reset(LeftTuple first) {
+ this.current = first;
+ }
+
+ public Object next() {
+ if ( this.current != null ) {
+ LeftTuple returnValue = this.current;
+ this.current = (LeftTuple) current.getNext();
+ return returnValue;
+ } else {
+ return null;
+ }
+ }
+
+ public void remove() {
+ // do nothing
+ }
+ }
+
+ public boolean isIndexed() {
+ return false;
+ }
+
+ public boolean matches(final Object object,
+ final int objectHashCode) {
+ return this.hashCode == objectHashCode && this.index.equal( object,
+ this.first );
+ }
+
+ public boolean matches(final LeftTuple tuple,
+ final int tupleHashCode) {
+ return this.hashCode == tupleHashCode && this.index.equal( this.first,
+ tuple );
+ }
+
+ public int hashCode() {
+ return this.hashCode;
+ }
+
+ public boolean equals(final Object object) {
+ final LeftTupleList other = (LeftTupleList) object;
+ return this.hashCode == other.hashCode && this.index == other.index;
+ }
+
+ public Entry getNext() {
+ return this.next;
+ }
+
+ public void setNext(final Entry next) {
+ this.next = next;
+ }
+
+ public Entry getPrevious() {
+ return null;
+ }
+
+ public void setPrevious(Entry previous) {
+ // this.previous = previous;
+ }
+
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ Iterator it = iterator();
+ for ( LeftTuple leftTuple = (LeftTuple) it.next(); leftTuple != null; leftTuple = (LeftTuple) it.next() ) {
+ builder.append( leftTuple + "\n" );
+ }
+
+ return builder.toString();
+ }
+
+ public void readExternal(ObjectInput in) throws IOException,
+ ClassNotFoundException {
+ // @todo
+
+ }
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ // @todo
+ }
+}
\ No newline at end of file
Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/RightTupleIndexHashTable.java (from rev 19178, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHandleIndexHashTable.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/RightTupleIndexHashTable.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/RightTupleIndexHashTable.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -0,0 +1,312 @@
+/**
+ *
+ */
+package org.drools.util;
+
+import org.drools.common.InternalFactHandle;
+import org.drools.reteoo.RightTuple;
+import org.drools.reteoo.RightTupleMemory;
+import org.drools.reteoo.LeftTuple;
+
+import java.io.ObjectInput;
+import java.io.IOException;
+import java.io.ObjectOutput;
+import java.io.Externalizable;
+
+public class RightTupleIndexHashTable extends AbstractHashTable
+ implements
+ RightTupleMemory {
+
+ private static final long serialVersionUID = 400L;
+
+ public static final int PRIME = 31;
+
+ private int startResult;
+
+ private int factSize;
+
+ private Index index;
+
+ public RightTupleIndexHashTable(final FieldIndex[] index) {
+ this( 128,
+ 0.75f,
+ index );
+ }
+
+ public RightTupleIndexHashTable(final int capacity,
+ final float loadFactor,
+ final FieldIndex[] index) {
+ super( capacity,
+ loadFactor );
+
+ this.startResult = RightTupleIndexHashTable.PRIME;
+ for ( int i = 0, length = index.length; i < length; i++ ) {
+ this.startResult = RightTupleIndexHashTable.PRIME * this.startResult + index[i].getExtractor().getIndex();
+ }
+
+ switch ( index.length ) {
+ case 0 :
+ throw new IllegalArgumentException( "FieldIndexHashTable cannot use an index[] of length 0" );
+ case 1 :
+ this.index = new SingleIndex( index,
+ this.startResult );
+ break;
+ case 2 :
+ this.index = new DoubleCompositeIndex( index,
+ this.startResult );
+ break;
+ case 3 :
+ this.index = new TripleCompositeIndex( index,
+ this.startResult );
+ break;
+ default :
+ throw new IllegalArgumentException( "FieldIndexHashTable cannot use an index[] of length great than 3" );
+ }
+ }
+
+ public RightTuple getFirst(LeftTuple leftTuple) {
+ RightTupleList bucket = get( leftTuple );
+ if ( bucket != null ) {
+ return bucket.first;
+ } else {
+ return null;
+ }
+ }
+
+ public RightTuple getLast(LeftTuple leftTuple) {
+ RightTupleList bucket = get( leftTuple );
+ if ( bucket != null ) {
+ return bucket.last;
+ } else {
+ return null;
+ }
+ }
+
+ public boolean isIndexed() {
+ return true;
+ }
+
+ public Index getIndex() {
+ return this.index;
+ }
+
+ public Entry getBucket(final Object object) {
+ final int hashCode = this.index.hashCodeOf( object );
+ final int index = indexOf( hashCode,
+ this.table.length );
+
+ return this.table[index];
+ }
+
+ /**
+ * Fast re-usable iterator
+ *
+ */
+ public static class FieldIndexHashTableIterator
+ implements
+ Iterator {
+ private Entry entry;
+
+ public FieldIndexHashTableIterator() {
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.drools.util.Iterator#next()
+ */
+ public Object next() {
+ final Entry current = this.entry;
+ this.entry = (this.entry != null) ? this.entry.getNext() : null;
+ return current;
+ }
+
+ public void remove() {
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.drools.util.Iterator#reset()
+ */
+ public void reset(final Entry entry) {
+ this.entry = entry;
+ }
+ }
+
+ public Entry[] toArray() {
+ Entry[] result = new Entry[this.factSize];
+ int index = 0;
+ for ( int i = 0; i < this.table.length; i++ ) {
+ RightTupleList bucket = (RightTupleList) this.table[i];
+ while ( bucket != null ) {
+ Entry entry = bucket.first;
+ while ( entry != null ) {
+ result[index++] = entry;
+ entry = entry.getNext();
+ }
+ bucket = (RightTupleList) bucket.next;
+ }
+ }
+ return result;
+ }
+
+ public void add(final RightTuple rightTuple) {
+ final RightTupleList entry = getOrCreate( rightTuple.getFactHandle().getObject() );
+ rightTuple.setMemory( entry );
+ entry.add( rightTuple );
+ this.factSize++;
+ }
+
+ /**
+ * We assume that this rightTuple is contained in this hash table
+ */
+ public void remove(final RightTuple rightTuple) {
+ if ( rightTuple.getMemory() != null ) {
+ RightTupleList memory = rightTuple.getMemory();
+ memory.remove( rightTuple );
+ if ( memory.first == null ) {
+ final int index = indexOf( memory.hashCode(),
+ this.table.length );
+ RightTupleList previous = null;
+ RightTupleList current = (RightTupleList) this.table[index];
+ while ( current != memory ) {
+ previous = current;
+ current = (RightTupleList) current.getNext();
+ }
+
+ if ( previous != null ) {
+ previous.next = current.next;
+ } else {
+ this.table[index] = current.next;
+ }
+ this.size--;
+ }
+ return;
+ }
+
+ final Object object = rightTuple.getFactHandle().getObject();
+ final int hashCode = this.index.hashCodeOf( object );
+ final int index = indexOf( hashCode,
+ this.table.length );
+
+ // search the table for the Entry, we need to track previous, so if the Entry
+ // is empty we can remove it.
+ RightTupleList previous = null;
+ RightTupleList current = (RightTupleList) this.table[index];
+ while ( current != null ) {
+ if ( current.matches( object,
+ hashCode ) ) {
+ current.remove( rightTuple );
+ this.factSize--;
+
+ if ( current.first == null ) {
+ if ( previous != null ) {
+ previous.next = current.next;
+ } else {
+ this.table[index] = current.next;
+ }
+ this.size--;
+ }
+ break;
+ }
+ previous = current;
+ current = (RightTupleList) current.next;
+ }
+ rightTuple.setNext( null );
+ rightTuple.setPrevious( null );
+ }
+
+ public boolean contains(final RightTuple rightTuple) {
+ final Object object = rightTuple.getFactHandle().getObject();
+
+ final int hashCode = this.index.hashCodeOf( object );
+
+ final int index = indexOf( hashCode,
+ this.table.length );
+
+ RightTupleList current = (RightTupleList) this.table[index];
+ while ( current != null ) {
+ if ( current.matches( object,
+ hashCode ) ) {
+ return true;
+ }
+ current = (RightTupleList) current.next;
+ }
+ return false;
+ }
+
+ public RightTupleList get(final LeftTuple tuple) {
+ //this.index.setCachedValue( tuple );
+
+ final int hashCode = this.index.hashCodeOf( tuple );
+
+ final int index = indexOf( hashCode,
+ this.table.length );
+ RightTupleList entry = (RightTupleList) this.table[index];
+
+ while ( entry != null ) {
+ if ( entry.matches( tuple,
+ hashCode ) ) {
+ return entry;
+ }
+ entry = (RightTupleList) entry.getNext();
+ }
+
+ return entry;
+ }
+
+ /**
+ * We use this method to aviod to table lookups for the same hashcode; which is what we would have to do if we did
+ * a get and then a create if the value is null.
+ *
+ * @param value
+ * @return
+ */
+ private RightTupleList getOrCreate(final Object object) {
+ //this.index.setCachedValue( object );
+
+ final int hashCode = this.index.hashCodeOf( object );
+
+ final int index = indexOf( hashCode,
+ this.table.length );
+ RightTupleList entry = (RightTupleList) this.table[index];
+
+ while ( entry != null ) {
+ if ( entry.matches( object,
+ hashCode ) ) {
+ return entry;
+ }
+ entry = (RightTupleList) entry.next;
+ }
+
+ if ( entry == null ) {
+ entry = new RightTupleList( this.index,
+ hashCode );
+ entry.next = this.table[index];
+ this.table[index] = entry;
+
+ if ( this.size++ >= this.threshold ) {
+ resize( 2 * this.table.length );
+ }
+ }
+ return entry;
+ }
+
+ public int size() {
+ return this.factSize;
+ }
+
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ for ( Entry entry : this.table ) {
+ while ( entry != null ) {
+ RightTupleList bucket = (RightTupleList) entry;
+ for ( RightTuple rightTuple = bucket.getFirst( null ); rightTuple != null; rightTuple = (RightTuple) rightTuple.getNext() ) {
+ builder.append( rightTuple );
+ }
+ entry = entry.getNext();
+ }
+ }
+
+ return builder.toString();
+ }
+}
\ No newline at end of file
Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/RightTupleList.java (from rev 19178, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/FactHashTable.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/RightTupleList.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/RightTupleList.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -0,0 +1,190 @@
+/**
+ *
+ */
+package org.drools.util;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.drools.common.InternalFactHandle;
+import org.drools.reteoo.RightTuple;
+import org.drools.reteoo.RightTupleMemory;
+import org.drools.reteoo.LeftTuple;
+import org.drools.util.AbstractHashTable.Index;
+
+public class RightTupleList
+ implements
+ RightTupleMemory, Entry {
+ private static final long serialVersionUID = 400L;
+
+ public Entry previous;
+ public Entry next;
+
+ public RightTuple first;
+ public RightTuple last;
+
+ private final int hashCode;
+ private final Index index;
+
+ public RightTupleList() {
+ // this is not an index bucket
+ this.hashCode = 0;
+ this.index = null;
+ }
+
+ public RightTupleList(final Index index,
+ final int hashCode) {
+ this.index = index;
+ this.hashCode = hashCode;
+ }
+
+ public RightTuple getFirst(LeftTuple leftTuple) {
+ return this.first;
+ }
+
+ public RightTuple getLast(LeftTuple leftTuple) {
+ return this.last;
+ }
+
+ public void add(final RightTuple rightTuple) {
+ if ( this.first != null ) {
+ this.first.setPrevious( rightTuple );
+ rightTuple.setNext( this.first );
+ this.first = rightTuple;
+ } else {
+ this.first = rightTuple;
+ this.last = rightTuple;;
+ }
+ }
+
+ /**
+ * We assume that this rightTuple is contained in this hash table
+ */
+ public void remove(final RightTuple rightTuple) {
+ RightTuple previous = ( RightTuple ) rightTuple.getPrevious();
+ RightTuple next = ( RightTuple ) rightTuple.getNext();
+
+ if ( previous != null && next != null ) {
+ // remove from middle
+ previous.setNext( next );
+ next.setPrevious( previous );
+ } else if ( next != null ) {
+ // remove from first
+ this.first = next;
+ next.setPrevious( null );
+ } else if ( previous != null ) {
+ // remove from end
+ this.last = previous;
+ previous.setNext( null );
+ } else {
+ // remove everything
+ this.last = null;
+ this.first = null;
+ }
+ }
+
+ public RightTuple get(final InternalFactHandle handle) {
+ RightTuple current = this.first;
+ while ( current != null ) {
+ if ( handle == current.getFactHandle() ) {
+ return current;
+ }
+ current = (RightTuple) current.getNext();
+ }
+ return null;
+ }
+
+ public boolean contains(final InternalFactHandle handle) {
+ return get( handle ) != null;
+ }
+
+
+ public RightTuple get(final RightTuple rightTuple) {
+ InternalFactHandle handle = rightTuple.getFactHandle();
+ RightTuple current = this.first;
+ while ( current != null ) {
+ if ( handle == current.getFactHandle() ) {
+ return current;
+ }
+ current = (RightTuple) current.getNext();
+ }
+ return null;
+ }
+
+ public boolean contains(final RightTuple rightTuple) {
+ return get( rightTuple ) != null;
+ }
+
+ public int size() {
+ int i = 0;
+ RightTuple current = this.first;
+ while ( current != null ) {
+ current = (RightTuple) current.getNext();
+ i++;
+ }
+ return i;
+ }
+
+ public boolean matches(final Object object,
+ final int objectHashCode) {
+ return this.hashCode == objectHashCode && this.index.equal( this.first.getFactHandle().getObject(),
+ object );
+ }
+
+ public boolean matches(final LeftTuple tuple,
+ final int tupleHashCode) {
+ return this.hashCode == tupleHashCode && this.index.equal( this.first.getFactHandle().getObject(),
+ tuple );
+ }
+
+ public int hashCode() {
+ return this.hashCode;
+ }
+
+ public boolean equals(final Object object) {
+ final RightTupleList other = (RightTupleList) object;
+ return this.hashCode == other.hashCode && this.index == other.index;
+ }
+
+ public Entry getPrevious() {
+ return null;
+ // return this.previous;
+ }
+
+ public void setPrevious(Entry previous) {
+ // this.previous = previous;
+ }
+
+ public Entry getNext() {
+ return this.next;
+ }
+
+ public void setNext(final Entry next) {
+ this.next = next;
+ }
+
+ public boolean isIndexed() {
+ return ( this.index != null );
+ }
+
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ for ( RightTuple rightTuple = ( RightTuple ) this.first; rightTuple != null; rightTuple = ( RightTuple ) rightTuple.getNext() ) {
+ builder.append( rightTuple );
+ }
+
+ return builder.toString();
+ }
+
+ public void readExternal(ObjectInput in) throws IOException,
+ ClassNotFoundException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ // TODO Auto-generated method stub
+
+ }
+}
\ No newline at end of file
Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleHashTable.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleHashTable.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -1,96 +0,0 @@
-/**
- *
- */
-package org.drools.util;
-
-import org.drools.common.InternalFactHandle;
-import org.drools.reteoo.LeftTuple;
-import org.drools.reteoo.LeftTupleMemory;
-
-public class TupleHashTable extends AbstractHashTable
- implements
- LeftTupleMemory {
- public TupleHashTable() {
- this( 16,
- 0.75f );
- }
-
- public TupleHashTable(final int capacity,
- final float loadFactor) {
- super( capacity,
- loadFactor );
- }
-
- public Iterator iterator(final InternalFactHandle handle) {
- return iterator();
- }
-
- public void add(final LeftTuple tuple) {
- final int hashCode = tuple.hashCode();
- final int index = indexOf( hashCode,
- this.table.length );
-
- tuple.setNext( this.table[index] );
- this.table[index] = tuple;
-
- if ( this.size++ >= this.threshold ) {
- resize( 2 * this.table.length );
- }
- }
-
- public LeftTuple get(final LeftTuple tuple) {
- final int hashCode = tuple.hashCode();
- final int index = indexOf( hashCode,
- this.table.length );
-
- LeftTuple current = (LeftTuple) this.table[index];
- while ( current != null ) {
- if ( hashCode == current.hashCode() && tuple.equals( current ) ) {
- return current;
- }
- current = (LeftTuple) current.getNext();
- }
- return null;
- }
-
- public LeftTuple remove(final LeftTuple tuple) {
- final int hashCode = tuple.hashCode();
- final int index = indexOf( hashCode,
- this.table.length );
-
- LeftTuple previous = (LeftTuple) this.table[index];
- LeftTuple current = previous;
- while ( current != null ) {
- final LeftTuple next = (LeftTuple) current.getNext();
- if ( hashCode == current.hashCode() && tuple.equals( current ) ) {
- if ( previous == current ) {
- this.table[index] = next;
- } else {
- previous.setNext( next );
- }
- current.setNext( null );
- this.size--;
- return current;
- }
- previous = current;
- current = next;
- }
- return current;
- }
-
- public Entry getBucket(final Object object) {
- final int hashCode = object.hashCode();
- final int index = indexOf( hashCode,
- this.table.length );
-
- return this.table[index];
- }
-
- public boolean contains(final LeftTuple tuple) {
- return (get( tuple ) != null);
- }
-
- public boolean isIndexed() {
- return false;
- }
-}
\ No newline at end of file
Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleIndexHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleIndexHashTable.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/TupleIndexHashTable.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -1,469 +0,0 @@
-/**
- *
- */
-package org.drools.util;
-
-import org.drools.common.InternalFactHandle;
-import org.drools.reteoo.LeftTuple;
-import org.drools.reteoo.LeftTupleMemory;
-
-import java.io.ObjectOutput;
-import java.io.ObjectInput;
-import java.io.IOException;
-import java.io.Externalizable;
-
-public class TupleIndexHashTable extends AbstractHashTable
- implements
- LeftTupleMemory {
-
- private static final long serialVersionUID = 400L;
-
- public static final int PRIME = 31;
-
- private int startResult;
-
- private FieldIndexHashTableIterator tupleValueIterator;
- private FieldIndexHashTableFullIterator tupleValueFullIterator;
-
- private int factSize;
-
- private Index index;
-
- public TupleIndexHashTable() {
- }
-
- public TupleIndexHashTable(final FieldIndex[] index) {
- this( 16,
- 0.75f,
- index );
- }
-
- public TupleIndexHashTable(final int capacity,
- final float loadFactor,
- final FieldIndex[] index) {
- super( capacity,
- loadFactor );
-
- this.startResult = TupleIndexHashTable.PRIME;
- for ( int i = 0, length = index.length; i < length; i++ ) {
- this.startResult += TupleIndexHashTable.PRIME * this.startResult + index[i].getExtractor().getIndex();
- }
-
- switch ( index.length ) {
- case 0 :
- throw new IllegalArgumentException( "FieldIndexHashTable cannot use an index[] of length 0" );
- case 1 :
- this.index = new SingleIndex( index,
- this.startResult );
- break;
- case 2 :
- this.index = new DoubleCompositeIndex( index,
- this.startResult );
- break;
- case 3 :
- this.index = new TripleCompositeIndex( index,
- this.startResult );
- break;
- default :
- throw new IllegalArgumentException( "FieldIndexHashTable cannot use an index[] of length great than 3" );
- }
- }
-
- public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- super.readExternal(in);
- startResult = in.readInt();
- tupleValueIterator = (FieldIndexHashTableIterator)in.readObject();
- tupleValueFullIterator = (FieldIndexHashTableFullIterator)in.readObject();
- factSize = in.readInt();
- index = (Index)in.readObject();
- }
-
- public void writeExternal(ObjectOutput out) throws IOException {
- super.writeExternal(out);
- out.writeInt(startResult);
- out.writeObject(tupleValueIterator);
- out.writeObject(tupleValueFullIterator);
- out.writeInt(factSize);
- out.writeObject(index);
- }
-
- public Iterator iterator() {
- if ( this.tupleValueFullIterator == null ) {
- this.tupleValueFullIterator = new FieldIndexHashTableFullIterator( this );
- }
- this.tupleValueFullIterator.reset();
- return this.tupleValueFullIterator;
- }
-
- public Iterator iterator(final InternalFactHandle handle) {
- if ( this.tupleValueIterator == null ) {
- this.tupleValueIterator = new FieldIndexHashTableIterator();
- }
- final FieldIndexEntry entry = get( handle );
- this.tupleValueIterator.reset( (entry != null) ? entry.first : null );
- return this.tupleValueIterator;
- }
-
- public boolean isIndexed() {
- return true;
- }
-
- public Index getIndex() {
- return this.index;
- }
-
- public Entry getBucket(final Object object) {
- final int hashCode = this.index.hashCodeOf( object );
- final int index = indexOf( hashCode,
- this.table.length );
-
- return this.table[index];
- }
-
- /**
- * Fast re-usable iterator
- *
- */
- public static class FieldIndexHashTableIterator
- implements
- Iterator, Externalizable {
- private Entry entry;
-
- public FieldIndexHashTableIterator() {
-
- }
-
- public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- entry = (Entry)in.readObject();
- }
-
- public void writeExternal(ObjectOutput out) throws IOException {
- out.writeObject(entry);
- }
-
- /* (non-Javadoc)
- * @see org.drools.util.Iterator#next()
- */
- public Object next() {
- final Entry current = this.entry;
- this.entry = (this.entry != null) ? this.entry.getNext() : null;
- return current;
- }
-
- /* (non-Javadoc)
- * @see org.drools.util.Iterator#reset()
- */
- public void reset(final Entry entry) {
- this.entry = entry;
- }
- }
-
- public static class FieldIndexHashTableFullIterator
- implements
- Iterator, Externalizable {
- private AbstractHashTable hashTable;
- private Entry[] table;
- private int row;
- private int length;
- private Entry entry;
-
- public FieldIndexHashTableFullIterator() {
-
- }
- public FieldIndexHashTableFullIterator(final AbstractHashTable hashTable) {
- this.hashTable = hashTable;
- }
-
- public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- hashTable = (AbstractHashTable)in.readObject();
- table = (Entry[])in.readObject();
- row = in.readInt();
- length = in.readInt();
- entry = (Entry)in.readObject();
- }
-
- public void writeExternal(ObjectOutput out) throws IOException {
- out.writeObject(hashTable);
- out.writeObject(table);
- out.writeInt(row);
- out.writeInt(length);
- out.writeObject(entry);
- }
-
- /* (non-Javadoc)
- * @see org.drools.util.Iterator#next()
- */
- public Object next() {
- if ( this.entry == null ) {
- // keep skipping rows until we come to the end, or find one that is populated
- while ( this.entry == null ) {
- this.row++;
- if ( this.row == this.length ) {
- return null;
- }
- this.entry = (this.table[this.row] != null) ? ((FieldIndexEntry) this.table[this.row]).first : null;
- }
- } else {
- this.entry = this.entry.getNext();
- if ( this.entry == null ) {
- this.entry = (Entry) next();
- }
- }
-
- return this.entry;
- }
-
- /* (non-Javadoc)
- * @see org.drools.util.Iterator#reset()
- */
- public void reset() {
- this.table = this.hashTable.getTable();
- this.length = this.table.length;
- this.row = -1;
- this.entry = null;
- }
- }
-
- public Entry[] toArray() {
- Entry[] result = new Entry[this.factSize];
- int index = 0;
- for ( int i = 0; i < this.table.length; i++ ) {
- FieldIndexEntry fieldIndexEntry = (FieldIndexEntry)this.table[i];
- while ( fieldIndexEntry != null ) {
- Entry entry = fieldIndexEntry.getFirst();
- while ( entry != null ) {
- result[index++] = entry;
- entry = entry.getNext();
- }
- fieldIndexEntry = ( FieldIndexEntry ) fieldIndexEntry.getNext();
- }
- }
- return result;
- }
-
- public void add(final LeftTuple tuple) {
- final FieldIndexEntry entry = getOrCreate( tuple );
- entry.add( tuple );
- this.factSize++;
- }
-
- public boolean add(final LeftTuple tuple,
- final boolean checkExists) {
- throw new UnsupportedOperationException( "FieldIndexHashTable does not support add(ReteTuple tuple, boolean checkExists)" );
- }
-
- public LeftTuple remove(final LeftTuple tuple) {
- final int hashCode = this.index.hashCodeOf( tuple );
-
- final int index = indexOf( hashCode,
- this.table.length );
-
- // search the table for the Entry, we need to track previous and next, so if the
- // Entry is empty after its had the FactEntry removed, we must remove it from the table
- FieldIndexEntry previous = (FieldIndexEntry) this.table[index];
- FieldIndexEntry current = previous;
- while ( current != null ) {
- final FieldIndexEntry next = (FieldIndexEntry) current.next;
- if ( current.matches( tuple,
- hashCode ) ) {
- final LeftTuple old = current.remove( tuple );
- this.factSize--;
- // If the FactEntryIndex is empty, then remove it from the hash table
- if ( current.first == null ) {
- if ( previous == current ) {
- this.table[index] = next;
- } else {
- previous.next = next;
- }
- current.next = null;
- this.size--;
- }
- return old;
- }
- previous = current;
- current = next;
- }
- return null;
- }
-
- public boolean contains(final LeftTuple tuple) {
- final int hashCode = this.index.hashCodeOf( tuple );
-
- final int index = indexOf( hashCode,
- this.table.length );
-
- FieldIndexEntry current = (FieldIndexEntry) this.table[index];
- while ( current != null ) {
- if ( current.matches( tuple,
- hashCode ) ) {
- return true;
- }
- current = (FieldIndexEntry) current.next;
- }
- return false;
- }
-
- public FieldIndexEntry get(final InternalFactHandle handle) {
- final Object object = handle.getObject();
- final int hashCode = this.index.hashCodeOf( handle.getObject() );
-
- final int index = indexOf( hashCode,
- this.table.length );
- FieldIndexEntry entry = (FieldIndexEntry) this.table[index];
-
- while ( entry != null ) {
- if ( entry.matches( object,
- hashCode ) ) {
- return entry;
- }
- entry = (FieldIndexEntry) entry.getNext();
- }
-
- return entry;
- }
-
- /**
- * We use this method to aviod to table lookups for the same hashcode; which is what we would have to do if we did
- * a get and then a create if the value is null.
- *
- * @param value
- * @return
- */
- private FieldIndexEntry getOrCreate(final LeftTuple tuple) {
- final int hashCode = this.index.hashCodeOf( tuple );
-
- final int index = indexOf( hashCode,
- this.table.length );
- FieldIndexEntry entry = (FieldIndexEntry) this.table[index];
-
- // search to find an existing entry
- while ( entry != null ) {
- if ( entry.matches( tuple,
- hashCode ) ) {
- return entry;
- }
- entry = (FieldIndexEntry) entry.next;
- }
-
- // entry does not exist, so create
- if ( entry == null ) {
- entry = new FieldIndexEntry( this.index,
- hashCode );
- entry.next = this.table[index];
- this.table[index] = entry;
-
- if ( this.size++ >= this.threshold ) {
- resize( 2 * this.table.length );
- }
- }
- return entry;
- }
-
- public int size() {
- return this.factSize;
- }
-
- public static class FieldIndexEntry
- implements
- Entry {
-
- private static final long serialVersionUID = 400L;
- private Entry next;
- private LeftTuple first;
- private int hashCode;
- private Index index;
-
- public FieldIndexEntry() {
-
- }
- public FieldIndexEntry(final Index index,
- final int hashCode) {
- this.index = index;
- this.hashCode = hashCode;
- }
-
- public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- next = (Entry)in.readObject();
- first = (LeftTuple)in.readObject();
- hashCode = in.readInt();
- index = (Index)in.readObject();
- }
-
- public void writeExternal(ObjectOutput out) throws IOException {
- out.writeObject(next);
- out.writeObject(first);
- out.writeInt(hashCode);
- out.writeObject(index);
- }
-
- public Entry getNext() {
- return this.next;
- }
-
- public void setNext(final Entry next) {
- this.next = next;
- }
-
- public LeftTuple getFirst() {
- return this.first;
- }
-
- public void add(final LeftTuple tuple) {
- tuple.setNext( this.first );
- this.first = tuple;
- }
-
- public LeftTuple get(final LeftTuple tuple) {
- LeftTuple current = this.first;
- while ( current != null ) {
- if ( tuple.equals( current ) ) {
- return current;
- }
- current = (LeftTuple) current.getNext();
- }
- return null;
- }
-
- public LeftTuple remove(final LeftTuple tuple) {
- LeftTuple previous = this.first;
- LeftTuple current = previous;
- while ( current != null ) {
- final LeftTuple next = (LeftTuple) current.getNext();
- if ( tuple.equals( current ) ) {
- if ( this.first == current ) {
- this.first = next;
- } else {
- previous.setNext( next );
- }
- current.setNext( null );
- return current;
- }
- previous = current;
- current = next;
- }
- return current;
- }
-
- public boolean matches(final Object object,
- final int objectHashCode) {
- return this.hashCode == objectHashCode && this.index.equal( object,
- this.first );
- }
-
- public boolean matches(final LeftTuple tuple,
- final int tupleHashCode) {
- return this.hashCode == tupleHashCode && this.index.equal( this.first,
- tuple );
- }
-
- public int hashCode() {
- return this.hashCode;
- }
-
- public boolean equals(final Object object) {
- final FieldIndexEntry other = (FieldIndexEntry) object;
- return this.hashCode == other.hashCode && this.index == other.index;
- }
- }
-
-}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/BaseBetaConstraintsTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/BaseBetaConstraintsTest.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/BaseBetaConstraintsTest.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -22,12 +22,12 @@
import org.drools.spi.BetaNodeFieldConstraint;
import org.drools.spi.Evaluator;
import org.drools.spi.FieldExtractor;
-import org.drools.util.FactHandleIndexHashTable;
-import org.drools.util.FactHashTable;
+import org.drools.util.RightTupleIndexHashTable;
+import org.drools.util.RightTupleList;
import org.drools.util.LinkedList;
import org.drools.util.LinkedListEntry;
-import org.drools.util.TupleHashTable;
-import org.drools.util.TupleIndexHashTable;
+import org.drools.util.LeftTupleList;
+import org.drools.util.LeftTupleIndexHashTable;
import org.drools.util.AbstractHashTable.FieldIndex;
import org.drools.util.AbstractHashTable.Index;
@@ -101,7 +101,7 @@
BetaMemory betaMemory = betaConstraints.createBetaMemory( config );
if ( indexedPositions.length > 0 ) {
- TupleIndexHashTable tupleHashTable = (TupleIndexHashTable) betaMemory.getLeftTupleMemory();
+ LeftTupleIndexHashTable tupleHashTable = (LeftTupleIndexHashTable) betaMemory.getLeftTupleMemory();
assertTrue( tupleHashTable.isIndexed() );
Index index = tupleHashTable.getIndex();
@@ -110,7 +110,7 @@
index.getFieldIndex( i ) );
}
- FactHandleIndexHashTable factHashTable = (FactHandleIndexHashTable) betaMemory.getRightTupleMemory();
+ RightTupleIndexHashTable factHashTable = (RightTupleIndexHashTable) betaMemory.getRightTupleMemory();
assertTrue( factHashTable.isIndexed() );
index = factHashTable.getIndex();
@@ -119,10 +119,10 @@
index.getFieldIndex( i ) );
}
} else {
- TupleHashTable tupleHashTable = (TupleHashTable) betaMemory.getLeftTupleMemory();
+ LeftTupleList tupleHashTable = (LeftTupleList) betaMemory.getLeftTupleMemory();
assertFalse( tupleHashTable.isIndexed() );
- FactHashTable factHashTable = (FactHashTable) betaMemory.getRightTupleMemory();
+ RightTupleList factHashTable = (RightTupleList) betaMemory.getRightTupleMemory();
assertFalse( factHashTable.isIndexed() );
}
}
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -65,7 +65,7 @@
};
//workingMemory.addEventListener(listener );
- final InputStream is = getClass().getResourceAsStream( "/manners128.dat" );
+ final InputStream is = getClass().getResourceAsStream( "/manners8.dat" );
final List list = getInputObjects( is );
for ( final Iterator it = list.iterator(); it.hasNext(); ) {
final Object object = it.next();
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeTest.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeTest.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -39,7 +39,7 @@
import org.drools.spi.FieldExtractor;
import org.drools.spi.FieldValue;
import org.drools.spi.PropagationContext;
-import org.drools.util.FactHashTable;
+import org.drools.util.RightTupleList;
public class AlphaNodeTest extends DroolsTestCase {
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/EvalConditionNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/EvalConditionNodeTest.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/EvalConditionNodeTest.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -24,7 +24,7 @@
import org.drools.reteoo.EvalConditionNode.EvalMemory;
import org.drools.reteoo.builder.BuildContext;
import org.drools.spi.PropagationContext;
-import org.drools.util.TupleHashTable;
+import org.drools.util.LeftTupleList;
public class EvalConditionNodeTest extends DroolsTestCase {
private PropagationContext context;
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 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LeftInputAdapterNodeTest.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -29,7 +29,7 @@
import org.drools.reteoo.builder.BuildContext;
import org.drools.spi.PropagationContext;
import org.drools.spi.Tuple;
-import org.drools.util.FactHashTable;
+import org.drools.util.RightTupleList;
public class LeftInputAdapterNodeTest extends DroolsTestCase {
private ReteooRuleBase ruleBase;
@@ -161,7 +161,7 @@
workingMemory.getObject( tuple0.get( 0 ) ) );
// check node memory
- final FactHashTable table = (FactHashTable) workingMemory.getNodeMemory( liaNode );
+ final RightTupleList table = (RightTupleList) workingMemory.getNodeMemory( liaNode );
assertEquals( 1,
table.size() );
assertTrue( table.contains( f0 ) );
@@ -256,7 +256,7 @@
final Tuple tuple = (Tuple) ((Object[]) sink.getAsserted().get( 0 ))[0];
- final FactHashTable map = (FactHashTable) workingMemory.getNodeMemory( liaNode );
+ final RightTupleList map = (RightTupleList) workingMemory.getNodeMemory( liaNode );
assertTrue( map.contains( f0 ) );
liaNode.retractObject( f0,
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 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeNodeTest.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -39,7 +39,7 @@
import org.drools.rule.EntryPoint;
import org.drools.spi.ObjectType;
import org.drools.spi.PropagationContext;
-import org.drools.util.FactHashTable;
+import org.drools.util.RightTupleList;
import org.drools.util.ObjectHashMap;
public class ObjectTypeNodeTest extends DroolsTestCase {
@@ -129,7 +129,7 @@
workingMemory.getObject( (DefaultFactHandle) ((Object[]) asserted.get( 0 ))[0] ) );
// check asserted object was added to memory
- final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( objectTypeNode );
+ final RightTupleList memory = (RightTupleList) workingMemory.getNodeMemory( objectTypeNode );
assertEquals( 1,
memory.size() );
assertTrue( memory.contains( handle1 ) );
@@ -182,7 +182,7 @@
workingMemory.getObject( (DefaultFactHandle) ((Object[]) asserted.get( 0 ))[0] ) );
// it's sequential, so check the asserted object was not added to the node memory
- final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( objectTypeNode );
+ final RightTupleList memory = (RightTupleList) workingMemory.getNodeMemory( objectTypeNode );
assertEquals( 0,
memory.size() );
}
@@ -198,7 +198,7 @@
new ClassObjectType( String.class ),
buildContext );
- final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( objectTypeNode );
+ final RightTupleList memory = (RightTupleList) workingMemory.getNodeMemory( objectTypeNode );
assertNotNull( memory );
}
@@ -258,7 +258,7 @@
context,
workingMemory );
/* check asserted object was added to memory */
- final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( objectTypeNode );
+ final RightTupleList memory = (RightTupleList) workingMemory.getNodeMemory( objectTypeNode );
assertEquals( 1,
memory.size() );
@@ -386,7 +386,7 @@
((InternalFactHandle) ((Object[]) asserted.get( 0 ))[0]).getObject() );
// check asserted object was added to memory
- final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( objectTypeNode );
+ final RightTupleList memory = (RightTupleList) workingMemory.getNodeMemory( objectTypeNode );
assertEquals( 1,
memory.size() );
assertTrue( memory.contains( handle1 ) );
@@ -437,7 +437,7 @@
person );
// check asserted object was added to memory
- final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( objectTypeNode );
+ final RightTupleList memory = (RightTupleList) workingMemory.getNodeMemory( objectTypeNode );
assertEquals( 1,
memory.size() );
assertTrue( memory.contains( handle1 ) );
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FactHashTableTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FactHashTableTest.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FactHashTableTest.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -6,7 +6,7 @@
public class FactHashTableTest extends TestCase {
public void testEmptyIterator() {
- final FactHashTable map = new FactHashTable();
+ final RightTupleList map = new RightTupleList();
final Iterator it = map.iterator();
for ( ObjectEntry entry = (ObjectEntry) it.next(); entry != null; entry = (ObjectEntry) it.next() ) {
fail( "Map is empty, there should be no iteration" );
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexEntryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexEntryTest.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexEntryTest.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -13,7 +13,7 @@
import org.drools.util.AbstractHashTable.FactEntryImpl;
import org.drools.util.AbstractHashTable.FieldIndex;
import org.drools.util.AbstractHashTable.SingleIndex;
-import org.drools.util.FactHandleIndexHashTable.FieldIndexEntry;
+import org.drools.util.RightTupleIndexHashTable.FieldIndexEntry;
public class FieldIndexEntryTest extends TestCase {
ClassFieldExtractorCache cache = ClassFieldExtractorCache.getInstance();
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexHashTableTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexHashTableTest.java 2008-03-21 21:00:01 UTC (rev 19194)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexHashTableTest.java 2008-03-21 21:07:44 UTC (rev 19195)
@@ -20,7 +20,7 @@
import org.drools.spi.FieldExtractor;
import org.drools.util.AbstractHashTable.FactEntryImpl;
import org.drools.util.AbstractHashTable.FieldIndex;
-import org.drools.util.FactHandleIndexHashTable.FieldIndexEntry;
+import org.drools.util.RightTupleIndexHashTable.FieldIndexEntry;
import org.drools.util.ObjectHashMap.ObjectEntry;
public class FieldIndexHashTableTest extends TestCase {
@@ -43,7 +43,7 @@
declaration,
equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ) );
- final FactHandleIndexHashTable map = new FactHandleIndexHashTable( new FieldIndex[]{fieldIndex} );
+ final RightTupleIndexHashTable map = new RightTupleIndexHashTable( new FieldIndex[]{fieldIndex} );
final Cheese cheddar = new Cheese( "cheddar",
10 );
@@ -92,7 +92,7 @@
declaration,
equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ) );
- final FactHandleIndexHashTable map = new FactHandleIndexHashTable( new FieldIndex[]{fieldIndex} );
+ final RightTupleIndexHashTable map = new RightTupleIndexHashTable( new FieldIndex[]{fieldIndex} );
assertEquals( 0,
map.size() );
@@ -149,7 +149,7 @@
declaration,
equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ) );
- final FactHandleIndexHashTable map = new FactHandleIndexHashTable( new FieldIndex[]{fieldIndex} );
+ final RightTupleIndexHashTable map = new RightTupleIndexHashTable( new FieldIndex[]{fieldIndex} );
assertEquals( 0,
map.size() );
@@ -206,7 +206,7 @@
declaration,
equals.getEvaluator( ValueType.OBJECT_TYPE, Operator.EQUAL ) );
- final FactHandleIndexHashTable map = new FactHandleIndexHashTable( new FieldIndex[]{fieldIndex} );
+ final RightTupleIndexHashTable map = new RightTupleIndexHashTable( new FieldIndex[]{fieldIndex} );
final TestClass c1 = new TestClass( 0,
new TestClass( 20,
@@ -253,7 +253,7 @@
declaration,
equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ) );
- final FactHandleIndexHashTable map = new FactHandleIndexHashTable( new FieldIndex[]{fieldIndex} );
+ final RightTupleIndexHashTable map = new RightTupleIndexHashTable( new FieldIndex[]{fieldIndex} );
assertEquals( 0,
map.size() );
@@ -320,7 +320,7 @@
declaration,
equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ) );
- final FactHandleIndexHashTable map = new FactHandleIndexHashTable( new FieldIndex[]{fieldIndex} );
+ final RightTupleIndexHashTable map = new RightTupleIndexHashTable( new FieldIndex[]{fieldIndex} );
assertEquals( 0,
map.size() );
@@ -537,7 +537,7 @@
declaration,
equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ) );
- final FactHandleIndexHashTable map = new FactHandleIndexHashTable( new FieldIndex[]{fieldIndex} );
+ final RightTupleIndexHashTable map = new RightTupleIndexHashTable( new FieldIndex[]{fieldIndex} );
final Cheese stilton = new Cheese( "stilton",
55 );
More information about the jboss-svn-commits
mailing list