Skip to content

Commit d3f66c5

Browse files
Add wrapIfNested
1 parent ed0fd40 commit d3f66c5

File tree

2 files changed

+75
-1
lines changed

2 files changed

+75
-1
lines changed

x-pack/plugin/ql/src/main/java/org/elasticsearch/xpack/ql/planner/ExpressionTranslators.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,8 @@ public static Query doTranslate(Range r, TranslatorHandler handler) {
369369
return handler.wrapFunctionQuery(r, r.value(), () -> translate(r, handler));
370370
}
371371
// Fall back to script query for non-foldable bounds (e.g., DATE_ADD with field reference)
372-
return new ScriptQuery(r.source(), r.asScript());
372+
Query q = new ScriptQuery(r.source(), r.asScript());
373+
return wrapIfNested(q, r.value());
373374
}
374375

375376
private static RangeQuery translate(Range r, TranslatorHandler handler) {
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0; you may not use this file except in compliance with the Elastic License
5+
* 2.0.
6+
*/
7+
package org.elasticsearch.xpack.ql.planner;
8+
9+
import org.elasticsearch.test.ESTestCase;
10+
import org.elasticsearch.xpack.ql.expression.Expression;
11+
import org.elasticsearch.xpack.ql.expression.FieldAttribute;
12+
import org.elasticsearch.xpack.ql.expression.Literal;
13+
import org.elasticsearch.xpack.ql.expression.predicate.Range;
14+
import org.elasticsearch.xpack.ql.querydsl.query.NestedQuery;
15+
import org.elasticsearch.xpack.ql.querydsl.query.Query;
16+
import org.elasticsearch.xpack.ql.querydsl.query.ScriptQuery;
17+
import org.elasticsearch.xpack.ql.tree.Source;
18+
import org.elasticsearch.xpack.ql.type.DataTypes;
19+
import org.elasticsearch.xpack.ql.type.EsField;
20+
21+
import java.time.ZoneOffset;
22+
import java.time.ZonedDateTime;
23+
import java.util.Collections;
24+
25+
import static org.hamcrest.Matchers.containsString;
26+
import static org.hamcrest.Matchers.instanceOf;
27+
28+
public class ExpressionTranslatorsTests extends ESTestCase {
29+
30+
private static final Source SOURCE = Source.EMPTY;
31+
32+
public void testRangeWithNonFoldableBoundsOnNestedFieldReturnsNestedQuery() {
33+
EsField nestedEsField = new EsField("nested", DataTypes.NESTED, Collections.emptyMap(), false);
34+
FieldAttribute nestedParent = new FieldAttribute(SOURCE, "nested", nestedEsField);
35+
36+
EsField dateEsField = new EsField("date", DataTypes.DATETIME, Collections.emptyMap(), true);
37+
FieldAttribute nestedDateField = new FieldAttribute(SOURCE, nestedParent, "nested.date", dateEsField);
38+
39+
assertTrue(nestedDateField.isNested());
40+
assertEquals("nested", nestedDateField.nestedParent().name());
41+
42+
// Use the field itself as lower bound to make it non-foldable
43+
Expression nonFoldableLower = nestedDateField;
44+
Expression foldableUpper = new Literal(SOURCE, ZonedDateTime.now(ZoneOffset.UTC), DataTypes.DATETIME);
45+
46+
Range range = new Range(SOURCE, nestedDateField, nonFoldableLower, true, foldableUpper, true, ZoneOffset.UTC);
47+
assertFalse(range.lower().foldable());
48+
assertTrue(range.upper().foldable());
49+
50+
Query result = ExpressionTranslators.Ranges.doTranslate(range, new QlTranslatorHandler());
51+
52+
assertThat(result, instanceOf(NestedQuery.class));
53+
String queryString = result.asBuilder().toString();
54+
assertThat(queryString, containsString("\"nested\""));
55+
assertThat(queryString, containsString("\"script\""));
56+
}
57+
58+
public void testRangeWithNonFoldableBoundsOnNonNestedFieldReturnsScriptQuery() {
59+
EsField dateEsField = new EsField("date", DataTypes.DATETIME, Collections.emptyMap(), true);
60+
FieldAttribute dateField = new FieldAttribute(SOURCE, "date", dateEsField);
61+
62+
assertFalse(dateField.isNested());
63+
64+
Expression nonFoldableLower = dateField;
65+
Expression foldableUpper = new Literal(SOURCE, ZonedDateTime.now(ZoneOffset.UTC), DataTypes.DATETIME);
66+
67+
Range range = new Range(SOURCE, dateField, nonFoldableLower, true, foldableUpper, true, ZoneOffset.UTC);
68+
69+
Query result = ExpressionTranslators.Ranges.doTranslate(range, new QlTranslatorHandler());
70+
71+
assertThat(result, instanceOf(ScriptQuery.class));
72+
}
73+
}

0 commit comments

Comments
 (0)