public List<RangeDimensionRange> partition(
     List<RangeDimensionRange> ranges, int num, Collection<Rule> rules, Aggregator aggregator) {
   int rangePerOutputRange = (int) (Math.ceil(1.0 * ranges.size() / num));
   List<RangeDimensionRange> outputRanges = new ArrayList<RangeDimensionRange>(num);
   for (int i = 0; i < ranges.size(); i += rangePerOutputRange) {
     RangeDimensionRange dimensionRange = ranges.get(i);
     outputRanges.add(
         new RangeDimensionRange(
             dimensionRange.getStart(),
             ranges.get(Math.min(i + rangePerOutputRange, ranges.size()) - 1).getEnd(),
             dimensionRange.getInfo()));
   }
   return outputRanges;
 }