@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;
 }
 @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();
   }
 }
 @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;
 }