lucene-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Gary Yngve (JIRA)" <>
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
             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:
For additional commands, e-mail:

View raw message