Fix ArrayIndexOutOfBoundsException in MultiExtractorHashStrategy.
Closed this issue · 1 comments
motlin commented
I get an exception from resolving a list using a tupleWith in-clause. My operation is something like:
MyTypeFinder.tags().tag().category()
.tupleWith(MyTypeFinder.tags().tag().name())
.in(tupleSet)
I believe the bug is the this
keyword in the following code in MultiExtractorHashStrategy
, but I'm not sure. I can see that this.extractors
has 5 elements, but the parameter extractors
has the two expected extractors Tag.category and Tag.name.
@Override
public int computeHashCode(Object o, Extractor[] extractors)
{
int h = (extractors[0]).valueHashCode(o);
h = HashUtil.combineHashes(h,(extractors[1]).valueHashCode(o));
for(int i=2;i<this.extractors.length;i++)
{
h = HashUtil.combineHashes(h,(extractors[i]).valueHashCode(o));
}
return h;
}
The relevant portion of the stack trace:
java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 2
at com.gs.fw.common.mithra.cache.MultiExtractorHashStrategy.computeHashCode(MultiExtractorHashStrategy.java:162) ~[reladomo-17.1.1.jar:na]
at com.gs.fw.common.mithra.cache.ConcurrentFullUniqueIndex.get(ConcurrentFullUniqueIndex.java:235) ~[reladomo-17.1.1.jar:na]
at com.gs.fw.common.mithra.util.MithraArrayTupleTupleSet.contains(MithraArrayTupleTupleSet.java:240) ~[reladomo-17.1.1.jar:na]
at com.gs.fw.common.mithra.finder.MultiInOperation.applyOperation(MultiInOperation.java:504) ~[reladomo-17.1.1.jar:na]
at com.gs.fw.common.mithra.finder.AndOperation.applyOperationToPartialCache(AndOperation.java:521) ~[reladomo-17.1.1.jar:na]
at com.gs.fw.common.mithra.portal.MithraAbstractObjectPortal.resolveOperationOnCache(MithraAbstractObjectPortal.java:759) ~[reladomo-17.1.1.jar:na]
at com.gs.fw.common.mithra.portal.MithraTransactionalPortal.zFindInMemoryWithoutAnalysis(MithraTransactionalPortal.java:241) ~[reladomo-17.1.1.jar:na]
at com.gs.fw.common.mithra.finder.MappedOperation.applyOperationToPartialCache(MappedOperation.java:139) ~[reladomo-17.1.1.jar:na]
at com.gs.fw.common.mithra.portal.MithraAbstractObjectPortal.resolveOperationOnCache(MithraAbstractObjectPortal.java:759) ~[reladomo-17.1.1.jar:na]
at com.gs.fw.common.mithra.portal.MithraTransactionalPortal.zFindInMemoryWithoutAnalysis(MithraTransactionalPortal.java:241) ~[reladomo-17.1.1.jar:na]
at com.gs.fw.common.mithra.finder.AndOperation.applyOperationToPartialCache(AndOperation.java:510) ~[reladomo-17.1.1.jar:na]
at com.gs.fw.common.mithra.portal.MithraAbstractObjectPortal.resolveOperationOnCache(MithraAbstractObjectPortal.java:759) ~[reladomo-17.1.1.jar:na]
at com.gs.fw.common.mithra.portal.MithraTransactionalPortal.zFindInMemoryWithoutAnalysis(MithraTransactionalPortal.java:241) ~[reladomo-17.1.1.jar:na]
at com.gs.fw.common.mithra.finder.MappedOperation.applyOperationToPartialCache(MappedOperation.java:139) ~[reladomo-17.1.1.jar:na]
at com.gs.fw.common.mithra.portal.MithraAbstractObjectPortal.resolveOperationOnCache(MithraAbstractObjectPortal.java:759) ~[reladomo-17.1.1.jar:na]
at com.gs.fw.common.mithra.portal.MithraTransactionalPortal.zFindInMemoryWithoutAnalysis(MithraTransactionalPortal.java:241) ~[reladomo-17.1.1.jar:na]
at com.gs.fw.common.mithra.finder.AndOperation.applyOperationToPartialCache(AndOperation.java:510) ~[reladomo-17.1.1.jar:na]
at com.gs.fw.common.mithra.portal.MithraAbstractObjectPortal.resolveOperationOnCache(MithraAbstractObjectPortal.java:759) ~[reladomo-17.1.1.jar:na]
at com.gs.fw.common.mithra.portal.MithraAbstractObjectPortal.findInCacheForNoTransaction(MithraAbstractObjectPortal.java:750) ~[reladomo-17.1.1.jar:na]
at com.gs.fw.common.mithra.portal.MithraTransactionalPortal.findInCache(MithraTransactionalPortal.java:330) ~[reladomo-17.1.1.jar:na]
at com.gs.fw.common.mithra.portal.MithraAbstractObjectPortal.cloneOrAnalyzeAndFindInMemory(MithraAbstractObjectPortal.java:709) ~[reladomo-17.1.1.jar:na]
at com.gs.fw.common.mithra.portal.MithraAbstractObjectPortal.findAggregateCachedQuery(MithraAbstractObjectPortal.java:931) ~[reladomo-17.1.1.jar:na]
at com.gs.fw.common.mithra.portal.MithraAbstractObjectPortal.findAggregatedData(MithraAbstractObjectPortal.java:948) ~[reladomo-17.1.1.jar:na]
at com.gs.fw.common.mithra.AggregateList.resolveOperation(AggregateList.java:280) ~[reladomo-17.1.1.jar:na]
at com.gs.fw.common.mithra.AggregateList.iterator(AggregateList.java:168) ~[reladomo-17.1.1.jar:na]
mohrezaei commented
Yub, looks obvious. PR with a test case?