You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@lucene.apache.org by dn...@apache.org on 2004/08/27 22:09:12 UTC

cvs commit: jakarta-lucene/src/java/org/apache/lucene/search BooleanClause.java BooleanQuery.java

dnaber      2004/08/27 13:09:12

  Modified:    src/java/org/apache/lucene/search BooleanClause.java
                        BooleanQuery.java
  Log:
  deprecate the add() method that takes two booleans, take an Occur cobject instead. Also deprecate the public fields in BooleanClause and add get/set methods instead.
  
  Revision  Changes    Path
  1.7       +102 -8    jakarta-lucene/src/java/org/apache/lucene/search/BooleanClause.java
  
  Index: BooleanClause.java
  ===================================================================
  RCS file: /home/cvs/jakarta-lucene/src/java/org/apache/lucene/search/BooleanClause.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- BooleanClause.java	29 Mar 2004 22:48:03 -0000	1.6
  +++ BooleanClause.java	27 Aug 2004 20:09:12 -0000	1.7
  @@ -18,21 +18,115 @@
   
   /** A clause in a BooleanQuery. */
   public class BooleanClause implements java.io.Serializable {
  -  /** The query whose matching documents are combined by the boolean query. */
  -  public Query query;
  +  
  +  public static final class Occur {
  +    
  +    private String name;
  +    
  +    private Occur() {
  +      // typesafe enum pattern, no public constructor
  +    }
  +    
  +    private Occur(String name) {
  +      // typesafe enum pattern, no public constructor
  +      this.name = name;
  +    }
  +    
  +    public String toString() {
  +      return name;
  +    }
  +
  +    /** Use this operator for terms that <i>must</i> appear in the matching documents. */
  +    public static final Occur MUST = new Occur("MUST");
  +    /** Use this operator for terms of which <i>should</i> appear in the 
  +     * matching documents. For a BooleanQuery with two <code>SHOULD</code> 
  +     * subqueries, at least one of the queries must appear in the matching documents. */
  +    public static final Occur SHOULD = new Occur("SHOULD");
  +    /** Use this operator for terms that <i>must not</i> appear in the matching documents.
  +     * Note that it is not possible to search for queries that only consist
  +     * of a <code>MUST_NOT</code> query. */
  +    public static final Occur MUST_NOT = new Occur("MUST_NOT");
  +    
  +  }
  +
  +  /** The query whose matching documents are combined by the boolean query.
  +   *     @deprecated use {@link #setQuery(Query)} instead */
  +  public Query query;    // TODO: decrease visibility for Lucene 2.0
  +
     /** If true, documents documents which <i>do not</i>
  -    match this sub-query will <i>not</i> match the boolean query. */
  -  public boolean required = false;
  -  /** If true, documents documents which <i>do</i>
  -    match this sub-query will <i>not</i> match the boolean query. */
  -  public boolean prohibited = false;
  +    match this sub-query will <i>not</i> match the boolean query.
  +    @deprecated use {@link #setOccur(BooleanClause.Occur)} instead */
  +  public boolean required = false;  // TODO: decrease visibility for Lucene 2.0
     
  +  /** If true, documents documents which <i>do</i>
  +    match this sub-query will <i>not</i> match the boolean query.
  +    @deprecated use {@link #setOccur(BooleanClause.Occur)} instead */
  +  public boolean prohibited = false;  // TODO: decrease visibility for Lucene 2.0
  +
  +  private Occur occur;
  +
     /** Constructs a BooleanClause with query <code>q</code>, required
  -    <code>r</code> and prohibited <code>p</code>. */ 
  +   * <code>r</code> and prohibited <code>p</code>.
  +   * @deprecated use BooleanClause(Query, Occur) instead
  +   * <ul>
  +   *  <li>For BooleanClause(query, true, false) use BooleanClause(query, BooleanClause.Occur.MUST)
  +   *  <li>For BooleanClause(query, false, false) use BooleanClause(query, BooleanClause.Occur.SHOULD)
  +   *  <li>For BooleanClause(query, false, true) use BooleanClause(query, BooleanClause.Occur.MUST_NOT)
  +   * </ul>
  +   */ 
     public BooleanClause(Query q, boolean r, boolean p) {
  +    // TODO: remove for Lucene 2.0
       query = q;
       required = r;
       prohibited = p;
  +  }
  +
  +  /** Constructs a BooleanClause.
  +  */ 
  +  public BooleanClause(Query query, Occur occur) {
  +    this.query = query;
  +    this.occur = occur;
  +    setFields(occur);
  +  }
  +
  +  public Occur getOccur() {
  +    return occur;
  +  }
  +
  +  public void setOccur(Occur occur) {
  +    this.occur = occur;
  +    setFields(occur);
  +  }
  +
  +  public Query getQuery() {
  +    return query;
  +  }
  +
  +  public void setQuery(Query query) {
  +    this.query = query;
  +  }
  +  
  +  public boolean isProhibited() {
  +    return prohibited;
  +  }
  +
  +  public boolean isRequired() {
  +    return required;
  +  }
  +
  +  private void setFields(Occur occur) {
  +    if (occur == Occur.MUST) {
  +      required = true;
  +      prohibited = false;
  +    } else if (occur == Occur.SHOULD) {
  +      required = false;
  +      prohibited = false;
  +    } else if (occur == Occur.MUST_NOT) {
  +      required = false;
  +      prohibited = true;
  +    } else {
  +      throw new IllegalArgumentException("Unknown operator " + occur);
  +    }
     }
   
     /** Returns true iff <code>o</code> is equal to this. */
  
  
  
  1.25      +39 -24    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.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- BooleanQuery.java	14 May 2004 12:56:29 -0000	1.24
  +++ BooleanQuery.java	27 Aug 2004 20:09:12 -0000	1.25
  @@ -24,7 +24,7 @@
     queries, typically {@link TermQuery}s or {@link PhraseQuery}s.
     */
   public class BooleanQuery extends Query {
  -
  +  
     /**
      * Default value is 1024.  Use <code>org.apache.lucene.maxClauseCount</code>
      * system property to override.
  @@ -65,14 +65,29 @@
      * It is an error to specify a clause as both <code>required</code> and
      * <code>prohibited</code>.
      *
  -   * @see #getMaxClauseCount()
  +   * @deprecated use {@link #add(Query, BooleanClause.Occur)} instead:
  +   * <ul>
  +   *  <li>For add(query, true, false) use add(query, BooleanClause.Occur.MUST)
  +   *  <li>For add(query, false, false) use add(query, BooleanClause.Occur.SHOULD)
  +   *  <li>For add(query, false, true) use add(query, BooleanClause.Occur.MUST_NOT)
  +   * </ul>
      */
     public void add(Query query, boolean required, boolean prohibited) {
       add(new BooleanClause(query, required, prohibited));
     }
   
     /** Adds a clause to a boolean query.
  -    * @see #getMaxClauseCount()
  +   *
  +   * @throws TooManyClauses if the new number of clauses exceeds the maximum clause number
  +   * @see #getMaxClauseCount()
  +   */
  +  public void add(Query query, BooleanClause.Occur occur) {
  +    add(new BooleanClause(query, occur));
  +  }
  +
  +  /** Adds a clause to a boolean query.
  +   * @throws TooManyClauses if the new number of clauses exceeds the maximum clause number
  +   * @see #getMaxClauseCount()
      */
     public void add(BooleanClause clause) {
       if (clauses.size() >= maxClauseCount)
  @@ -94,7 +109,7 @@
         this.searcher = searcher;
         for (int i = 0 ; i < clauses.size(); i++) {
           BooleanClause c = (BooleanClause)clauses.elementAt(i);
  -        weights.add(c.query.createWeight(searcher));
  +        weights.add(c.getQuery().createWeight(searcher));
         }
       }
   
  @@ -106,7 +121,7 @@
         for (int i = 0 ; i < weights.size(); i++) {
           BooleanClause c = (BooleanClause)clauses.elementAt(i);
           Weight w = (Weight)weights.elementAt(i);
  -        if (!c.prohibited)
  +        if (!c.isProhibited())
             sum += w.sumOfSquaredWeights();         // sum sub weights
         }
   
  @@ -121,7 +136,7 @@
         for (int i = 0 ; i < weights.size(); i++) {
           BooleanClause c = (BooleanClause)clauses.elementAt(i);
           Weight w = (Weight)weights.elementAt(i);
  -        if (!c.prohibited)
  +        if (!c.isProhibited())
             w.normalize(norm);
         }
       }
  @@ -137,9 +152,9 @@
         boolean noneBoolean = true;
         for (int i = 0 ; i < weights.size(); i++) {
           BooleanClause c = (BooleanClause)clauses.elementAt(i);
  -        if (!c.required)
  +        if (!c.isRequired())
             allRequired = false;
  -        if (c.query instanceof BooleanQuery)
  +        if (c.getQuery() instanceof BooleanQuery)
             noneBoolean = false;
         }
   
  @@ -164,8 +179,8 @@
           Weight w = (Weight)weights.elementAt(i);
           Scorer subScorer = w.scorer(reader);
           if (subScorer != null)
  -          result.add(subScorer, c.required, c.prohibited);
  -        else if (c.required)
  +          result.add(subScorer, c.isRequired(), c.isProhibited());
  +        else if (c.isRequired())
             return null;
         }
   
  @@ -183,16 +198,16 @@
           BooleanClause c = (BooleanClause)clauses.elementAt(i);
           Weight w = (Weight)weights.elementAt(i);
           Explanation e = w.explain(reader, doc);
  -        if (!c.prohibited) maxCoord++;
  +        if (!c.isProhibited()) maxCoord++;
           if (e.getValue() > 0) {
  -          if (!c.prohibited) {
  +          if (!c.isProhibited()) {
               sumExpl.addDetail(e);
               sum += e.getValue();
               coord++;
             } else {
               return new Explanation(0.0f, "match prohibited");
             }
  -        } else if (c.required) {
  +        } else if (c.isRequired()) {
             return new Explanation(0.0f, "match required");
           }
         }
  @@ -223,12 +238,12 @@
     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
  +      if (!c.isProhibited()) {			  // just return clause
   
  -        Query query = c.query.rewrite(reader);    // rewrite first
  +        Query query = c.getQuery().rewrite(reader);    // rewrite first
   
           if (getBoost() != 1.0f) {                 // incorporate boost
  -          if (query == c.query)                   // if rewrite was no-op
  +          if (query == c.getQuery())                   // if rewrite was no-op
               query = (Query)query.clone();         // then clone before boost
             query.setBoost(getBoost() * query.getBoost());
           }
  @@ -240,12 +255,12 @@
       BooleanQuery clone = null;                    // recursively rewrite
       for (int i = 0 ; i < clauses.size(); i++) {
         BooleanClause c = (BooleanClause)clauses.elementAt(i);
  -      Query query = c.query.rewrite(reader);
  -      if (query != c.query) {                     // clause rewrote: must clone
  +      Query query = c.getQuery().rewrite(reader);
  +      if (query != c.getQuery()) {                     // clause rewrote: must clone
           if (clone == null)
             clone = (BooleanQuery)this.clone();
           clone.clauses.setElementAt
  -          (new BooleanClause(query, c.required, c.prohibited), i);
  +          (new BooleanClause(query, c.getOccur()), i);
         }
       }
       if (clone != null) {
  @@ -270,18 +285,18 @@
   
       for (int i = 0 ; i < clauses.size(); i++) {
         BooleanClause c = (BooleanClause)clauses.elementAt(i);
  -      if (c.prohibited)
  +      if (c.isProhibited())
   	buffer.append("-");
  -      else if (c.required)
  +      else if (c.isRequired())
   	buffer.append("+");
   
  -      Query subQuery = c.query;
  +      Query subQuery = c.getQuery();
         if (subQuery instanceof BooleanQuery) {	  // wrap sub-bools in parens
   	buffer.append("(");
  -	buffer.append(c.query.toString(field));
  +	buffer.append(c.getQuery().toString(field));
   	buffer.append(")");
         } else
  -	buffer.append(c.query.toString(field));
  +	buffer.append(c.getQuery().toString(field));
   
         if (i != clauses.size()-1)
   	buffer.append(" ");
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: lucene-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: lucene-dev-help@jakarta.apache.org