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]