/* * Copyright (C) 2014 Indeed Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing permissions and * limitations under the License. */ package com.indeed.imhotep; import com.indeed.imhotep.api.FTGSIterator; import javax.annotation.Nullable; import java.io.Closeable; import java.util.Collection; /** * @author jsgroth */ public final class FTGSMerger extends AbstractFTGSMerger { private String termStringVal; public FTGSMerger(Collection<? extends FTGSIterator> iterators, int numStats, @Nullable Closeable doneCallback) { super(iterators, numStats, doneCallback); } @Override public boolean nextTerm() { for (int i = 0; i < numTermIterators; ++i) { final FTGSIterator itr = iterators[termIterators[i]]; if (!itr.nextTerm()) { final int fi = termIteratorIndexes[i]; swap(fieldIterators, fi, --numFieldIterators); for (int j = 0; j < numTermIterators; ++j) { if (termIteratorIndexes[j] == numFieldIterators) { termIteratorIndexes[j] = fi; } } } } numTermIterators = 0; if (numFieldIterators == 0) return false; int newNumTermIterators = 0; if (fieldIsIntType) { long min = Long.MAX_VALUE; for (int i = 0; i < numFieldIterators; ++i) { final FTGSIterator itr = iterators[fieldIterators[i]]; final long term = itr.termIntVal(); if (term < min) { newNumTermIterators = 1; termIteratorIndexes[0] = i; min = term; } else if (term == min) { termIteratorIndexes[newNumTermIterators++] = i; } } termIntVal = min; } else { String min = null; for (int i = 0; i < numFieldIterators; ++i) { final FTGSIterator itr = iterators[fieldIterators[i]]; final String term = itr.termStringVal(); final int c; if (min == null || (c = term.compareTo(min)) < 0) { newNumTermIterators = 1; termIteratorIndexes[0] = i; min = term; } else if (c == 0) { termIteratorIndexes[newNumTermIterators++] = i; } } termStringVal = min; } for (int i = 0; i < newNumTermIterators; ++i) { final int fi = termIteratorIndexes[i]; final int index = fieldIterators[fi]; termIterators[numTermIterators] = index; termIteratorIndexes[numTermIterators++] = fi; } termIteratorsRemaining = numTermIterators; for (int i = 0; i < termIteratorsRemaining; ++i) { final FTGSIterator itr = iterators[termIterators[i]]; if (!itr.nextGroup()) { swap(termIterators, i, --termIteratorsRemaining); swap(termIteratorIndexes, i, termIteratorsRemaining); --i; } } accumulatedVec.reset(); return true; } @Override public String termStringVal() { return termStringVal; } }