From 618e1f654f4fb6319a523a946acba10123b172be Mon Sep 17 00:00:00 2001 From: Colin Goodheart-Smithe Date: Wed, 4 Jan 2017 12:54:18 +0000 Subject: [PATCH] RangeQuery WITHIN case now normalises query 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 --- .../index/query/RangeQueryBuilder.java | 6 ++--- .../index/query/RangeQueryBuilderTests.java | 26 +++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/index/query/RangeQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/RangeQueryBuilder.java index afc5b7dd2c56f..bc1bd4bea93dd 100644 --- a/core/src/main/java/org/elasticsearch/index/query/RangeQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/RangeQueryBuilder.java @@ -469,12 +469,12 @@ protected QueryBuilder doRewrite(QueryRewriteContext queryRewriteContext) throws case DISJOINT: return new MatchNoneQueryBuilder(); case WITHIN: - if (from != null || to != null) { + if (from != null || to != null || format != null || timeZone != null) { RangeQueryBuilder newRangeQuery = new RangeQueryBuilder(fieldName); newRangeQuery.from(null); newRangeQuery.to(null); - newRangeQuery.format = format; - newRangeQuery.timeZone = timeZone; + newRangeQuery.format = null; + newRangeQuery.timeZone = null; return newRangeQuery; } else { return this; diff --git a/core/src/test/java/org/elasticsearch/index/query/RangeQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/RangeQueryBuilderTests.java index b48179e0a733a..2640998f3c4a3 100644 --- a/core/src/test/java/org/elasticsearch/index/query/RangeQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/RangeQueryBuilderTests.java @@ -20,6 +20,7 @@ package org.elasticsearch.index.query; import com.carrotsearch.randomizedtesting.generators.RandomPicks; + import org.apache.lucene.document.IntPoint; import org.apache.lucene.document.LongPoint; import org.apache.lucene.search.PointRangeQuery; @@ -411,6 +412,31 @@ protected MappedFieldType.Relation getRelation(QueryRewriteContext queryRewriteC assertThat(rewrittenRange.to(), equalTo(null)); } + public void testRewriteDateToMatchAllWithTimezoneAndFormat() throws IOException { + String fieldName = randomAsciiOfLengthBetween(1, 20); + RangeQueryBuilder query = new RangeQueryBuilder(fieldName) { + @Override + protected MappedFieldType.Relation getRelation(QueryRewriteContext queryRewriteContext) throws IOException { + return Relation.WITHIN; + } + }; + DateTime queryFromValue = new DateTime(2015, 1, 1, 0, 0, 0, ISOChronology.getInstanceUTC()); + DateTime queryToValue = new DateTime(2016, 1, 1, 0, 0, 0, ISOChronology.getInstanceUTC()); + query.from(queryFromValue); + query.to(queryToValue); + query.timeZone(randomFrom(DateTimeZone.getAvailableIDs())); + query.format("yyyy-MM-dd"); + QueryShardContext queryShardContext = createShardContext(); + QueryBuilder rewritten = query.rewrite(queryShardContext); + assertThat(rewritten, instanceOf(RangeQueryBuilder.class)); + RangeQueryBuilder rewrittenRange = (RangeQueryBuilder) rewritten; + assertThat(rewrittenRange.fieldName(), equalTo(fieldName)); + assertThat(rewrittenRange.from(), equalTo(null)); + assertThat(rewrittenRange.to(), equalTo(null)); + assertThat(rewrittenRange.timeZone(), equalTo(null)); + assertThat(rewrittenRange.format(), equalTo(null)); + } + public void testRewriteDateToMatchNone() throws IOException { String fieldName = randomAsciiOfLengthBetween(1, 20); RangeQueryBuilder query = new RangeQueryBuilder(fieldName) {