@@ -431,28 +431,24 @@ struct TGetTimeComponent {
431431
432432namespace {
433433
434- const TTMStorage& Reference (const NUdf::TUnboxedValuePod& value) {
435- return *reinterpret_cast <const TTMStorage*>(value.GetRawPtr ());
434+ // FIXME: The default value for TResourceName allows to omit
435+ // explicit specialization in functions that still doesn't support
436+ // big datetime types. Should be removed in future.
437+ template <const char * TResourceName = TMResourceName, typename TValue,
438+ typename TStorage = std::conditional_t <TResourceName == TMResourceName,
439+ TTMStorage, TTM64Storage>>
440+ const TStorage& Reference (const TValue& value) {
441+ return *reinterpret_cast <const TStorage*>(value.GetRawPtr ());
436442}
437443
438- TTMStorage& Reference (NUdf::TUnboxedValuePod& value) {
439- return *reinterpret_cast <TTMStorage*>(value.GetRawPtr ());
440- }
441-
442- const TTMStorage& Reference (const TBlockItem& value) {
443- return *reinterpret_cast <const TTMStorage*>(value.GetRawPtr ());
444- }
445-
446- Y_DECLARE_UNUSED TTMStorage& Reference (TBlockItem& value) {
447- return *reinterpret_cast <TTMStorage*>(value.GetRawPtr ());
448- }
449-
450- const TTM64Storage& Reference64 (const NUdf::TUnboxedValuePod& value) {
451- return *reinterpret_cast <const TTM64Storage*>(value.GetRawPtr ());
452- }
453-
454- TTM64Storage& Reference64 (NUdf::TUnboxedValuePod& value) {
455- return *reinterpret_cast <TTM64Storage*>(value.GetRawPtr ());
444+ // FIXME: The default value for TResourceName allows to omit
445+ // explicit specialization in functions that still doesn't support
446+ // big datetime types. Should be removed in future.
447+ template <const char * TResourceName = TMResourceName, typename TValue,
448+ typename TStorage = std::conditional_t <TResourceName == TMResourceName,
449+ TTMStorage, TTM64Storage>>
450+ TStorage& Reference (TValue& value) {
451+ return *reinterpret_cast <TStorage*>(value.GetRawPtr ());
456452}
457453
458454template <typename TValue>
@@ -480,19 +476,22 @@ TValue DoAddYears(const TValue& date, i64 years, const NUdf::IDateBuilder& build
480476 return result;
481477}
482478
483- #define ACCESSORS_POLY (field, type, wtype ) \
484- template <typename TValue> \
485- inline type Get##field(const TValue& tm) { \
486- return (type)Reference (tm).field ; \
487- } \
488- template <typename TValue> \
489- inline wtype GetW##field(const TValue& tm) { \
490- return (wtype)Reference64 (tm).field ; \
491- } \
492- template <typename TValue> \
493- inline void Set##field(TValue& tm, type value) { \
494- Reference (tm).field = value; \
495- } \
479+ // FIXME: The default value for TResourceName allows to omit
480+ // explicit specialization in functions that still doesn't support
481+ // big datetime types. Should be removed in future.
482+ #define ACCESSORS_POLY (field, type, wtype ) \
483+ template <const char * TResourceName = TMResourceName, typename TValue, \
484+ typename rtype = std::conditional_t <TResourceName == TMResourceName, \
485+ type, wtype>> \
486+ inline rtype Get##field(const TValue& tm) { \
487+ return (rtype)Reference<TResourceName>(tm).field ; \
488+ } \
489+ template <const char * TResourceName = TMResourceName, typename TValue, \
490+ typename itype = std::conditional_t <TResourceName == TMResourceName, \
491+ type, wtype>> \
492+ inline void Set##field(TValue& tm, itype value) { \
493+ Reference<TResourceName>(tm).field = value; \
494+ } \
496495
497496#define ACCESSORS (field, type ) \
498497 ACCESSORS_POLY (field, type, type)
@@ -788,7 +787,7 @@ TValue DoAddYears(const TValue& date, i64 years, const NUdf::IDateBuilder& build
788787 EMPTY_RESULT_ON_EMPTY_ARG (0 );
789788
790789 TUnboxedValuePod result (0 );
791- auto & storage = Reference64 (result);
790+ auto & storage = Reference<TM64ResourceName> (result);
792791 storage.FromDate32 (valueBuilder->GetDateBuilder (), args[0 ].Get <i32 >());
793792 return result;
794793 } catch (const std::exception& e) {
@@ -823,7 +822,7 @@ TValue DoAddYears(const TValue& date, i64 years, const NUdf::IDateBuilder& build
823822 EMPTY_RESULT_ON_EMPTY_ARG (0 );
824823
825824 TUnboxedValuePod result (0 );
826- auto & storage = Reference64 (result);
825+ auto & storage = Reference<TM64ResourceName> (result);
827826 storage.FromDatetime64 (valueBuilder->GetDateBuilder (), args[0 ].Get <i64 >());
828827 return result;
829828 } catch (const std::exception& e) {
@@ -858,7 +857,7 @@ TValue DoAddYears(const TValue& date, i64 years, const NUdf::IDateBuilder& build
858857 EMPTY_RESULT_ON_EMPTY_ARG (0 );
859858
860859 TUnboxedValuePod result (0 );
861- auto & storage = Reference64 (result);
860+ auto & storage = Reference<TM64ResourceName> (result);
862861 storage.FromTimestamp64 (valueBuilder->GetDateBuilder (), args[0 ].Get <i64 >());
863862 return result;
864863 } catch (const std::exception& e) {
@@ -1031,23 +1030,23 @@ TValue DoAddYears(const TValue& date, i64 years, const NUdf::IDateBuilder& build
10311030 Y_UNUSED (valueBuilder);
10321031 TUnboxedValuePod result (0 );
10331032 auto & arg = Reference (args[0 ]);
1034- auto & storage = Reference64 (result);
1033+ auto & storage = Reference<TM64ResourceName> (result);
10351034 storage.From (arg);
10361035 return result;
10371036 }
10381037
10391038 SIMPLE_STRICT_UDF (TMakeDate32, TDate32(TAutoMap<TResource<TM64ResourceName>>)) {
1040- auto & storage = Reference64 (args[0 ]);
1039+ auto & storage = Reference<TM64ResourceName> (args[0 ]);
10411040 return TUnboxedValuePod (storage.ToDate32 (valueBuilder->GetDateBuilder ()));
10421041 }
10431042
10441043 SIMPLE_STRICT_UDF (TMakeDatetime64, TDatetime64(TAutoMap<TResource<TM64ResourceName>>)) {
1045- auto & storage = Reference64 (args[0 ]);
1044+ auto & storage = Reference<TM64ResourceName> (args[0 ]);
10461045 return TUnboxedValuePod (storage.ToDatetime64 (valueBuilder->GetDateBuilder ()));
10471046 }
10481047
10491048 SIMPLE_STRICT_UDF (TMakeTimestamp64, TTimestamp64(TAutoMap<TResource<TM64ResourceName>>)) {
1050- auto & storage = Reference64 (args[0 ]);
1049+ auto & storage = Reference<TM64ResourceName> (args[0 ]);
10511050 return TUnboxedValuePod (storage.ToTimestamp64 (valueBuilder->GetDateBuilder ()));
10521051 }
10531052
@@ -1333,13 +1332,7 @@ TUnboxedValue GetMonthName(const IValueBuilder* valueBuilder, const TUnboxedValu
13331332 TUnboxedValuePod::Embedded (TStringRef::Of (" November" )),
13341333 TUnboxedValuePod::Embedded (TStringRef::Of (" December" ))
13351334 }};
1336- if constexpr (TResourceName == TMResourceName) {
1337- return monthNames.at (GetMonth (arg) - 1U );
1338- }
1339- if constexpr (TResourceName == TM64ResourceName) {
1340- return monthNames.at (GetWMonth (arg) - 1U );
1341- }
1342- Y_UNREACHABLE ();
1335+ return monthNames.at (GetMonth<TResourceName>(arg) - 1U );
13431336}
13441337
13451338 // struct TGetDayOfMonthKernelExec : TUnaryKernelExec<TGetMonthNameKernelExec, TReaderTraits::TResource<false>, TFixedSizeArrayBuilder<ui8, false>> {
@@ -1367,13 +1360,7 @@ TUnboxedValue GetDayOfWeekName(const IValueBuilder* valueBuilder, const TUnboxed
13671360 TUnboxedValuePod::Embedded (TStringRef::Of (" Saturday" )),
13681361 TUnboxedValuePod::Embedded (TStringRef::Of (" Sunday" ))
13691362 }};
1370- if constexpr (TResourceName == TMResourceName) {
1371- return dayNames.at (GetDayOfWeek (arg) - 1U );
1372- }
1373- if constexpr (TResourceName == TM64ResourceName) {
1374- return dayNames.at (GetWDayOfWeek (arg) - 1U );
1375- }
1376- Y_UNREACHABLE ();
1363+ return dayNames.at (GetDayOfWeek<TResourceName>(arg) - 1U );
13771364}
13781365
13791366 // struct TGetDayOfWeekNameKernelExec : TUnaryKernelExec<TGetDayOfWeekNameKernelExec, TReaderTraits::TResource<true>, TStringArrayBuilder<arrow::StringType, false>> {
@@ -1414,13 +1401,7 @@ TUnboxedValue GetDayOfWeekName(const IValueBuilder* valueBuilder, const TUnboxed
14141401
14151402template <const char * TResourceName>
14161403TUnboxedValue GetTimezoneName (const IValueBuilder* valueBuilder, const TUnboxedValuePod& arg) {
1417- ui16 tzId;
1418- if constexpr (TResourceName == TMResourceName) {
1419- tzId = GetTimezoneId (arg);
1420- }
1421- if constexpr (TResourceName == TM64ResourceName) {
1422- tzId = GetWTimezoneId (arg);
1423- }
1404+ const ui16 tzId = GetTimezoneId<TResourceName>(arg);
14241405 const auto & tzNames = NUdf::GetTimezones ();
14251406 if (tzId >= tzNames.size ()) {
14261407 return TUnboxedValuePod ();
@@ -1643,21 +1624,10 @@ TUnboxedValue GetTimezoneName(const IValueBuilder* valueBuilder, const TUnboxedV
16431624 }
16441625 };
16451626
1646- template <auto Core>
1627+ template <const char * TResourceName, auto Core>
16471628 TUnboxedValue SimpleDatetimeToDatetimeUdf (const IValueBuilder* valueBuilder, const TUnboxedValuePod* args) {
16481629 auto result = args[0 ];
1649- auto & storage = Reference (result);
1650- if (auto res = Core (storage, *valueBuilder)) {
1651- storage = res.GetRef ();
1652- return result;
1653- }
1654- return TUnboxedValuePod{};
1655- }
1656-
1657- template <auto Core>
1658- TUnboxedValue SimpleDatetime64ToDatetime64Udf (const IValueBuilder* valueBuilder, const TUnboxedValuePod* args) {
1659- auto result = args[0 ];
1660- auto & storage = Reference64 (result);
1630+ auto & storage = Reference<TResourceName>(result);
16611631 if (auto res = Core (storage, *valueBuilder)) {
16621632 storage = res.GetRef ();
16631633 return result;
@@ -2753,21 +2723,21 @@ class TBoundaryOf: public ::NYql::NUdf::TBoxedValue {
27532723 TMakeDatetime64,
27542724 TMakeTimestamp64,
27552725
2756- TGetDateComponent<GetYearUDF, ui16, GetYear, i32 , GetWYear >,
2757- TGetDateComponent<GetDayOfYearUDF, ui16, GetDayOfYear, ui16, GetWDayOfYear >,
2758- TGetDateComponent<GetMonthUDF, ui8, GetMonth, ui8, GetWMonth >,
2726+ TGetDateComponent<GetYearUDF, ui16, GetYear<TMResourceName> , i32 , GetYear<TM64ResourceName> >,
2727+ TGetDateComponent<GetDayOfYearUDF, ui16, GetDayOfYear<TMResourceName> , ui16, GetDayOfYear<TM64ResourceName> >,
2728+ TGetDateComponent<GetMonthUDF, ui8, GetMonth<TMResourceName> , ui8, GetMonth<TM64ResourceName> >,
27592729 TGetDateComponentName<GetMonthNameUDF, GetMonthName<TMResourceName>, GetMonthName<TM64ResourceName>>,
2760- TGetDateComponent<GetWeekOfYearUDF, ui8, GetWeekOfYear, ui8, GetWWeekOfYear >,
2761- TGetDateComponent<GetWeekOfYearIso8601UDF, ui8, GetWeekOfYearIso8601, ui8, GetWWeekOfYearIso8601 >,
2762- TGetDateComponent<GetDayOfMonthUDF, ui8, GetDay, ui8, GetWDay >,
2763- TGetDateComponent<GetDayOfWeekUDF, ui8, GetDayOfWeek, ui8, GetWDayOfWeek >,
2730+ TGetDateComponent<GetWeekOfYearUDF, ui8, GetWeekOfYear<TMResourceName> , ui8, GetWeekOfYear<TM64ResourceName> >,
2731+ TGetDateComponent<GetWeekOfYearIso8601UDF, ui8, GetWeekOfYearIso8601<TMResourceName> , ui8, GetWeekOfYearIso8601<TM64ResourceName> >,
2732+ TGetDateComponent<GetDayOfMonthUDF, ui8, GetDay<TMResourceName> , ui8, GetDay<TM64ResourceName> >,
2733+ TGetDateComponent<GetDayOfWeekUDF, ui8, GetDayOfWeek<TMResourceName> , ui8, GetDayOfWeek<TM64ResourceName> >,
27642734 TGetDateComponentName<GetDayOfWeekNameUDF, GetDayOfWeekName<TMResourceName>, GetDayOfWeekName<TM64ResourceName>>,
2765- TGetTimeComponent<GetHourUDF, ui8, GetHour, GetWHour , 1u , 3600u , 24u , false >,
2766- TGetTimeComponent<GetMinuteUDF, ui8, GetMinute, GetWMinute , 1u , 60u , 60u , false >,
2767- TGetTimeComponent<GetSecondUDF, ui8, GetSecond, GetWSecond , 1u , 1u , 60u , false >,
2768- TGetTimeComponent<GetMillisecondOfSecondUDF, ui32, GetMicrosecond, GetWMicrosecond , 1000u , 1000u , 1000u , true >,
2769- TGetTimeComponent<GetMicrosecondOfSecondUDF, ui32, GetMicrosecond, GetWMicrosecond , 1u , 1u , 1000000u , true >,
2770- TGetDateComponent<GetTimezoneIdUDF, ui16, GetTimezoneId, ui16, GetWTimezoneId >,
2735+ TGetTimeComponent<GetHourUDF, ui8, GetHour<TMResourceName>, GetHour<TM64ResourceName> , 1u , 3600u , 24u , false >,
2736+ TGetTimeComponent<GetMinuteUDF, ui8, GetMinute<TMResourceName>, GetMinute<TM64ResourceName> , 1u , 60u , 60u , false >,
2737+ TGetTimeComponent<GetSecondUDF, ui8, GetSecond<TMResourceName>, GetSecond<TM64ResourceName> , 1u , 1u , 60u , false >,
2738+ TGetTimeComponent<GetMillisecondOfSecondUDF, ui32, GetMicrosecond<TMResourceName>, GetMicrosecond<TM64ResourceName> , 1000u , 1000u , 1000u , true >,
2739+ TGetTimeComponent<GetMicrosecondOfSecondUDF, ui32, GetMicrosecond<TMResourceName>, GetMicrosecond<TM64ResourceName> , 1u , 1u , 1000000u , true >,
2740+ TGetDateComponent<GetTimezoneIdUDF, ui16, GetTimezoneId<TMResourceName> , ui16, GetTimezoneId<TM64ResourceName> >,
27712741 TGetDateComponentName<GetTimezoneNameUDF, GetTimezoneName<TMResourceName>, GetTimezoneName<TM64ResourceName>>,
27722742
27732743 TUpdate,
@@ -2798,33 +2768,33 @@ class TBoundaryOf: public ::NYql::NUdf::TBoxedValue {
27982768 TToHours,
27992769 TToMinutes,
28002770
2801- TBoundaryOf<StartOfYearUDF, SimpleDatetimeToDatetimeUdf<StartOfYear<TTMStorage>>,
2802- SimpleDatetime64ToDatetime64Udf< StartOfYear<TTM64Storage>>>,
2803- TBoundaryOf<StartOfQuarterUDF, SimpleDatetimeToDatetimeUdf<StartOfQuarter<TTMStorage>>,
2804- SimpleDatetime64ToDatetime64Udf< StartOfQuarter<TTM64Storage>>>,
2805- TBoundaryOf<StartOfMonthUDF, SimpleDatetimeToDatetimeUdf<StartOfMonth<TTMStorage>>,
2806- SimpleDatetime64ToDatetime64Udf< StartOfMonth<TTM64Storage>>>,
2807- TBoundaryOf<StartOfWeekUDF, SimpleDatetimeToDatetimeUdf<StartOfWeek<TTMStorage>>,
2808- SimpleDatetime64ToDatetime64Udf< StartOfWeek<TTM64Storage>>>,
2809- TBoundaryOf<StartOfDayUDF, SimpleDatetimeToDatetimeUdf<StartOfDay<TTMStorage>>,
2810- SimpleDatetime64ToDatetime64Udf< StartOfDay<TTM64Storage>>>,
2771+ TBoundaryOf<StartOfYearUDF, SimpleDatetimeToDatetimeUdf<TMResourceName, StartOfYear<TTMStorage>>,
2772+ SimpleDatetimeToDatetimeUdf<TM64ResourceName, StartOfYear<TTM64Storage>>>,
2773+ TBoundaryOf<StartOfQuarterUDF, SimpleDatetimeToDatetimeUdf<TMResourceName, StartOfQuarter<TTMStorage>>,
2774+ SimpleDatetimeToDatetimeUdf<TM64ResourceName, StartOfQuarter<TTM64Storage>>>,
2775+ TBoundaryOf<StartOfMonthUDF, SimpleDatetimeToDatetimeUdf<TMResourceName, StartOfMonth<TTMStorage>>,
2776+ SimpleDatetimeToDatetimeUdf<TM64ResourceName, StartOfMonth<TTM64Storage>>>,
2777+ TBoundaryOf<StartOfWeekUDF, SimpleDatetimeToDatetimeUdf<TMResourceName, StartOfWeek<TTMStorage>>,
2778+ SimpleDatetimeToDatetimeUdf<TM64ResourceName, StartOfWeek<TTM64Storage>>>,
2779+ TBoundaryOf<StartOfDayUDF, SimpleDatetimeToDatetimeUdf<TMResourceName, StartOfDay<TTMStorage>>,
2780+ SimpleDatetimeToDatetimeUdf<TM64ResourceName, StartOfDay<TTM64Storage>>>,
28112781 TStartOf,
28122782 TTimeOfDay,
28132783
28142784 TShiftYears,
28152785 TShiftQuarters,
28162786 TShiftMonths,
28172787
2818- TBoundaryOf<EndOfYearUDF, SimpleDatetimeToDatetimeUdf<EndOfYear<TTMStorage>>,
2819- SimpleDatetime64ToDatetime64Udf< EndOfYear<TTM64Storage>>>,
2820- TBoundaryOf<EndOfQuarterUDF, SimpleDatetimeToDatetimeUdf<EndOfQuarter<TTMStorage>>,
2821- SimpleDatetime64ToDatetime64Udf< EndOfQuarter<TTM64Storage>>>,
2822- TBoundaryOf<EndOfMonthUDF, SimpleDatetimeToDatetimeUdf<EndOfMonth<TTMStorage>>,
2823- SimpleDatetime64ToDatetime64Udf< EndOfMonth<TTM64Storage>>>,
2824- TBoundaryOf<EndOfWeekUDF, SimpleDatetimeToDatetimeUdf<EndOfWeek<TTMStorage>>,
2825- SimpleDatetime64ToDatetime64Udf< EndOfWeek<TTM64Storage>>>,
2826- TBoundaryOf<EndOfDayUDF, SimpleDatetimeToDatetimeUdf<EndOfDay<TTMStorage>>,
2827- SimpleDatetime64ToDatetime64Udf< EndOfDay<TTM64Storage>>>,
2788+ TBoundaryOf<EndOfYearUDF, SimpleDatetimeToDatetimeUdf<TMResourceName, EndOfYear<TTMStorage>>,
2789+ SimpleDatetimeToDatetimeUdf<TM64ResourceName, EndOfYear<TTM64Storage>>>,
2790+ TBoundaryOf<EndOfQuarterUDF, SimpleDatetimeToDatetimeUdf<TMResourceName, EndOfQuarter<TTMStorage>>,
2791+ SimpleDatetimeToDatetimeUdf<TM64ResourceName, EndOfQuarter<TTM64Storage>>>,
2792+ TBoundaryOf<EndOfMonthUDF, SimpleDatetimeToDatetimeUdf<TMResourceName, EndOfMonth<TTMStorage>>,
2793+ SimpleDatetimeToDatetimeUdf<TM64ResourceName, EndOfMonth<TTM64Storage>>>,
2794+ TBoundaryOf<EndOfWeekUDF, SimpleDatetimeToDatetimeUdf<TMResourceName, EndOfWeek<TTMStorage>>,
2795+ SimpleDatetimeToDatetimeUdf<TM64ResourceName, EndOfWeek<TTM64Storage>>>,
2796+ TBoundaryOf<EndOfDayUDF, SimpleDatetimeToDatetimeUdf<TMResourceName, EndOfDay<TTMStorage>>,
2797+ SimpleDatetimeToDatetimeUdf<TM64ResourceName, EndOfDay<TTM64Storage>>>,
28282798 TEndOf,
28292799
28302800 TToUnits<ToSecondsUDF, ui32, 1 >,
0 commit comments