lucene-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Gary Yngve (JIRA)" <j...@apache.org>
Subject [jira] Created: (LUCENE-2336) off by one: DisjunctionSumScorer::advance
Date Fri, 19 Mar 2010 23:38:27 GMT
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: java-dev-unsubscribe@lucene.apache.org
For additional commands, e-mail: java-dev-help@lucene.apache.org


Mime
View raw message