CavalliumDBEngine/src/main/java/it/cavallium/dbengine/lucene/searcher/ScoringShardsCollectorManager.java

112 lines
3.6 KiB
Java
Raw Normal View History

2021-07-08 18:54:53 +02:00
package it.cavallium.dbengine.lucene.searcher;
import static it.cavallium.dbengine.lucene.searcher.CurrentPageInfo.TIE_BREAKER;
2021-09-22 11:03:39 +02:00
import it.cavallium.dbengine.database.LLUtils;
2021-07-08 18:54:53 +02:00
import it.cavallium.dbengine.lucene.LuceneUtils;
import java.io.IOException;
import java.util.Collection;
import org.apache.lucene.search.CollectorManager;
import org.apache.lucene.search.FieldDoc;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.TopFieldCollector;
import org.apache.lucene.search.TopFieldDocs;
import org.jetbrains.annotations.Nullable;
import reactor.core.scheduler.Schedulers;
2021-07-08 18:54:53 +02:00
public class ScoringShardsCollectorManager implements CollectorManager<TopFieldCollector, TopDocs> {
@Nullable
2021-07-08 18:54:53 +02:00
private final Sort sort;
private final int numHits;
private final FieldDoc after;
private final int totalHitsThreshold;
private final @Nullable Integer startN;
private final @Nullable Integer topN;
private final CollectorManager<TopFieldCollector, TopFieldDocs> sharedCollectorManager;
public ScoringShardsCollectorManager(@Nullable final Sort sort,
2021-07-08 18:54:53 +02:00
final int numHits,
final FieldDoc after,
final int totalHitsThreshold,
int startN,
int topN) {
this(sort, numHits, after, totalHitsThreshold, (Integer) startN, (Integer) topN);
}
public ScoringShardsCollectorManager(@Nullable final Sort sort,
2021-09-22 11:03:39 +02:00
final int numHits,
final FieldDoc after,
final int totalHitsThreshold,
int startN) {
this(sort, numHits, after, totalHitsThreshold, (Integer) startN, (Integer) 2147483630);
}
public ScoringShardsCollectorManager(@Nullable final Sort sort,
2021-07-08 18:54:53 +02:00
final int numHits,
final FieldDoc after,
final int totalHitsThreshold) {
this(sort, numHits, after, totalHitsThreshold, null, null);
}
private ScoringShardsCollectorManager(@Nullable final Sort sort,
2021-07-08 18:54:53 +02:00
final int numHits,
final FieldDoc after,
final int totalHitsThreshold,
@Nullable Integer startN,
@Nullable Integer topN) {
this.sort = sort;
this.numHits = numHits;
this.after = after;
this.totalHitsThreshold = totalHitsThreshold;
this.startN = startN;
2021-09-22 11:03:39 +02:00
if (topN != null && startN != null && (long) topN + (long) startN > 2147483630) {
this.topN = 2147483630 - startN;
} else if (topN != null && topN > 2147483630) {
this.topN = 2147483630;
} else {
this.topN = topN;
}
this.sharedCollectorManager = TopFieldCollector.createSharedManager(sort == null ? Sort.RELEVANCE : sort, numHits, after, totalHitsThreshold);
2021-07-08 18:54:53 +02:00
}
@Override
public TopFieldCollector newCollector() throws IOException {
return sharedCollectorManager.newCollector();
}
@Override
public TopDocs reduce(Collection<TopFieldCollector> collectors) throws IOException {
if (Schedulers.isInNonBlockingThread()) {
throw new UnsupportedOperationException("Called reduce in a nonblocking thread");
}
2021-07-08 18:54:53 +02:00
TopDocs result;
if (sort != null) {
TopFieldDocs[] topDocs = new TopFieldDocs[collectors.size()];
var i = 0;
for (TopFieldCollector collector : collectors) {
topDocs[i] = collector.topDocs();
for (ScoreDoc scoreDoc : topDocs[i].scoreDocs) {
scoreDoc.shardIndex = i;
}
i++;
}
2021-09-09 23:00:16 +02:00
result = LuceneUtils.mergeTopDocs(sort, startN, topN, topDocs, TIE_BREAKER);
2021-07-08 18:54:53 +02:00
} else {
TopDocs[] topDocs = new TopDocs[collectors.size()];
var i = 0;
for (TopFieldCollector collector : collectors) {
topDocs[i] = collector.topDocs();
for (ScoreDoc scoreDoc : topDocs[i].scoreDocs) {
scoreDoc.shardIndex = i;
}
i++;
}
2021-09-09 23:00:16 +02:00
result = LuceneUtils.mergeTopDocs(null, startN, topN, topDocs, TIE_BREAKER);
2021-07-08 18:54:53 +02:00
}
return result;
}
}