2021-12-23 02:13:51 +01:00
|
|
|
package it.cavallium.dbengine.lucene.searcher;
|
|
|
|
|
|
|
|
import java.util.Iterator;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.function.Supplier;
|
|
|
|
import java.util.stream.IntStream;
|
|
|
|
import org.apache.lucene.search.IndexSearcher;
|
|
|
|
import org.apache.lucene.search.ScoreDoc;
|
|
|
|
|
|
|
|
public class LuceneMultiGenerator implements Supplier<ScoreDoc> {
|
|
|
|
|
|
|
|
private final Iterator<Supplier<ScoreDoc>> generators;
|
|
|
|
private Supplier<ScoreDoc> luceneGenerator;
|
|
|
|
|
2022-02-11 21:46:05 +01:00
|
|
|
public LuceneMultiGenerator(List<IndexSearcher> shards, LocalQueryParams localQueryParams) {
|
2021-12-23 02:13:51 +01:00
|
|
|
this.generators = IntStream
|
|
|
|
.range(0, shards.size())
|
|
|
|
.mapToObj(shardIndex -> {
|
|
|
|
IndexSearcher shard = shards.get(shardIndex);
|
2022-02-11 13:32:50 +01:00
|
|
|
return (Supplier<ScoreDoc>) new LuceneGenerator(shard,
|
|
|
|
localQueryParams,
|
2022-02-11 21:46:05 +01:00
|
|
|
shardIndex
|
2022-02-11 13:32:50 +01:00
|
|
|
);
|
2021-12-23 02:13:51 +01:00
|
|
|
})
|
|
|
|
.iterator();
|
|
|
|
tryAdvanceGenerator();
|
|
|
|
}
|
|
|
|
|
|
|
|
private void tryAdvanceGenerator() {
|
|
|
|
if (generators.hasNext()) {
|
|
|
|
luceneGenerator = generators.next();
|
|
|
|
} else {
|
|
|
|
luceneGenerator = null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public ScoreDoc get() {
|
|
|
|
if (luceneGenerator == null) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
ScoreDoc item;
|
|
|
|
do {
|
|
|
|
item = luceneGenerator.get();
|
|
|
|
if (item == null) {
|
|
|
|
tryAdvanceGenerator();
|
|
|
|
if (luceneGenerator == null) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} while (item == null);
|
|
|
|
return item;
|
|
|
|
}
|
|
|
|
}
|