package org.xbib.elasticsearch.skywalker.collectors;
import org.apache.lucene.index.AtomicReaderContext;
import org.apache.lucene.search.Scorer;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.TopScoreDocCollector;
import java.io.IOException;
/**
* Count limited hit collector
*/
public class CountLimitedHitCollector extends LimitedHitCollector {
private int maxSize;
private int count;
private int lastDoc;
private TopScoreDocCollector tdc;
private TopDocs topDocs = null;
public CountLimitedHitCollector(int maxSize, boolean outOfOrder, boolean shouldScore) {
this.maxSize = maxSize;
this.outOfOrder = outOfOrder;
this.shouldScore = shouldScore;
count = 0;
tdc = TopScoreDocCollector.create(maxSize, outOfOrder);
}
@Override
public long limitSize() {
return maxSize;
}
@Override
public int limitType() {
return TYPE_SIZE;
}
@Override
public void collect(int doc) throws IOException {
count++;
if (count > maxSize) {
count--;
throw new LimitedException(TYPE_SIZE, maxSize, count, lastDoc);
}
lastDoc = docBase + doc;
tdc.collect(doc);
}
@Override
public int getDocId(int pos) {
if (topDocs == null) {
topDocs = tdc.topDocs();
}
return topDocs.scoreDocs[pos].doc;
}
@Override
public float getScore(int pos) {
if (topDocs == null) {
topDocs = tdc.topDocs();
}
return topDocs.scoreDocs[pos].score;
}
@Override
public int getTotalHits() {
return count;
}
@Override
public boolean acceptsDocsOutOfOrder() {
return tdc.acceptsDocsOutOfOrder();
}
@Override
public void setNextReader(AtomicReaderContext context) throws IOException {
this.docBase = context.docBase;
tdc.setNextReader(context);
}
@Override
public void setScorer(Scorer scorer) throws IOException {
if (shouldScore) {
tdc.setScorer(scorer);
} else {
tdc.setScorer(NoScoringScorer.INSTANCE);
}
}
@Override
public void reset() {
count = 0;
lastDoc = 0;
topDocs = null;
tdc = TopScoreDocCollector.create(maxSize, outOfOrder);
}
}