package org.apache.lucene.search;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.lucene.index.LeafReaderContext;
public class SecondOrderCollectorTopN extends AbstractSecondOrderCollector {
private TopDocsCollector topCollector;
private int topN;
private String detail = null;
public SecondOrderCollectorTopN(String detail, int topN, TopDocsCollector collector) {
this.topN = topN;
topCollector = collector;
this.detail = detail;
}
public SecondOrderCollectorTopN(int topN) {
topCollector = TopScoreDocCollector.create(topN);
this.topN = topN;
}
@Override
public List<CollectorDoc> getSubReaderResults(int rangeStart, int rangeEnd) {
if (topCollector.totalHits == 0)
return null;
lock.lock();
try {
if (!organized) {
((ArrayList) hits).ensureCapacity(topCollector.totalHits);
for (ScoreDoc d: topCollector.topDocs().scoreDocs) {
hits.add(new CollectorDoc(d.doc, d.score));
}
}
}
finally {
lock.unlock();
}
return super.getSubReaderResults(rangeStart, rangeEnd);
}
@Override
public String toString() {
return this.getClass().getSimpleName() + "(" + topN + (detail!=null ? ", info=" + detail : "") + ")";
}
@Override
public boolean needsScores() {
return topCollector.needsScores();
}
@Override
public void collect(int doc) throws IOException {
throw new UnsupportedOperationException("Must not be called");
}
@Override
public LeafCollector getLeafCollector(LeafReaderContext context) throws IOException {
LeafCollector c = topCollector.getLeafCollector(context);
return c;
}
}