/*
* 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.local;
import com.indeed.flamdex.api.FlamdexReader;
import com.indeed.flamdex.api.IntTermDocIterator;
import com.indeed.flamdex.api.StringTermDocIterator;
import com.indeed.util.core.Pair;
import com.indeed.util.core.io.Closeables2;
import com.indeed.util.core.reference.SharedReference;
class FlamdexFTGSIterator extends AbstractFlamdexFTGSIterator {
protected StringTermDocIterator stringTermDocIterator;
protected IntTermDocIterator intTermDocIterator;
private final String[] intFields;
private final String[] stringFields;
private int intFieldPtr = 0;
private int stringFieldPtr = 0;
public FlamdexFTGSIterator(ImhotepLocalSession imhotepLocalSession, SharedReference<FlamdexReader> flamdexReader, String[] intFields, String[] stringFields) {
super(imhotepLocalSession, flamdexReader);
this.intFields = intFields;
this.stringFields = stringFields;
}
@Override
public final boolean nextField() {
// todo: reset/cleanup term iterators etc that are in progress
synchronized (session) {
if (intFieldPtr < intFields.length) {
currentField = intFields[intFieldPtr++];
currentFieldIsIntType = true;
if (intTermDocIterator != null) Closeables2.closeQuietly(intTermDocIterator, ImhotepLocalSession.log);
intTermDocIterator = flamdexReader.get().getIntTermDocIterator(currentField);
if (session.fieldZeroDocBitsets != null) {
fieldZeroDocBitset = session.fieldZeroDocBitsets.get(Pair.of(currentField, currentFieldIsIntType));
}
termIndex = 0;
return true;
}
if (stringFieldPtr < stringFields.length) {
currentField = stringFields[stringFieldPtr++];
currentFieldIsIntType = false;
if (stringTermDocIterator != null) Closeables2.closeQuietly(stringTermDocIterator, ImhotepLocalSession.log);
stringTermDocIterator = flamdexReader.get().getStringTermDocIterator(currentField);
if (session.fieldZeroDocBitsets != null) {
fieldZeroDocBitset = session.fieldZeroDocBitsets.get(Pair.of(currentField, currentFieldIsIntType));
}
termIndex = 0;
return true;
}
currentField = null;
close();
if (ImhotepLocalSession.logTiming) {
ImhotepLocalSession.log.info("intTermsTime: "+intTermsTime/1000000d+" ms, stringTermsTime: "+stringTermsTime/1000000d+" ms, docsTime: "+docsTime/1000000d+" ms, lookupsTime: "+lookupsTime/1000000d+" ms, timingErrorTime: "+timingErrorTime/1000000d+" ms");
}
return false;
}
}
@Override
public final void close() {
synchronized (session) {
if (intTermDocIterator != null) {
Closeables2.closeQuietly(intTermDocIterator, ImhotepLocalSession.log);
intTermDocIterator = null;
}
if (stringTermDocIterator != null) {
Closeables2.closeQuietly(stringTermDocIterator, ImhotepLocalSession.log);
stringTermDocIterator = null;
}
if (flamdexReader != null) {
Closeables2.closeQuietly(flamdexReader, ImhotepLocalSession.log);
flamdexReader = null;
}
}
}
@Override
public final boolean nextTerm() {
if (currentField == null) return false;
resetGroupStats = true;
if (currentFieldIsIntType) {
if (ImhotepLocalSession.logTiming) intTermsTime -= System.nanoTime();
final boolean ret = intTermDocIterator.nextTerm();
if (ImhotepLocalSession.logTiming) intTermsTime += System.nanoTime();
return ret;
} else {
if (ImhotepLocalSession.logTiming) stringTermsTime -= System.nanoTime();
final boolean ret = stringTermDocIterator.nextTerm();
if (ImhotepLocalSession.logTiming) stringTermsTime += System.nanoTime();
return ret;
}
}
@Override
public final long termDocFreq() {
return currentFieldIsIntType ? intTermDocIterator.docFreq() : stringTermDocIterator.docFreq();
}
@Override
public final long termIntVal() {
return intTermDocIterator.term();
}
@Override
public final String termStringVal() {
return stringTermDocIterator.term();
}
protected int fillDocIdBuffer() {
return (currentFieldIsIntType?intTermDocIterator:stringTermDocIterator).fillDocIdBuffer(session.docIdBuf);
}
}