@Override
    public Query rangeQuery(
        Object lowerTerm, Object upperTerm, boolean includeLower, boolean includeUpper) {
      failIfNotIndexed();
      InetAddress lower;
      if (lowerTerm == null) {
        lower = XInetAddressPoint.MIN_VALUE;
      } else {
        lower = parse(lowerTerm);
        if (includeLower == false) {
          if (lower.equals(XInetAddressPoint.MAX_VALUE)) {
            return new MatchNoDocsQuery();
          }
          lower = XInetAddressPoint.nextUp(lower);
        }
      }

      InetAddress upper;
      if (upperTerm == null) {
        upper = XInetAddressPoint.MAX_VALUE;
      } else {
        upper = parse(upperTerm);
        if (includeUpper == false) {
          if (upper.equals(XInetAddressPoint.MIN_VALUE)) {
            return new MatchNoDocsQuery();
          }
          upper = XInetAddressPoint.nextDown(upper);
        }
      }

      return InetAddressPoint.newRangeQuery(name(), lower, upper);
    }
 @Override
 public Query fuzzyQuery(
     Object value,
     Fuzziness fuzziness,
     int prefixLength,
     int maxExpansions,
     boolean transpositions) {
   failIfNotIndexed();
   InetAddress base = parse(value);
   int mask = fuzziness.asInt();
   return XInetAddressPoint.newPrefixQuery(name(), base, mask);
 }
 @Override
 public Query termQuery(Object value, @Nullable QueryShardContext context) {
   failIfNotIndexed();
   if (value instanceof InetAddress) {
     return InetAddressPoint.newExactQuery(name(), (InetAddress) value);
   } else {
     if (value instanceof BytesRef) {
       value = ((BytesRef) value).utf8ToString();
     }
     String term = value.toString();
     if (term.contains("/")) {
       String[] fields = term.split("/");
       if (fields.length == 2) {
         InetAddress address = InetAddresses.forString(fields[0]);
         int prefixLength = Integer.parseInt(fields[1]);
         return XInetAddressPoint.newPrefixQuery(name(), address, prefixLength);
       } else {
         throw new IllegalArgumentException("Expected [ip/prefix] but was [" + term + "]");
       }
     }
     InetAddress address = InetAddresses.forString(term);
     return InetAddressPoint.newExactQuery(name(), address);
   }
 }