You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@lucene.apache.org by cu...@apache.org on 2003/01/20 19:40:19 UTC

cvs commit: jakarta-lucene/src/test/org/apache/lucene/search TestWildcard.java

cutting     2003/01/20 10:40:19

  Modified:    src/java/org/apache/lucene/search BooleanQuery.java
                        Query.java
               src/test/org/apache/lucene/search TestWildcard.java
  Log:
  Fixed a bug when rewritten queries were included in a BooleanQuery.
  
  Revision  Changes    Path
  1.12      +30 -4     jakarta-lucene/src/java/org/apache/lucene/search/BooleanQuery.java
  
  Index: BooleanQuery.java
  ===================================================================
  RCS file: /home/cvs/jakarta-lucene/src/java/org/apache/lucene/search/BooleanQuery.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- BooleanQuery.java	15 Jan 2003 19:25:04 -0000	1.11
  +++ BooleanQuery.java	20 Jan 2003 18:40:19 -0000	1.12
  @@ -195,15 +195,41 @@
     }
   
     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. */
  
  
  
  1.12      +1 -5      jakarta-lucene/src/java/org/apache/lucene/search/Query.java
  
  Index: Query.java
  ===================================================================
  RCS file: /home/cvs/jakarta-lucene/src/java/org/apache/lucene/search/Query.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- Query.java	15 Jan 2003 15:41:52 -0000	1.11
  +++ Query.java	20 Jan 2003 18:40:19 -0000	1.12
  @@ -125,11 +125,7 @@
       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;
     }
  
  
  
  1.5       +17 -0     jakarta-lucene/src/test/org/apache/lucene/search/TestWildcard.java
  
  Index: TestWildcard.java
  ===================================================================
  RCS file: /home/cvs/jakarta-lucene/src/test/org/apache/lucene/search/TestWildcard.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- TestWildcard.java	18 Jul 2002 14:41:39 -0000	1.4
  +++ TestWildcard.java	20 Jan 2003 18:40:19 -0000	1.5
  @@ -101,6 +101,14 @@
           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;
   
  @@ -114,6 +122,15 @@
   	assertEquals(1, result.length());
   
   	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());
       }
   
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>