diff options
author | Simon Willnauer <simonw@apache.org> | 2016-02-12 12:53:12 +0100 |
---|---|---|
committer | Simon Willnauer <simonw@apache.org> | 2016-02-12 12:53:12 +0100 |
commit | b906c8a389b36206685b46d70f114d6cef82cb15 (patch) | |
tree | 153faa6b3f425a1e2a6d45d11f59769fed815e09 /core/src/main/java/org/elasticsearch/index/query | |
parent | 685bee308130d02fc379e09da7b817fff3a479b6 (diff) |
apply fixes after review
Diffstat (limited to 'core/src/main/java/org/elasticsearch/index/query')
19 files changed, 103 insertions, 70 deletions
diff --git a/core/src/main/java/org/elasticsearch/index/query/AbstractQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/AbstractQueryBuilder.java index d2116ae3c0..39c835e4b0 100644 --- a/core/src/main/java/org/elasticsearch/index/query/AbstractQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/AbstractQueryBuilder.java @@ -258,4 +258,23 @@ public abstract class AbstractQueryBuilder<QB extends AbstractQueryBuilder<QB>> } return queries; } + + @Override + public final QueryBuilder<?> rewrite(QueryRewriteContext queryShardContext) throws IOException { + QueryBuilder rewritten = doRewrite(queryShardContext); + if (rewritten == this) { + return rewritten; + } + if (queryName() != null && rewritten.queryName() == null) { // we inherit the name + rewritten.queryName(queryName()); + } + if (boost() != DEFAULT_BOOST && rewritten.boost() == DEFAULT_BOOST) { + rewritten.boost(boost()); + } + return rewritten; + } + + protected QueryBuilder<?> doRewrite(QueryRewriteContext queryShardContext) throws IOException { + return this; + } } diff --git a/core/src/main/java/org/elasticsearch/index/query/BoolQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/BoolQueryBuilder.java index 72e13c2c31..261acff33c 100644 --- a/core/src/main/java/org/elasticsearch/index/query/BoolQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/BoolQueryBuilder.java @@ -263,6 +263,13 @@ public class BoolQueryBuilder extends AbstractQueryBuilder<BoolQueryBuilder> { @Override protected Query doToQuery(QueryShardContext context) throws IOException { + final int numClauses = mustNotClauses.size() + filterClauses.size() + shouldClauses.size() + mustClauses.size(); + if (numClauses == 1 && must().size() == 1 && boost() == DEFAULT_BOOST) { + // we really only optimize this for testing since we use this to rewrite + // named queries TemplateQueryBuilder and WrapperQueryBuilder. + // it's equivalent but will anyways happen later down the road in the BQ#rewrite method + return mustClauses.get(0).toQuery(context); + } BooleanQuery.Builder booleanQueryBuilder = new BooleanQuery.Builder(); booleanQueryBuilder.setDisableCoord(disableCoord); addBooleanClauses(context, booleanQueryBuilder, mustClauses, BooleanClause.Occur.MUST); @@ -273,6 +280,7 @@ public class BoolQueryBuilder extends AbstractQueryBuilder<BoolQueryBuilder> { if (booleanQuery.clauses().isEmpty()) { return new MatchAllDocsQuery(); } + final String minimumShouldMatch; if (context.isFilter() && this.minimumShouldMatch == null && shouldClauses.size() > 0) { minimumShouldMatch = "1"; @@ -349,7 +357,7 @@ public class BoolQueryBuilder extends AbstractQueryBuilder<BoolQueryBuilder> { } @Override - public QueryBuilder<?> rewrite(QueryRewriteContext queryRewriteContext) throws IOException { + protected QueryBuilder<?> doRewrite(QueryRewriteContext queryRewriteContext) throws IOException { BoolQueryBuilder newBuilder = new BoolQueryBuilder(); boolean changed = false; final int clauses = mustClauses.size() + mustNotClauses.size() + filterClauses.size() + shouldClauses.size(); @@ -372,14 +380,14 @@ public class BoolQueryBuilder extends AbstractQueryBuilder<BoolQueryBuilder> { return this; } - private static boolean rewriteClauses(QueryRewriteContext queryRewriteContext, List<QueryBuilder<?>> builders, Consumer<QueryBuilder<?>> conusmer) throws IOException { + private static boolean rewriteClauses(QueryRewriteContext queryRewriteContext, List<QueryBuilder<?>> builders, Consumer<QueryBuilder<?>> consumer) throws IOException { boolean changed = false; for (QueryBuilder builder : builders) { QueryBuilder result = builder.rewrite(queryRewriteContext); if (result != builder) { changed = true; } - conusmer.accept(result); + consumer.accept(result); } return changed; } diff --git a/core/src/main/java/org/elasticsearch/index/query/BoostingQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/BoostingQueryBuilder.java index 507e85687d..d03d6894b0 100644 --- a/core/src/main/java/org/elasticsearch/index/query/BoostingQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/BoostingQueryBuilder.java @@ -160,12 +160,11 @@ public class BoostingQueryBuilder extends AbstractQueryBuilder<BoostingQueryBuil } @Override - public QueryBuilder<?> rewrite(QueryRewriteContext queryShardContext) throws IOException { - QueryBuilder positiveQuery = this.positiveQuery.rewrite(queryShardContext); - QueryBuilder negativeQuery = this.negativeQuery.rewrite(queryShardContext); + protected QueryBuilder<?> doRewrite(QueryRewriteContext queryRewriteContext) throws IOException { + QueryBuilder positiveQuery = this.positiveQuery.rewrite(queryRewriteContext); + QueryBuilder negativeQuery = this.negativeQuery.rewrite(queryRewriteContext); if (positiveQuery != this.positiveQuery || negativeQuery != this.negativeQuery) { - BoostingQueryBuilder newQueryBuilder = new BoostingQueryBuilder(positiveQuery, negativeQuery) - .boost(boost()).queryName(queryName()); + BoostingQueryBuilder newQueryBuilder = new BoostingQueryBuilder(positiveQuery, negativeQuery); newQueryBuilder.negativeBoost = negativeBoost; return newQueryBuilder; } diff --git a/core/src/main/java/org/elasticsearch/index/query/ConstantScoreQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/ConstantScoreQueryBuilder.java index ad00bba28b..ee6fa4c2c2 100644 --- a/core/src/main/java/org/elasticsearch/index/query/ConstantScoreQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/ConstantScoreQueryBuilder.java @@ -106,10 +106,10 @@ public class ConstantScoreQueryBuilder extends AbstractQueryBuilder<ConstantScor } @Override - public QueryBuilder<?> rewrite(QueryRewriteContext queryShardContext) throws IOException { - QueryBuilder rewrite = filterBuilder.rewrite(queryShardContext); + protected QueryBuilder<?> doRewrite(QueryRewriteContext queryRewriteContext) throws IOException { + QueryBuilder rewrite = filterBuilder.rewrite(queryRewriteContext); if (rewrite != filterBuilder) { - return new ConstantScoreQueryBuilder(rewrite).boost(boost()).queryName(queryName()); + return new ConstantScoreQueryBuilder(rewrite); } return this; } diff --git a/core/src/main/java/org/elasticsearch/index/query/EmptyQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/EmptyQueryBuilder.java index 83f7abae7a..e810292a95 100644 --- a/core/src/main/java/org/elasticsearch/index/query/EmptyQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/EmptyQueryBuilder.java @@ -20,24 +20,16 @@ package org.elasticsearch.index.query; import org.apache.lucene.search.Query; -import org.elasticsearch.action.support.ToXContentToBytes; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; -import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.common.xcontent.XContentType; import java.io.IOException; -import java.util.Objects; /** * A {@link QueryBuilder} that is a stand in replacement for an empty query clause in the DSL. * The current DSL allows parsing inner queries / filters like "{ }", in order to have a * valid non-null representation of these clauses that actually do nothing we can use this class. - * - * This builder has no corresponding parser and it is not registered under the query name. It is - * intended to be used internally as a stand-in for nested queries that are left empty and should - * be ignored upstream. */ public final class EmptyQueryBuilder extends AbstractQueryBuilder<EmptyQueryBuilder> { diff --git a/core/src/main/java/org/elasticsearch/index/query/GeoShapeQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/GeoShapeQueryBuilder.java index db64aa3a7d..dd186f92ba 100644 --- a/core/src/main/java/org/elasticsearch/index/query/GeoShapeQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/GeoShapeQueryBuilder.java @@ -235,7 +235,7 @@ public class GeoShapeQueryBuilder extends AbstractQueryBuilder<GeoShapeQueryBuil } @Override - protected Query doToQuery(QueryShardContext context) throws IOException { + protected Query doToQuery(QueryShardContext context) { if (shape == null) { throw new UnsupportedOperationException("query must be rewritten first"); } @@ -449,12 +449,11 @@ public class GeoShapeQueryBuilder extends AbstractQueryBuilder<GeoShapeQueryBuil } @Override - public QueryBuilder<GeoShapeQueryBuilder> rewrite(QueryRewriteContext queryShardContext) throws IOException { + protected QueryBuilder<GeoShapeQueryBuilder> doRewrite(QueryRewriteContext queryShardContext) throws IOException { if (this.shape == null) { GetRequest getRequest = new GetRequest(indexedShapeIndex, indexedShapeType, indexedShapeId); ShapeBuilder shape = fetch(queryShardContext.getClient(), getRequest, indexedShapePath); - return new GeoShapeQueryBuilder(this.fieldName, shape).relation(relation).strategy(strategy) - .boost(boost()).queryName(queryName()); + return new GeoShapeQueryBuilder(this.fieldName, shape).relation(relation).strategy(strategy); } return this; } diff --git a/core/src/main/java/org/elasticsearch/index/query/HasChildQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/HasChildQueryBuilder.java index 66c9d77534..940fa89f03 100644 --- a/core/src/main/java/org/elasticsearch/index/query/HasChildQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/HasChildQueryBuilder.java @@ -398,15 +398,15 @@ public class HasChildQueryBuilder extends AbstractQueryBuilder<HasChildQueryBuil } @Override - public QueryBuilder<?> rewrite(QueryRewriteContext queryShardContext) throws IOException { - QueryBuilder rewrite = query.rewrite(queryShardContext); + protected QueryBuilder<?> doRewrite(QueryRewriteContext queryRewriteContext) throws IOException { + QueryBuilder rewrite = query.rewrite(queryRewriteContext); if (rewrite != query) { HasChildQueryBuilder hasChildQueryBuilder = new HasChildQueryBuilder(type, rewrite); hasChildQueryBuilder.minChildren = minChildren; hasChildQueryBuilder.maxChildren = maxChildren; hasChildQueryBuilder.scoreMode = scoreMode; hasChildQueryBuilder.queryInnerHits = queryInnerHits; - return hasChildQueryBuilder.queryName(queryName()).boost(boost()); + return hasChildQueryBuilder; } return this; } diff --git a/core/src/main/java/org/elasticsearch/index/query/HasParentQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/HasParentQueryBuilder.java index 10ed269a2b..9a3637de3f 100644 --- a/core/src/main/java/org/elasticsearch/index/query/HasParentQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/HasParentQueryBuilder.java @@ -257,13 +257,13 @@ public class HasParentQueryBuilder extends AbstractQueryBuilder<HasParentQueryBu } @Override - public QueryBuilder<?> rewrite(QueryRewriteContext queryShardContext) throws IOException { + protected QueryBuilder<?> doRewrite(QueryRewriteContext queryShardContext) throws IOException { QueryBuilder rewrite = query.rewrite(queryShardContext); if (rewrite != query) { HasParentQueryBuilder hasParentQueryBuilder = new HasParentQueryBuilder(type, rewrite); hasParentQueryBuilder.score = score; hasParentQueryBuilder.innerHit = innerHit; - return hasParentQueryBuilder.queryName(queryName()).boost(boost()); + return hasParentQueryBuilder; } return this; } diff --git a/core/src/main/java/org/elasticsearch/index/query/IndicesQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/IndicesQueryBuilder.java index c366394976..019e18d134 100644 --- a/core/src/main/java/org/elasticsearch/index/query/IndicesQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/IndicesQueryBuilder.java @@ -142,11 +142,11 @@ public class IndicesQueryBuilder extends AbstractQueryBuilder<IndicesQueryBuilde } @Override - public QueryBuilder<?> rewrite(QueryRewriteContext queryShardContext) throws IOException { + protected QueryBuilder<?> doRewrite(QueryRewriteContext queryShardContext) throws IOException { QueryBuilder<?> newInnnerQuery = innerQuery.rewrite(queryShardContext); QueryBuilder<?> newNoMatchQuery = noMatchQuery.rewrite(queryShardContext); if (newInnnerQuery != innerQuery || newNoMatchQuery != noMatchQuery) { - return new IndicesQueryBuilder(innerQuery, indices).noMatchQuery(noMatchQuery).boost(boost()).queryName(queryName()); + return new IndicesQueryBuilder(innerQuery, indices).noMatchQuery(noMatchQuery); } return this; } diff --git a/core/src/main/java/org/elasticsearch/index/query/MoreLikeThisQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/MoreLikeThisQueryBuilder.java index c08cf205e6..9f6c8b24c4 100644 --- a/core/src/main/java/org/elasticsearch/index/query/MoreLikeThisQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/MoreLikeThisQueryBuilder.java @@ -1052,7 +1052,7 @@ public class MoreLikeThisQueryBuilder extends AbstractQueryBuilder<MoreLikeThisQ } @Override - public QueryBuilder<?> rewrite(QueryRewriteContext queryShardContext) throws IOException { + protected QueryBuilder<?> doRewrite(QueryRewriteContext queryRewriteContext) throws IOException { // TODO this needs heavy cleanups before we can rewrite it return this; } diff --git a/core/src/main/java/org/elasticsearch/index/query/NestedQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/NestedQueryBuilder.java index 461ebdb52a..596c249921 100644 --- a/core/src/main/java/org/elasticsearch/index/query/NestedQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/NestedQueryBuilder.java @@ -226,10 +226,10 @@ public class NestedQueryBuilder extends AbstractQueryBuilder<NestedQueryBuilder> } @Override - public QueryBuilder<?> rewrite(QueryRewriteContext queryShardContext) throws IOException { - QueryBuilder rewrite = query.rewrite(queryShardContext); + protected QueryBuilder<?> doRewrite(QueryRewriteContext queryRewriteContext) throws IOException { + QueryBuilder rewrite = query.rewrite(queryRewriteContext); if (rewrite != query) { - return new NestedQueryBuilder(path, rewrite).queryName(queryName()).boost(boost()).scoreMode(scoreMode); + return new NestedQueryBuilder(path, rewrite).scoreMode(scoreMode); } return this; } diff --git a/core/src/main/java/org/elasticsearch/index/query/QueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/QueryBuilder.java index 3667905bac..f8010e7b52 100644 --- a/core/src/main/java/org/elasticsearch/index/query/QueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/QueryBuilder.java @@ -74,16 +74,16 @@ public interface QueryBuilder<QB extends QueryBuilder<QB>> extends NamedWriteabl String getName(); /** - * Rewrites this query builder into it's primitive form. By default this method return theb builder itself. If the builder - * did not change the identity reference must be returend otherwise the builder will be rewritten infinitely. + * Rewrites this query builder into its primitive form. By default this method return the builder itself. If the builder + * did not change the identity reference must be returned otherwise the builder will be rewritten infinitely. */ default QueryBuilder<?> rewrite(QueryRewriteContext queryShardContext) throws IOException { return this; } /** - * Rewrites the given query into it's primitive form. Queries that for instance fetch resources from remote hosts or - * can simplify / optimize itself should do their heavy lifting duringt {@link #rewrite(QueryRewriteContext)}. This method + * Rewrites the given query into its primitive form. Queries that for instance fetch resources from remote hosts or + * can simplify / optimize itself should do their heavy lifting during {@link #rewrite(QueryRewriteContext)}. This method * rewrites the query until it doesn't change anymore. * @throws IOException if an {@link IOException} occurs */ diff --git a/core/src/main/java/org/elasticsearch/index/query/QueryRewriteContext.java b/core/src/main/java/org/elasticsearch/index/query/QueryRewriteContext.java index 425673cb54..e057aff06b 100644 --- a/core/src/main/java/org/elasticsearch/index/query/QueryRewriteContext.java +++ b/core/src/main/java/org/elasticsearch/index/query/QueryRewriteContext.java @@ -24,6 +24,7 @@ import org.elasticsearch.indices.query.IndicesQueriesRegistry; import org.elasticsearch.script.ScriptService; /** + * Context object used to rewrite {@link QueryBuilder} instances into simplified version. */ public class QueryRewriteContext { protected final ScriptService scriptService; @@ -38,26 +39,34 @@ public class QueryRewriteContext { this.parseContext = new QueryParseContext(indicesQueriesRegistry); } + /** + * Returns a clients to fetch resources from local or remove nodes. + */ public final Client getClient() { return scriptService.getClient(); } + /** + * Returns the index settings for this context. This might return null if the + * context has not index scope. + */ public final IndexSettings getIndexSettings() { return indexSettings; } + /** + * Returns a script service to fetch scripts. + */ public final ScriptService getScriptService() { return scriptService; } + /** + * Returns a new {@link QueryParseContext} to parse template or wrapped queries. + */ public QueryParseContext newParseContext() { QueryParseContext queryParseContext = new QueryParseContext(indicesQueriesRegistry); queryParseContext.parseFieldMatcher(parseContext.parseFieldMatcher()); return queryParseContext; } - - public boolean hasIndex() { - return indexSettings != null; - } - } diff --git a/core/src/main/java/org/elasticsearch/index/query/QueryShardContext.java b/core/src/main/java/org/elasticsearch/index/query/QueryShardContext.java index 09978122dc..83066fba7b 100644 --- a/core/src/main/java/org/elasticsearch/index/query/QueryShardContext.java +++ b/core/src/main/java/org/elasticsearch/index/query/QueryShardContext.java @@ -191,10 +191,6 @@ public class QueryShardContext extends QueryRewriteContext { return unmodifiableMap(new HashMap<>(namedQueries)); } - public void combineNamedQueries(QueryShardContext context) { - namedQueries.putAll(context.namedQueries); - } - /** * Return whether we are currently parsing a filter or a query. */ diff --git a/core/src/main/java/org/elasticsearch/index/query/ScriptQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/ScriptQueryBuilder.java index 31484fe804..353dbd668a 100644 --- a/core/src/main/java/org/elasticsearch/index/query/ScriptQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/ScriptQueryBuilder.java @@ -25,7 +25,6 @@ import org.apache.lucene.search.Query; import org.apache.lucene.search.RandomAccessWeight; import org.apache.lucene.search.Weight; import org.apache.lucene.util.Bits; -import org.elasticsearch.client.Client; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.xcontent.XContentBuilder; @@ -33,7 +32,6 @@ import org.elasticsearch.script.LeafSearchScript; import org.elasticsearch.script.Script; import org.elasticsearch.script.Script.ScriptField; import org.elasticsearch.script.ScriptContext; -import org.elasticsearch.script.ScriptEngineService; import org.elasticsearch.script.ScriptService; import org.elasticsearch.script.SearchScript; import org.elasticsearch.search.lookup.SearchLookup; diff --git a/core/src/main/java/org/elasticsearch/index/query/TemplateQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/TemplateQueryBuilder.java index 4067f6d87c..4b3e81ebf1 100644 --- a/core/src/main/java/org/elasticsearch/index/query/TemplateQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/TemplateQueryBuilder.java @@ -127,7 +127,7 @@ public class TemplateQueryBuilder extends AbstractQueryBuilder<TemplateQueryBuil } @Override - public QueryBuilder<?> rewrite(QueryRewriteContext queryRewriteContext) throws IOException { + protected QueryBuilder<?> doRewrite(QueryRewriteContext queryRewriteContext) throws IOException { ExecutableScript executable = queryRewriteContext.getScriptService().executable(template, ScriptContext.Standard.SEARCH, Collections.emptyMap()); BytesReference querySource = (BytesReference) executable.run(); @@ -135,11 +135,10 @@ public class TemplateQueryBuilder extends AbstractQueryBuilder<TemplateQueryBuil try (XContentParser qSourceParser = XContentFactory.xContent(querySource).createParser(querySource)) { queryParseContext.reset(qSourceParser); final QueryBuilder<?> queryBuilder = queryParseContext.parseInnerQueryBuilder(); - if (queryBuilder.boost() == DEFAULT_BOOST) { - queryBuilder.boost(boost()); // only pass down the boost if it has it's own boost - } - if (queryName() != null) { - queryBuilder.queryName(queryName()); + if (boost() != DEFAULT_BOOST || queryName() != null) { + final BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); + boolQueryBuilder.must(queryBuilder); + return boolQueryBuilder; } return queryBuilder; } diff --git a/core/src/main/java/org/elasticsearch/index/query/TermsQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/TermsQueryBuilder.java index 570fc76dab..e75d982ebe 100644 --- a/core/src/main/java/org/elasticsearch/index/query/TermsQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/TermsQueryBuilder.java @@ -316,18 +316,18 @@ public class TermsQueryBuilder extends AbstractQueryBuilder<TermsQueryBuilder> { } @Override - public QueryBuilder<TermsQueryBuilder> rewrite(QueryRewriteContext queryRewriteContext) throws IOException { + protected QueryBuilder<?> doRewrite(QueryRewriteContext queryRewriteContext) throws IOException { if (this.termsLookup != null) { TermsLookup termsLookup = new TermsLookup(this.termsLookup); if (termsLookup.index() == null) { // TODO this should go away? - if (queryRewriteContext.hasIndex()) { + if (queryRewriteContext.getIndexSettings() != null) { termsLookup.index(queryRewriteContext.getIndexSettings().getIndex().getName()); } else { return this; // can't rewrite until we have index scope on the shard } } List<Object> values = fetch(termsLookup, queryRewriteContext.getClient()); - return new TermsQueryBuilder(this.fieldName, values).boost(boost()).queryName(queryName()); + return new TermsQueryBuilder(this.fieldName, values); } return this; } diff --git a/core/src/main/java/org/elasticsearch/index/query/WrapperQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/WrapperQueryBuilder.java index 6ba07f766e..6c7ac0e908 100644 --- a/core/src/main/java/org/elasticsearch/index/query/WrapperQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/WrapperQueryBuilder.java @@ -105,7 +105,7 @@ public class WrapperQueryBuilder extends AbstractQueryBuilder<WrapperQueryBuilde @Override protected Query doToQuery(QueryShardContext context) throws IOException { - throw new UnsupportedOperationException("this query must be rewritten first"); + throw new UnsupportedOperationException("this query must be rewritten first"); } @Override @@ -129,17 +129,16 @@ public class WrapperQueryBuilder extends AbstractQueryBuilder<WrapperQueryBuilde } @Override - public QueryBuilder<?> rewrite(QueryRewriteContext context) throws IOException { + protected QueryBuilder<?> doRewrite(QueryRewriteContext context) throws IOException { try (XContentParser qSourceParser = XContentFactory.xContent(source).createParser(source)) { QueryParseContext parseContext = context.newParseContext(); parseContext.reset(qSourceParser); final QueryBuilder<?> queryBuilder = parseContext.parseInnerQueryBuilder(); - if (queryBuilder.boost() == DEFAULT_BOOST) { - queryBuilder.boost(boost()); - } - if (queryName() != null) { // we inherit the name - queryBuilder.queryName(queryName()); + if (boost() != DEFAULT_BOOST || queryName() != null) { + final BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); + boolQueryBuilder.must(queryBuilder); + return boolQueryBuilder; } return queryBuilder; } diff --git a/core/src/main/java/org/elasticsearch/index/query/functionscore/FunctionScoreQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/functionscore/FunctionScoreQueryBuilder.java index 14a2826084..60959a9789 100644 --- a/core/src/main/java/org/elasticsearch/index/query/functionscore/FunctionScoreQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/functionscore/FunctionScoreQueryBuilder.java @@ -394,17 +394,32 @@ public class FunctionScoreQueryBuilder extends AbstractQueryBuilder<FunctionScor public FilterFunctionBuilder readFrom(StreamInput in) throws IOException { return new FilterFunctionBuilder(in.readQuery(), in.readScoreFunction()); } + + public FilterFunctionBuilder rewrite(QueryRewriteContext context) throws IOException { + QueryBuilder<?> rewrite = filter.rewrite(context); + if (rewrite != filter) { + return new FilterFunctionBuilder(rewrite, scoreFunction); + } + return this; + } } @Override - public QueryBuilder<?> rewrite(QueryRewriteContext queryShardContext) throws IOException { - QueryBuilder<?> queryBuilder = this.query.rewrite(queryShardContext); - if (queryBuilder != query) { - FunctionScoreQueryBuilder newQueryBuilder = new FunctionScoreQueryBuilder(queryBuilder, filterFunctionBuilders); + protected QueryBuilder<?> doRewrite(QueryRewriteContext queryRewriteContext) throws IOException { + QueryBuilder<?> queryBuilder = this.query.rewrite(queryRewriteContext); + FilterFunctionBuilder[] rewrittenBuilders = new FilterFunctionBuilder[this.filterFunctionBuilders.length]; + boolean rewritten = false; + for (int i = 0; i < rewrittenBuilders.length; i++) { + FilterFunctionBuilder rewrite = filterFunctionBuilders[i].rewrite(queryRewriteContext); + rewritten |= rewrite != filterFunctionBuilders[i]; + rewrittenBuilders[i] = rewrite; + } + if (queryBuilder != query || rewritten) { + FunctionScoreQueryBuilder newQueryBuilder = new FunctionScoreQueryBuilder(queryBuilder, rewrittenBuilders); newQueryBuilder.scoreMode = scoreMode; newQueryBuilder.minScore = minScore; newQueryBuilder.maxBoost = maxBoost; - return newQueryBuilder.queryName(queryName()).boost(boost()); + return newQueryBuilder; } return this; } |