private void initPartitionRange(ColumnValueRange dimRange) {
   if (null != dimRange.getBeginValue()) {
     this.partitionColumnStartDate = DateFormat.stringToDate(dimRange.getBeginValue()).getTime();
   }
   if (null != dimRange.getEndValue()) {
     this.partitionColumnEndDate = DateFormat.stringToDate(dimRange.getEndValue()).getTime();
   }
 }
  private void init(Collection<ColumnValueRange> andDimensionRanges) {
    int size = andDimensionRanges.size();
    Map<TblColRef, String> startValues = Maps.newHashMapWithExpectedSize(size);
    Map<TblColRef, String> stopValues = Maps.newHashMapWithExpectedSize(size);
    Map<TblColRef, Set<String>> fuzzyValues = Maps.newHashMapWithExpectedSize(size);
    for (ColumnValueRange dimRange : andDimensionRanges) {
      TblColRef column = dimRange.getColumn();
      startValues.put(column, dimRange.getBeginValue());
      stopValues.put(column, dimRange.getEndValue());
      fuzzyValues.put(column, dimRange.getEqualValues());

      TblColRef partitionDateColumnRef =
          cubeSeg.getCubeDesc().getModel().getPartitionDesc().getPartitionDateColumnRef();
      if (column.equals(partitionDateColumnRef)) {
        initPartitionRange(dimRange);
      }
    }

    AbstractRowKeyEncoder encoder = AbstractRowKeyEncoder.createInstance(cubeSeg, cuboid);

    encoder.setBlankByte(RowConstants.ROWKEY_LOWER_BYTE);

    this.startKey = encoder.encode(startValues);

    encoder.setBlankByte(RowConstants.ROWKEY_UPPER_BYTE);

    // In order to make stopRow inclusive add a trailing 0 byte. #See
    // Scan.setStopRow(byte [] stopRow)
    this.stopKey = Bytes.add(encoder.encode(stopValues), ZERO_TAIL_BYTES);

    // restore encoder defaults for later reuse (note
    // AbstractRowKeyEncoder.createInstance() caches instances)
    encoder.setBlankByte(AbstractRowKeyEncoder.DEFAULT_BLANK_BYTE);

    // always fuzzy match cuboid ID to lock on the selected cuboid
    this.fuzzyKeys = buildFuzzyKeys(fuzzyValues);
  }