public void fromXContent(XContentParser parser) throws IOException {
    DateMathParser dateParser =
        new DateMathParser(Joda.forPattern("dateOptionalTime"), TimeUnit.MILLISECONDS);
    String currentFieldName = null;
    XContentParser.Token token;
    while ((token = parser.nextToken()) != END_OBJECT) {
      if (token == null) {
        break;
      } else if (token == FIELD_NAME) {
        currentFieldName = parser.currentName();
      } else if (token == VALUE_NULL
          || token == VALUE_STRING
          || token == VALUE_BOOLEAN
          || token == VALUE_NUMBER) {
        if (currentFieldName.equals("name")) {
          setName(parser.text());

        } else if (currentFieldName.equals("type")) {
          setType(parser.text());

        } else if (currentFieldName.equals("started")) {
          try {
            this.started = new Date(dateParser.parse(parser.text(), 0));
          } catch (Exception e) {
            // ignore
          }

        } else if (currentFieldName.equals("timestamp")) {
          try {
            setTimestamp(new Date(dateParser.parse(parser.text(), 0)));
          } catch (Exception e) {
            // ignore
          }

        } else if (currentFieldName.equals("counter")) {
          try {
            setCounter(parser.longValue());
          } catch (Exception e) {
            // ignore
          }

        } else if (currentFieldName.equals("enabled")) {
          setEnabled(parser.booleanValue());

        } else if (currentFieldName.equals("active")) {
          setActive(parser.booleanValue());
        }
      } else if (token == START_OBJECT) {
        if ("custom".equals(currentFieldName)) {
          setCustom(parser.map());
        }
      }
    }
  }
 public long parseToMilliseconds(
     String value,
     boolean inclusive,
     @Nullable DateTimeZone zone,
     @Nullable DateMathParser forcedDateParser) {
   SearchContext sc = SearchContext.current();
   long now = sc == null ? System.currentTimeMillis() : sc.nowInMillis();
   DateMathParser dateParser = dateMathParser;
   if (forcedDateParser != null) {
     dateParser = forcedDateParser;
   }
   return dateParser.parse(value, now, inclusive, zone);
 }
 @Override
 public Query fuzzyQuery(
     String value,
     Fuzziness fuzziness,
     int prefixLength,
     int maxExpansions,
     boolean transpositions) {
   long iValue = dateMathParser.parse(value, System.currentTimeMillis());
   long iSim;
   try {
     iSim = fuzziness.asTimeValue().millis();
   } catch (Exception e) {
     // not a time format
     iSim = fuzziness.asLong();
   }
   return NumericRangeQuery.newLongRange(
       names.indexName(), precisionStep, iValue - iSim, iValue + iSim, true, true);
 }