CavalliumDBEngine/src/main/java/it/cavallium/dbengine/lucene/collector/ReactiveLeafCollector.java

46 lines
1.4 KiB
Java
Raw Normal View History

2021-09-25 18:31:41 +02:00
package it.cavallium.dbengine.lucene.collector;
2021-09-29 11:38:29 +02:00
import it.cavallium.dbengine.database.LLUtils;
2021-11-08 18:52:52 +01:00
import java.util.concurrent.CancellationException;
2021-09-25 18:31:41 +02:00
import java.util.concurrent.locks.LockSupport;
import org.apache.lucene.index.LeafReaderContext;
2021-11-08 23:46:40 +01:00
import org.apache.lucene.search.CollectionTerminatedException;
2021-09-25 18:31:41 +02:00
import org.apache.lucene.search.LeafCollector;
import org.apache.lucene.search.Scorable;
import org.apache.lucene.search.ScoreDoc;
2021-11-08 16:33:41 +01:00
import reactor.core.publisher.FluxSink;
2021-09-25 18:31:41 +02:00
import reactor.core.publisher.Sinks.EmitResult;
import reactor.core.publisher.Sinks.Many;
public class ReactiveLeafCollector implements LeafCollector {
private final LeafReaderContext leafReaderContext;
2021-11-08 16:33:41 +01:00
private final FluxSink<ScoreDoc> scoreDocsSink;
2021-09-25 18:31:41 +02:00
private final int shardIndex;
2021-11-08 16:33:41 +01:00
public ReactiveLeafCollector(LeafReaderContext leafReaderContext, FluxSink<ScoreDoc> scoreDocsSink, int shardIndex) {
2021-09-25 18:31:41 +02:00
this.leafReaderContext = leafReaderContext;
this.scoreDocsSink = scoreDocsSink;
this.shardIndex = shardIndex;
}
@Override
public void setScorer(Scorable scorable) {
}
@Override
public void collect(int i) {
2021-09-29 11:38:29 +02:00
LLUtils.ensureBlocking();
2021-09-25 18:31:41 +02:00
var scoreDoc = new ScoreDoc(leafReaderContext.docBase + i, 0, shardIndex);
2021-11-08 16:33:41 +01:00
while (scoreDocsSink.requestedFromDownstream() < 0 && !scoreDocsSink.isCancelled()) {
2021-11-08 23:46:02 +01:00
// 10ms
LockSupport.parkNanos(10L * 1000000L);
2021-11-08 16:33:41 +01:00
}
scoreDocsSink.next(scoreDoc);
2021-11-08 18:52:52 +01:00
if (scoreDocsSink.isCancelled()) {
2021-11-08 23:46:40 +01:00
throw new CollectionTerminatedException();
2021-11-08 18:52:52 +01:00
}
2021-09-25 18:31:41 +02:00
}
}