goller      2004/12/10 11:36:40

  Modified:    src/java/org/apache/lucene/search BooleanScorer.java
  Added:       src/test/org/apache/lucene/search TestBooleanScorer.java
  Log:
  Test case and fix for bug #32467
  
  Revision  Changes    Path
  1.1                  
jakarta-lucene/src/test/org/apache/lucene/search/TestBooleanScorer.java
  
  Index: TestBooleanScorer.java
  ===================================================================
  package org.apache.lucene.search;
  
  /**
   * Copyright 2004 The Apache Software Foundation
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  import java.io.IOException;
  
  import org.apache.lucene.analysis.WhitespaceAnalyzer;
  import org.apache.lucene.document.Document;
  import org.apache.lucene.document.Field;
  import org.apache.lucene.index.IndexWriter;
  import org.apache.lucene.index.Term;
  import org.apache.lucene.store.RAMDirectory;
  
  import junit.framework.TestCase;
  
  /**
   * @author Christoph Goller
   * @version $rcs = ' $Id: TestBooleanScorer.java,v 1.1 2004/12/10 19:36:40 
goller Exp $ ' ;
   */
  public class TestBooleanScorer extends TestCase
  {
  
    public TestBooleanScorer(String name) {
      super(name);
    }
  
    private static final String FIELD = "category";
    
    public void testMethod() {
      RAMDirectory directory = new RAMDirectory();
  
      String[] values = new String[] { "1", "2", "3", "4" };
  
      try {
        IndexWriter writer = new IndexWriter(directory, new 
WhitespaceAnalyzer(), true);
        for (int i = 0; i < values.length; i++) {
          Document doc = new Document();
          doc.add(new Field(FIELD, values[i], Field.Store.YES, 
Field.Index.UN_TOKENIZED));
          writer.addDocument(doc);
        }
        writer.close();
  
        BooleanQuery booleanQuery1 = new BooleanQuery();
        booleanQuery1.add(new TermQuery(new Term(FIELD, "1")), 
BooleanClause.Occur.SHOULD);
        booleanQuery1.add(new TermQuery(new Term(FIELD, "2")), 
BooleanClause.Occur.SHOULD);
  
        BooleanQuery query = new BooleanQuery();
        query.add(booleanQuery1, BooleanClause.Occur.MUST);
        query.add(new TermQuery(new Term(FIELD, "9")), 
BooleanClause.Occur.MUST_NOT);
  
        IndexSearcher indexSearcher = new IndexSearcher(directory);
        Hits hits = indexSearcher.search(query);
        assertEquals("Number of matched documents", 2, hits.length());
  
      }
      catch (IOException e) {
        fail(e.getMessage());
      }
  
    }
    
  
  }
  
  
  
  1.14      +25 -7     
jakarta-lucene/src/java/org/apache/lucene/search/BooleanScorer.java
  
  Index: BooleanScorer.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-lucene/src/java/org/apache/lucene/search/BooleanScorer.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- BooleanScorer.java        13 Oct 2004 17:12:04 -0000      1.13
  +++ BooleanScorer.java        10 Dec 2004 19:36:40 -0000      1.14
  @@ -87,6 +87,7 @@
     private Bucket current;
   
     public void score(HitCollector hc) throws IOException {
  +    next();
       score(hc, Integer.MAX_VALUE);
     }
   
  @@ -95,19 +96,35 @@
         computeCoordFactors();
   
       boolean more;
  +    Bucket tmp;
  +    
       do {
  -      while (bucketTable.first != null) {         // more queued
  -        current = bucketTable.first;
  -        if (current.doc >= max)
  -          return true;
  +      bucketTable.first = null;
  +      
  +      while (current != null) {         // more queued 
   
           // check prohibited & required
           if ((current.bits & prohibitedMask) == 0 && 
               (current.bits & requiredMask) == requiredMask) {
  +          
  +          if (current.doc >= max){
  +            tmp = current;
  +            current = current.next;
  +            tmp.next = bucketTable.first;
  +            bucketTable.first = tmp;
  +            continue;
  +          }
  +          
             hc.collect(current.doc, current.score * 
coordFactors[current.coord]);
           }
           
  -        bucketTable.first = current.next;         // pop the queue
  +        current = current.next;         // pop the queue
  +      }
  +      
  +      if( bucketTable.first != null){
  +        current = bucketTable.first;
  +        bucketTable.first = current.next;
  +        return true;
         }
   
         // refill the queue
  @@ -120,11 +137,12 @@
               more = true;
           }
         }
  -    } while (bucketTable.first != null || more);
  +      current = bucketTable.first;
  +      
  +    } while (current != null || more);
   
       return false;
     }
  -
   
     public int doc() { return current.doc; }
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to