Skip to content

Commit 0bbdade

Browse files
committed
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 dc3834f commit 0bbdade

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
@@ -471,12 +471,12 @@ protected QueryBuilder doRewrite(QueryRewriteContext queryRewriteContext) throws
471471
case DISJOINT:
472472
return new MatchNoneQueryBuilder();
473473
case WITHIN:
474-
if (from != null || to != null) {
474+
if (from != null || to != null || format != null || timeZone != null) {
475475
RangeQueryBuilder newRangeQuery = new RangeQueryBuilder(fieldName);
476476
newRangeQuery.from(null);
477477
newRangeQuery.to(null);
478-
newRangeQuery.format = format;
479-
newRangeQuery.timeZone = timeZone;
478+
newRangeQuery.format = null;
479+
newRangeQuery.timeZone = null;
480480
return newRangeQuery;
481481
} else {
482482
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.LegacyNumericRangeQuery;
@@ -503,6 +504,31 @@ protected MappedFieldType.Relation getRelation(QueryRewriteContext queryRewriteC
503504
assertThat(rewrittenRange.to(), equalTo(null));
504505
}
505506

507+
public void testRewriteDateToMatchAllWithTimezoneAndFormat() throws IOException {
508+
String fieldName = randomAsciiOfLengthBetween(1, 20);
509+
RangeQueryBuilder query = new RangeQueryBuilder(fieldName) {
510+
@Override
511+
protected MappedFieldType.Relation getRelation(QueryRewriteContext queryRewriteContext) throws IOException {
512+
return Relation.WITHIN;
513+
}
514+
};
515+
DateTime queryFromValue = new DateTime(2015, 1, 1, 0, 0, 0, ISOChronology.getInstanceUTC());
516+
DateTime queryToValue = new DateTime(2016, 1, 1, 0, 0, 0, ISOChronology.getInstanceUTC());
517+
query.from(queryFromValue);
518+
query.to(queryToValue);
519+
query.timeZone(randomFrom(DateTimeZone.getAvailableIDs()));
520+
query.format("yyyy-MM-dd");
521+
QueryShardContext queryShardContext = createShardContext();
522+
QueryBuilder rewritten = query.rewrite(queryShardContext);
523+
assertThat(rewritten, instanceOf(RangeQueryBuilder.class));
524+
RangeQueryBuilder rewrittenRange = (RangeQueryBuilder) rewritten;
525+
assertThat(rewrittenRange.fieldName(), equalTo(fieldName));
526+
assertThat(rewrittenRange.from(), equalTo(null));
527+
assertThat(rewrittenRange.to(), equalTo(null));
528+
assertThat(rewrittenRange.timeZone(), equalTo(null));
529+
assertThat(rewrittenRange.format(), equalTo(null));
530+
}
531+
506532
public void testRewriteDateToMatchNone() throws IOException {
507533
String fieldName = randomAsciiOfLengthBetween(1, 20);
508534
RangeQueryBuilder query = new RangeQueryBuilder(fieldName) {

0 commit comments

Comments
 (0)