2021-04-01 19:48:25 +02:00
|
|
|
package it.cavallium.dbengine.lucene.searcher;
|
|
|
|
|
2021-07-26 19:21:17 +02:00
|
|
|
import static it.cavallium.dbengine.lucene.searcher.PaginationInfo.ALLOW_UNSCORED_PAGINATION_MODE;
|
|
|
|
|
|
|
|
import it.cavallium.dbengine.lucene.UnscoredCollector;
|
2021-04-01 19:48:25 +02:00
|
|
|
import java.io.IOException;
|
2021-07-17 23:06:26 +02:00
|
|
|
import org.apache.lucene.index.LeafReaderContext;
|
|
|
|
import org.apache.lucene.index.NumericDocValues;
|
|
|
|
import org.apache.lucene.misc.search.DiversifiedTopDocsCollector;
|
|
|
|
import org.apache.lucene.search.BulkScorer;
|
2021-07-05 15:43:19 +02:00
|
|
|
import org.apache.lucene.search.Collector;
|
2021-04-01 19:48:25 +02:00
|
|
|
import org.apache.lucene.search.FieldDoc;
|
2021-07-17 23:06:26 +02:00
|
|
|
import org.apache.lucene.search.HitQueue;
|
2021-04-01 19:48:25 +02:00
|
|
|
import org.apache.lucene.search.IndexSearcher;
|
2021-07-17 23:06:26 +02:00
|
|
|
import org.apache.lucene.search.LeafCollector;
|
2021-07-05 15:43:19 +02:00
|
|
|
import org.apache.lucene.search.MultiCollectorManager.Collectors;
|
2021-04-01 19:48:25 +02:00
|
|
|
import org.apache.lucene.search.Query;
|
2021-07-17 23:06:26 +02:00
|
|
|
import org.apache.lucene.search.Scorable;
|
2021-07-05 15:43:19 +02:00
|
|
|
import org.apache.lucene.search.ScoreDoc;
|
2021-07-17 23:06:26 +02:00
|
|
|
import org.apache.lucene.search.ScoreMode;
|
2021-04-01 19:48:25 +02:00
|
|
|
import org.apache.lucene.search.Sort;
|
|
|
|
import org.apache.lucene.search.TopDocs;
|
|
|
|
import org.apache.lucene.search.TopDocsCollector;
|
|
|
|
import org.apache.lucene.search.TopFieldCollector;
|
|
|
|
import org.apache.lucene.search.TopScoreDocCollector;
|
2021-07-17 23:06:26 +02:00
|
|
|
import org.apache.lucene.search.TotalHits.Relation;
|
2021-04-01 19:48:25 +02:00
|
|
|
|
|
|
|
class TopDocsSearcher {
|
|
|
|
|
2021-07-08 18:54:53 +02:00
|
|
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
|
|
|
public static TopDocsCollector<ScoreDoc> getTopDocsCollector(Sort luceneSort,
|
2021-07-05 15:43:19 +02:00
|
|
|
int limit,
|
|
|
|
ScoreDoc after,
|
2021-07-26 19:21:17 +02:00
|
|
|
int totalHitsThreshold,
|
|
|
|
boolean computeScores) {
|
2021-07-08 18:54:53 +02:00
|
|
|
TopDocsCollector<ScoreDoc> collector;
|
2021-07-05 15:43:19 +02:00
|
|
|
if (luceneSort == null) {
|
|
|
|
if (after == null) {
|
2021-07-26 19:21:17 +02:00
|
|
|
if (computeScores || !ALLOW_UNSCORED_PAGINATION_MODE) {
|
|
|
|
collector = TopScoreDocCollector.create(limit, totalHitsThreshold);
|
|
|
|
} else {
|
|
|
|
collector = new UnscoredCollector(null, limit);
|
|
|
|
}
|
2021-07-05 15:43:19 +02:00
|
|
|
} else {
|
2021-07-26 19:21:17 +02:00
|
|
|
if (computeScores || !ALLOW_UNSCORED_PAGINATION_MODE) {
|
|
|
|
collector = TopScoreDocCollector.create(limit, after, totalHitsThreshold);
|
|
|
|
} else {
|
|
|
|
collector = new UnscoredCollector(after.doc, limit);
|
|
|
|
}
|
2021-07-05 15:43:19 +02:00
|
|
|
}
|
|
|
|
} else {
|
2021-07-26 19:21:17 +02:00
|
|
|
if (!computeScores) {
|
|
|
|
throw new IllegalArgumentException("ComputeScores must be true if sort is set");
|
|
|
|
}
|
2021-07-05 15:43:19 +02:00
|
|
|
if (after == null) {
|
2021-07-08 18:54:53 +02:00
|
|
|
collector = (TopDocsCollector<ScoreDoc>) (TopDocsCollector) TopFieldCollector.create(luceneSort, limit, totalHitsThreshold);
|
2021-07-05 15:43:19 +02:00
|
|
|
} else if (after instanceof FieldDoc afterFieldDoc) {
|
2021-07-08 18:54:53 +02:00
|
|
|
collector = (TopDocsCollector<ScoreDoc>) (TopDocsCollector) TopFieldCollector.create(luceneSort, limit, afterFieldDoc, totalHitsThreshold);
|
2021-07-05 15:43:19 +02:00
|
|
|
} else {
|
|
|
|
throw new UnsupportedOperationException("GetTopDocs with \"luceneSort\" != null requires \"after\" to be a FieldDoc");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return collector;
|
|
|
|
}
|
2021-04-01 19:48:25 +02:00
|
|
|
}
|