diff options
author | imunkin <imunkin@yandex-team.com> | 2024-11-27 17:22:52 +0300 |
---|---|---|
committer | imunkin <imunkin@yandex-team.com> | 2024-11-27 17:44:32 +0300 |
commit | 33266313a237df5574c6426ea4beb6c165b9f3d7 (patch) | |
tree | 25125a0b8673417e29d073d4f35272655e23bee2 /yql/essentials/udfs/common/datetime2/datetime_udf.cpp | |
parent | 2d4ccf80e7eefd304f113a94a6d1a1b2e9eb5d4c (diff) | |
download | ydb-33266313a237df5574c6426ea4beb6c165b9f3d7.tar.gz |
YQL-18303: Introduce IntervalFrom* converters overloads for Interval64
commit_hash:c17121050d6f0624a1d96d89bac0326fb899315c
Diffstat (limited to 'yql/essentials/udfs/common/datetime2/datetime_udf.cpp')
-rw-r--r-- | yql/essentials/udfs/common/datetime2/datetime_udf.cpp | 72 |
1 files changed, 26 insertions, 46 deletions
diff --git a/yql/essentials/udfs/common/datetime2/datetime_udf.cpp b/yql/essentials/udfs/common/datetime2/datetime_udf.cpp index 3798557b91..d7948c3371 100644 --- a/yql/essentials/udfs/common/datetime2/datetime_udf.cpp +++ b/yql/essentials/udfs/common/datetime2/datetime_udf.cpp @@ -561,10 +561,16 @@ TValue DoAddYears(const TValue& date, i64 years, const NUdf::IDateBuilder& build return timestamp >= MIN_TIMESTAMP64 && timestamp <= MAX_TIMESTAMP64; } - inline bool ValidateInterval(i64 interval) { + template<> + inline bool Validate<TInterval>(i64 interval) { return interval > -i64(MAX_TIMESTAMP) && interval < i64(MAX_TIMESTAMP); } + template<> + inline bool Validate<TInterval64>(i64 interval) { + return interval >= -MAX_INTERVAL64 && interval <= MAX_INTERVAL64; + } + // Split template<typename TUserDataType, bool Nullable> @@ -1306,52 +1312,19 @@ TValue DoAddYears(const TValue& date, i64 years, const NUdf::IDateBuilder& build DATETIME_FROM_CONVERTER_UDF(FromMilliseconds64, TTimestamp64, i64, UsecondsInMilliseconds); DATETIME_FROM_CONVERTER_UDF(FromMicroseconds64, TTimestamp64, i64, 1); + DATETIME_FROM_CONVERTER_UDF(IntervalFromDays, TInterval, i32, UsecondsInDay); + DATETIME_FROM_CONVERTER_UDF(IntervalFromHours, TInterval, i32, UsecondsInHour); + DATETIME_FROM_CONVERTER_UDF(IntervalFromMinutes, TInterval, i32, UsecondsInMinute); + DATETIME_FROM_CONVERTER_UDF(IntervalFromSeconds, TInterval, i32, UsecondsInSecond); + DATETIME_FROM_CONVERTER_UDF(IntervalFromMilliseconds, TInterval, i64, UsecondsInMilliseconds); + DATETIME_FROM_CONVERTER_UDF(IntervalFromMicroseconds, TInterval, i64, 1); - template <typename TInput, i64 Multiplier> - using TIntervalFromKernel = TUnaryUnsafeFixedSizeFilterKernel<TInput, i64, - [] (TInput interval) { return std::make_pair(i64(interval * Multiplier), ValidateInterval(interval)); }>; - - BEGIN_SIMPLE_STRICT_ARROW_UDF(TIntervalFromDays, TOptional<TInterval>(TAutoMap<i32>)) { - Y_UNUSED(valueBuilder); - const i64 res = i64(args[0].Get<i32>()) * UsecondsInDay; - return ValidateInterval(res) ? TUnboxedValuePod(res) : TUnboxedValuePod(); - } - END_SIMPLE_ARROW_UDF(TIntervalFromDays, (TIntervalFromKernel<i32, UsecondsInDay>::Do)); - - BEGIN_SIMPLE_STRICT_ARROW_UDF(TIntervalFromHours, TOptional<TInterval>(TAutoMap<i32>)) { - Y_UNUSED(valueBuilder); - const i64 res = i64(args[0].Get<i32>()) * UsecondsInHour; - return ValidateInterval(res) ? TUnboxedValuePod(res) : TUnboxedValuePod(); - } - END_SIMPLE_ARROW_UDF(TIntervalFromHours, (TIntervalFromKernel<i32, UsecondsInHour>::Do)); - - BEGIN_SIMPLE_STRICT_ARROW_UDF(TIntervalFromMinutes, TOptional<TInterval>(TAutoMap<i32>)) { - Y_UNUSED(valueBuilder); - const i64 res = i64(args[0].Get<i32>()) * UsecondsInMinute; - return ValidateInterval(res) ? TUnboxedValuePod(res) : TUnboxedValuePod(); - } - END_SIMPLE_ARROW_UDF(TIntervalFromMinutes, (TIntervalFromKernel<i32, UsecondsInMinute>::Do)); - - BEGIN_SIMPLE_STRICT_ARROW_UDF(TIntervalFromSeconds, TOptional<TInterval>(TAutoMap<i32>)) { - Y_UNUSED(valueBuilder); - const i64 res = i64(args[0].Get<i32>()) * UsecondsInSecond; - return ValidateInterval(res) ? TUnboxedValuePod(res) : TUnboxedValuePod(); - } - END_SIMPLE_ARROW_UDF(TIntervalFromSeconds, (TIntervalFromKernel<i32, UsecondsInSecond>::Do)); - - BEGIN_SIMPLE_STRICT_ARROW_UDF(TIntervalFromMilliseconds, TOptional<TInterval>(TAutoMap<i64>)) { - Y_UNUSED(valueBuilder); - const i64 res = i64(args[0].Get<i64>()) * UsecondsInMilliseconds; - return ValidateInterval(res) ? TUnboxedValuePod(res) : TUnboxedValuePod(); - } - END_SIMPLE_ARROW_UDF(TIntervalFromMilliseconds, (TIntervalFromKernel<i64, UsecondsInMilliseconds>::Do)); - - BEGIN_SIMPLE_STRICT_ARROW_UDF(TIntervalFromMicroseconds, TOptional<TInterval>(TAutoMap<i64>)) { - Y_UNUSED(valueBuilder); - const i64 res = args[0].Get<i64>(); - return ValidateInterval(res) ? TUnboxedValuePod(res) : TUnboxedValuePod(); - } - END_SIMPLE_ARROW_UDF(TIntervalFromMicroseconds, (TIntervalFromKernel<i64, 1>::Do)); + DATETIME_FROM_CONVERTER_UDF(Interval64FromDays, TInterval64, i32, UsecondsInDay); + DATETIME_FROM_CONVERTER_UDF(Interval64FromHours, TInterval64, i64, UsecondsInHour); + DATETIME_FROM_CONVERTER_UDF(Interval64FromMinutes, TInterval64, i64, UsecondsInMinute); + DATETIME_FROM_CONVERTER_UDF(Interval64FromSeconds, TInterval64, i64, UsecondsInSecond); + DATETIME_FROM_CONVERTER_UDF(Interval64FromMilliseconds, TInterval64, i64, UsecondsInMilliseconds); + DATETIME_FROM_CONVERTER_UDF(Interval64FromMicroseconds, TInterval64, i64, 1); // To* @@ -2437,6 +2410,13 @@ TValue DoAddYears(const TValue& date, i64 years, const NUdf::IDateBuilder& build TIntervalFromMilliseconds, TIntervalFromMicroseconds, + TInterval64FromDays, + TInterval64FromHours, + TInterval64FromMinutes, + TInterval64FromSeconds, + TInterval64FromMilliseconds, + TInterval64FromMicroseconds, + TToDays, TToHours, TToMinutes, |