mirror of https://github.com/apache/lucene.git
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:
parent
7f20a5f408
commit
637b10da6c
|
@ -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. */
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue