2021-01-30 22:14:48 +01:00
|
|
|
package it.cavallium.dbengine.lucene;
|
2020-12-07 22:15:18 +01:00
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
|
import java.util.concurrent.atomic.AtomicLong;
|
|
|
|
import java.util.concurrent.locks.ReentrantLock;
|
|
|
|
import org.apache.lucene.index.LeafReaderContext;
|
|
|
|
import org.apache.lucene.search.Collector;
|
|
|
|
import org.apache.lucene.search.LeafCollector;
|
|
|
|
import org.apache.lucene.search.Scorable;
|
|
|
|
import org.apache.lucene.search.ScoreMode;
|
|
|
|
|
|
|
|
public class LuceneParallelStreamCollector implements Collector, LeafCollector {
|
|
|
|
|
2021-01-29 17:19:01 +01:00
|
|
|
private final int base;
|
|
|
|
private final ScoreMode scoreMode;
|
2020-12-07 22:15:18 +01:00
|
|
|
private final LuceneParallelStreamConsumer streamConsumer;
|
|
|
|
private final AtomicBoolean stopped;
|
|
|
|
private final AtomicLong totalHitsCounter;
|
|
|
|
private final ReentrantLock lock;
|
2021-01-29 17:19:01 +01:00
|
|
|
private Scorable scorer;
|
2020-12-07 22:15:18 +01:00
|
|
|
|
2021-01-29 17:19:01 +01:00
|
|
|
public LuceneParallelStreamCollector(int base, ScoreMode scoreMode, LuceneParallelStreamConsumer streamConsumer,
|
2020-12-07 22:15:18 +01:00
|
|
|
AtomicBoolean stopped, AtomicLong totalHitsCounter, ReentrantLock lock) {
|
|
|
|
this.base = base;
|
2021-01-29 17:19:01 +01:00
|
|
|
this.scoreMode = scoreMode;
|
2020-12-07 22:15:18 +01:00
|
|
|
this.streamConsumer = streamConsumer;
|
|
|
|
this.stopped = stopped;
|
|
|
|
this.totalHitsCounter = totalHitsCounter;
|
|
|
|
this.lock = lock;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2021-01-29 17:19:01 +01:00
|
|
|
public final LeafCollector getLeafCollector(LeafReaderContext context) {
|
|
|
|
return new LuceneParallelStreamCollector(context.docBase, scoreMode, streamConsumer, stopped, totalHitsCounter, lock);
|
2020-12-07 22:15:18 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2021-01-29 17:19:01 +01:00
|
|
|
public void setScorer(Scorable scorer) {
|
|
|
|
this.scorer = scorer;
|
2020-12-07 22:15:18 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void collect(int doc) throws IOException {
|
|
|
|
doc += base;
|
|
|
|
totalHitsCounter.incrementAndGet();
|
|
|
|
lock.lock();
|
|
|
|
try {
|
|
|
|
if (!stopped.get()) {
|
2021-01-29 17:19:01 +01:00
|
|
|
assert (scorer == null) || scorer.docID() == doc;
|
|
|
|
if (!streamConsumer.consume(doc, scorer == null ? 0 : scorer.score())) {
|
2020-12-07 22:15:18 +01:00
|
|
|
stopped.set(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} finally {
|
|
|
|
lock.unlock();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public ScoreMode scoreMode() {
|
2021-01-29 17:19:01 +01:00
|
|
|
return scoreMode;
|
2020-12-07 22:15:18 +01:00
|
|
|
}
|
|
|
|
}
|