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/07/27 12:34:42 UTC

svn commit: r1692864 - in /lucene/dev/branches/branch_5x: ./ lucene/ lucene/core/ lucene/core/src/java/org/apache/lucene/index/ lucene/core/src/java/org/apache/lucene/search/ lucene/core/src/java/org/apache/lucene/search/spans/ lucene/core/src/java/org...

Author: jpountz
Date: Mon Jul 27 10:34:42 2015
New Revision: 1692864

URL: http://svn.apache.org/r1692864
Log:
LUCENE-6695: Added BlendedTermQuery.

Added:
    lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/BlendedTermQuery.java
      - copied, changed from r1692848, lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/BlendedTermQuery.java
    lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestBlendedTermQuery.java
      - copied unchanged from r1692848, lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestBlendedTermQuery.java
Modified:
    lucene/dev/branches/branch_5x/   (props changed)
    lucene/dev/branches/branch_5x/lucene/   (props changed)
    lucene/dev/branches/branch_5x/lucene/CHANGES.txt   (contents, props changed)
    lucene/dev/branches/branch_5x/lucene/core/   (props changed)
    lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/TermContext.java
    lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/MultiTermQuery.java
    lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/ScoringRewrite.java
    lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/TermCollectingRewrite.java
    lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/TopTermsRewrite.java
    lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/SpanMultiTermQueryWrapper.java
    lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/util/ArrayUtil.java
    lucene/dev/branches/branch_5x/lucene/queryparser/   (props changed)
    lucene/dev/branches/branch_5x/lucene/queryparser/src/java/org/apache/lucene/queryparser/complexPhrase/ComplexPhraseQueryParser.java

Modified: lucene/dev/branches/branch_5x/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/CHANGES.txt?rev=1692864&r1=1692863&r2=1692864&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/branch_5x/lucene/CHANGES.txt Mon Jul 27 10:34:42 2015
@@ -102,6 +102,9 @@ New Features
 * LUCENE-6694: Add LithuanianAnalyzer and LithuanianStemmer.
   (Dainius Jocas via Robert Muir)
 
+* LUCENE-6695: Added a new BlendedTermQuery to blend statistics across several
+  terms. (Simon Willnauer, Adrien Grand)
+
 API Changes
 
 * LUCENE-6508: Simplify Lock api, there is now just 

Modified: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/TermContext.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/TermContext.java?rev=1692864&r1=1692863&r2=1692864&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/TermContext.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/TermContext.java Mon Jul 27 10:34:42 2015
@@ -17,7 +17,6 @@ package org.apache.lucene.index;
  * limitations under the License.
  */
 
-import org.apache.lucene.codecs.BlockTermState;
 import org.apache.lucene.util.BytesRef;
 
 import java.io.IOException;

Copied: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/BlendedTermQuery.java (from r1692848, lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/BlendedTermQuery.java)
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/BlendedTermQuery.java?p2=lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/BlendedTermQuery.java&p1=lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/BlendedTermQuery.java&r1=1692848&r2=1692864&rev=1692864&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/BlendedTermQuery.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/BlendedTermQuery.java Mon Jul 27 10:34:42 2015
@@ -134,12 +134,11 @@ public final class BlendedTermQuery exte
   public static final RewriteMethod BOOLEAN_REWRITE = new RewriteMethod() {
     @Override
     public Query rewrite(Query[] subQueries) {
-      BooleanQuery.Builder merged = new BooleanQuery.Builder();
-      merged.setDisableCoord(true);
+      BooleanQuery merged = new BooleanQuery(true);
       for (Query query : subQueries) {
         merged.add(query, Occur.SHOULD);
       }
-      return merged.build();
+      return merged;
     }
   };
 
@@ -189,7 +188,7 @@ public final class BlendedTermQuery exte
   private final TermContext[] contexts;
   private final RewriteMethod rewriteMethod;
 
-  private BlendedTermQuery(Term[] terms, float[] boosts, TermContext[] contexts,
+  private BlendedTermQuery(final Term[] terms, final float[] boosts, final TermContext[] contexts,
       RewriteMethod rewriteMethod) {
     assert terms.length == boosts.length;
     assert terms.length == contexts.length;

Modified: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/MultiTermQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/MultiTermQuery.java?rev=1692864&r1=1692863&r2=1692864&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/MultiTermQuery.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/MultiTermQuery.java Mon Jul 27 10:34:42 2015
@@ -18,16 +18,13 @@ package org.apache.lucene.search;
  */
 
 import java.io.IOException;
-import java.util.List;
 import java.util.Objects;
 
 import org.apache.lucene.index.FilteredTermsEnum; // javadocs
 import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.SingleTermsEnum;   // javadocs
 import org.apache.lucene.index.Term;
 import org.apache.lucene.index.TermContext;
-import org.apache.lucene.index.TermState;
 import org.apache.lucene.index.Terms;
 import org.apache.lucene.index.TermsEnum;
 import org.apache.lucene.util.AttributeSource;
@@ -175,10 +172,15 @@ public abstract class MultiTermQuery ext
     }
     
     @Override
-    protected BooleanQuery getTopLevelQuery() {
+    protected BooleanQuery getTopLevelBuilder() {
       return new BooleanQuery(true);
     }
-    
+
+    @Override
+    protected Query build(BooleanQuery builder) {
+      return builder;
+    }
+
     @Override
     protected void addClause(BooleanQuery topLevel, Term term, int docCount, float boost, TermContext states) {
       final TermQuery tq = new TermQuery(term, states);
@@ -201,7 +203,7 @@ public abstract class MultiTermQuery ext
    * @see #setRewriteMethod
    */
   public static final class TopTermsBlendedFreqScoringRewrite extends
-      TopTermsRewrite<BooleanQuery> {
+      TopTermsRewrite<BlendedTermQuery.Builder> {
 
     /**
      * Create a TopTermsBlendedScoringBooleanQueryRewrite for at most
@@ -220,71 +222,22 @@ public abstract class MultiTermQuery ext
     }
 
     @Override
-    protected BooleanQuery getTopLevelQuery() {
-      return new BooleanQuery(true);
+    protected BlendedTermQuery.Builder getTopLevelBuilder() {
+      BlendedTermQuery.Builder builder = new BlendedTermQuery.Builder();
+      builder.setRewriteMethod(BlendedTermQuery.BOOLEAN_REWRITE);
+      return builder;
     }
 
     @Override
-    protected void addClause(BooleanQuery topLevel, Term term, int docCount,
-        float boost, TermContext states) {
-      final TermQuery tq = new TermQuery(term, states);
-      tq.setBoost(boost);
-      topLevel.add(tq, BooleanClause.Occur.SHOULD);
+    protected Query build(BlendedTermQuery.Builder builder) {
+      return builder.build();
     }
 
     @Override
-    void adjustScoreTerms(IndexReader reader, ScoreTerm[] scoreTerms) {
-      if (scoreTerms.length <= 1) {
-        return;
-      }
-      int maxDoc = reader.maxDoc();
-      int maxDf = 0;
-      long maxTtf = 0;
-      for (ScoreTerm scoreTerm : scoreTerms) {
-        TermContext ctx = scoreTerm.termState;
-        int df = ctx.docFreq();
-        maxDf = Math.max(df, maxDf);
-        long ttf = ctx.totalTermFreq();
-        maxTtf = ttf == -1 || maxTtf == -1 ? -1 : Math.max(ttf, maxTtf);
-      }
-
-      assert maxDf >= 0 : "DF must be >= 0";
-      if (maxDf == 0) {
-        return; // we are done that term doesn't exist at all
-      }
-      assert (maxTtf == -1) || (maxTtf >= maxDf);
-
-      for (int i = 0; i < scoreTerms.length; i++) {
-        TermContext ctx = scoreTerms[i].termState;
-        ctx = adjustFrequencies(ctx, maxDf, maxTtf);
-
-        ScoreTerm adjustedScoreTerm = new ScoreTerm(ctx);
-        adjustedScoreTerm.boost = scoreTerms[i].boost;
-        adjustedScoreTerm.bytes.copyBytes(scoreTerms[i].bytes);
-        scoreTerms[i] = adjustedScoreTerm;
-      }
-    }
-  }
-
-  private static TermContext adjustFrequencies(TermContext ctx, int artificialDf,
-      long artificialTtf) {
-    List<LeafReaderContext> leaves = ctx.topReaderContext.leaves();
-    final int len;
-    if (leaves == null) {
-      len = 1;
-    } else {
-      len = leaves.size();
-    }
-    TermContext newCtx = new TermContext(ctx.topReaderContext);
-    for (int i = 0; i < len; ++i) {
-      TermState termState = ctx.get(i);
-      if (termState == null) {
-        continue;
-      }
-      newCtx.register(termState, i);
+    protected void addClause(BlendedTermQuery.Builder topLevel, Term term, int docCount,
+        float boost, TermContext states) {
+      topLevel.add(term, boost, states);
     }
-    newCtx.accumulateStatistics(artificialDf, artificialTtf);
-    return newCtx;
   }
 
   /**
@@ -316,11 +269,16 @@ public abstract class MultiTermQuery ext
     }
     
     @Override
-    protected BooleanQuery getTopLevelQuery() {
+    protected BooleanQuery getTopLevelBuilder() {
       return new BooleanQuery(true);
     }
     
     @Override
+    protected Query build(BooleanQuery builder) {
+      return builder;
+    }
+    
+    @Override
     protected void addClause(BooleanQuery topLevel, Term term, int docFreq, float boost, TermContext states) {
       final Query q = new ConstantScoreQuery(new TermQuery(term, states));
       q.setBoost(boost);

Modified: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/ScoringRewrite.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/ScoringRewrite.java?rev=1692864&r1=1692863&r2=1692864&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/ScoringRewrite.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/ScoringRewrite.java Mon Jul 27 10:34:42 2015
@@ -37,7 +37,7 @@ import org.apache.lucene.util.RamUsageEs
  * the scores as computed by the query.
  * <p>
  * @lucene.internal Only public to be accessible by spans package. */
-public abstract class ScoringRewrite<Q extends Query> extends TermCollectingRewrite<Q> {
+public abstract class ScoringRewrite<B> extends TermCollectingRewrite<B> {
 
   /** A rewrite method that first translates each term into
    *  {@link BooleanClause.Occur#SHOULD} clause in a
@@ -54,9 +54,14 @@ public abstract class ScoringRewrite<Q e
    *  @see MultiTermQuery#setRewriteMethod */
   public final static ScoringRewrite<BooleanQuery> SCORING_BOOLEAN_REWRITE = new ScoringRewrite<BooleanQuery>() {
     @Override
-    protected BooleanQuery getTopLevelQuery() {
+    protected BooleanQuery getTopLevelBuilder() {
       return new BooleanQuery(true);
     }
+
+    @Override
+    protected Query build(BooleanQuery builder) {
+      return builder;
+    }
     
     @Override
     protected void addClause(BooleanQuery topLevel, Term term, int docCount,
@@ -86,7 +91,7 @@ public abstract class ScoringRewrite<Q e
   public final static RewriteMethod CONSTANT_SCORE_BOOLEAN_REWRITE = new RewriteMethod() {
     @Override
     public Query rewrite(IndexReader reader, MultiTermQuery query) throws IOException {
-      final BooleanQuery bq = SCORING_BOOLEAN_REWRITE.rewrite(reader, query);
+      final Query bq = SCORING_BOOLEAN_REWRITE.rewrite(reader, query);
       // strip the scores off
       final Query result = new ConstantScoreQuery(bq);
       result.setBoost(query.getBoost());
@@ -99,8 +104,8 @@ public abstract class ScoringRewrite<Q e
   protected abstract void checkMaxClauseCount(int count) throws IOException;
   
   @Override
-  public final Q rewrite(final IndexReader reader, final MultiTermQuery query) throws IOException {
-    final Q result = getTopLevelQuery();
+  public final Query rewrite(final IndexReader reader, final MultiTermQuery query) throws IOException {
+    final B builder = getTopLevelBuilder();
     final ParallelArraysTermCollector col = new ParallelArraysTermCollector();
     collectTerms(reader, query, col);
     
@@ -113,10 +118,10 @@ public abstract class ScoringRewrite<Q e
         final int pos = sort[i];
         final Term term = new Term(query.getField(), col.terms.get(pos, new BytesRef()));
         assert termStates[pos].hasOnlyRealTerms() == false || reader.docFreq(term) == termStates[pos].docFreq();
-        addClause(result, term, termStates[pos].docFreq(), query.getBoost() * boost[pos], termStates[pos]);
+        addClause(builder, term, termStates[pos].docFreq(), query.getBoost() * boost[pos], termStates[pos]);
       }
     }
-    return result;
+    return build(builder);
   }
 
   final class ParallelArraysTermCollector extends TermCollector {

Modified: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/TermCollectingRewrite.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/TermCollectingRewrite.java?rev=1692864&r1=1692863&r2=1692864&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/TermCollectingRewrite.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/TermCollectingRewrite.java Mon Jul 27 10:34:42 2015
@@ -20,7 +20,6 @@ package org.apache.lucene.search;
 import java.io.IOException;
 
 import org.apache.lucene.index.LeafReaderContext;
-import org.apache.lucene.index.Fields;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.IndexReaderContext;
 import org.apache.lucene.index.Term;
@@ -30,18 +29,21 @@ import org.apache.lucene.index.TermsEnum
 import org.apache.lucene.util.AttributeSource;
 import org.apache.lucene.util.BytesRef;
 
-abstract class TermCollectingRewrite<Q extends Query> extends MultiTermQuery.RewriteMethod {
+abstract class TermCollectingRewrite<B> extends MultiTermQuery.RewriteMethod {
   
   
-  /** Return a suitable top-level Query for holding all expanded terms. */
-  protected abstract Q getTopLevelQuery() throws IOException;
+  /** Return a suitable builder for the top-level Query for holding all expanded terms. */
+  protected abstract B getTopLevelBuilder() throws IOException;
+
+  /** Finalize the creation of the query from the builder. */
+  protected abstract Query build(B builder);
   
   /** Add a MultiTermQuery term to the top-level query */
-  protected final void addClause(Q topLevel, Term term, int docCount, float boost) throws IOException {
+  protected final void addClause(B topLevel, Term term, int docCount, float boost) throws IOException {
     addClause(topLevel, term, docCount, boost, null);
   }
   
-  protected abstract void addClause(Q topLevel, Term term, int docCount, float boost, TermContext states) throws IOException;
+  protected abstract void addClause(B topLevel, Term term, int docCount, float boost, TermContext states) throws IOException;
 
   
   final void collectTerms(IndexReader reader, MultiTermQuery query, TermCollector collector) throws IOException {

Modified: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/TopTermsRewrite.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/TopTermsRewrite.java?rev=1692864&r1=1692863&r2=1692864&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/TopTermsRewrite.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/TopTermsRewrite.java Mon Jul 27 10:34:42 2015
@@ -37,7 +37,7 @@ import org.apache.lucene.util.BytesRefBu
  * via a priority queue.
  * @lucene.internal Only public to be accessible by spans package.
  */
-public abstract class TopTermsRewrite<Q extends Query> extends TermCollectingRewrite<Q> {
+public abstract class TopTermsRewrite<B> extends TermCollectingRewrite<B> {
 
   private final int size;
   
@@ -61,7 +61,7 @@ public abstract class TopTermsRewrite<Q
   protected abstract int getMaxSize();
   
   @Override
-  public final Q rewrite(final IndexReader reader, final MultiTermQuery query) throws IOException {
+  public final Query rewrite(final IndexReader reader, final MultiTermQuery query) throws IOException {
     final int maxSize = Math.min(size, getMaxSize());
     final PriorityQueue<ScoreTerm> stQueue = new PriorityQueue<>();
     collectTerms(reader, query, new TermCollector() {
@@ -154,21 +154,15 @@ public abstract class TopTermsRewrite<Q
       }
     });
     
-    final Q q = getTopLevelQuery();
+    final B b = getTopLevelBuilder();
     final ScoreTerm[] scoreTerms = stQueue.toArray(new ScoreTerm[stQueue.size()]);
     ArrayUtil.timSort(scoreTerms, scoreTermSortByTermComp);
-    
-    adjustScoreTerms(reader, scoreTerms);
 
     for (final ScoreTerm st : scoreTerms) {
       final Term term = new Term(query.field, st.bytes.toBytesRef());
-      addClause(q, term, st.termState.docFreq(), query.getBoost() * st.boost, st.termState); // add to query
+      addClause(b, term, st.termState.docFreq(), query.getBoost() * st.boost, st.termState); // add to query
     }
-    return q;
-  }
-
-  void adjustScoreTerms(IndexReader reader, ScoreTerm[] scoreTerms) {
-    //no-op but allows subclasses the ability to tweak the score terms used in ranking e.g. balancing IDF.
+    return build(b);
   }
 
   @Override

Modified: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/SpanMultiTermQueryWrapper.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/SpanMultiTermQueryWrapper.java?rev=1692864&r1=1692863&r2=1692864&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/SpanMultiTermQueryWrapper.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/SpanMultiTermQueryWrapper.java Mon Jul 27 10:34:42 2015
@@ -160,11 +160,16 @@ public class SpanMultiTermQueryWrapper<Q
   public final static SpanRewriteMethod SCORING_SPAN_QUERY_REWRITE = new SpanRewriteMethod() {
     private final ScoringRewrite<SpanOrQuery> delegate = new ScoringRewrite<SpanOrQuery>() {
       @Override
-      protected SpanOrQuery getTopLevelQuery() {
+      protected SpanOrQuery getTopLevelBuilder() {
         return new SpanOrQuery();
       }
 
       @Override
+      protected Query build(SpanOrQuery builder) {
+        return builder;
+      }
+
+      @Override
       protected void checkMaxClauseCount(int count) {
         // we accept all terms as SpanOrQuery has no limits
       }
@@ -179,7 +184,7 @@ public class SpanMultiTermQueryWrapper<Q
     
     @Override
     public SpanQuery rewrite(IndexReader reader, MultiTermQuery query) throws IOException {
-      return delegate.rewrite(reader, query);
+      return (SpanQuery) delegate.rewrite(reader, query);
     }
   };
   
@@ -209,11 +214,16 @@ public class SpanMultiTermQueryWrapper<Q
         }
     
         @Override
-        protected SpanOrQuery getTopLevelQuery() {
+        protected SpanOrQuery getTopLevelBuilder() {
           return new SpanOrQuery();
         }
 
         @Override
+        protected Query build(SpanOrQuery builder) {
+          return builder;
+        }
+
+        @Override
         protected void addClause(SpanOrQuery topLevel, Term term, int docFreq, float boost, TermContext states) {
           final SpanTermQuery q = new SpanTermQuery(term, states);
           q.setBoost(boost);
@@ -229,7 +239,7 @@ public class SpanMultiTermQueryWrapper<Q
 
     @Override
     public SpanQuery rewrite(IndexReader reader, MultiTermQuery query) throws IOException {
-      return delegate.rewrite(reader, query);
+      return (SpanQuery) delegate.rewrite(reader, query);
     }
   
     @Override

Modified: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/util/ArrayUtil.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/util/ArrayUtil.java?rev=1692864&r1=1692863&r2=1692864&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/util/ArrayUtil.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/util/ArrayUtil.java Mon Jul 27 10:34:42 2015
@@ -17,6 +17,7 @@ package org.apache.lucene.util;
  * limitations under the License.
  */
 
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Comparator;
 
@@ -236,6 +237,14 @@ public final class ArrayUtil {
       return currentSize;
   }
 
+  public static <T> T[] grow(T[] array, int minSize) {
+    assert minSize >= 0: "size must be positive (got " + minSize + "): likely integer overflow?";
+    if (array.length < minSize) {
+      return Arrays.copyOf(array, oversize(minSize, RamUsageEstimator.NUM_BYTES_OBJECT_REF));
+    } else
+      return array;
+  }
+
   public static short[] grow(short[] array, int minSize) {
     assert minSize >= 0: "size must be positive (got " + minSize + "): likely integer overflow?";
     if (array.length < minSize) {

Modified: lucene/dev/branches/branch_5x/lucene/queryparser/src/java/org/apache/lucene/queryparser/complexPhrase/ComplexPhraseQueryParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/queryparser/src/java/org/apache/lucene/queryparser/complexPhrase/ComplexPhraseQueryParser.java?rev=1692864&r1=1692863&r2=1692864&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/queryparser/src/java/org/apache/lucene/queryparser/complexPhrase/ComplexPhraseQueryParser.java (original)
+++ lucene/dev/branches/branch_5x/lucene/queryparser/src/java/org/apache/lucene/queryparser/complexPhrase/ComplexPhraseQueryParser.java Mon Jul 27 10:34:42 2015
@@ -29,6 +29,7 @@ import org.apache.lucene.queryparser.cla
 import org.apache.lucene.queryparser.classic.QueryParser;
 import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.MultiTermQuery;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.TermQuery;
@@ -271,7 +272,7 @@ public class ComplexPhraseQueryParser ex
         // HashSet bclauseterms=new HashSet();
         Query qc = bclauses[i].getQuery();
         // Rewrite this clause e.g one* becomes (one OR onerous)
-        qc = qc.rewrite(reader);
+        qc = new IndexSearcher(reader).rewrite(qc);
         if (bclauses[i].getOccur().equals(BooleanClause.Occur.MUST_NOT)) {
           numNegatives++;
         }