Hey,
just checked with 5.5.0.Final and same thing just that the index decision
for the JoinNode is postponed to ConstraintType.isIndexableForNode(), where
the nodeType equals UNKNOWN and thus no indexing is allowed.
Thanks,
Philipp
2013/3/8 Philipp Herzig <pherzig(a)gmail.com>
Dear developers,
I have a question regarding the current implementation within reteoo.
In both cases, the JoinNode and CompositeObjectAdapter is doing a linear
search for Joins and "Splits" respectively.
For the BetaNodes the decision using lists or maps is done in
SingleBetaContraints() (line 82)
this.indexed = depth >= 1 && DefaultBetaConstraints.isIndexable(
constraint );
However, the MVELContraint (constraint) always returns false for an
equijoin predicate (always the MVELContraint constructor without index flag
is called). Consequently, createBetaMemory() creates lists rather than
maps. These are finally joined in assertLeftTuple and assertObject of the
JoinNode with complexity 2n-1.
(Note: Of course, IndexLeftBetaMemoryOption.YES
and IndexRightBetaMemoryOption.YES are set but ignored according to the
SingleBetaContraints' constructor).
Relatively similar the CompositeObjectAdapter:
While propagating objects (CompositeObjectAdapter.propagateAssertObject)
the method asks if a fieldIndex is hashed which always returns false.
However, I cannot find any possibility to set this flag to true.
Interestingly the fields are added to a collection called
hashedFieldIndexes in FieldIndex.registerFieldIndex. Moreover the code for
dispatching to the right sink via hashcode is there, but is not reachable
anyway.
Are there any design related reasons for not supporting this or am I
missing something? If not, I would love to open a FR for that. If someone
helps me in setting up the mvn stuff I could do that myself.
(Version 5.4.0.Final)
Thanks,
Philipp