summaryrefslogtreecommitdiff
path: root/core/src/main/java/org/elasticsearch/index/query/QueryBuilder.java
diff options
context:
space:
mode:
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.java24
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;
+ }
+
}