You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by jp...@apache.org on 2015/09/07 15:34:48 UTC

svn commit: r1701621 [2/6] - in /lucene/dev/trunk: lucene/ lucene/core/src/java/org/apache/lucene/search/ lucene/core/src/java/org/apache/lucene/search/payloads/ lucene/core/src/java/org/apache/lucene/search/similarities/ lucene/core/src/java/org/apach...

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/Weight.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/Weight.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/Weight.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/Weight.java Mon Sep  7 13:34:46 2015
@@ -94,8 +94,8 @@ public abstract class Weight {
   /** The value for normalization of contained query clauses (e.g. sum of squared weights). */
   public abstract float getValueForNormalization() throws IOException;
 
-  /** Assigns the query normalization factor and boost from parent queries to this. */
-  public abstract void normalize(float norm, float topLevelBoost);
+  /** Assigns the query normalization factor and boost to this. */
+  public abstract void normalize(float norm, float boost);
 
   /**
    * Returns a {@link Scorer} which can iterate in order over all matching

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/WildcardQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/WildcardQuery.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/WildcardQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/WildcardQuery.java Mon Sep  7 13:34:46 2015
@@ -21,7 +21,6 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.lucene.index.Term;
-import org.apache.lucene.util.ToStringUtils;
 import org.apache.lucene.util.automaton.Automata;
 import org.apache.lucene.util.automaton.Automaton;
 import org.apache.lucene.util.automaton.Operations;
@@ -121,7 +120,6 @@ public class WildcardQuery extends Autom
       buffer.append(":");
     }
     buffer.append(term.text());
-    buffer.append(ToStringUtils.boost(getBoost()));
     return buffer.toString();
   }
 }

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/package-info.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/package-info.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/package-info.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/package-info.java Mon Sep  7 13:34:46 2015
@@ -274,8 +274,8 @@
  *       <li><b>Index-time boost</b> by calling
  *        {@link org.apache.lucene.document.Field#setBoost(float) Field.setBoost()} before a document is 
  *        added to the index.</li>
- *       <li><b>Query-time boost</b> by setting a boost on a query clause, calling
- *        {@link org.apache.lucene.search.Query#setBoost(float) Query.setBoost()}.</li>
+ *       <li><b>Query-time boost</b> by applying a boost to a query by wrapping with
+ *       {@link org.apache.lucene.search.BoostQuery}.</li>
  *    </ul>    
  * <p>Indexing time boosts are pre-processed for storage efficiency and written to
  *    storage for a field as follows:
@@ -366,7 +366,7 @@
  *             <li>{@link org.apache.lucene.search.Query#rewrite(org.apache.lucene.index.IndexReader) rewrite(IndexReader reader)} &mdash; Rewrites queries into primitive queries. Primitive queries are:
  *                 {@link org.apache.lucene.search.TermQuery TermQuery},
  *                 {@link org.apache.lucene.search.BooleanQuery BooleanQuery}, <span
- *                     >and other queries that implement {@link org.apache.lucene.search.Query#createWeight(IndexSearcher,boolean) createWeight(IndexSearcher searcher,boolean)}</span></li>
+ *                     >and other queries that implement {@link org.apache.lucene.search.Query#createWeight(IndexSearcher,boolean) createWeight(IndexSearcher searcher,boolean,float)}</span></li>
  *         </ol>
  * <a name="weightClass"></a>
  * <h3>The Weight Interface</h3>
@@ -389,10 +389,10 @@
  *                 For example, with {@link org.apache.lucene.search.similarities.TFIDFSimilarity Lucene's classic vector-space formula}, this
  *                 is implemented as the sum of squared weights: <code>(idf * boost)<sup>2</sup></code></li>
  *             <li>
- *                 {@link org.apache.lucene.search.Weight#normalize(float,float) normalize(float norm, float topLevelBoost)} &mdash; 
+ *                 {@link org.apache.lucene.search.Weight#normalize(float,float) normalize(float norm, float boost)} &mdash; 
  *                 Performs query normalization: 
  *                 <ul>
- *                 <li><code>topLevelBoost</code>: A query-boost factor from any wrapping queries that should be multiplied into every
+ *                 <li><code>boost</code>: A query-boost factor from any wrapping queries that should be multiplied into every
  *                 document's score. For example, a TermQuery that is wrapped within a BooleanQuery with a boost of <code>5</code> would
  *                 receive this value at this time. This allows the TermQuery (the leaf node in this case) to compute this up-front
  *                 a single time (e.g. by multiplying into the IDF), rather than for every document.</li> 

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadSpanUtil.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadSpanUtil.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadSpanUtil.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadSpanUtil.java Mon Sep  7 13:34:46 2015
@@ -100,11 +100,9 @@ public class PayloadSpanUtil {
       }
 
       SpanNearQuery sp = new SpanNearQuery(clauses, slop, inorder);
-      sp.setBoost(query.getBoost());
       getPayloads(payloads, sp);
     } else if (query instanceof TermQuery) {
       SpanTermQuery stq = new SpanTermQuery(((TermQuery) query).getTerm());
-      stq.setBoost(query.getBoost());
       getPayloads(payloads, stq);
     } else if (query instanceof SpanQuery) {
       getPayloads(payloads, (SpanQuery) query);
@@ -163,7 +161,6 @@ public class PayloadSpanUtil {
 
         SpanNearQuery sp = new SpanNearQuery(clauses, slop + positionGaps,
                                                       inorder);
-        sp.setBoost(query.getBoost());
         getPayloads(payloads, sp);
       }
     }

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/SpanPayloadCheckQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/SpanPayloadCheckQuery.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/SpanPayloadCheckQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/SpanPayloadCheckQuery.java Mon Sep  7 13:34:46 2015
@@ -153,18 +153,10 @@ public class SpanPayloadCheckQuery exten
       buffer.append(';');
     }
     buffer.append(")");
-    buffer.append(ToStringUtils.boost(getBoost()));
     return buffer.toString();
   }
 
   @Override
-  public SpanPayloadCheckQuery clone() {
-    SpanPayloadCheckQuery result = new SpanPayloadCheckQuery((SpanQuery) match.clone(), payloadToMatch);
-    result.setBoost(getBoost());
-    return result;
-  }
-
-  @Override
   public boolean equals(Object o) {
     if (! super.equals(o)) {
       return false;

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/BM25Similarity.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/BM25Similarity.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/BM25Similarity.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/BM25Similarity.java Mon Sep  7 13:34:46 2015
@@ -199,7 +199,7 @@ public class BM25Similarity extends Simi
   }
 
   @Override
-  public final SimWeight computeWeight(float queryBoost, CollectionStatistics collectionStats, TermStatistics... termStats) {
+  public final SimWeight computeWeight(CollectionStatistics collectionStats, TermStatistics... termStats) {
     Explanation idf = termStats.length == 1 ? idfExplain(collectionStats, termStats[0]) : idfExplain(collectionStats, termStats);
 
     float avgdl = avgFieldLength(collectionStats);
@@ -209,7 +209,7 @@ public class BM25Similarity extends Simi
     for (int i = 0; i < cache.length; i++) {
       cache[i] = k1 * ((1 - b) + b * decodeNormValue((byte)i) / avgdl);
     }
-    return new BM25Stats(collectionStats.field(), idf, queryBoost, avgdl, cache);
+    return new BM25Stats(collectionStats.field(), idf, avgdl, cache);
   }
 
   @Override
@@ -260,10 +260,8 @@ public class BM25Similarity extends Simi
     private final Explanation idf;
     /** The average document length. */
     private final float avgdl;
-    /** query's inner boost */
-    private final float queryBoost;
-    /** query's outer boost (only for explain) */
-    private float topLevelBoost;
+    /** query boost */
+    private float boost;
     /** weight (idf * boost) */
     private float weight;
     /** field name, for pulling norms */
@@ -271,26 +269,25 @@ public class BM25Similarity extends Simi
     /** precomputed norm[256] with k1 * ((1 - b) + b * dl / avgdl) */
     private final float cache[];
 
-    BM25Stats(String field, Explanation idf, float queryBoost, float avgdl, float cache[]) {
+    BM25Stats(String field, Explanation idf, float avgdl, float cache[]) {
       this.field = field;
       this.idf = idf;
-      this.queryBoost = queryBoost;
       this.avgdl = avgdl;
       this.cache = cache;
+      normalize(1f, 1f);
     }
 
     @Override
     public float getValueForNormalization() {
       // we return a TF-IDF like normalization to be nice, but we don't actually normalize ourselves.
-      final float queryWeight = idf.getValue() * queryBoost;
-      return queryWeight * queryWeight;
+      return weight * weight;
     }
 
     @Override
-    public void normalize(float queryNorm, float topLevelBoost) {
+    public void normalize(float queryNorm, float boost) {
       // we don't normalize with queryNorm at all, we just capture the top-level boost
-      this.topLevelBoost = topLevelBoost;
-      this.weight = idf.getValue() * queryBoost * topLevelBoost;
+      this.boost = boost;
+      this.weight = idf.getValue() * boost;
     } 
   }
 
@@ -315,7 +312,7 @@ public class BM25Similarity extends Simi
   }
 
   private Explanation explainScore(int doc, Explanation freq, BM25Stats stats, NumericDocValues norms) {
-    Explanation boostExpl = Explanation.match(stats.queryBoost * stats.topLevelBoost, "boost");
+    Explanation boostExpl = Explanation.match(stats.boost, "boost");
     List<Explanation> subs = new ArrayList<>();
     if (boostExpl.getValue() != 1.0f)
       subs.add(boostExpl);

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/BasicStats.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/BasicStats.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/BasicStats.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/BasicStats.java Mon Sep  7 13:34:46 2015
@@ -37,21 +37,16 @@ public class BasicStats extends Similari
   protected long totalTermFreq;
   
   // -------------------------- Boost-related stuff --------------------------
-  
-  /** Query's inner boost. */
-  protected final float queryBoost;
-  /** Any outer query's boost. */
-  protected float topLevelBoost;
+
   /** For most Similarities, the immediate and the top level query boosts are
    * not handled differently. Hence, this field is just the product of the
    * other two. */
-  protected float totalBoost;
+  protected float boost;
   
-  /** Constructor. Sets the query boost. */
-  public BasicStats(String field, float queryBoost) {
+  /** Constructor. */
+  public BasicStats(String field) {
     this.field = field;
-    this.queryBoost = queryBoost;
-    this.totalBoost = queryBoost;
+    normalize(1f, 1f);
   }
   
   // ------------------------- Getter/setter methods -------------------------
@@ -128,19 +123,17 @@ public class BasicStats extends Similari
    * {@link #normalize(float, float)}, etc.
    */
   protected float rawNormalizationValue() {
-    return queryBoost;
+    return boost;
   }
   
-  /** No normalization is done. {@code topLevelBoost} is saved in the object,
-   * however. */
+  /** No normalization is done. {@code boost} is saved in the object, however. */
   @Override
-  public void normalize(float queryNorm, float topLevelBoost) {
-    this.topLevelBoost = topLevelBoost;
-    totalBoost = queryBoost * topLevelBoost;
+  public void normalize(float queryNorm, float boost) {
+    this.boost = boost;
   }
   
   /** Returns the total boost. */
-  public float getTotalBoost() {
-    return totalBoost;
+  public float getBoost() {
+    return boost;
   }
 }

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/DFRSimilarity.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/DFRSimilarity.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/DFRSimilarity.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/DFRSimilarity.java Mon Sep  7 13:34:46 2015
@@ -109,15 +109,15 @@ public class DFRSimilarity extends Simil
   @Override
   protected float score(BasicStats stats, float freq, float docLen) {
     float tfn = normalization.tfn(stats, freq, docLen);
-    return stats.getTotalBoost() *
+    return stats.getBoost() *
         basicModel.score(stats, tfn) * afterEffect.score(stats, tfn);
   }
   
   @Override
   protected void explain(List<Explanation> subs,
       BasicStats stats, int doc, float freq, float docLen) {
-    if (stats.getTotalBoost() != 1.0f) {
-      subs.add(Explanation.match(stats.getTotalBoost(), "boost"));
+    if (stats.getBoost() != 1.0f) {
+      subs.add(Explanation.match(stats.getBoost(), "boost"));
     }
     
     Explanation normExpl = normalization.explain(stats, freq, docLen);

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/IBSimilarity.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/IBSimilarity.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/IBSimilarity.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/IBSimilarity.java Mon Sep  7 13:34:46 2015
@@ -96,7 +96,7 @@ public class IBSimilarity extends Simila
   
   @Override
   protected float score(BasicStats stats, float freq, float docLen) {
-    return stats.getTotalBoost() *
+    return stats.getBoost() *
         distribution.score(
             stats,
             normalization.tfn(stats, freq, docLen),
@@ -106,8 +106,8 @@ public class IBSimilarity extends Simila
   @Override
   protected void explain(
       List<Explanation> subs, BasicStats stats, int doc, float freq, float docLen) {
-    if (stats.getTotalBoost() != 1.0f) {
-      subs.add(Explanation.match(stats.getTotalBoost(), "boost"));
+    if (stats.getBoost() != 1.0f) {
+      subs.add(Explanation.match(stats.getBoost(), "boost"));
     }
     Explanation normExpl = normalization.explain(stats, freq, docLen);
     Explanation lambdaExpl = lambda.explain(stats);

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/LMDirichletSimilarity.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/LMDirichletSimilarity.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/LMDirichletSimilarity.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/LMDirichletSimilarity.java Mon Sep  7 13:34:46 2015
@@ -64,7 +64,7 @@ public class LMDirichletSimilarity exten
   
   @Override
   protected float score(BasicStats stats, float freq, float docLen) {
-    float score = stats.getTotalBoost() * (float)(Math.log(1 + freq /
+    float score = stats.getBoost() * (float)(Math.log(1 + freq /
         (mu * ((LMStats)stats).getCollectionProbability())) +
         Math.log(mu / (docLen + mu)));
     return score > 0.0f ? score : 0.0f;
@@ -73,8 +73,8 @@ public class LMDirichletSimilarity exten
   @Override
   protected void explain(List<Explanation> subs, BasicStats stats, int doc,
       float freq, float docLen) {
-    if (stats.getTotalBoost() != 1.0f) {
-      subs.add(Explanation.match(stats.getTotalBoost(), "boost"));
+    if (stats.getBoost() != 1.0f) {
+      subs.add(Explanation.match(stats.getBoost(), "boost"));
     }
 
     subs.add(Explanation.match(mu, "mu"));

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/LMJelinekMercerSimilarity.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/LMJelinekMercerSimilarity.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/LMJelinekMercerSimilarity.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/LMJelinekMercerSimilarity.java Mon Sep  7 13:34:46 2015
@@ -52,7 +52,7 @@ public class LMJelinekMercerSimilarity e
   
   @Override
   protected float score(BasicStats stats, float freq, float docLen) {
-    return stats.getTotalBoost() *
+    return stats.getBoost() *
         (float)Math.log(1 +
             ((1 - lambda) * freq / docLen) /
             (lambda * ((LMStats)stats).getCollectionProbability()));
@@ -61,8 +61,8 @@ public class LMJelinekMercerSimilarity e
   @Override
   protected void explain(List<Explanation> subs, BasicStats stats, int doc,
       float freq, float docLen) {
-    if (stats.getTotalBoost() != 1.0f) {
-      subs.add(Explanation.match(stats.getTotalBoost(), "boost"));
+    if (stats.getBoost() != 1.0f) {
+      subs.add(Explanation.match(stats.getBoost(), "boost"));
     }
     subs.add(Explanation.match(lambda, "lambda"));
     super.explain(subs, stats, doc, freq, docLen);

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/LMSimilarity.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/LMSimilarity.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/LMSimilarity.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/LMSimilarity.java Mon Sep  7 13:34:46 2015
@@ -54,8 +54,8 @@ public abstract class LMSimilarity exten
   }
   
   @Override
-  protected BasicStats newStats(String field, float queryBoost) {
-    return new LMStats(field, queryBoost);
+  protected BasicStats newStats(String field) {
+    return new LMStats(field);
   }
 
   /**
@@ -108,8 +108,8 @@ public abstract class LMSimilarity exten
     /**
      * Creates LMStats for the provided field and query-time boost
      */
-    public LMStats(String field, float queryBoost) {
-      super(field, queryBoost);
+    public LMStats(String field) {
+      super(field);
     }
     
     /**

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/MultiSimilarity.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/MultiSimilarity.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/MultiSimilarity.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/MultiSimilarity.java Mon Sep  7 13:34:46 2015
@@ -50,10 +50,10 @@ public class MultiSimilarity extends Sim
   }
 
   @Override
-  public SimWeight computeWeight(float queryBoost, CollectionStatistics collectionStats, TermStatistics... termStats) {
+  public SimWeight computeWeight(CollectionStatistics collectionStats, TermStatistics... termStats) {
     SimWeight subStats[] = new SimWeight[sims.length];
     for (int i = 0; i < subStats.length; i++) {
-      subStats[i] = sims[i].computeWeight(queryBoost, collectionStats, termStats);
+      subStats[i] = sims[i].computeWeight(collectionStats, termStats);
     }
     return new MultiStats(subStats);
   }
@@ -120,9 +120,9 @@ public class MultiSimilarity extends Sim
     }
 
     @Override
-    public void normalize(float queryNorm, float topLevelBoost) {
+    public void normalize(float queryNorm, float boost) {
       for (SimWeight stat : subStats) {
-        stat.normalize(queryNorm, topLevelBoost);
+        stat.normalize(queryNorm, boost);
       }
     }
   }

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/PerFieldSimilarityWrapper.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/PerFieldSimilarityWrapper.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/PerFieldSimilarityWrapper.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/PerFieldSimilarityWrapper.java Mon Sep  7 13:34:46 2015
@@ -46,10 +46,10 @@ public abstract class PerFieldSimilarity
   }
 
   @Override
-  public final SimWeight computeWeight(float queryBoost, CollectionStatistics collectionStats, TermStatistics... termStats) {
+  public final SimWeight computeWeight(CollectionStatistics collectionStats, TermStatistics... termStats) {
     PerFieldSimWeight weight = new PerFieldSimWeight();
     weight.delegate = get(collectionStats.field());
-    weight.delegateWeight = weight.delegate.computeWeight(queryBoost, collectionStats, termStats);
+    weight.delegateWeight = weight.delegate.computeWeight(collectionStats, termStats);
     return weight;
   }
 
@@ -74,8 +74,8 @@ public abstract class PerFieldSimilarity
     }
     
     @Override
-    public void normalize(float queryNorm, float topLevelBoost) {
-      delegateWeight.normalize(queryNorm, topLevelBoost);
+    public void normalize(float queryNorm, float boost) {
+      delegateWeight.normalize(queryNorm, boost);
     }
   }
 }

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/Similarity.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/Similarity.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/Similarity.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/Similarity.java Mon Sep  7 13:34:46 2015
@@ -78,7 +78,7 @@ import java.util.Collections;
  * <a name="querytime">Query time</a>
  * At query-time, Queries interact with the Similarity via these steps:
  * <ol>
- *   <li>The {@link #computeWeight(float, CollectionStatistics, TermStatistics...)} method is called a single time,
+ *   <li>The {@link #computeWeight(CollectionStatistics, TermStatistics...)} method is called a single time,
  *       allowing the implementation to compute any statistics (such as IDF, average document length, etc)
  *       across <i>the entire collection</i>. The {@link TermStatistics} and {@link CollectionStatistics} passed in 
  *       already contain all of the raw statistics involved, so a Similarity can freely use any combination
@@ -158,16 +158,15 @@ public abstract class Similarity {
   /**
    * Compute any collection-level weight (e.g. IDF, average document length, etc) needed for scoring a query.
    *
-   * @param queryBoost the query-time boost.
    * @param collectionStats collection-level statistics, such as the number of tokens in the collection.
    * @param termStats term-level statistics, such as the document frequency of a term across the collection.
    * @return SimWeight object with the information this Similarity needs to score a query.
    */
-  public abstract SimWeight computeWeight(float queryBoost, CollectionStatistics collectionStats, TermStatistics... termStats);
+  public abstract SimWeight computeWeight(CollectionStatistics collectionStats, TermStatistics... termStats);
 
   /**
    * Creates a new {@link Similarity.SimScorer} to score matching documents from a segment of the inverted index.
-   * @param weight collection information from {@link #computeWeight(float, CollectionStatistics, TermStatistics...)}
+   * @param weight collection information from {@link #computeWeight(CollectionStatistics, TermStatistics...)}
    * @param context segment of the inverted index to be scored.
    * @return SloppySimScorer for scoring documents across <code>context</code>
    * @throws IOException if there is a low-level I/O error
@@ -243,8 +242,11 @@ public abstract class Similarity {
      * <p>
      * NOTE: a Similarity implementation might not use this normalized value at all,
      * it's not required. However, it's usually a good idea to at least incorporate 
-     * the topLevelBoost (e.g. from an outer BooleanQuery) into its score.
+     * the boost into its score.
+     * <p>
+     * NOTE: If this method is called several times, it behaves as if only the
+     * last call was performed.
      */
-    public abstract void normalize(float queryNorm, float topLevelBoost);
+    public abstract void normalize(float queryNorm, float boost);
   }
 }

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/SimilarityBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/SimilarityBase.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/SimilarityBase.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/SimilarityBase.java Mon Sep  7 13:34:46 2015
@@ -83,18 +83,18 @@ public abstract class SimilarityBase ext
   }
   
   @Override
-  public final SimWeight computeWeight(float queryBoost, CollectionStatistics collectionStats, TermStatistics... termStats) {
+  public final SimWeight computeWeight(CollectionStatistics collectionStats, TermStatistics... termStats) {
     BasicStats stats[] = new BasicStats[termStats.length];
     for (int i = 0; i < termStats.length; i++) {
-      stats[i] = newStats(collectionStats.field(), queryBoost);
+      stats[i] = newStats(collectionStats.field());
       fillBasicStats(stats[i], collectionStats, termStats[i]);
     }
     return stats.length == 1 ? stats[0] : new MultiSimilarity.MultiStats(stats);
   }
   
   /** Factory method to return a custom stats object */
-  protected BasicStats newStats(String field, float queryBoost) {
-    return new BasicStats(field, queryBoost);
+  protected BasicStats newStats(String field) {
+    return new BasicStats(field);
   }
   
   /** Fills all member fields defined in {@code BasicStats} in {@code stats}. 

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/TFIDFSimilarity.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/TFIDFSimilarity.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/TFIDFSimilarity.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/similarities/TFIDFSimilarity.java Mon Sep  7 13:34:46 2015
@@ -414,7 +414,7 @@ import org.apache.lucene.util.BytesRef;
  *        <tr>
  *          <td valign="middle" align="right" rowspan="1">
  *            {@link org.apache.lucene.search.Weight#getValueForNormalization() sumOfSquaredWeights} &nbsp; = &nbsp;
- *            {@link org.apache.lucene.search.Query#getBoost() q.getBoost()} <sup><big>2</big></sup>
+ *            {@link org.apache.lucene.search.BoostQuery#getBoost() q.getBoost()} <sup><big>2</big></sup>
  *            &nbsp;&middot;&nbsp;
  *          </td>
  *          <td valign="bottom" align="center" rowspan="1" style="text-align: center">
@@ -443,13 +443,13 @@ import org.apache.lucene.util.BytesRef;
  *      is a search time boost of term <i>t</i> in the query <i>q</i> as
  *      specified in the query text
  *      (see <A HREF="{@docRoot}/../queryparser/org/apache/lucene/queryparser/classic/package-summary.html#Boosting_a_Term">query syntax</A>),
- *      or as set by application calls to
- *      {@link org.apache.lucene.search.Query#setBoost(float) setBoost()}.
+ *      or as set by wrapping with
+ *      {@link org.apache.lucene.search.BoostQuery#BoostQuery(org.apache.lucene.search.Query, float) BoostQuery}.
  *      Notice that there is really no direct API for accessing a boost of one term in a multi term query,
  *      but rather multi terms are represented in a query as multi
  *      {@link org.apache.lucene.search.TermQuery TermQuery} objects,
  *      and so the boost of a term in the query is accessible by calling the sub-query
- *      {@link org.apache.lucene.search.Query#getBoost() getBoost()}.
+ *      {@link org.apache.lucene.search.BoostQuery#getBoost() getBoost()}.
  *      <br>&nbsp;<br>
  *    </li>
  *
@@ -684,11 +684,11 @@ public abstract class TFIDFSimilarity ex
   public abstract float scorePayload(int doc, int start, int end, BytesRef payload);
 
   @Override
-  public final SimWeight computeWeight(float queryBoost, CollectionStatistics collectionStats, TermStatistics... termStats) {
+  public final SimWeight computeWeight(CollectionStatistics collectionStats, TermStatistics... termStats) {
     final Explanation idf = termStats.length == 1
     ? idfExplain(collectionStats, termStats[0])
     : idfExplain(collectionStats, termStats);
-    return new IDFStats(collectionStats.field(), idf, queryBoost);
+    return new IDFStats(collectionStats.field(), idf);
   }
 
   @Override
@@ -738,16 +738,15 @@ public abstract class TFIDFSimilarity ex
     /** The idf and its explanation */
     private final Explanation idf;
     private float queryNorm;
+    private float boost;
     private float queryWeight;
-    private final float queryBoost;
     private float value;
     
-    public IDFStats(String field, Explanation idf, float queryBoost) {
+    public IDFStats(String field, Explanation idf) {
       // TODO: Validate?
       this.field = field;
       this.idf = idf;
-      this.queryBoost = queryBoost;
-      this.queryWeight = idf.getValue() * queryBoost; // compute query weight
+      normalize(1f, 1f);
     }
 
     @Override
@@ -757,9 +756,10 @@ public abstract class TFIDFSimilarity ex
     }
 
     @Override
-    public void normalize(float queryNorm, float topLevelBoost) {
-      this.queryNorm = queryNorm * topLevelBoost;
-      queryWeight *= this.queryNorm;              // normalize query weight
+    public void normalize(float queryNorm, float boost) {
+      this.boost = boost;
+      this.queryNorm = queryNorm;
+      queryWeight = queryNorm * boost * idf.getValue();
       value = queryWeight * idf.getValue();         // idf for document
     }
   }  
@@ -767,8 +767,8 @@ public abstract class TFIDFSimilarity ex
   private Explanation explainQuery(IDFStats stats) {
     List<Explanation> subs = new ArrayList<>();
 
-    Explanation boostExpl = Explanation.match(stats.queryBoost, "boost");
-    if (stats.queryBoost != 1.0f)
+    Explanation boostExpl = Explanation.match(stats.boost, "boost");
+    if (stats.boost != 1.0f)
       subs.add(boostExpl);
     subs.add(stats.idf);
 

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/FieldMaskingSpanQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/FieldMaskingSpanQuery.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/FieldMaskingSpanQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/FieldMaskingSpanQuery.java Mon Sep  7 13:34:46 2015
@@ -20,7 +20,6 @@ package org.apache.lucene.search.spans;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.Query;
-import org.apache.lucene.util.ToStringUtils;
 
 import java.io.IOException;
 import java.util.Objects;
@@ -68,9 +67,9 @@ import java.util.Objects;
  * but with the term statistics of the real field. This may lead to exceptions,
  * poor performance, and unexpected scoring behaviour.
  */
-public class FieldMaskingSpanQuery extends SpanQuery {
-  private SpanQuery maskedQuery;
-  private String field;
+public final class FieldMaskingSpanQuery extends SpanQuery {
+  private final SpanQuery maskedQuery;
+  private final String field;
     
   public FieldMaskingSpanQuery(SpanQuery maskedQuery, String maskedField) {
     this.maskedQuery = Objects.requireNonNull(maskedQuery);
@@ -100,15 +99,10 @@ public class FieldMaskingSpanQuery exten
 
     SpanQuery rewritten = (SpanQuery) maskedQuery.rewrite(reader);
     if (rewritten != maskedQuery) {
-      clone = (FieldMaskingSpanQuery) this.clone();
-      clone.maskedQuery = rewritten;
+      return new FieldMaskingSpanQuery(rewritten, field);
     }
 
-    if (clone != null) {
-      return clone;
-    } else {
-      return this;
-    }
+    return super.rewrite(reader);
   }
 
   @Override
@@ -117,7 +111,6 @@ public class FieldMaskingSpanQuery exten
     buffer.append("mask(");
     buffer.append(maskedQuery.toString(field));
     buffer.append(")");
-    buffer.append(ToStringUtils.boost(getBoost()));
     buffer.append(" as ");
     buffer.append(this.field);
     return buffer.toString();

Added: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanBoostQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanBoostQuery.java?rev=1701621&view=auto
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanBoostQuery.java (added)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanBoostQuery.java Mon Sep  7 13:34:46 2015
@@ -0,0 +1,189 @@
+package org.apache.lucene.search.spans;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.TreeMap;
+
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.LeafReaderContext;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.index.TermContext;
+import org.apache.lucene.search.BoostQuery;
+import org.apache.lucene.search.Explanation;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.Scorer;
+
+/**
+ * Counterpart of {@link BoostQuery} for spans.
+ */
+public final class SpanBoostQuery extends SpanQuery {
+
+  /** By default we enclose the wrapped query within parenthesis, but this is
+   *  not required for all queries, so we use a whitelist of queries that don't
+   *  need parenthesis to have a better toString(). */
+  private static final Set<Class<? extends SpanQuery>> NO_PARENS_REQUIRED_QUERIES = Collections.unmodifiableSet(
+      new HashSet<>(Arrays.asList(
+          SpanTermQuery.class,
+          SpanNearQuery.class,
+          SpanOrQuery.class,
+          SpanFirstQuery.class,
+          SpanContainingQuery.class,
+          SpanContainQuery.class,
+          SpanNotQuery.class,
+          SpanWithinQuery.class
+      )));
+
+  private final SpanQuery query;
+  private final float boost;
+
+  /** Sole constructor: wrap {@code query} in such a way that the produced
+   *  scores will be boosted by {@code boost}. */
+  public SpanBoostQuery(SpanQuery query, float boost) {
+    this.query = Objects.requireNonNull(query);
+    this.boost = boost;
+  }
+
+  /**
+   * Return the wrapped {@link SpanQuery}.
+   */
+  public SpanQuery getQuery() {
+    return query;
+  }
+
+  /**
+   * Return the applied boost.
+   */
+  public float getBoost() {
+    return boost;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (super.equals(obj) == false) {
+      return false;
+    }
+    SpanBoostQuery that = (SpanBoostQuery) obj;
+    return query.equals(that.query)
+        && Float.floatToIntBits(boost) == Float.floatToIntBits(that.boost);
+  }
+
+  @Override
+  public int hashCode() {
+    int h = super.hashCode();
+    h = 31 * h + query.hashCode();
+    h = 31 * h + Float.floatToIntBits(boost);
+    return h;
+  }
+
+  @Override
+  public Query rewrite(IndexReader reader) throws IOException {
+    if (boost == 1f) {
+      return query;
+    }
+
+    final SpanQuery rewritten = (SpanQuery) query.rewrite(reader);
+    if (query != rewritten) {
+      return new SpanBoostQuery(rewritten, boost);
+    }
+
+    if (query.getClass() == SpanBoostQuery.class) {
+      SpanBoostQuery in = (SpanBoostQuery) query;
+      return new SpanBoostQuery(in.query, boost * in.boost);
+    }
+
+    return super.rewrite(reader);
+  }
+
+  @Override
+  public String toString(String field) {
+    boolean needsParens = NO_PARENS_REQUIRED_QUERIES.contains(query.getClass()) == false;
+    StringBuilder builder = new StringBuilder();
+    if (needsParens) {
+      builder.append("(");
+    }
+    builder.append(query.toString(field));
+    if (needsParens) {
+      builder.append(")");
+    }
+    builder.append("^");
+    builder.append(boost);
+    return builder.toString();
+  }
+
+  @Override
+  public String getField() {
+    return query.getField();
+  }
+
+  @Override
+  public SpanWeight createWeight(IndexSearcher searcher, boolean needsScores) throws IOException {
+    final SpanWeight weight = query.createWeight(searcher, needsScores);
+    if (needsScores == false) {
+      return weight;
+    }
+    Map<Term, TermContext> terms = new TreeMap<>();
+    weight.extractTermContexts(terms);
+    weight.normalize(1f, boost);
+    return new SpanWeight(this, searcher, terms) {
+      
+      @Override
+      public void extractTerms(Set<Term> terms) {
+        weight.extractTerms(terms);
+      }
+
+      @Override
+      public Explanation explain(LeafReaderContext context, int doc) throws IOException {
+        return weight.explain(context, doc);
+      }
+
+      @Override
+      public float getValueForNormalization() throws IOException {
+        return weight.getValueForNormalization();
+      }
+
+      @Override
+      public void normalize(float norm, float boost) {
+        weight.normalize(norm, SpanBoostQuery.this.boost * boost);
+      }
+      
+      @Override
+      public Spans getSpans(LeafReaderContext ctx, Postings requiredPostings) throws IOException {
+        return weight.getSpans(ctx, requiredPostings);
+      }
+
+      @Override
+      public Scorer scorer(LeafReaderContext context) throws IOException {
+        return weight.scorer(context);
+      }
+
+      @Override
+      public void extractTermContexts(Map<Term,TermContext> contexts) {
+        weight.extractTermContexts(contexts);
+      }
+    };
+  }
+
+}

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanContainQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanContainQuery.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanContainQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanContainQuery.java Mon Sep  7 13:34:46 2015
@@ -35,7 +35,7 @@ abstract class SpanContainQuery extends
   SpanQuery big;
   SpanQuery little;
 
-  SpanContainQuery(SpanQuery big, SpanQuery little, float boost) {
+  SpanContainQuery(SpanQuery big, SpanQuery little) {
     this.big = Objects.requireNonNull(big);
     this.little = Objects.requireNonNull(little);
     Objects.requireNonNull(big.getField());
@@ -43,7 +43,6 @@ abstract class SpanContainQuery extends
     if (! big.getField().equals(little.getField())) {
       throw new IllegalArgumentException("big and little not same field");
     }
-    this.setBoost(boost);
   }
 
   @Override
@@ -105,22 +104,20 @@ abstract class SpanContainQuery extends
   }
 
   @Override
-  public abstract SpanContainQuery clone();
-
-  @Override
   public Query rewrite(IndexReader reader) throws IOException {
-    SpanContainQuery clone = null;
     SpanQuery rewrittenBig = (SpanQuery) big.rewrite(reader);
-    if (rewrittenBig != big) {
-      clone = this.clone();
-      clone.big = rewrittenBig;
-    }
     SpanQuery rewrittenLittle = (SpanQuery) little.rewrite(reader);
-    if (rewrittenLittle != little) {
-      if (clone == null) clone = this.clone();
-      clone.little = rewrittenLittle;
+    if (big != rewrittenBig || little != rewrittenLittle) {
+      try {
+        SpanContainQuery clone = (SpanContainQuery) super.clone();
+        clone.big = rewrittenBig;
+        clone.little = rewrittenLittle;
+        return clone;
+      } catch (CloneNotSupportedException e) {
+        throw new AssertionError(e);
+      }
     }
-    return (clone != null) ? clone : this;
+    return super.rewrite(reader);
   }
 
   @Override

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanContainingQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanContainingQuery.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanContainingQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanContainingQuery.java Mon Sep  7 13:34:46 2015
@@ -21,21 +21,20 @@ import org.apache.lucene.index.LeafReade
 import org.apache.lucene.index.Term;
 import org.apache.lucene.index.TermContext;
 import org.apache.lucene.search.IndexSearcher;
-import org.apache.lucene.util.Bits;
 
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Map;
 
 /** Keep matches that contain another Spans. */
-public class SpanContainingQuery extends SpanContainQuery {
+public final class SpanContainingQuery extends SpanContainQuery {
   /** Construct a SpanContainingQuery matching spans from <code>big</code>
    * that contain at least one spans from <code>little</code>.
    * This query has the boost of <code>big</code>.
    * <code>big</code> and <code>little</code> must be in the same field.
    */
   public SpanContainingQuery(SpanQuery big, SpanQuery little) {
-    super(big, little, big.getBoost());
+    super(big, little);
   }
 
   @Override
@@ -44,13 +43,6 @@ public class SpanContainingQuery extends
   }
 
   @Override
-  public SpanContainingQuery clone() {
-    return new SpanContainingQuery(
-          (SpanQuery) big.clone(),
-          (SpanQuery) little.clone());
-  }
-
-  @Override
   public SpanWeight createWeight(IndexSearcher searcher, boolean needsScores) throws IOException {
     SpanWeight bigWeight = big.createWeight(searcher, false);
     SpanWeight littleWeight = little.createWeight(searcher, false);

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanFirstQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanFirstQuery.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanFirstQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanFirstQuery.java Mon Sep  7 13:34:46 2015
@@ -18,7 +18,6 @@ package org.apache.lucene.search.spans;
  */
 
 import org.apache.lucene.search.spans.FilterSpans.AcceptStatus;
-import org.apache.lucene.util.ToStringUtils;
 
 import java.io.IOException;
 
@@ -54,15 +53,7 @@ public class SpanFirstQuery extends Span
     buffer.append(", ");
     buffer.append(end);
     buffer.append(")");
-    buffer.append(ToStringUtils.boost(getBoost()));
     return buffer.toString();
   }
 
-  @Override
-  public SpanFirstQuery clone() {
-    SpanFirstQuery spanFirstQuery = new SpanFirstQuery((SpanQuery) match.clone(), end);
-    spanFirstQuery.setBoost(getBoost());
-    return spanFirstQuery;
-  }
-
 }

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanMultiTermQueryWrapper.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanMultiTermQueryWrapper.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanMultiTermQueryWrapper.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanMultiTermQueryWrapper.java Mon Sep  7 13:34:46 2015
@@ -114,10 +114,6 @@ public class SpanMultiTermQueryWrapper<Q
     String queryStr = query.toString(field);
     builder.append(queryStr);
     builder.append(")");
-    if (getBoost() != 1F) {
-      builder.append('^');
-      builder.append(getBoost());
-    }
     return builder.toString();
   }
 
@@ -126,7 +122,6 @@ public class SpanMultiTermQueryWrapper<Q
     final Query q = query.rewrite(reader);
     if (!(q instanceof SpanQuery))
       throw new UnsupportedOperationException("You can only use SpanMultiTermQueryWrapper with a suitable SpanRewriteMethod.");
-    q.setBoost(q.getBoost() * getBoost()); // multiply boost
     return q;
   }
   
@@ -179,7 +174,6 @@ public class SpanMultiTermQueryWrapper<Q
       @Override
       protected void addClause(SpanOrQuery topLevel, Term term, int docCount, float boost, TermContext states) {
         final SpanTermQuery q = new SpanTermQuery(term, states);
-        q.setBoost(boost);
         topLevel.addClause(q);
       }
     };
@@ -228,7 +222,6 @@ public class SpanMultiTermQueryWrapper<Q
         @Override
         protected void addClause(SpanOrQuery topLevel, Term term, int docFreq, float boost, TermContext states) {
           final SpanTermQuery q = new SpanTermQuery(term, states);
-          q.setBoost(boost);
           topLevel.addClause(q);
         }
       };

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanNearQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanNearQuery.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanNearQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanNearQuery.java Mon Sep  7 13:34:46 2015
@@ -173,7 +173,6 @@ public class SpanNearQuery extends SpanQ
     buffer.append(", ");
     buffer.append(inOrder);
     buffer.append(")");
-    buffer.append(ToStringUtils.boost(getBoost()));
     return buffer.toString();
   }
 
@@ -235,34 +234,24 @@ public class SpanNearQuery extends SpanQ
 
   @Override
   public Query rewrite(IndexReader reader) throws IOException {
-    SpanNearQuery clone = null;
+    boolean actuallyRewritten = false;
+    List<SpanQuery> rewrittenClauses = new ArrayList<>();
     for (int i = 0 ; i < clauses.size(); i++) {
       SpanQuery c = clauses.get(i);
       SpanQuery query = (SpanQuery) c.rewrite(reader);
-      if (query != c) {                     // clause rewrote: must clone
-        if (clone == null)
-          clone = this.clone();
-        clone.clauses.set(i,query);
-      }
+      actuallyRewritten |= query != c;
+      rewrittenClauses.add(query);
     }
-    if (clone != null) {
-      return clone; // some clauses rewrote
-    } else {
-      return this; // no clauses rewrote
+    if (actuallyRewritten) {
+      try {
+        SpanNearQuery rewritten = (SpanNearQuery) clone();
+        rewritten.clauses = rewrittenClauses;
+        return rewritten;
+      } catch (CloneNotSupportedException e) {
+        throw new AssertionError(e);
+      }
     }
-  }
-
-  @Override
-  public SpanNearQuery clone() {
-    int sz = clauses.size();
-    SpanQuery[] newClauses = new SpanQuery[sz];
-
-    for (int i = 0; i < sz; i++) {
-      newClauses[i] = (SpanQuery) clauses.get(i).clone();
-    }
-    SpanNearQuery spanNearQuery = new SpanNearQuery(newClauses, slop, inOrder);
-    spanNearQuery.setBoost(getBoost());
-    return spanNearQuery;
+    return super.rewrite(reader);
   }
 
   /** Returns true iff <code>o</code> is equal to this. */

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanNotQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanNotQuery.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanNotQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanNotQuery.java Mon Sep  7 13:34:46 2015
@@ -35,7 +35,7 @@ import java.util.Set;
 /** Removes matches which overlap with another SpanQuery or which are
  * within x tokens before or y tokens after another SpanQuery.
  */
-public class SpanNotQuery extends SpanQuery implements Cloneable {
+public final class SpanNotQuery extends SpanQuery {
   private SpanQuery include;
   private SpanQuery exclude;
   private final int pre;
@@ -89,17 +89,9 @@ public class SpanNotQuery extends SpanQu
     buffer.append(", ");
     buffer.append(Integer.toString(post));
     buffer.append(")");
-    buffer.append(ToStringUtils.boost(getBoost()));
     return buffer.toString();
   }
 
-  @Override
-  public SpanNotQuery clone() {
-    SpanNotQuery spanNotQuery = new SpanNotQuery((SpanQuery) include.clone(),
-                                                                (SpanQuery) exclude.clone(), pre, post);
-    spanNotQuery.setBoost(getBoost());
-    return spanNotQuery;
-  }
 
   @Override
   public SpanWeight createWeight(IndexSearcher searcher, boolean needsScores) throws IOException {
@@ -200,24 +192,12 @@ public class SpanNotQuery extends SpanQu
 
   @Override
   public Query rewrite(IndexReader reader) throws IOException {
-    SpanNotQuery clone = null;
-
     SpanQuery rewrittenInclude = (SpanQuery) include.rewrite(reader);
-    if (rewrittenInclude != include) {
-      clone = this.clone();
-      clone.include = rewrittenInclude;
-    }
     SpanQuery rewrittenExclude = (SpanQuery) exclude.rewrite(reader);
-    if (rewrittenExclude != exclude) {
-      if (clone == null) clone = this.clone();
-      clone.exclude = rewrittenExclude;
-    }
-
-    if (clone != null) {
-      return clone;                        // some clauses rewrote
-    } else {
-      return this;                         // no clauses rewrote
+    if (rewrittenInclude != include || rewrittenExclude != exclude) {
+      return new SpanNotQuery(rewrittenInclude, rewrittenExclude);
     }
+    return super.rewrite(reader);
   }
 
     /** Returns true iff <code>o</code> is equal to this. */

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanOrQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanOrQuery.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanOrQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanOrQuery.java Mon Sep  7 13:34:46 2015
@@ -27,7 +27,6 @@ import org.apache.lucene.search.Disjunct
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.TwoPhaseIterator;
-import org.apache.lucene.util.ToStringUtils;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -39,7 +38,7 @@ import java.util.Set;
 
 /** Matches the union of its clauses.
  */
-public class SpanOrQuery extends SpanQuery implements Cloneable {
+public final class SpanOrQuery extends SpanQuery {
   private List<SpanQuery> clauses;
   private String field;
 
@@ -72,35 +71,19 @@ public class SpanOrQuery extends SpanQue
   public String getField() { return field; }
 
   @Override
-  public SpanOrQuery clone() {
-    int sz = clauses.size();
-    SpanQuery[] newClauses = new SpanQuery[sz];
-
-    for (int i = 0; i < sz; i++) {
-      newClauses[i] = (SpanQuery) clauses.get(i).clone();
-    }
-    SpanOrQuery soq = new SpanOrQuery(newClauses);
-    soq.setBoost(getBoost());
-    return soq;
-  }
-
-  @Override
   public Query rewrite(IndexReader reader) throws IOException {
-    SpanOrQuery clone = null;
+    SpanOrQuery rewritten = new SpanOrQuery();
+    boolean actuallyRewritten = false;
     for (int i = 0 ; i < clauses.size(); i++) {
       SpanQuery c = clauses.get(i);
       SpanQuery query = (SpanQuery) c.rewrite(reader);
-      if (query != c) {                     // clause rewrote: must clone
-        if (clone == null)
-          clone = this.clone();
-        clone.clauses.set(i,query);
-      }
+      actuallyRewritten |= query != c;
+      rewritten.addClause(query);
     }
-    if (clone != null) {
-      return clone;                        // some clauses rewrote
-    } else {
-      return this;                         // no clauses rewrote
+    if (actuallyRewritten) {
+      return rewritten;
     }
+    return super.rewrite(reader);
   }
 
   @Override
@@ -116,7 +99,6 @@ public class SpanOrQuery extends SpanQue
       }
     }
     buffer.append("])");
-    buffer.append(ToStringUtils.boost(getBoost()));
     return buffer.toString();
   }
 

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanPositionCheckQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanPositionCheckQuery.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanPositionCheckQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanPositionCheckQuery.java Mon Sep  7 13:34:46 2015
@@ -106,19 +106,18 @@ public abstract class SpanPositionCheckQ
 
   @Override
   public Query rewrite(IndexReader reader) throws IOException {
-    SpanPositionCheckQuery clone = null;
-
     SpanQuery rewritten = (SpanQuery) match.rewrite(reader);
     if (rewritten != match) {
-      clone = (SpanPositionCheckQuery) this.clone();
-      clone.match = rewritten;
+      try {
+        SpanPositionCheckQuery clone = (SpanPositionCheckQuery) this.clone();
+        clone.match = rewritten;
+        return clone;
+      } catch (CloneNotSupportedException e) {
+        throw new AssertionError(e);
+      }
     }
 
-    if (clone != null) {
-      return clone;                        // some clauses rewrote
-    } else {
-      return this;                         // no clauses rewrote
-    }
+    return super.rewrite(reader);
   }
 
   /** Returns true iff <code>o</code> is equal to this. */

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanPositionRangeQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanPositionRangeQuery.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanPositionRangeQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanPositionRangeQuery.java Mon Sep  7 13:34:46 2015
@@ -18,7 +18,6 @@ package org.apache.lucene.search.spans;
 
 
 import org.apache.lucene.search.spans.FilterSpans.AcceptStatus;
-import org.apache.lucene.util.ToStringUtils;
 
 import java.io.IOException;
 
@@ -70,18 +69,10 @@ public class SpanPositionRangeQuery exte
     buffer.append(", ").append(start).append(", ");
     buffer.append(end);
     buffer.append(")");
-    buffer.append(ToStringUtils.boost(getBoost()));
     return buffer.toString();
   }
 
   @Override
-  public SpanPositionRangeQuery clone() {
-    SpanPositionRangeQuery result = new SpanPositionRangeQuery((SpanQuery) match.clone(), start, end);
-    result.setBoost(getBoost());
-    return result;
-  }
-
-  @Override
   public boolean equals(Object o) {
     if (! super.equals(o)) {
       return false;

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanTermQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanTermQuery.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanTermQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanTermQuery.java Mon Sep  7 13:34:46 2015
@@ -129,7 +129,6 @@ public class SpanTermQuery extends SpanQ
       buffer.append(term.text());
     else
       buffer.append(term.toString());
-    buffer.append(ToStringUtils.boost(getBoost()));
     return buffer.toString();
   }
 

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanWeight.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanWeight.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanWeight.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanWeight.java Mon Sep  7 13:34:46 2015
@@ -101,7 +101,7 @@ public abstract class SpanWeight extends
       i++;
     }
     CollectionStatistics collectionStats = searcher.collectionStatistics(query.getField());
-    return searcher.getSimilarity(true).computeWeight(query.getBoost(), collectionStats, termStats);
+    return searcher.getSimilarity(true).computeWeight(collectionStats, termStats);
   }
 
   /**
@@ -124,9 +124,9 @@ public abstract class SpanWeight extends
   }
 
   @Override
-  public void normalize(float queryNorm, float topLevelBoost) {
+  public void normalize(float queryNorm, float boost) {
     if (simWeight != null) {
-      simWeight.normalize(queryNorm, topLevelBoost);
+      simWeight.normalize(queryNorm, boost);
     }
   }
 

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanWithinQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanWithinQuery.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanWithinQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanWithinQuery.java Mon Sep  7 13:34:46 2015
@@ -27,7 +27,7 @@ import java.util.ArrayList;
 import java.util.Map;
 
 /** Keep matches that are contained within another Spans. */
-public class SpanWithinQuery extends SpanContainQuery {
+public final class SpanWithinQuery extends SpanContainQuery {
 
   /** Construct a SpanWithinQuery matching spans from <code>little</code>
    * that are inside of <code>big</code>.
@@ -35,7 +35,7 @@ public class SpanWithinQuery extends Spa
    * <code>big</code> and <code>little</code> must be in the same field.
    */
   public SpanWithinQuery(SpanQuery big, SpanQuery little) {
-    super(big, little, little.getBoost());
+    super(big, little);
   }
 
   @Override
@@ -44,13 +44,6 @@ public class SpanWithinQuery extends Spa
   }
 
   @Override
-  public SpanWithinQuery clone() {
-    return new SpanWithinQuery(
-          (SpanQuery) big.clone(),
-          (SpanQuery) little.clone());
-  }
-
-  @Override
   public SpanWeight createWeight(IndexSearcher searcher, boolean needsScores) throws IOException {
     SpanWeight bigWeight = big.createWeight(searcher, false);
     SpanWeight littleWeight = little.createWeight(searcher, false);

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/ToStringUtils.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/ToStringUtils.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/ToStringUtils.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/ToStringUtils.java Mon Sep  7 13:34:46 2015
@@ -24,15 +24,6 @@ public final class ToStringUtils {
 
   private ToStringUtils() {} // no instance
 
-  /**
-   * for printing boost only if not 1.0
-   */
-  public static String boost(float boost) {
-    if (boost != 1.0f) {
-      return "^" + Float.toString(boost);
-    } else return "";
-  }
-
   public static void byteArray(StringBuilder buffer, byte[] bytes) {
     for (int i = 0; i < bytes.length; i++) {
       buffer.append("b[").append(i).append("]=").append(bytes[i]);

Modified: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/TestSearch.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/TestSearch.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/TestSearch.java (original)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/TestSearch.java Mon Sep  7 13:34:46 2015
@@ -34,9 +34,8 @@ import org.apache.lucene.search.*;
 public class TestSearch extends LuceneTestCase {
 
   public void testNegativeQueryBoost() throws Exception {
-    Query q = new TermQuery(new Term("foo", "bar"));
-    q.setBoost(-42f);
-    assertEquals(-42f, q.getBoost(), 0.0f);
+    BoostQuery q = new BoostQuery(new TermQuery(new Term("foo", "bar")), -42f);
+    assertEquals(-42f, q.getBoost(), 0f);
 
     Directory directory = newDirectory();
     try {

Modified: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestCustomNorms.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestCustomNorms.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestCustomNorms.java (original)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestCustomNorms.java Mon Sep  7 13:34:46 2015
@@ -110,7 +110,7 @@ public class TestCustomNorms extends Luc
     }
     
     @Override
-    public SimWeight computeWeight(float queryBoost, CollectionStatistics collectionStats, TermStatistics... termStats) {
+    public SimWeight computeWeight(CollectionStatistics collectionStats, TermStatistics... termStats) {
       throw new UnsupportedOperationException();
     }
 

Modified: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestNorms.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestNorms.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestNorms.java (original)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestNorms.java Mon Sep  7 13:34:46 2015
@@ -187,7 +187,7 @@ public class TestNorms extends LuceneTes
     }
 
     @Override
-    public SimWeight computeWeight(float queryBoost, CollectionStatistics collectionStats, TermStatistics... termStats) {
+    public SimWeight computeWeight(CollectionStatistics collectionStats, TermStatistics... termStats) {
       throw new UnsupportedOperationException();
     }
 

Modified: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestUniqueTermCount.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestUniqueTermCount.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestUniqueTermCount.java (original)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestUniqueTermCount.java Mon Sep  7 13:34:46 2015
@@ -105,7 +105,7 @@ public class TestUniqueTermCount extends
     }
 
     @Override
-    public SimWeight computeWeight(float queryBoost, CollectionStatistics collectionStats, TermStatistics... termStats) {
+    public SimWeight computeWeight(CollectionStatistics collectionStats, TermStatistics... termStats) {
       throw new UnsupportedOperationException();
     }
 

Modified: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/JustCompileSearch.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/JustCompileSearch.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/JustCompileSearch.java (original)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/JustCompileSearch.java Mon Sep  7 13:34:46 2015
@@ -224,7 +224,7 @@ final class JustCompileSearch {
   static final class JustCompileSimilarity extends Similarity {
 
     @Override
-    public SimWeight computeWeight(float queryBoost, CollectionStatistics collectionStats, TermStatistics... termStats) {
+    public SimWeight computeWeight(CollectionStatistics collectionStats, TermStatistics... termStats) {
       throw new UnsupportedOperationException(UNSUPPORTED_MSG);
     }
 

Modified: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestBooleanCoord.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestBooleanCoord.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestBooleanCoord.java (original)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestBooleanCoord.java Mon Sep  7 13:34:46 2015
@@ -84,7 +84,7 @@ public class TestBooleanCoord extends Lu
       }
 
       @Override
-      public SimWeight computeWeight(float queryBoost, CollectionStatistics collectionStats, TermStatistics... termStats) {
+      public SimWeight computeWeight(CollectionStatistics collectionStats, TermStatistics... termStats) {
         return new SimWeight() {
           @Override
           public float getValueForNormalization() {

Modified: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestBooleanQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestBooleanQuery.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestBooleanQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestBooleanQuery.java Mon Sep  7 13:34:46 2015
@@ -102,8 +102,7 @@ public class TestBooleanQuery extends Lu
 
     // LUCENE-2617: make sure that a term not in the index still contributes to the score via coord factor
     float score = s.search(q.build(), 10).getMaxScore();
-    Query subQuery = new TermQuery(new Term("field", "not_in_index"));
-    subQuery.setBoost(0);
+    Query subQuery = new BoostQuery(new TermQuery(new Term("field", "not_in_index")), 0f);
     q.add(subQuery, BooleanClause.Occur.SHOULD);
     float score2 = s.search(q.build(), 10).getMaxScore();
     assertEquals(score*.5F, score2, 1e-6);
@@ -114,14 +113,12 @@ public class TestBooleanQuery extends Lu
       qq.add(clause);
     }
     PhraseQuery phrase = new PhraseQuery("field", "not_in_index", "another_not_in_index");
-    phrase.setBoost(0);
-    qq.add(phrase, BooleanClause.Occur.SHOULD);
+    qq.add(new BoostQuery(phrase, 0f), BooleanClause.Occur.SHOULD);
     score2 = s.search(qq.build(), 10).getMaxScore();
     assertEquals(score*(1/3F), score2, 1e-6);
 
     // now test BooleanScorer2
-    subQuery = new TermQuery(new Term("field", "b"));
-    subQuery.setBoost(0);
+    subQuery = new BoostQuery(new TermQuery(new Term("field", "b")), 0f);
     q.add(subQuery, BooleanClause.Occur.MUST);
     score2 = s.search(q.build(), 10).getMaxScore();
     assertEquals(score*(2/3F), score2, 1e-6);
@@ -334,7 +331,6 @@ public class TestBooleanQuery extends Lu
   }
 
   public void testOneClauseRewriteOptimization() throws Exception {
-    final float BOOST = 3.5F;
     final String FIELD = "content";
     final String VALUE = "foo";
 
@@ -343,29 +339,20 @@ public class TestBooleanQuery extends Lu
     IndexReader r = DirectoryReader.open(dir);
 
     TermQuery expected = new TermQuery(new Term(FIELD, VALUE));
-    expected.setBoost(BOOST);
 
     final int numLayers = atLeast(3);
-    boolean needBoost = true;
     Query actual = new TermQuery(new Term(FIELD, VALUE));
 
     for (int i = 0; i < numLayers; i++) {
-      if (needBoost && 0 == TestUtil.nextInt(random(),0,numLayers)) {
-        needBoost = false;
-        actual.setBoost(BOOST);
-      }
 
       BooleanQuery.Builder bq = new BooleanQuery.Builder();
       bq.add(actual, random().nextBoolean()
              ? BooleanClause.Occur.SHOULD : BooleanClause.Occur.MUST);
       actual = bq.build();
     }
-    if (needBoost) {
-      actual.setBoost(BOOST);
-    }
 
     assertEquals(numLayers + ": " + actual.toString(),
-                 expected, actual.rewrite(r));
+                 expected, new IndexSearcher(r).rewrite(actual));
 
     r.close();
     dir.close();
@@ -462,7 +449,6 @@ public class TestBooleanQuery extends Lu
     }
     bq2Builder.setMinimumNumberShouldMatch(bq.getMinimumNumberShouldMatch());
     BooleanQuery bq2 = bq2Builder.build();
-    bq2.setBoost(bq.getBoost());
 
     final AtomicBoolean matched = new AtomicBoolean();
     searcher.search(bq, new SimpleCollector() {
@@ -515,7 +501,6 @@ public class TestBooleanQuery extends Lu
 
     BooleanQuery.Builder qBuilder = new BooleanQuery.Builder();
     BooleanQuery q = qBuilder.build();
-    q.setBoost(random().nextFloat());
     qBuilder.add(new TermQuery(new Term("field", "a")), Occur.FILTER);
 
     // With a single clause, we will rewrite to the underlying
@@ -526,7 +511,6 @@ public class TestBooleanQuery extends Lu
     // Make sure it returns null scores
     qBuilder.add(new TermQuery(new Term("field", "b")), Occur.FILTER);
     q = qBuilder.build();
-    q.setBoost(random().nextFloat());
     assertSameScoresWithoutFilters(searcher, q);
 
     // Now with a scoring clause, we need to make sure that
@@ -534,7 +518,6 @@ public class TestBooleanQuery extends Lu
     // query
     qBuilder.add(new TermQuery(new Term("field", "c")), Occur.SHOULD);
     q = qBuilder.build();
-    q.setBoost(random().nextFloat());
     assertSameScoresWithoutFilters(searcher, q);
 
     // FILTER and empty SHOULD
@@ -542,7 +525,6 @@ public class TestBooleanQuery extends Lu
     qBuilder.add(new TermQuery(new Term("field", "a")), Occur.FILTER);
     qBuilder.add(new TermQuery(new Term("field", "e")), Occur.SHOULD);
     q = qBuilder.build();
-    q.setBoost(random().nextFloat());
     assertSameScoresWithoutFilters(searcher, q);
 
     // mix of FILTER and MUST
@@ -550,7 +532,6 @@ public class TestBooleanQuery extends Lu
     qBuilder.add(new TermQuery(new Term("field", "a")), Occur.FILTER);
     qBuilder.add(new TermQuery(new Term("field", "d")), Occur.MUST);
     q = qBuilder.build();
-    q.setBoost(random().nextFloat());
     assertSameScoresWithoutFilters(searcher, q);
 
     // FILTER + minShouldMatch
@@ -560,7 +541,6 @@ public class TestBooleanQuery extends Lu
     qBuilder.add(new TermQuery(new Term("field", "d")), Occur.SHOULD);
     qBuilder.setMinimumNumberShouldMatch(1);
     q = qBuilder.build();
-    q.setBoost(random().nextFloat());
     assertSameScoresWithoutFilters(searcher, q);
 
     reader.close();
@@ -585,8 +565,8 @@ public class TestBooleanQuery extends Lu
 
     // Single clauses rewrite to a term query
     final Query rewritten1 = query1.build().rewrite(reader);
-    assertTrue(rewritten1 instanceof ConstantScoreQuery);
-    assertEquals(0f, rewritten1.getBoost(), 0f);
+    assertTrue(rewritten1 instanceof BoostQuery);
+    assertEquals(0f, ((BoostQuery) rewritten1).getBoost(), 0f);
 
     // When there are two clauses, we cannot rewrite, but if one of them creates
     // a null scorer we will end up with a single filter scorer and will need to

Added: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestBoostQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestBoostQuery.java?rev=1701621&view=auto
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestBoostQuery.java (added)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestBoostQuery.java Mon Sep  7 13:34:46 2015
@@ -0,0 +1,70 @@
+package org.apache.lucene.search;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.index.MultiReader;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.search.BooleanClause.Occur;
+import org.apache.lucene.util.LuceneTestCase;
+
+public class TestBoostQuery extends LuceneTestCase {
+
+  public void testEquals() {
+    final float boost = random().nextFloat() * 3 - 1;
+    BoostQuery q1 = new BoostQuery(new MatchAllDocsQuery(), boost);
+    BoostQuery q2 = new BoostQuery(new MatchAllDocsQuery(), boost);
+    assertEquals(q1, q2);
+    assertEquals(q1.getBoost(), q2.getBoost(), 0f);
+
+    float boost2 = boost;
+    while (boost == boost2) {
+      boost2 = random().nextFloat() * 3 - 1;
+    }
+    BoostQuery q3 = new BoostQuery(new MatchAllDocsQuery(), boost2);
+    assertFalse(q1.equals(q3));
+    assertFalse(q1.hashCode() == q3.hashCode());
+  }
+
+  public void testToString() {
+    assertEquals("foo:bar^2.0", new BoostQuery(new TermQuery(new Term("foo", "bar")), 2).toString());
+    BooleanQuery bq = new BooleanQuery.Builder()
+        .add(new TermQuery(new Term("foo", "bar")), Occur.SHOULD)
+        .add(new TermQuery(new Term("foo", "baz")), Occur.SHOULD)
+        .build();
+    assertEquals("(foo:bar foo:baz)^2.0", new BoostQuery(bq, 2).toString());
+  }
+
+  public void testRewrite() throws IOException {
+    IndexSearcher searcher = new IndexSearcher(new MultiReader());
+
+    // inner queries are rewritten
+    Query q = new BoostQuery(new MatchNoDocsQuery(), 2);
+    assertEquals(new BoostQuery(new BooleanQuery.Builder().build(), 2), searcher.rewrite(q));
+
+    // boosts are merged
+    q = new BoostQuery(new BoostQuery(new MatchAllDocsQuery(), 3), 2);
+    assertEquals(new BoostQuery(new MatchAllDocsQuery(), 6), searcher.rewrite(q));
+
+    // scores are not computed when the boost is 0
+    q = new BoostQuery(new MatchAllDocsQuery(), 0);
+    assertEquals(new BoostQuery(new ConstantScoreQuery(new MatchAllDocsQuery()), 0), searcher.rewrite(q));
+  }
+
+}

Modified: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestComplexExplanations.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestComplexExplanations.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestComplexExplanations.java (original)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestComplexExplanations.java Mon Sep  7 13:34:46 2015
@@ -73,12 +73,10 @@ public class TestComplexExplanations ext
         .add(new TermQuery(new Term(FIELD, "xx")), Occur.MUST)
         .add(matchTheseItems(new int[] {1,3}), Occur.FILTER)
         .build();
-    t.setBoost(1000);
-    q.add(t, Occur.SHOULD);
+    q.add(new BoostQuery(t, 1000), Occur.SHOULD);
     
     t = new ConstantScoreQuery(matchTheseItems(new int[] {0,2}));
-    t.setBoost(30);
-    q.add(t, Occur.SHOULD);
+    q.add(new BoostQuery(t, 30), Occur.SHOULD);
     
     DisjunctionMaxQuery dm = new DisjunctionMaxQuery(0.2f);
     dm.add(snear(st("w2"),
@@ -135,12 +133,10 @@ public class TestComplexExplanations ext
         .add(new TermQuery(new Term(FIELD, "xx")), Occur.MUST)
         .add(matchTheseItems(new int[] {1,3}), Occur.FILTER)
         .build();
-    t.setBoost(1000);
-    q.add(t, Occur.SHOULD);
+    q.add(new BoostQuery(t, 1000), Occur.SHOULD);
     
     t = new ConstantScoreQuery(matchTheseItems(new int[] {0,2}));
-    t.setBoost(-20.0f);
-    q.add(t, Occur.SHOULD);
+    q.add(new BoostQuery(t, -20), Occur.SHOULD);
     
     DisjunctionMaxQuery dm = new DisjunctionMaxQuery(0.2f);
     dm.add(snear(st("w2"),
@@ -175,9 +171,8 @@ public class TestComplexExplanations ext
     builder.add(snear("w2","w3",1,true), Occur.SHOULD);
     builder.add(snear("w1","w3",3,true), Occur.SHOULD);
     BooleanQuery b = builder.build(); 
-    b.setBoost(0.0f);
     
-    q.add(b, Occur.SHOULD);
+    q.add(new BoostQuery(b, 0), Occur.SHOULD);
     
     qtest(q.build(), new int[] { 0,1,2 });
   }
@@ -193,21 +188,18 @@ public class TestComplexExplanations ext
 
   public void testT3() throws Exception {
     TermQuery query = new TermQuery(new Term(FIELD, "w1"));
-    query.setBoost(0);
-    bqtest(query, new int[] { 0,1,2,3 });
+    bqtest(new BoostQuery(query, 0), new int[] { 0,1,2,3 });
   }
 
   public void testMA3() throws Exception {
     Query q=new MatchAllDocsQuery();
-    q.setBoost(0);
-    bqtest(q, new int[] { 0,1,2,3 });
+    bqtest(new BoostQuery(q, 0), new int[] { 0,1,2,3 });
   }
   
   public void testFQ5() throws Exception {
     TermQuery query = new TermQuery(new Term(FIELD, "xx"));
-    query.setBoost(0);
     Query filtered = new BooleanQuery.Builder()
-        .add(query, Occur.MUST)
+        .add(new BoostQuery(query, 0), Occur.MUST)
         .add(matchTheseItems(new int[] {1,3}), Occur.FILTER)
         .build();
     bqtest(filtered, new int[] {3});
@@ -215,8 +207,7 @@ public class TestComplexExplanations ext
   
   public void testCSQ4() throws Exception {
     Query q = new ConstantScoreQuery(matchTheseItems(new int[] {3}));
-    q.setBoost(0);
-    bqtest(q, new int[] {3});
+    bqtest(new BoostQuery(q, 0), new int[] {3});
   }
   
   public void testDMQ10() throws Exception {
@@ -225,17 +216,14 @@ public class TestComplexExplanations ext
     BooleanQuery.Builder query = new BooleanQuery.Builder();;
     query.add(new TermQuery(new Term(FIELD, "yy")), Occur.SHOULD);
     TermQuery boostedQuery = new TermQuery(new Term(FIELD, "w5"));
-    boostedQuery.setBoost(100);
-    query.add(boostedQuery, Occur.SHOULD);
+    query.add(new BoostQuery(boostedQuery, 100), Occur.SHOULD);
 
     q.add(query.build());
 
     TermQuery xxBoostedQuery = new TermQuery(new Term(FIELD, "xx"));
-    xxBoostedQuery.setBoost(0);
 
-    q.add(xxBoostedQuery);
-    q.setBoost(0.0f);
-    bqtest(q, new int[] { 0,2,3 });
+    q.add(new BoostQuery(xxBoostedQuery, 0));
+    bqtest(new BoostQuery(q, 0), new int[] { 0,2,3 });
   }
   
   public void testMPQ7() throws Exception {
@@ -243,8 +231,7 @@ public class TestComplexExplanations ext
     q.add(ta(new String[] {"w1"}));
     q.add(ta(new String[] {"w2"}));
     q.setSlop(1);
-    q.setBoost(0.0f);
-    bqtest(q, new int[] { 0,1,2 });
+    bqtest(new BoostQuery(q, 0), new int[] { 0,1,2 });
   }
   
   public void testBQ12() throws Exception {
@@ -252,8 +239,7 @@ public class TestComplexExplanations ext
     BooleanQuery.Builder query = new BooleanQuery.Builder();;
     query.add(new TermQuery(new Term(FIELD, "w1")), Occur.SHOULD);
     TermQuery boostedQuery = new TermQuery(new Term(FIELD, "w2"));
-    boostedQuery.setBoost(0);
-    query.add(boostedQuery, Occur.SHOULD);
+    query.add(new BoostQuery(boostedQuery, 0), Occur.SHOULD);
     
     qtest(query.build(), new int[] { 0,1,2,3 });
   }
@@ -262,8 +248,7 @@ public class TestComplexExplanations ext
     BooleanQuery.Builder query = new BooleanQuery.Builder();;
     query.add(new TermQuery(new Term(FIELD, "w1")), Occur.SHOULD);
     TermQuery boostedQuery = new TermQuery(new Term(FIELD, "w5"));
-    boostedQuery.setBoost(0);
-    query.add(boostedQuery, Occur.MUST_NOT);
+    query.add(new BoostQuery(boostedQuery, 0), Occur.MUST_NOT);
 
     qtest(query.build(), new int[] { 1,2,3 });
   }
@@ -271,8 +256,7 @@ public class TestComplexExplanations ext
     // NOTE: using qtest not bqtest
     BooleanQuery.Builder query = new BooleanQuery.Builder();;
     TermQuery boostedQuery = new TermQuery(new Term(FIELD, "w1"));
-    boostedQuery.setBoost(0);
-    query.add(boostedQuery, Occur.MUST);
+    query.add(new BoostQuery(boostedQuery, 0), Occur.MUST);
     query.add(new TermQuery(new Term(FIELD, "w2")), Occur.SHOULD);
     
     qtest(query.build(), new int[] { 0,1,2,3 });
@@ -283,66 +267,57 @@ public class TestComplexExplanations ext
     builder.add(new TermQuery(new Term(FIELD, "w2")), Occur.SHOULD);
 
     Query query = builder.build();
-    query.setBoost(0);
 
-    bqtest(query, new int[] { 0,1,2,3 });
+    bqtest(new BoostQuery(query, 0), new int[] { 0,1,2,3 });
   }
   public void testBQ22() throws Exception {
     BooleanQuery.Builder builder = new BooleanQuery.Builder();;
     TermQuery boostedQuery = new TermQuery(new Term(FIELD, "w1"));
-    boostedQuery.setBoost(0);
-    builder.add(boostedQuery, Occur.MUST);
+    builder.add(new BoostQuery(boostedQuery, 0), Occur.MUST);
     builder.add(new TermQuery(new Term(FIELD, "w2")), Occur.SHOULD);
     BooleanQuery query = builder.build();
-    query.setBoost(0);
 
-    bqtest(query, new int[] { 0,1,2,3 });
+    bqtest(new BoostQuery(query, 0), new int[] { 0,1,2,3 });
   }
 
   public void testST3() throws Exception {
     SpanQuery q = st("w1");
-    q.setBoost(0);
-    bqtest(q, new int[] {0,1,2,3});
+    bqtest(new SpanBoostQuery(q, 0), new int[] {0,1,2,3});
   }
   public void testST6() throws Exception {
     SpanQuery q = st("xx");
-    q.setBoost(0);
-    qtest(q, new int[] {2,3});
+    qtest(new SpanBoostQuery(q, 0), new int[] {2,3});
   }
 
   public void testSF3() throws Exception {
     SpanQuery q = sf(("w1"),1);
-    q.setBoost(0);
-    bqtest(q, new int[] {0,1,2,3});
+    bqtest(new SpanBoostQuery(q, 0), new int[] {0,1,2,3});
   }
   public void testSF7() throws Exception {
     SpanQuery q = sf(("xx"),3);
-    q.setBoost(0);
-    bqtest(q, new int[] {2,3});
+    bqtest(new SpanBoostQuery(q, 0), new int[] {2,3});
   }
   
   public void testSNot3() throws Exception {
     SpanQuery q = snot(sf("w1",10),st("QQ"));
-    q.setBoost(0);
-    bqtest(q, new int[] {0,1,2,3});
+    bqtest(new SpanBoostQuery(q, 0), new int[] {0,1,2,3});
   }
   public void testSNot6() throws Exception {
     SpanQuery q = snot(sf("w1",10),st("xx"));
-    q.setBoost(0);
-    bqtest(q, new int[] {0,1,2,3});
+    bqtest(new SpanBoostQuery(q, 0), new int[] {0,1,2,3});
   }
 
   public void testSNot8() throws Exception {
     // NOTE: using qtest not bqtest
     SpanQuery f = snear("w1","w3",10,true);
-    f.setBoost(0);
+    f = new SpanBoostQuery(f, 0);
     SpanQuery q = snot(f, st("xx"));
     qtest(q, new int[] {0,1,3});
   }
   public void testSNot9() throws Exception {
     // NOTE: using qtest not bqtest
     SpanQuery t = st("xx");
-    t.setBoost(0);
+    t = new SpanBoostQuery(t, 0);
     SpanQuery q = snot(snear("w1","w3",10,true), t);
     qtest(q, new int[] {0,1,3});
   }

Modified: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestConjunctions.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestConjunctions.java?rev=1701621&r1=1701620&r2=1701621&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestConjunctions.java (original)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestConjunctions.java Mon Sep  7 13:34:46 2015
@@ -94,7 +94,7 @@ public class TestConjunctions extends Lu
     }
 
     @Override
-    public SimWeight computeWeight(float queryBoost,
+    public SimWeight computeWeight(
         CollectionStatistics collectionStats, TermStatistics... termStats) {
       return new SimWeight() {
         @Override