/*
* 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.flamdex.lucene;
import com.indeed.flamdex.api.DocIdStream;
import com.indeed.flamdex.api.TermIterator;
import org.apache.lucene.index.TermDocs;
import java.io.IOException;
public class LuceneDocIdStream implements DocIdStream {
private final TermDocs termDocs;
private boolean valid = false;
public LuceneDocIdStream(final TermDocs termDocs) {
this.termDocs = termDocs;
}
@Override
public void reset(final TermIterator term) {
if (!(term instanceof LuceneTermIterator)) throw new IllegalArgumentException("This DocIdStream can only function with LuceneTermIterator");
internalReset((LuceneTermIterator)term);
}
private void internalReset(final LuceneTermIterator term) {
try {
termDocs.seek(term.termEnum());
} catch (final IOException e) {
throw e(e);
}
valid = true;
}
@Override
public int fillDocIdBuffer(final int[] docIdBuffer) {
if (!valid) throw new IllegalArgumentException("DocIdStream is not in a valid state");
try {
return internalFillDocIdBuffer(docIdBuffer);
} catch (IOException e) {
throw e(e);
}
}
private int internalFillDocIdBuffer(final int[] docIdBuffer) throws IOException {
int i = 0;
for (; i < docIdBuffer.length; i++) {
if (!termDocs.next()) break; // todo: think about setting valid = false
docIdBuffer[i] = termDocs.doc();
}
return i;
}
@Override
public void close() {
try {
termDocs.close();
} catch (IOException e) {
throw e(e);
}
}
private RuntimeException e(final IOException e) {
valid = false;
throw LuceneUtils.ioRuntimeException(e);
}
}