goldmansachs/reladomo

Fix ArrayIndexOutOfBoundsException in MultiExtractorHashStrategy.

Closed this issue · 1 comments

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]

Yub, looks obvious. PR with a test case?