diff options
Diffstat (limited to 'core/src/main/java/org/elasticsearch/index/query/QueryBuilder.java')
-rw-r--r-- | core/src/main/java/org/elasticsearch/index/query/QueryBuilder.java | 24 |
1 files changed, 24 insertions, 0 deletions
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 b75406c864..3667905bac 100644 --- a/core/src/main/java/org/elasticsearch/index/query/QueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/QueryBuilder.java @@ -72,4 +72,28 @@ public interface QueryBuilder<QB extends QueryBuilder<QB>> extends NamedWriteabl * Returns the name that identifies uniquely the query */ 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. + */ + 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 query until it doesn't change anymore. + * @throws IOException if an {@link IOException} occurs + */ + static QueryBuilder<?> rewriteQuery(QueryBuilder<?> original, QueryRewriteContext context) throws IOException { + QueryBuilder builder = original; + for (QueryBuilder rewrittenBuilder = builder.rewrite(context); rewrittenBuilder != builder; + rewrittenBuilder = builder.rewrite(context)) { + builder = rewrittenBuilder; + } + return builder; + } + } |