@Override
 public Filter rangeFilter(
     QueryParseContext parseContext,
     Object lowerTerm,
     Object upperTerm,
     boolean includeLower,
     boolean includeUpper,
     @Nullable QueryParseContext context) {
   return NumericRangeFieldDataFilter.newLongRange(
       (IndexNumericFieldData) parseContext.getForField(this),
       lowerTerm == null ? null : parseValue(lowerTerm),
       upperTerm == null ? null : parseValue(upperTerm),
       includeLower,
       includeUpper);
 }
 @Override
 public Filter rangeFilter(
     FieldDataCache fieldDataCache,
     Object lowerTerm,
     Object upperTerm,
     boolean includeLower,
     boolean includeUpper,
     @Nullable QueryParseContext context) {
   return NumericRangeFieldDataFilter.newLongRange(
       fieldDataCache,
       names.indexName(),
       lowerTerm == null ? null : parseValue(lowerTerm),
       upperTerm == null ? null : parseValue(upperTerm),
       includeLower,
       includeUpper);
 }
  private Filter innerRangeFilter(
      IndexNumericFieldData fieldData,
      Object lowerTerm,
      Object upperTerm,
      boolean includeLower,
      boolean includeUpper,
      @Nullable DateTimeZone timeZone,
      @Nullable DateMathParser forcedDateParser,
      @Nullable Boolean explicitCaching) {
    boolean cache;
    boolean cacheable = true;
    Long lowerVal = null;
    Long upperVal = null;
    if (lowerTerm != null) {
      if (lowerTerm instanceof Number) {
        lowerVal = ((Number) lowerTerm).longValue();
      } else {
        String value = convertToString(lowerTerm);
        cacheable = !hasDateExpressionWithNoRounding(value);
        lowerVal = parseToMilliseconds(value, false, timeZone, forcedDateParser);
      }
    }
    if (upperTerm != null) {
      if (upperTerm instanceof Number) {
        upperVal = ((Number) upperTerm).longValue();
      } else {
        String value = convertToString(upperTerm);
        cacheable = cacheable && !hasDateExpressionWithNoRounding(value);
        upperVal = parseToMilliseconds(value, includeUpper, timeZone, forcedDateParser);
      }
    }

    if (explicitCaching != null) {
      if (explicitCaching) {
        cache = cacheable;
      } else {
        cache = false;
      }
    } else {
      cache = cacheable;
    }

    Filter filter;
    if (fieldData != null) {
      filter =
          NumericRangeFieldDataFilter.newLongRange(
              fieldData, lowerVal, upperVal, includeLower, includeUpper);
    } else {
      filter =
          NumericRangeFilter.newLongRange(
              names.indexName(), precisionStep, lowerVal, upperVal, includeLower, includeUpper);
    }

    if (!cache) {
      // We don't cache range filter if `now` date expression is used and also when a compound
      // filter wraps
      // a range filter with a `now` date expressions.
      return NoCacheFilter.wrap(filter);
    } else {
      return filter;
    }
  }