diff --git a/lucene/core/src/java/org/apache/lucene/search/Query.java b/lucene/core/src/java/org/apache/lucene/search/Query.java index 7a3fc0dbe0b..54de63fc02f 100644 --- a/lucene/core/src/java/org/apache/lucene/search/Query.java +++ b/lucene/core/src/java/org/apache/lucene/search/Query.java @@ -70,7 +70,9 @@ public abstract class Query { * a PrefixQuery will be rewritten into a BooleanQuery that consists * of TermQuerys. */ - public abstract Query rewrite(IndexReader reader, RewriteContext rewriteContext) throws IOException; + public Query rewrite(IndexReader reader) throws IOException { + return this; + } /** * Override and implement query instance equivalence properly in a subclass. diff --git a/lucene/core/src/java/org/apache/lucene/search/RewriteContext.java b/lucene/core/src/java/org/apache/lucene/search/RewriteContext.java deleted file mode 100644 index 8738399777d..00000000000 --- a/lucene/core/src/java/org/apache/lucene/search/RewriteContext.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * 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. - */ - -package org.apache.lucene.search; - -import java.io.IOException; - -import org.apache.lucene.index.IndexReader; -import org.apache.lucene.index.Term; -import org.apache.lucene.index.TermContext; - -public class RewriteContext { - - public TermContext buildTermContext(Term term, IndexReader reader) throws IOException { - return TermContext.build(reader.getContext(), term); - } - -} diff --git a/lucene/core/src/java/org/apache/lucene/search/TermQuery.java b/lucene/core/src/java/org/apache/lucene/search/TermQuery.java index b13a9f4e198..925fe93f3c5 100644 --- a/lucene/core/src/java/org/apache/lucene/search/TermQuery.java +++ b/lucene/core/src/java/org/apache/lucene/search/TermQuery.java @@ -22,7 +22,6 @@ import java.util.Objects; import java.util.Set; import org.apache.lucene.index.IndexOptions; -import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexReaderContext; import org.apache.lucene.index.LeafReader; import org.apache.lucene.index.LeafReaderContext; @@ -204,17 +203,25 @@ public class TermQuery extends Query { @Override public Weight createWeight(IndexSearcher searcher, ScoreMode scoreMode, float boost) throws IOException { - if (perReaderTermState == null) - throw new IllegalStateException("TermQuery must be rewritten before use"); - if (perReaderTermState.wasBuiltFor(searcher.getTopReaderContext()) == false) - throw new IllegalStateException("TermQuery was built against a different IndexReader"); - return new TermWeight(searcher, scoreMode.needsScores(), boost, perReaderTermState); - } + final IndexReaderContext context = searcher.getTopReaderContext(); + final TermContext termState; + if (perReaderTermState == null + || perReaderTermState.wasBuiltFor(context) == false) { + if (scoreMode.needsScores()) { + // make TermQuery single-pass if we don't have a PRTS or if the context + // differs! + termState = TermContext.build(context, term); + } else { + // do not compute the term state, this will help save seeks in the terms + // dict on segments that have a cache entry for this query + termState = null; + } + } else { + // PRTS was pre-build for this IS + termState = this.perReaderTermState; + } - @Override - public Query rewrite(IndexReader reader, RewriteContext rewriteContext) throws IOException { - TermContext tc = rewriteContext.buildTermContext(term, reader); - return new TermQuery(term, tc); + return new TermWeight(searcher, scoreMode.needsScores(), boost, termState); } /** Prints a user-readable version of this query. */