code: public static <T> Set<T> filterShards(DimFilter dimFilter, Iterable<T> input, Function<T, ShardSpec> converter,
                                          Map<String, Optional<RangeSet<String>>> dimensionRangeCache)
    {
      Set<T> retSet = new LinkedHashSet<>();
  
      for (T obj : input) {
        ShardSpec shard = converter.apply(obj);
        boolean include = true;
  
        if (dimFilter != null && shard != null) {
          Map<String, RangeSet<String>> filterDomain = new HashMap<>();
          List<String> dimensions = shard.getDomainDimensions();
          for (String dimension : dimensions) {
            Optional<RangeSet<String>> optFilterRangeSet = dimensionRangeCache
                .computeIfAbsent(dimension, d -> Optional.fromNullable(dimFilter.getDimensionRangeSet(d)));
  
            if (optFilterRangeSet.isPresent()) {
              filterDomain.put(dimension, optFilterRangeSet.get());
            }
          }
          if (!filterDomain.isEmpty() && !shard.possibleInDomain(filterDomain)) {
            include = false;
          }
        }
  
        if (include) {
          retSet.add(obj);
        }
      }
      return retSet;
    }
docs: Filter the given iterable of objects by removing any object whose ShardSpec, obtained from the converter function,
  does not fit in the RangeSet of the dimFilter {@link DimFilter#getDimensionRangeSet(String)}. The returned set
  contains the filtered objects in the same order as they appear in input.
  
  DimensionRangedCache stores the RangeSets of different dimensions for the dimFilter. It should be re-used
  between calls with the same dimFilter to save redundant calls of {@link DimFilter#getDimensionRangeSet(String)}
  on same dimensions.
  
  @param dimFilter The filter to use
  @param input The iterable of objects to be filtered
  @param converter The function to convert T to ShardSpec that can be filtered by
  @param dimensionRangeCache The cache of RangeSets of different dimensions for the dimFilter
  @param <T> This can be any type, as long as transform function is provided to convert this to ShardSpec
  @return The set of filtered object, in the same order as input