@@ -431,28 +431,24 @@ struct TGetTimeComponent {
431
431
432
432
namespace {
433
433
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 ());
436
442
}
437
443
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 ());
456
452
}
457
453
458
454
template <typename TValue>
@@ -480,19 +476,22 @@ TValue DoAddYears(const TValue& date, i64 years, const NUdf::IDateBuilder& build
480
476
return result;
481
477
}
482
478
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
+ } \
496
495
497
496
#define ACCESSORS (field, type ) \
498
497
ACCESSORS_POLY (field, type, type)
@@ -788,7 +787,7 @@ TValue DoAddYears(const TValue& date, i64 years, const NUdf::IDateBuilder& build
788
787
EMPTY_RESULT_ON_EMPTY_ARG (0 );
789
788
790
789
TUnboxedValuePod result (0 );
791
- auto & storage = Reference64 (result);
790
+ auto & storage = Reference<TM64ResourceName> (result);
792
791
storage.FromDate32 (valueBuilder->GetDateBuilder (), args[0 ].Get <i32 >());
793
792
return result;
794
793
} catch (const std::exception& e) {
@@ -823,7 +822,7 @@ TValue DoAddYears(const TValue& date, i64 years, const NUdf::IDateBuilder& build
823
822
EMPTY_RESULT_ON_EMPTY_ARG (0 );
824
823
825
824
TUnboxedValuePod result (0 );
826
- auto & storage = Reference64 (result);
825
+ auto & storage = Reference<TM64ResourceName> (result);
827
826
storage.FromDatetime64 (valueBuilder->GetDateBuilder (), args[0 ].Get <i64 >());
828
827
return result;
829
828
} catch (const std::exception& e) {
@@ -858,7 +857,7 @@ TValue DoAddYears(const TValue& date, i64 years, const NUdf::IDateBuilder& build
858
857
EMPTY_RESULT_ON_EMPTY_ARG (0 );
859
858
860
859
TUnboxedValuePod result (0 );
861
- auto & storage = Reference64 (result);
860
+ auto & storage = Reference<TM64ResourceName> (result);
862
861
storage.FromTimestamp64 (valueBuilder->GetDateBuilder (), args[0 ].Get <i64 >());
863
862
return result;
864
863
} catch (const std::exception& e) {
@@ -1031,23 +1030,23 @@ TValue DoAddYears(const TValue& date, i64 years, const NUdf::IDateBuilder& build
1031
1030
Y_UNUSED (valueBuilder);
1032
1031
TUnboxedValuePod result (0 );
1033
1032
auto & arg = Reference (args[0 ]);
1034
- auto & storage = Reference64 (result);
1033
+ auto & storage = Reference<TM64ResourceName> (result);
1035
1034
storage.From (arg);
1036
1035
return result;
1037
1036
}
1038
1037
1039
1038
SIMPLE_STRICT_UDF (TMakeDate32, TDate32(TAutoMap<TResource<TM64ResourceName>>)) {
1040
- auto & storage = Reference64 (args[0 ]);
1039
+ auto & storage = Reference<TM64ResourceName> (args[0 ]);
1041
1040
return TUnboxedValuePod (storage.ToDate32 (valueBuilder->GetDateBuilder ()));
1042
1041
}
1043
1042
1044
1043
SIMPLE_STRICT_UDF (TMakeDatetime64, TDatetime64(TAutoMap<TResource<TM64ResourceName>>)) {
1045
- auto & storage = Reference64 (args[0 ]);
1044
+ auto & storage = Reference<TM64ResourceName> (args[0 ]);
1046
1045
return TUnboxedValuePod (storage.ToDatetime64 (valueBuilder->GetDateBuilder ()));
1047
1046
}
1048
1047
1049
1048
SIMPLE_STRICT_UDF (TMakeTimestamp64, TTimestamp64(TAutoMap<TResource<TM64ResourceName>>)) {
1050
- auto & storage = Reference64 (args[0 ]);
1049
+ auto & storage = Reference<TM64ResourceName> (args[0 ]);
1051
1050
return TUnboxedValuePod (storage.ToTimestamp64 (valueBuilder->GetDateBuilder ()));
1052
1051
}
1053
1052
@@ -1333,13 +1332,7 @@ TUnboxedValue GetMonthName(const IValueBuilder* valueBuilder, const TUnboxedValu
1333
1332
TUnboxedValuePod::Embedded (TStringRef::Of (" November" )),
1334
1333
TUnboxedValuePod::Embedded (TStringRef::Of (" December" ))
1335
1334
}};
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 );
1343
1336
}
1344
1337
1345
1338
// struct TGetDayOfMonthKernelExec : TUnaryKernelExec<TGetMonthNameKernelExec, TReaderTraits::TResource<false>, TFixedSizeArrayBuilder<ui8, false>> {
@@ -1367,13 +1360,7 @@ TUnboxedValue GetDayOfWeekName(const IValueBuilder* valueBuilder, const TUnboxed
1367
1360
TUnboxedValuePod::Embedded (TStringRef::Of (" Saturday" )),
1368
1361
TUnboxedValuePod::Embedded (TStringRef::Of (" Sunday" ))
1369
1362
}};
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 );
1377
1364
}
1378
1365
1379
1366
// struct TGetDayOfWeekNameKernelExec : TUnaryKernelExec<TGetDayOfWeekNameKernelExec, TReaderTraits::TResource<true>, TStringArrayBuilder<arrow::StringType, false>> {
@@ -1414,13 +1401,7 @@ TUnboxedValue GetDayOfWeekName(const IValueBuilder* valueBuilder, const TUnboxed
1414
1401
1415
1402
template <const char * TResourceName>
1416
1403
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);
1424
1405
const auto & tzNames = NUdf::GetTimezones ();
1425
1406
if (tzId >= tzNames.size ()) {
1426
1407
return TUnboxedValuePod ();
@@ -1643,21 +1624,10 @@ TUnboxedValue GetTimezoneName(const IValueBuilder* valueBuilder, const TUnboxedV
1643
1624
}
1644
1625
};
1645
1626
1646
- template <auto Core>
1627
+ template <const char * TResourceName, auto Core>
1647
1628
TUnboxedValue SimpleDatetimeToDatetimeUdf (const IValueBuilder* valueBuilder, const TUnboxedValuePod* args) {
1648
1629
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);
1661
1631
if (auto res = Core (storage, *valueBuilder)) {
1662
1632
storage = res.GetRef ();
1663
1633
return result;
@@ -2753,21 +2723,21 @@ class TBoundaryOf: public ::NYql::NUdf::TBoxedValue {
2753
2723
TMakeDatetime64,
2754
2724
TMakeTimestamp64,
2755
2725
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> >,
2759
2729
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> >,
2764
2734
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> >,
2771
2741
TGetDateComponentName<GetTimezoneNameUDF, GetTimezoneName<TMResourceName>, GetTimezoneName<TM64ResourceName>>,
2772
2742
2773
2743
TUpdate,
@@ -2798,33 +2768,33 @@ class TBoundaryOf: public ::NYql::NUdf::TBoxedValue {
2798
2768
TToHours,
2799
2769
TToMinutes,
2800
2770
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>>>,
2811
2781
TStartOf,
2812
2782
TTimeOfDay,
2813
2783
2814
2784
TShiftYears,
2815
2785
TShiftQuarters,
2816
2786
TShiftMonths,
2817
2787
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>>>,
2828
2798
TEndOf,
2829
2799
2830
2800
TToUnits<ToSecondsUDF, ui32, 1 >,
0 commit comments