Skip to content

Commit cf924aa

Browse files
committed
Make Reference helper be a template of TResourceName
commit_hash:79c97d1acda775c5303c2cfb23668f72690477eb
1 parent 1213d16 commit cf924aa

File tree

1 file changed

+77
-107
lines changed

1 file changed

+77
-107
lines changed

yql/essentials/udfs/common/datetime2/datetime_udf.cpp

Lines changed: 77 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -431,28 +431,24 @@ struct TGetTimeComponent {
431431

432432
namespace {
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

458454
template<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

14151402
template<const char* TResourceName>
14161403
TUnboxedValue 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

Comments
 (0)