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; /** * Accessible top hit collector */ public class AccessibleTopHitCollector extends AccessibleHitCollector { private TopScoreDocCollector tdc; private TopDocs topDocs = null; private int size; public AccessibleTopHitCollector(int size, boolean outOfOrder, boolean shouldScore) { tdc = TopScoreDocCollector.create(size, outOfOrder); this.shouldScore = shouldScore; this.outOfOrder = outOfOrder; this.size = size; } @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 tdc.getTotalHits(); } @Override public boolean acceptsDocsOutOfOrder() { return tdc.acceptsDocsOutOfOrder(); } @Override public void collect(int doc) throws IOException { tdc.collect(doc); } @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() { tdc = TopScoreDocCollector.create(size, outOfOrder); topDocs = null; } }