|
|
@@ -23,6 +23,7 @@ import org.apache.lucene.index.Terms;
|
|
|
import org.apache.lucene.index.TermsEnum;
|
|
|
import org.apache.lucene.search.DocIdSetIterator;
|
|
|
import org.apache.lucene.search.KnnCollector;
|
|
|
+import org.apache.lucene.search.VectorScorer;
|
|
|
import org.apache.lucene.search.suggest.document.CompletionTerms;
|
|
|
import org.apache.lucene.util.Bits;
|
|
|
import org.apache.lucene.util.BytesRef;
|
|
|
@@ -481,6 +482,27 @@ class ExitableDirectoryReader extends FilterDirectoryReader {
|
|
|
return in.vectorValue();
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public VectorScorer scorer(byte[] bytes) throws IOException {
|
|
|
+ VectorScorer scorer = in.scorer(bytes);
|
|
|
+ if (scorer == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return new VectorScorer() {
|
|
|
+ private final DocIdSetIterator iterator = new ExitableDocSetIterator(scorer.iterator(), queryCancellation);
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public float score() throws IOException {
|
|
|
+ return scorer.score();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public DocIdSetIterator iterator() {
|
|
|
+ return iterator;
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public int docID() {
|
|
|
return in.docID();
|
|
|
@@ -531,11 +553,72 @@ class ExitableDirectoryReader extends FilterDirectoryReader {
|
|
|
return nextDoc;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public VectorScorer scorer(float[] target) throws IOException {
|
|
|
+ VectorScorer scorer = in.scorer(target);
|
|
|
+ if (scorer == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return new VectorScorer() {
|
|
|
+ private final DocIdSetIterator iterator = new ExitableDocSetIterator(scorer.iterator(), queryCancellation);
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public float score() throws IOException {
|
|
|
+ return scorer.score();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public DocIdSetIterator iterator() {
|
|
|
+ return iterator;
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
private void checkAndThrowWithSampling() {
|
|
|
if ((calls++ & ExitableIntersectVisitor.MAX_CALLS_BEFORE_QUERY_TIMEOUT_CHECK) == 0) {
|
|
|
this.queryCancellation.checkCancelled();
|
|
|
}
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
+ private static class ExitableDocSetIterator extends DocIdSetIterator {
|
|
|
+ private int calls;
|
|
|
+ private final DocIdSetIterator in;
|
|
|
+ private final QueryCancellation queryCancellation;
|
|
|
+
|
|
|
+ private ExitableDocSetIterator(DocIdSetIterator in, QueryCancellation queryCancellation) {
|
|
|
+ this.in = in;
|
|
|
+ this.queryCancellation = queryCancellation;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int docID() {
|
|
|
+ return in.docID();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int advance(int target) throws IOException {
|
|
|
+ final int advance = in.advance(target);
|
|
|
+ checkAndThrowWithSampling();
|
|
|
+ return advance;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int nextDoc() throws IOException {
|
|
|
+ final int nextDoc = in.nextDoc();
|
|
|
+ checkAndThrowWithSampling();
|
|
|
+ return nextDoc;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public long cost() {
|
|
|
+ return in.cost();
|
|
|
+ }
|
|
|
+
|
|
|
+ private void checkAndThrowWithSampling() {
|
|
|
+ if ((calls++ & ExitableIntersectVisitor.MAX_CALLS_BEFORE_QUERY_TIMEOUT_CHECK) == 0) {
|
|
|
+ this.queryCancellation.checkCancelled();
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|