public void testIllegalArguments() {
    try {
      if (randomBoolean()) {
        new RangeQueryBuilder(null);
      } else {
        new RangeQueryBuilder("");
      }
      fail("cannot be null or empty");
    } catch (IllegalArgumentException e) {
      // expected
    }

    RangeQueryBuilder rangeQueryBuilder = new RangeQueryBuilder("test");
    try {
      if (randomBoolean()) {
        rangeQueryBuilder.timeZone(null);
      } else {
        rangeQueryBuilder.timeZone("badID");
      }
      fail("cannot be null or unknown id");
    } catch (IllegalArgumentException e) {
      // expected
    }

    try {
      if (randomBoolean()) {
        rangeQueryBuilder.format(null);
      } else {
        rangeQueryBuilder.format("badFormat");
      }
      fail("cannot be null or bad format");
    } catch (IllegalArgumentException e) {
      // expected
    }
  }
 /** Specifying a timezone together with an unmapped field should throw an exception. */
 public void testToQueryUnmappedWithTimezone() throws QueryShardException, IOException {
   RangeQueryBuilder query = new RangeQueryBuilder("bogus_field");
   query.from(1).to(10).timeZone("UTC");
   try {
     query.toQuery(createShardContext());
     fail("Expected QueryShardException");
   } catch (QueryShardException e) {
     assertThat(e.getMessage(), containsString("[range] time_zone can not be applied"));
   }
 }
 @Override
 protected Map<String, RangeQueryBuilder> getAlternateVersions() {
   Map<String, RangeQueryBuilder> alternateVersions = new HashMap<>();
   RangeQueryBuilder rangeQueryBuilder = new RangeQueryBuilder(INT_FIELD_NAME);
   rangeQueryBuilder.from(randomIntBetween(1, 100)).to(randomIntBetween(101, 200));
   rangeQueryBuilder.includeLower(randomBoolean());
   rangeQueryBuilder.includeUpper(randomBoolean());
   String query =
       "{\n"
           + "    \"range\":{\n"
           + "        \""
           + INT_FIELD_NAME
           + "\": {\n"
           + "            \""
           + (rangeQueryBuilder.includeLower() ? "gte" : "gt")
           + "\": "
           + rangeQueryBuilder.from()
           + ",\n"
           + "            \""
           + (rangeQueryBuilder.includeUpper() ? "lte" : "lt")
           + "\": "
           + rangeQueryBuilder.to()
           + "\n"
           + "        }\n"
           + "    }\n"
           + "}";
   alternateVersions.put(query, rangeQueryBuilder);
   return alternateVersions;
 }
  public void testFromJson() throws IOException {
    String json =
        "{\n"
            + "  \"range\" : {\n"
            + "    \"timestamp\" : {\n"
            + "      \"from\" : \"2015-01-01 00:00:00\",\n"
            + "      \"to\" : \"now\",\n"
            + "      \"include_lower\" : true,\n"
            + "      \"include_upper\" : true,\n"
            + "      \"time_zone\" : \"+01:00\",\n"
            + "      \"boost\" : 1.0\n"
            + "    }\n"
            + "  }\n"
            + "}";

    RangeQueryBuilder parsed = (RangeQueryBuilder) parseQuery(json);
    checkGeneratedJson(json, parsed);

    assertEquals(json, "2015-01-01 00:00:00", parsed.from());
    assertEquals(json, "now", parsed.to());
  }
 @Override
 protected RangeQueryBuilder doCreateTestQueryBuilder() {
   RangeQueryBuilder query;
   // switch between numeric and date ranges
   switch (randomIntBetween(0, 2)) {
     case 0:
       // use mapped integer field for numeric range queries
       query = new RangeQueryBuilder(INT_FIELD_NAME);
       query.from(randomIntBetween(1, 100));
       query.to(randomIntBetween(101, 200));
       break;
     case 1:
       // use mapped date field, using date string representation
       query = new RangeQueryBuilder(DATE_FIELD_NAME);
       query.from(
           new DateTime(
                   System.currentTimeMillis() - randomIntBetween(0, 1000000), DateTimeZone.UTC)
               .toString());
       query.to(
           new DateTime(
                   System.currentTimeMillis() + randomIntBetween(0, 1000000), DateTimeZone.UTC)
               .toString());
       // Create timestamp option only then we have a date mapper,
       // otherwise we could trigger exception.
       if (createShardContext().getMapperService().fullName(DATE_FIELD_NAME) != null) {
         if (randomBoolean()) {
           query.timeZone(randomTimeZone());
         }
         if (randomBoolean()) {
           query.format("yyyy-MM-dd'T'HH:mm:ss.SSSZZ");
         }
       }
       break;
     case 2:
     default:
       query = new RangeQueryBuilder(STRING_FIELD_NAME);
       query.from("a" + randomAsciiOfLengthBetween(1, 10));
       query.to("z" + randomAsciiOfLengthBetween(1, 10));
       break;
   }
   query.includeLower(randomBoolean()).includeUpper(randomBoolean());
   if (randomBoolean()) {
     query.from(null);
   }
   if (randomBoolean()) {
     query.to(null);
   }
   return query;
 }
 @Override
 protected void doAssertLuceneQuery(
     RangeQueryBuilder queryBuilder, Query query, QueryShardContext context) throws IOException {
   if (getCurrentTypes().length == 0
       || (queryBuilder.fieldName().equals(DATE_FIELD_NAME) == false
           && queryBuilder.fieldName().equals(INT_FIELD_NAME) == false)) {
     assertThat(query, instanceOf(TermRangeQuery.class));
     TermRangeQuery termRangeQuery = (TermRangeQuery) query;
     assertThat(termRangeQuery.getField(), equalTo(queryBuilder.fieldName()));
     assertThat(termRangeQuery.getLowerTerm(), equalTo(BytesRefs.toBytesRef(queryBuilder.from())));
     assertThat(termRangeQuery.getUpperTerm(), equalTo(BytesRefs.toBytesRef(queryBuilder.to())));
     assertThat(termRangeQuery.includesLower(), equalTo(queryBuilder.includeLower()));
     assertThat(termRangeQuery.includesUpper(), equalTo(queryBuilder.includeUpper()));
   } else if (queryBuilder.fieldName().equals(DATE_FIELD_NAME)) {
     // we can't properly test unmapped dates because LateParsingQuery is package private
   } else if (queryBuilder.fieldName().equals(INT_FIELD_NAME)) {
     assertThat(query, instanceOf(NumericRangeQuery.class));
     NumericRangeQuery numericRangeQuery = (NumericRangeQuery) query;
     assertThat(numericRangeQuery.getField(), equalTo(queryBuilder.fieldName()));
     assertThat(numericRangeQuery.getMin(), equalTo(queryBuilder.from()));
     assertThat(numericRangeQuery.getMax(), equalTo(queryBuilder.to()));
     assertThat(numericRangeQuery.includesMin(), equalTo(queryBuilder.includeLower()));
     assertThat(numericRangeQuery.includesMax(), equalTo(queryBuilder.includeUpper()));
   } else {
     throw new UnsupportedOperationException();
   }
 }