boolean matchesRange(Comparable<Object> value) {
    if (min != NoValue.INSTANCE) {
      int cmp = EntityProtoComparators.MULTI_TYPE_COMPARATOR.compare(value, min);
      if (cmp < 0 || (cmp == 0 && !minInclusive)) {
        return false;
      }
    }

    if (max != NoValue.INSTANCE) {
      int cmp = EntityProtoComparators.MULTI_TYPE_COMPARATOR.compare(value, max);
      if (cmp > 0 || (cmp == 0 && !maxInclusive)) {
        return false;
      }
    }

    return true;
  }
 public void addFilter(Filter filter) {
   Comparable<Object> value = DataTypeTranslator.getComparablePropertyValue(filter.getProperty(0));
   switch (filter.getOpEnum()) {
     case EQUAL:
       equalValues.add(value);
       break;
     case GREATER_THAN:
       if (min == NoValue.INSTANCE
           || EntityProtoComparators.MULTI_TYPE_COMPARATOR.compare(min, value) <= 0) {
         min = value;
         minInclusive = false;
       }
       break;
     case GREATER_THAN_OR_EQUAL:
       if (min == NoValue.INSTANCE
           || EntityProtoComparators.MULTI_TYPE_COMPARATOR.compare(min, value) < 0) {
         min = value;
         minInclusive = true;
       }
       break;
     case LESS_THAN:
       if (max == NoValue.INSTANCE
           || EntityProtoComparators.MULTI_TYPE_COMPARATOR.compare(max, value) >= 0) {
         max = value;
         maxInclusive = false;
       }
       break;
     case LESS_THAN_OR_EQUAL:
       if (max == NoValue.INSTANCE
           || EntityProtoComparators.MULTI_TYPE_COMPARATOR.compare(max, value) > 0) {
         max = value;
         maxInclusive = true;
       }
       break;
     case EXISTS:
       break;
     default:
       throw new IllegalArgumentException(
           "Unable to perform filter using operator " + filter.getOp());
   }
 }