Fixed a bug when rewritten queries were included in a BooleanQuery.

git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@149933 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Doug Cutting 2003-01-20 18:40:19 +00:00
parent 7f20a5f408
commit 637b10da6c
3 changed files with 48 additions and 9 deletions

View File

@ -195,15 +195,41 @@ public class BooleanQuery extends Query {
}
protected Weight createWeight(Searcher searcher) {
return new BooleanWeight(searcher);
}
public Query rewrite(IndexReader reader) throws IOException {
if (clauses.size() == 1) { // optimize 1-clause queries
BooleanClause c = (BooleanClause)clauses.elementAt(0);
if (!c.prohibited) { // just return clause weight
Query clone = (Query)c.query.clone();
if (!c.prohibited) { // just return clause
Query clone = (Query)c.query.clone(); // have to clone to boost
clone.setBoost(getBoost() * clone.getBoost());
return clone.createWeight(searcher);
return clone;
}
}
return new BooleanWeight(searcher);
BooleanQuery clone = (BooleanQuery)this.clone(); // recursively clone
boolean changed = false;
for (int i = 0 ; i < clauses.size(); i++) {
BooleanClause c = (BooleanClause)clauses.elementAt(i);
Query q = c.query.rewrite(reader);
if (q != c.query) { // rewrote
changed = true; // replace in clone
clone.clauses.setElementAt
(new BooleanClause(q, c.required, c.prohibited), i);
}
}
if (changed)
return clone; // clauses rewrote
else
return this; // no clauses rewrote
}
public Object clone() {
BooleanQuery clone = (BooleanQuery)super.clone();
clone.clauses = (Vector)this.clauses.clone();
return clone;
}
/** Prints a user-readable version of this query. */

View File

@ -125,11 +125,7 @@ public abstract class Query implements java.io.Serializable, Cloneable {
return weight;
}
/** Expert: called to re-write queries into primitive queries.
*
* <p>Only implemented by derived queries, with no {@link
* #createWeight(Searcher)} implementatation..
*/
/** Expert: called to re-write queries into primitive queries. */
public Query rewrite(IndexReader reader) throws IOException {
return this;
}

View File

@ -101,6 +101,14 @@ public class TestWildcard
Query query2 = new WildcardQuery(new Term("body", "metal*"));
Query query3 = new WildcardQuery(new Term("body", "m*tal"));
Query query4 = new WildcardQuery(new Term("body", "m*tal*"));
Query query5 = new WildcardQuery(new Term("body", "m*tals"));
BooleanQuery query6 = new BooleanQuery();
query6.add(query5, false, false);
BooleanQuery query7 = new BooleanQuery();
query7.add(query3, false, false);
query7.add(query5, false, false);
Hits result;
@ -115,6 +123,15 @@ public class TestWildcard
result = searcher.search(query4);
assertEquals(2, result.length());
result = searcher.search(query5);
assertEquals(1, result.length());
result = searcher.search(query6);
assertEquals(1, result.length());
result = searcher.search(query7);
assertEquals(2, result.length());
}
public void testQuestionmark()