|
@@ -47,7 +47,10 @@ import org.joda.time.format.ISODateTimeFormat;
|
|
|
import org.junit.Test;
|
|
|
|
|
|
import java.io.IOException;
|
|
|
-import java.util.*;
|
|
|
+import java.util.HashSet;
|
|
|
+import java.util.Locale;
|
|
|
+import java.util.Random;
|
|
|
+import java.util.Set;
|
|
|
import java.util.concurrent.ExecutionException;
|
|
|
|
|
|
import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_REPLICAS;
|
|
@@ -2342,6 +2345,200 @@ public class SimpleQueryTests extends ElasticsearchIntegrationTest {
|
|
|
assertThat(statsResponse.getIndex("test").getTotal().getFilterCache().getMemorySizeInBytes(), cluster().hasFilterCache() ? greaterThan(filtercacheSize) : is(filtercacheSize));
|
|
|
}
|
|
|
|
|
|
+ @Test
|
|
|
+ public void testRangeFilterWithTimeZone() throws Exception {
|
|
|
+ assertAcked(prepareCreate("test")
|
|
|
+ .addMapping("type1", "date", "type=date"));
|
|
|
+ ensureGreen();
|
|
|
+
|
|
|
+ index("test", "type1", "1", "date", "2014-01-01", "num", 1);
|
|
|
+ index("test", "type1", "2", "date", "2013-12-31T23:00:00", "num", 2);
|
|
|
+ index("test", "type1", "3", "date", "2014-01-01T01:00:00", "num", 3);
|
|
|
+ // Now in UTC+1
|
|
|
+ index("test", "type1", "4", "date", DateTime.now(DateTimeZone.forOffsetHours(1)).getMillis(), "num", 4);
|
|
|
+
|
|
|
+ refresh();
|
|
|
+
|
|
|
+ SearchResponse searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.filteredQuery(matchAllQuery(), FilterBuilders.rangeFilter("date").from("2014-01-01T00:00:00").to("2014-01-01T00:59:00")))
|
|
|
+ .get();
|
|
|
+ assertHitCount(searchResponse, 1l);
|
|
|
+ assertThat(searchResponse.getHits().getAt(0).getId(), is("1"));
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.filteredQuery(matchAllQuery(), FilterBuilders.rangeFilter("date").from("2013-12-31T23:00:00").to("2013-12-31T23:59:00")))
|
|
|
+ .get();
|
|
|
+ assertHitCount(searchResponse, 1l);
|
|
|
+ assertThat(searchResponse.getHits().getAt(0).getId(), is("2"));
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.filteredQuery(matchAllQuery(), FilterBuilders.rangeFilter("date").from("2014-01-01T01:00:00").to("2014-01-01T01:59:00")))
|
|
|
+ .get();
|
|
|
+ assertHitCount(searchResponse, 1l);
|
|
|
+ assertThat(searchResponse.getHits().getAt(0).getId(), is("3"));
|
|
|
+
|
|
|
+ // We explicitly define a time zone in the from/to dates so whatever the time zone is, it won't be used
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.filteredQuery(matchAllQuery(), FilterBuilders.rangeFilter("date").from("2014-01-01T00:00:00Z").to("2014-01-01T00:59:00Z").timeZone("+10:00")))
|
|
|
+ .get();
|
|
|
+ assertHitCount(searchResponse, 1l);
|
|
|
+ assertThat(searchResponse.getHits().getAt(0).getId(), is("1"));
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.filteredQuery(matchAllQuery(), FilterBuilders.rangeFilter("date").from("2013-12-31T23:00:00Z").to("2013-12-31T23:59:00Z").timeZone("+10:00")))
|
|
|
+ .get();
|
|
|
+ assertHitCount(searchResponse, 1l);
|
|
|
+ assertThat(searchResponse.getHits().getAt(0).getId(), is("2"));
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.filteredQuery(matchAllQuery(), FilterBuilders.rangeFilter("date").from("2014-01-01T01:00:00Z").to("2014-01-01T01:59:00Z").timeZone("+10:00")))
|
|
|
+ .get();
|
|
|
+ assertHitCount(searchResponse, 1l);
|
|
|
+ assertThat(searchResponse.getHits().getAt(0).getId(), is("3"));
|
|
|
+
|
|
|
+ // We define a time zone to be applied to the filter and from/to have no time zone
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.filteredQuery(matchAllQuery(), FilterBuilders.rangeFilter("date").from("2014-01-01T03:00:00").to("2014-01-01T03:59:00").timeZone("+3:00")))
|
|
|
+ .get();
|
|
|
+ assertHitCount(searchResponse, 1l);
|
|
|
+ assertThat(searchResponse.getHits().getAt(0).getId(), is("1"));
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.filteredQuery(matchAllQuery(), FilterBuilders.rangeFilter("date").from("2014-01-01T02:00:00").to("2014-01-01T02:59:00").timeZone("+3:00")))
|
|
|
+ .get();
|
|
|
+ assertHitCount(searchResponse, 1l);
|
|
|
+ assertThat(searchResponse.getHits().getAt(0).getId(), is("2"));
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.filteredQuery(matchAllQuery(), FilterBuilders.rangeFilter("date").from("2014-01-01T04:00:00").to("2014-01-01T04:59:00").timeZone("+3:00")))
|
|
|
+ .get();
|
|
|
+ assertHitCount(searchResponse, 1l);
|
|
|
+ assertThat(searchResponse.getHits().getAt(0).getId(), is("3"));
|
|
|
+
|
|
|
+ // When we use long values, it means we have ms since epoch UTC based so we don't apply any transformation
|
|
|
+ try {
|
|
|
+ client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.filteredQuery(matchAllQuery(), FilterBuilders.rangeFilter("date").from(1388534400000L).to(1388537940999L).timeZone("+1:00")))
|
|
|
+ .get();
|
|
|
+ fail("A Range Filter using ms since epoch with a TimeZone should raise a QueryParsingException");
|
|
|
+ } catch (SearchPhaseExecutionException e) {
|
|
|
+ // We expect it
|
|
|
+ }
|
|
|
+
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.filteredQuery(matchAllQuery(), FilterBuilders.rangeFilter("date").from("2014-01-01").to("2014-01-01T00:59:00").timeZone("-1:00")))
|
|
|
+ .get();
|
|
|
+ assertHitCount(searchResponse, 1l);
|
|
|
+ assertThat(searchResponse.getHits().getAt(0).getId(), is("3"));
|
|
|
+
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.filteredQuery(matchAllQuery(), FilterBuilders.rangeFilter("date").from("now/d-1d").timeZone("+1:00")))
|
|
|
+ .get();
|
|
|
+ assertHitCount(searchResponse, 1l);
|
|
|
+ assertThat(searchResponse.getHits().getAt(0).getId(), is("4"));
|
|
|
+
|
|
|
+ // A Range Filter on a numeric field with a TimeZone should raise an exception
|
|
|
+ try {
|
|
|
+ client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.filteredQuery(matchAllQuery(), FilterBuilders.rangeFilter("num").from("0").to("4").timeZone("-1:00")))
|
|
|
+ .get();
|
|
|
+ fail("A Range Filter on a numeric field with a TimeZone should raise a QueryParsingException");
|
|
|
+ } catch (SearchPhaseExecutionException e) {
|
|
|
+ // We expect it
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testRangeQueryWithTimeZone() throws Exception {
|
|
|
+ assertAcked(prepareCreate("test")
|
|
|
+ .addMapping("type1", "date", "type=date"));
|
|
|
+ ensureGreen();
|
|
|
+
|
|
|
+ index("test", "type1", "1", "date", "2014-01-01", "num", 1);
|
|
|
+ index("test", "type1", "2", "date", "2013-12-31T23:00:00", "num", 2);
|
|
|
+ index("test", "type1", "3", "date", "2014-01-01T01:00:00", "num", 3);
|
|
|
+ // Now in UTC+1
|
|
|
+ index("test", "type1", "4", "date", DateTime.now(DateTimeZone.forOffsetHours(1)).getMillis(), "num", 4);
|
|
|
+
|
|
|
+ refresh();
|
|
|
+
|
|
|
+ SearchResponse searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.rangeQuery("date").from("2014-01-01T00:00:00").to("2014-01-01T00:59:00"))
|
|
|
+ .get();
|
|
|
+ assertHitCount(searchResponse, 1l);
|
|
|
+ assertThat(searchResponse.getHits().getAt(0).getId(), is("1"));
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.rangeQuery("date").from("2013-12-31T23:00:00").to("2013-12-31T23:59:00"))
|
|
|
+ .get();
|
|
|
+ assertHitCount(searchResponse, 1l);
|
|
|
+ assertThat(searchResponse.getHits().getAt(0).getId(), is("2"));
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.rangeQuery("date").from("2014-01-01T01:00:00").to("2014-01-01T01:59:00"))
|
|
|
+ .get();
|
|
|
+ assertHitCount(searchResponse, 1l);
|
|
|
+ assertThat(searchResponse.getHits().getAt(0).getId(), is("3"));
|
|
|
+
|
|
|
+ // We explicitly define a time zone in the from/to dates so whatever the time zone is, it won't be used
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.rangeQuery("date").from("2014-01-01T00:00:00Z").to("2014-01-01T00:59:00Z").timeZone("+10:00"))
|
|
|
+ .get();
|
|
|
+ assertHitCount(searchResponse, 1l);
|
|
|
+ assertThat(searchResponse.getHits().getAt(0).getId(), is("1"));
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.rangeQuery("date").from("2013-12-31T23:00:00Z").to("2013-12-31T23:59:00Z").timeZone("+10:00"))
|
|
|
+ .get();
|
|
|
+ assertHitCount(searchResponse, 1l);
|
|
|
+ assertThat(searchResponse.getHits().getAt(0).getId(), is("2"));
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.rangeQuery("date").from("2014-01-01T01:00:00Z").to("2014-01-01T01:59:00Z").timeZone("+10:00"))
|
|
|
+ .get();
|
|
|
+ assertHitCount(searchResponse, 1l);
|
|
|
+ assertThat(searchResponse.getHits().getAt(0).getId(), is("3"));
|
|
|
+
|
|
|
+ // We define a time zone to be applied to the filter and from/to have no time zone
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.rangeQuery("date").from("2014-01-01T03:00:00").to("2014-01-01T03:59:00").timeZone("+3:00"))
|
|
|
+ .get();
|
|
|
+ assertHitCount(searchResponse, 1l);
|
|
|
+ assertThat(searchResponse.getHits().getAt(0).getId(), is("1"));
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.rangeQuery("date").from("2014-01-01T02:00:00").to("2014-01-01T02:59:00").timeZone("+3:00"))
|
|
|
+ .get();
|
|
|
+ assertHitCount(searchResponse, 1l);
|
|
|
+ assertThat(searchResponse.getHits().getAt(0).getId(), is("2"));
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.rangeQuery("date").from("2014-01-01T04:00:00").to("2014-01-01T04:59:00").timeZone("+3:00"))
|
|
|
+ .get();
|
|
|
+ assertHitCount(searchResponse, 1l);
|
|
|
+ assertThat(searchResponse.getHits().getAt(0).getId(), is("3"));
|
|
|
+
|
|
|
+ // When we use long values, it means we have ms since epoch UTC based so we don't apply any transformation
|
|
|
+ try {
|
|
|
+ client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.rangeQuery("date").from(1388534400000L).to(1388537940999L).timeZone("+1:00"))
|
|
|
+ .get();
|
|
|
+ fail("A Range Filter using ms since epoch with a TimeZone should raise a QueryParsingException");
|
|
|
+ } catch (SearchPhaseExecutionException e) {
|
|
|
+ // We expect it
|
|
|
+ }
|
|
|
+
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.rangeQuery("date").from("2014-01-01").to("2014-01-01T00:59:00").timeZone("-1:00"))
|
|
|
+ .get();
|
|
|
+ assertHitCount(searchResponse, 1l);
|
|
|
+ assertThat(searchResponse.getHits().getAt(0).getId(), is("3"));
|
|
|
+
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.rangeQuery("date").from("now/d-1d").timeZone("+1:00"))
|
|
|
+ .get();
|
|
|
+ assertHitCount(searchResponse, 1l);
|
|
|
+ assertThat(searchResponse.getHits().getAt(0).getId(), is("4"));
|
|
|
+
|
|
|
+ // A Range Filter on a numeric field with a TimeZone should raise an exception
|
|
|
+ try {
|
|
|
+ client().prepareSearch("test")
|
|
|
+ .setQuery(QueryBuilders.rangeQuery("num").from("0").to("4").timeZone("-1:00"))
|
|
|
+ .get();
|
|
|
+ fail("A Range Filter on a numeric field with a TimeZone should raise a QueryParsingException");
|
|
|
+ } catch (SearchPhaseExecutionException e) {
|
|
|
+ // We expect it
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
@Test
|
|
|
public void testSearchEmptyDoc() {
|
|
|
assertAcked(prepareCreate("test").setSettings("{\"index.analysis.analyzer.default.type\":\"keyword\"}"));
|