Skip to content

Commit a9135cd

Browse files
authored
RangeQuery WITHIN case now normalises query (#22431)
Previous to his change when the range query was rewritten to an unbounded range (`[* TO *]`) it maintained the timezone and format for the query. This means that queries with different timezones and format which are rewritten to unbounded range queries actually end up as different entries in the search request cache. This is inefficient and unnecessary so this change nulls the timezone and format in the rewritten query so that regardless of the timezone or format the rewritten query will be the same. Although this does not fix #22412 (since it deals with the WITHIN case rather than the INTERSECTS case) it is born from the same arguments
1 parent ed94f75 commit a9135cd

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

core/src/main/java/org/elasticsearch/index/query/RangeQueryBuilder.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -469,12 +469,12 @@ protected QueryBuilder doRewrite(QueryRewriteContext queryRewriteContext) throws
469469
case DISJOINT:
470470
return new MatchNoneQueryBuilder();
471471
case WITHIN:
472-
if (from != null || to != null) {
472+
if (from != null || to != null || format != null || timeZone != null) {
473473
RangeQueryBuilder newRangeQuery = new RangeQueryBuilder(fieldName);
474474
newRangeQuery.from(null);
475475
newRangeQuery.to(null);
476-
newRangeQuery.format = format;
477-
newRangeQuery.timeZone = timeZone;
476+
newRangeQuery.format = null;
477+
newRangeQuery.timeZone = null;
478478
return newRangeQuery;
479479
} else {
480480
return this;

core/src/test/java/org/elasticsearch/index/query/RangeQueryBuilderTests.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.elasticsearch.index.query;
2121

2222
import com.carrotsearch.randomizedtesting.generators.RandomPicks;
23+
2324
import org.apache.lucene.document.IntPoint;
2425
import org.apache.lucene.document.LongPoint;
2526
import org.apache.lucene.search.PointRangeQuery;
@@ -411,6 +412,31 @@ protected MappedFieldType.Relation getRelation(QueryRewriteContext queryRewriteC
411412
assertThat(rewrittenRange.to(), equalTo(null));
412413
}
413414

415+
public void testRewriteDateToMatchAllWithTimezoneAndFormat() throws IOException {
416+
String fieldName = randomAsciiOfLengthBetween(1, 20);
417+
RangeQueryBuilder query = new RangeQueryBuilder(fieldName) {
418+
@Override
419+
protected MappedFieldType.Relation getRelation(QueryRewriteContext queryRewriteContext) throws IOException {
420+
return Relation.WITHIN;
421+
}
422+
};
423+
DateTime queryFromValue = new DateTime(2015, 1, 1, 0, 0, 0, ISOChronology.getInstanceUTC());
424+
DateTime queryToValue = new DateTime(2016, 1, 1, 0, 0, 0, ISOChronology.getInstanceUTC());
425+
query.from(queryFromValue);
426+
query.to(queryToValue);
427+
query.timeZone(randomFrom(DateTimeZone.getAvailableIDs()));
428+
query.format("yyyy-MM-dd");
429+
QueryShardContext queryShardContext = createShardContext();
430+
QueryBuilder rewritten = query.rewrite(queryShardContext);
431+
assertThat(rewritten, instanceOf(RangeQueryBuilder.class));
432+
RangeQueryBuilder rewrittenRange = (RangeQueryBuilder) rewritten;
433+
assertThat(rewrittenRange.fieldName(), equalTo(fieldName));
434+
assertThat(rewrittenRange.from(), equalTo(null));
435+
assertThat(rewrittenRange.to(), equalTo(null));
436+
assertThat(rewrittenRange.timeZone(), equalTo(null));
437+
assertThat(rewrittenRange.format(), equalTo(null));
438+
}
439+
414440
public void testRewriteDateToMatchNone() throws IOException {
415441
String fieldName = randomAsciiOfLengthBetween(1, 20);
416442
RangeQueryBuilder query = new RangeQueryBuilder(fieldName) {

0 commit comments

Comments
 (0)