Test case and fix for bug #32467

git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@150700 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Christoph Goller 2004-12-10 19:36:40 +00:00
parent ac5e84d8f6
commit 84a908d84c
2 changed files with 102 additions and 7 deletions

View File

@ -87,6 +87,7 @@ final class BooleanScorer extends Scorer {
private Bucket current; private Bucket current;
public void score(HitCollector hc) throws IOException { public void score(HitCollector hc) throws IOException {
next();
score(hc, Integer.MAX_VALUE); score(hc, Integer.MAX_VALUE);
} }
@ -95,19 +96,35 @@ final class BooleanScorer extends Scorer {
computeCoordFactors(); computeCoordFactors();
boolean more; boolean more;
Bucket tmp;
do { do {
while (bucketTable.first != null) { // more queued bucketTable.first = null;
current = bucketTable.first;
if (current.doc >= max) while (current != null) { // more queued
return true;
// check prohibited & required // check prohibited & required
if ((current.bits & prohibitedMask) == 0 && if ((current.bits & prohibitedMask) == 0 &&
(current.bits & requiredMask) == requiredMask) { (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]); 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 // refill the queue
@ -120,12 +137,13 @@ final class BooleanScorer extends Scorer {
more = true; more = true;
} }
} }
} while (bucketTable.first != null || more); current = bucketTable.first;
} while (current != null || more);
return false; return false;
} }
public int doc() { return current.doc; } public int doc() { return current.doc; }
public boolean next() throws IOException { public boolean next() throws IOException {

View File

@ -0,0 +1,77 @@
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$ ' ;
*/
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());
}
}
}