Skip to content

Commit

Permalink
LUCENE-9565 Fix competitive iteration
Browse files Browse the repository at this point in the history
PR apache#1351 introduced a sort optimization where documents can be skipped.
But iteration over competitive iterators was not properly organized,
as they were not storing the current docID, and
when competitive iterator was updated the current doc ID was lost.

This patch fixed it.

Relates to apache#1351
  • Loading branch information
mayya-sharipova committed Oct 6, 2020
1 parent 6ac94a6 commit 574245c
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 9 deletions.
11 changes: 8 additions & 3 deletions lucene/core/src/java/org/apache/lucene/search/Weight.java
Original file line number Diff line number Diff line change
Expand Up @@ -204,9 +204,14 @@ public int score(LeafCollector collector, Bits acceptDocs, int min, int max) thr
collector.setScorer(scorer);
DocIdSetIterator scorerIterator = twoPhase == null ? iterator : twoPhase.approximation();
DocIdSetIterator collectorIterator = collector.competitiveIterator();
// if possible filter scorerIterator to keep only competitive docs as defined by collector
DocIdSetIterator filteredIterator = collectorIterator == null ? scorerIterator :
ConjunctionDISI.intersectIterators(Arrays.asList(scorerIterator, collectorIterator));
DocIdSetIterator filteredIterator = scorerIterator;
if (collectorIterator != null) {
if (scorerIterator.docID() != -1) {
collectorIterator.advance(scorerIterator.docID());
}
// filter scorerIterator to keep only competitive docs as defined by collector
filteredIterator = ConjunctionDISI.intersectIterators(Arrays.asList(scorerIterator, collectorIterator));
}
if (filteredIterator.docID() == -1 && min == 0 && max == DocIdSetIterator.NO_MORE_DOCS) {
scoreAll(collector, filteredIterator, twoPhase, acceptDocs);
return DocIdSetIterator.NO_MORE_DOCS;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,14 +133,16 @@ public DocIdSetIterator competitiveIterator() {
return null;
} else {
return new DocIdSetIterator() {
private int docID = -1;

@Override
public int nextDoc() throws IOException {
return competitiveIterator.nextDoc();
return advance(docID + 1);
}

@Override
public int docID() {
return competitiveIterator.docID();
return docID;
}

@Override
Expand All @@ -150,7 +152,7 @@ public long cost() {

@Override
public int advance(int target) throws IOException {
return competitiveIterator.advance(target);
return docID = competitiveIterator.advance(target);
}
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -220,14 +220,16 @@ public PointValues.Relation compare(byte[] minPackedValue, byte[] maxPackedValue
public DocIdSetIterator competitiveIterator() {
if (enableSkipping == false) return null;
return new DocIdSetIterator() {
private int docID = -1;

@Override
public int nextDoc() throws IOException {
return competitiveIterator.nextDoc();
return advance(docID + 1);
}

@Override
public int docID() {
return competitiveIterator.docID();
return docID;
}

@Override
Expand All @@ -237,7 +239,7 @@ public long cost() {

@Override
public int advance(int target) throws IOException {
return competitiveIterator.advance(target);
return docID = competitiveIterator.advance(target);
}
};
}
Expand Down

0 comments on commit 574245c

Please sign in to comment.