public BaseDateTimeTransformer()

in pinot-core/src/main/java/org/apache/pinot/core/operator/transform/transformer/datetime/BaseDateTimeTransformer.java [64:201]


  public BaseDateTimeTransformer(
      DateTimeFormatSpec inputFormat,
      DateTimeFormatSpec outputFormat,
      DateTimeGranularitySpec outputGranularity,
      @Nullable DateTimeZone bucketingTimeZone) {

    _inputTimeSize = inputFormat.getColumnSize();
    _inputTimeUnit = inputFormat.getColumnUnit();
    _inputDateTimeFormatter = inputFormat.getDateTimeFormatter();
    _outputTimeSize = outputFormat.getColumnSize();
    _outputTimeUnit = outputFormat.getColumnDateTimeTransformUnit();
    _outputDateTimeFormatter = outputFormat.getDateTimeFormatter();
    _outputGranularity = outputGranularity;
    _outputGranularityMillis = outputGranularity.granularityToMillis();
    _bucketingChronology = bucketingTimeZone != null ? ISOChronology.getInstance(bucketingTimeZone) : null;
    _dateTime = new MutableDateTime(0L, DateTimeZone.UTC);
    _printBuffer = new StringBuilder();

    final int size = _outputGranularity.getSize();

    // setup date time truncating based on output granularity
    // when size == 1, skip the needless set() calls
    switch (_outputGranularity.getTimeUnit()) {
      case MILLISECONDS:
        if (size != 1) {
          _sdfDateTimeTruncate = (dateTime) -> {
            dateTime.setMillisOfSecond((dateTime.getMillisOfSecond() / size) * size);
            return print(dateTime);
          };
          _millisDateTimeTruncate = (dateTime) -> {
            dateTime.setMillisOfSecond((dateTime.getMillisOfSecond() / size) * size);
            return dateTime.getMillis();
          };
        } else {
          _sdfDateTimeTruncate = (dateTime) -> print(dateTime);
          _millisDateTimeTruncate = (dateTime) -> dateTime.getMillis();
        }
        break;
      case SECONDS:
        if (size != 1) {
          _sdfDateTimeTruncate = (dateTime) -> {
            dateTime.setSecondOfMinute((dateTime.getSecondOfMinute() / size) * size);
            dateTime.secondOfMinute().roundFloor();
            return print(dateTime);
          };
          _millisDateTimeTruncate = (dateTime) -> {
            dateTime.setSecondOfMinute((dateTime.getSecondOfMinute() / size) * size);
            dateTime.secondOfMinute().roundFloor();
            return dateTime.getMillis();
          };
        } else {
          _sdfDateTimeTruncate = (dateTime) -> {
            dateTime.secondOfMinute().roundFloor();
            return print(dateTime);
          };
          _millisDateTimeTruncate = (dateTime) -> {
            dateTime.secondOfMinute().roundFloor();
            return dateTime.getMillis();
          };
        }
        break;
      case MINUTES:
        if (size != 1) {
          _sdfDateTimeTruncate = (dateTime) -> {
            dateTime.setMinuteOfHour((dateTime.getMinuteOfHour() / size) * size);
            dateTime.minuteOfHour().roundFloor();
            return print(dateTime);
          };
          _millisDateTimeTruncate = (dateTime) -> {
            dateTime.setMinuteOfHour((dateTime.getMinuteOfHour() / size) * size);
            dateTime.minuteOfHour().roundFloor();
            return dateTime.getMillis();
          };
        } else {
          _sdfDateTimeTruncate = (dateTime) -> {
            dateTime.minuteOfHour().roundFloor();
            return print(dateTime);
          };
          _millisDateTimeTruncate = (dateTime) -> {
            dateTime.minuteOfHour().roundFloor();
            return dateTime.getMillis();
          };
        }
        break;
      case HOURS:
        if (size != 1) {
          _sdfDateTimeTruncate = (dateTime) -> {
            dateTime.setHourOfDay((dateTime.getHourOfDay() / size) * size);
            dateTime.hourOfDay().roundFloor();
            return print(dateTime);
          };
          _millisDateTimeTruncate = (dateTime) -> {
            dateTime.setHourOfDay((dateTime.getHourOfDay() / size) * size);
            dateTime.hourOfDay().roundFloor();
            return dateTime.getMillis();
          };
        } else {
          _sdfDateTimeTruncate = (dateTime) -> {
            dateTime.hourOfDay().roundFloor();
            return print(dateTime);
          };
          _millisDateTimeTruncate = (dateTime) -> {
            dateTime.hourOfDay().roundFloor();
            return dateTime.getMillis();
          };
        }
        break;
      case DAYS:
        if (size != 1) {
          _sdfDateTimeTruncate = (dateTime) -> {
            dateTime.setDayOfMonth(((dateTime.getDayOfMonth() - 1) / size) * size + 1);
            dateTime.dayOfMonth().roundFloor();
            return print(dateTime);
          };
          _millisDateTimeTruncate = (dateTime) -> {
            dateTime.setDayOfMonth(((dateTime.getDayOfMonth() - 1) / size) * size + 1);
            dateTime.dayOfMonth().roundFloor();
            return dateTime.getMillis();
          };
        } else {
          _sdfDateTimeTruncate = (dateTime) -> {
            dateTime.dayOfMonth().roundFloor();
            return print(dateTime);
          };
          _millisDateTimeTruncate = (dateTime) -> {
            dateTime.dayOfMonth().roundFloor();
            return dateTime.getMillis();
          };
        }
        break;
      default:
        // truncating to MICROSECONDS or NANOSECONDS doesn't do anything because timestamps are stored
        // in milliseconds at most
        _sdfDateTimeTruncate = _outputDateTimeFormatter::print;
        _millisDateTimeTruncate = (dateTime) -> dateTime.getMillis();
        break;
    }
  }