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;
}
}