diff options
Diffstat (limited to 'core/src/main/java/org/elasticsearch/index/query/TemplateQueryBuilder.java')
-rw-r--r-- | core/src/main/java/org/elasticsearch/index/query/TemplateQueryBuilder.java | 32 |
1 files changed, 23 insertions, 9 deletions
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 02a9bc42e3..4067f6d87c 100644 --- a/core/src/main/java/org/elasticsearch/index/query/TemplateQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/TemplateQueryBuilder.java @@ -25,11 +25,13 @@ import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.script.ExecutableScript; +import org.elasticsearch.script.ScriptContext; import org.elasticsearch.script.ScriptService; import org.elasticsearch.script.Template; -import org.elasticsearch.search.internal.SearchContext; import java.io.IOException; +import java.util.Collections; import java.util.Map; import java.util.Objects; @@ -100,14 +102,7 @@ public class TemplateQueryBuilder extends AbstractQueryBuilder<TemplateQueryBuil @Override protected Query doToQuery(QueryShardContext context) throws IOException { - BytesReference querySource = context.executeQueryTemplate(template); - try (XContentParser qSourceParser = XContentFactory.xContent(querySource).createParser(querySource)) { - final QueryShardContext contextCopy = new QueryShardContext(context); - contextCopy.reset(qSourceParser); - QueryBuilder result = contextCopy.parseContext().parseInnerQueryBuilder(); - context.combineNamedQueries(contextCopy); - return result.toQuery(context); - } + throw new UnsupportedOperationException("this query must be rewritten first"); } @Override @@ -130,4 +125,23 @@ public class TemplateQueryBuilder extends AbstractQueryBuilder<TemplateQueryBuil protected boolean doEquals(TemplateQueryBuilder other) { return Objects.equals(template, other.template); } + + @Override + public QueryBuilder<?> rewrite(QueryRewriteContext queryRewriteContext) throws IOException { + ExecutableScript executable = queryRewriteContext.getScriptService().executable(template, + ScriptContext.Standard.SEARCH, Collections.emptyMap()); + BytesReference querySource = (BytesReference) executable.run(); + final QueryParseContext queryParseContext = queryRewriteContext.newParseContext(); + 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()); + } + return queryBuilder; + } + } } |