[ 
https://issues.apache.org/jira/browse/LUCENE-2336?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Adrien Grand resolved LUCENE-2336.
----------------------------------
    Resolution: Not A Problem

We fixed the docs long time ago to state that the behaviour is undefined if 
target is <= docID().

> off by one: DisjunctionSumScorer::advance
> -----------------------------------------
>
>                 Key: LUCENE-2336
>                 URL: https://issues.apache.org/jira/browse/LUCENE-2336
>             Project: Lucene - Core
>          Issue Type: Bug
>          Components: core/search
>            Reporter: Gary Yngve
>            Priority: Minor
>              Labels: scorer, search
>   Original Estimate: 4h
>  Remaining Estimate: 4h
>
> 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 was sent by Atlassian JIRA
(v6.4.14#64029)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to