off by one: DisjunctionSumScorer::advance
-----------------------------------------
Key: LUCENE-2336
URL: https://issues.apache.org/jira/browse/LUCENE-2336
Project: Lucene - Java
Issue Type: Bug
Components: Search
Reporter: Gary Yngve
Priority: Minor
The bug is:
if (target <= currentDoc) {
should be
if (target < currentDoc) {
based on the comments for the method as well as the contract for
DocIdSetIterator: "Advances to the first beyond the current"
It can be demonstrated by:
assertEquals("advance(1) first match failed", 1,
scorer.advance(1));
assertEquals("advance(1) second match failed", n,
scorer.advance(1));
if docId: 1 is a hit and n is the next hit. (Tests all pass if this code
change is made.)
I'm not labeling it as major because the class is package-protected and
currently passes spec.
Relevant excerpt:
/**
* Advances to the first match beyond the current whose document number is
* greater than or equal to a given target. <br>
* When this method is used the {...@link #explain(int)} method should not be
* used. <br>
* The implementation uses the skipTo() method on the subscorers.
*
* @param target
* The target document number.
* @return the document whose number is greater than or equal to the given
* target, or -1 if none exist.
*/
public int advance(int target) throws IOException {
if (scorerDocQueue.size() < minimumNrMatchers) {
return currentDoc = NO_MORE_DOCS;
}
if (target <= currentDoc) {
return currentDoc;
}
do {
if (scorerDocQueue.topDoc() >= target) {
boolean b = advanceAfterCurrent();
return b ? currentDoc : (currentDoc = NO_MORE_DOCS);
} else if (!scorerDocQueue.topSkipToAndAdjustElsePop(target)) {
if (scorerDocQueue.size() < minimumNrMatchers) {
return currentDoc = NO_MORE_DOCS;
}
}
} while (true);
}
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]