@@ -389,38 +389,28 @@ TTMStorage& Reference(NUdf::TUnboxedValuePod& value) {
389
389
return *reinterpret_cast <TTMStorage*>(value.GetRawPtr ());
390
390
}
391
391
392
- template <typename TValue>
393
- TValue DoAddMonths (const TValue& date, i64 months, const NUdf::IDateBuilder& builder) {
392
+ NUdf::TUnboxedValuePod DoAddMonths (const NUdf::TUnboxedValuePod& date, i64 months, const NUdf::IDateBuilder& builder) {
394
393
auto result = date;
395
394
auto & storage = Reference (result);
396
395
if (!NYql::DateTime::DoAddMonths (storage, months, builder)) {
397
- return TValue {};
396
+ return NUdf::TUnboxedValuePod {};
398
397
}
399
398
return result;
400
399
}
401
-
402
- template <typename TValue>
403
- TValue DoAddQuarters (const TValue& date, i64 quarters, const NUdf::IDateBuilder& builder) {
404
- return DoAddMonths (date, quarters * 3ll , builder);
405
- }
406
-
407
- template <typename TValue>
408
- TValue DoAddYears (const TValue& date, i64 years, const NUdf::IDateBuilder& builder) {
400
+ NUdf::TUnboxedValuePod DoAddYears (const NUdf::TUnboxedValuePod& date, i64 years, const NUdf::IDateBuilder& builder) {
409
401
auto result = date;
410
402
auto & storage = Reference (result);
411
403
if (!NYql::DateTime::DoAddYears (storage, years, builder)) {
412
- return TValue {};
404
+ return NUdf::TUnboxedValuePod {};
413
405
}
414
406
return result;
415
407
}
416
408
417
409
#define ACCESSORS (field, type ) \
418
- template <typename TValue> \
419
- inline type Get##field(const TValue& tm ) { \
410
+ inline type Get##field(const TUnboxedValuePod& tm ) { \
420
411
return (type)Reference (tm ).field ; \
421
412
} \
422
- template <typename TValue> \
423
- Y_DECLARE_UNUSED inline void Set##field(TValue& tm , type value) { \
413
+ Y_DECLARE_UNUSED inline void Set##field(TUnboxedValuePod& tm , type value) { \
424
414
Reference (tm ).field = value; \
425
415
}
426
416
@@ -562,24 +552,6 @@ TValue DoAddYears(const TValue& date, i64 years, const NUdf::IDateBuilder& build
562
552
IFunctionTypeInfoBuilder& builder,
563
553
bool typesOnly)
564
554
{
565
- const auto typeInfoHelper = builder.TypeInfoHelper ();
566
-
567
- TTupleTypeInspector tuple (*typeInfoHelper, userType);
568
- Y_ENSURE (tuple);
569
- Y_ENSURE (tuple.GetElementsCount () > 0 );
570
- TTupleTypeInspector argsTuple (*typeInfoHelper, tuple.GetElementType (0 ));
571
- Y_ENSURE (argsTuple);
572
-
573
- if (argsTuple.GetElementsCount () != 1 ) {
574
- builder.SetError (" Expected one argument" );
575
- return true ;
576
- }
577
- auto argType = argsTuple.GetElementType (0 );
578
- TVector<const TType*> argBlockTypes;
579
- argBlockTypes.push_back (argType);
580
-
581
- TBlockTypeInspector block (*typeInfoHelper, argType);
582
-
583
555
builder.UserType (userType);
584
556
builder.Args ()->Add <TUserDataType>().Flags (ICallablePayload::TArgumentFlags::AutoMap);
585
557
builder.Returns (builder.Resource (TMResourceName));
@@ -752,124 +724,68 @@ TValue DoAddYears(const TValue& date, i64 years, const NUdf::IDateBuilder& build
752
724
753
725
// Get*
754
726
755
-
756
727
#define GET_METHOD (field, type ) \
757
- struct TGet ##field##KernelExec : TUnaryKernelExec<TGet##field##KernelExec, TReaderTraits::TResource<true >, TFixedSizeArrayBuilder<type, false >> { \
758
- template <typename TSink> \
759
- static void Process (TBlockItem item, TSink& sink) { \
760
- sink (TBlockItem (Get##field<TBlockItem>(item))); \
761
- } \
762
- }; \
763
- BEGIN_SIMPLE_STRICT_ARROW_UDF (TGet##field, type(TAutoMap<TResource<TMResourceName>>)) { \
728
+ SIMPLE_STRICT_UDF (TGet##field, type(TAutoMap<TResource<TMResourceName>>)) { \
764
729
Y_UNUSED (valueBuilder); \
765
730
return TUnboxedValuePod (Get##field (args[0 ])); \
766
- } \
767
- END_SIMPLE_ARROW_UDF_WITH_NULL_HANDLING (TGet##field, TGet##field##KernelExec::Do, arrow::compute::NullHandling::INTERSECTION);
731
+ }
768
732
769
733
GET_METHOD (Year, ui16)
770
734
GET_METHOD (DayOfYear, ui16)
771
735
GET_METHOD (Month, ui8)
772
-
773
- template <typename TValue>
774
- TValue GetMonthNameValue (size_t idx) {
775
- static const std::array<TValue, 12U > monthNames = {{
776
- TValue::Embedded (TStringRef::Of (" January" )),
777
- TValue::Embedded (TStringRef::Of (" February" )),
778
- TValue::Embedded (TStringRef::Of (" March" )),
779
- TValue::Embedded (TStringRef::Of (" April" )),
780
- TValue::Embedded (TStringRef::Of (" May" )),
781
- TValue::Embedded (TStringRef::Of (" June" )),
782
- TValue::Embedded (TStringRef::Of (" July" )),
783
- TValue::Embedded (TStringRef::Of (" August" )),
784
- TValue::Embedded (TStringRef::Of (" September" )),
785
- TValue::Embedded (TStringRef::Of (" October" )),
786
- TValue::Embedded (TStringRef::Of (" November" )),
787
- TValue::Embedded (TStringRef::Of (" December" ))
788
- }};
789
- return monthNames.at (idx);
790
- }
791
-
792
- struct TGetMonthNameKernelExec : TUnaryKernelExec<TGetMonthNameKernelExec, TReaderTraits::TResource<true >, TStringArrayBuilder<arrow::StringType, false >> {
793
- template <typename TSink>
794
- static void Process (TBlockItem item, TSink& sink) {
795
- sink (GetMonthNameValue<TBlockItem>(GetMonth (item) - 1U ));
796
- }
797
- };
798
736
799
- BEGIN_SIMPLE_STRICT_ARROW_UDF (TGetMonthName, char *(TAutoMap<TResource<TMResourceName>>)) {
737
+ SIMPLE_STRICT_UDF (TGetMonthName, char *(TAutoMap<TResource<TMResourceName>>)) {
800
738
Y_UNUSED (valueBuilder);
801
- return GetMonthNameValue<TUnboxedValue>(GetMonth (*args) - 1U );
739
+ static const std::array<TUnboxedValue, 12U > monthNames = {{
740
+ TUnboxedValuePod::Embedded (TStringRef::Of (" January" )),
741
+ TUnboxedValuePod::Embedded (TStringRef::Of (" February" )),
742
+ TUnboxedValuePod::Embedded (TStringRef::Of (" March" )),
743
+ TUnboxedValuePod::Embedded (TStringRef::Of (" April" )),
744
+ TUnboxedValuePod::Embedded (TStringRef::Of (" May" )),
745
+ TUnboxedValuePod::Embedded (TStringRef::Of (" June" )),
746
+ TUnboxedValuePod::Embedded (TStringRef::Of (" July" )),
747
+ TUnboxedValuePod::Embedded (TStringRef::Of (" August" )),
748
+ TUnboxedValuePod::Embedded (TStringRef::Of (" September" )),
749
+ TUnboxedValuePod::Embedded (TStringRef::Of (" October" )),
750
+ TUnboxedValuePod::Embedded (TStringRef::Of (" November" )),
751
+ TUnboxedValuePod::Embedded (TStringRef::Of (" December" ))
752
+ }};
753
+ return monthNames.at (GetMonth (*args) - 1U );
802
754
}
803
- END_SIMPLE_ARROW_UDF_WITH_NULL_HANDLING (TGetMonthName, TGetMonthNameKernelExec::Do, arrow::compute::NullHandling::INTERSECTION);
804
755
805
756
GET_METHOD (WeekOfYear, ui8)
806
757
GET_METHOD (WeekOfYearIso8601, ui8)
807
758
808
- struct TGetDayOfMonthKernelExec : TUnaryKernelExec<TGetMonthNameKernelExec, TReaderTraits::TResource<true >, TFixedSizeArrayBuilder<ui8, false >> {
809
- template <typename TSink>
810
- static void Process (TBlockItem item, TSink& sink) {
811
- sink (GetDay (item));
812
- }
813
- };
814
-
815
- BEGIN_SIMPLE_STRICT_ARROW_UDF (TGetDayOfMonth, ui8(TAutoMap<TResource<TMResourceName>>)) {
759
+ SIMPLE_STRICT_UDF (TGetDayOfMonth, ui8(TAutoMap<TResource<TMResourceName>>)) {
816
760
Y_UNUSED (valueBuilder);
817
761
return TUnboxedValuePod (GetDay (args[0 ]));
818
762
}
819
- END_SIMPLE_ARROW_UDF_WITH_NULL_HANDLING (TGetDayOfMonth, TGetDayOfMonthKernelExec::Do, arrow::compute::NullHandling::INTERSECTION);
820
763
821
764
GET_METHOD (DayOfWeek, ui8)
822
765
823
- template <typename TValue>
824
- TValue GetDayNameValue (size_t idx) {
825
- static const std::array<TValue, 7U > dayNames = {{
826
- TValue::Embedded (TStringRef::Of (" Monday" )),
827
- TValue::Embedded (TStringRef::Of (" Tuesday" )),
828
- TValue::Embedded (TStringRef::Of (" Wednesday" )),
829
- TValue::Embedded (TStringRef::Of (" Thursday" )),
830
- TValue::Embedded (TStringRef::Of (" Friday" )),
831
- TValue::Embedded (TStringRef::Of (" Saturday" )),
832
- TValue::Embedded (TStringRef::Of (" Sunday" ))
833
- }};
834
- return dayNames.at (idx);
835
- }
836
-
837
- struct TGetDayOfWeekNameKernelExec : TUnaryKernelExec<TGetDayOfWeekNameKernelExec, TReaderTraits::TResource<true >, TStringArrayBuilder<arrow::StringType, false >> {
838
- template <typename TSink>
839
- static void Process (TBlockItem item, TSink& sink) {
840
- sink (GetDayNameValue<TBlockItem>(GetDayOfWeek (item) - 1U ));
841
- }
842
- };
843
-
844
- BEGIN_SIMPLE_STRICT_ARROW_UDF (TGetDayOfWeekName, char *(TAutoMap<TResource<TMResourceName>>)) {
766
+ SIMPLE_STRICT_UDF (TGetDayOfWeekName, char *(TAutoMap<TResource<TMResourceName>>)) {
845
767
Y_UNUSED (valueBuilder);
846
- return GetDayNameValue<TUnboxedValuePod>(GetDayOfWeek (*args) - 1U );
768
+ static const std::array<TUnboxedValue, 7U > dayNames = {{
769
+ TUnboxedValuePod::Embedded (TStringRef::Of (" Monday" )),
770
+ TUnboxedValuePod::Embedded (TStringRef::Of (" Tuesday" )),
771
+ TUnboxedValuePod::Embedded (TStringRef::Of (" Wednesday" )),
772
+ TUnboxedValuePod::Embedded (TStringRef::Of (" Thursday" )),
773
+ TUnboxedValuePod::Embedded (TStringRef::Of (" Friday" )),
774
+ TUnboxedValuePod::Embedded (TStringRef::Of (" Saturday" )),
775
+ TUnboxedValuePod::Embedded (TStringRef::Of (" Sunday" ))
776
+ }};
777
+ return dayNames.at (GetDayOfWeek (*args) - 1U );
847
778
}
848
- END_SIMPLE_ARROW_UDF_WITH_NULL_HANDLING (TGetDayOfWeekName, TGetDayOfWeekNameKernelExec::Do, arrow::compute::NullHandling::INTERSECTION);
849
779
850
780
GET_METHOD (TimezoneId, ui16)
851
781
852
- struct TTGetTimezoneNameKernelExec : TUnaryKernelExec<TTGetTimezoneNameKernelExec, TReaderTraits::TResource<true >, TStringArrayBuilder<arrow::StringType, true >> {
853
- template <typename TSink>
854
- static void Process (TBlockItem item, TUdfKernelState& state, TSink& sink) {
855
- auto timezoneId = GetTimezoneId (item);
856
- if (timezoneId >= NUdf::GetTimezones ().size ()) {
857
- sink (TBlockItem{});
858
- } else {
859
- auto str = state.GetValueBuilder ().NewString (NUdf::GetTimezones ()[timezoneId]);
860
- sink (str);
861
- }
862
- }
863
- };
864
-
865
- BEGIN_SIMPLE_STRICT_ARROW_UDF (TGetTimezoneName, char *(TAutoMap<TResource<TMResourceName>>)) {
782
+ SIMPLE_STRICT_UDF (TGetTimezoneName, char *(TAutoMap<TResource<TMResourceName>>)) {
866
783
auto timezoneId = GetTimezoneId (args[0 ]);
867
784
if (timezoneId >= NUdf::GetTimezones ().size ()) {
868
785
return TUnboxedValuePod ();
869
786
}
870
787
return valueBuilder->NewString (NUdf::GetTimezones ()[timezoneId]);
871
788
}
872
- END_SIMPLE_ARROW_UDF (TGetTimezoneName, TTGetTimezoneNameKernelExec::Do);
873
789
874
790
// Update
875
791
@@ -1241,32 +1157,20 @@ TValue DoAddYears(const TValue& date, i64 years, const NUdf::IDateBuilder& build
1241
1157
auto & storage = Reference (args[0 ]);
1242
1158
return TUnboxedValuePod ((i64)storage.ToTimeOfDay ());
1243
1159
}
1244
- END_SIMPLE_ARROW_UDF (TTimeOfDay, timeOfDayKernelExecDo);
1245
1160
1246
1161
// Add ...
1247
1162
1248
- template <auto Core>
1249
- struct TAddKernelExec : TBinaryKernelExec<TAddKernelExec<Core>> {
1250
- template <typename TSink>
1251
- static void Process (TBlockItem date, TBlockItem arg, TUdfKernelState& state, TSink& sink) {
1252
- sink (Core (date, arg.Get <i32>(), state.GetValueBuilder ().GetDateBuilder ()));
1253
- }
1254
- };
1255
-
1256
- BEGIN_SIMPLE_STRICT_ARROW_UDF (TShiftYears, TOptional<TResource<TMResourceName>>(TAutoMap<TResource<TMResourceName>>, i32)) {
1163
+ SIMPLE_STRICT_UDF (TShiftYears, TOptional<TResource<TMResourceName>>(TAutoMap<TResource<TMResourceName>>, i32)) {
1257
1164
return DoAddYears (args[0 ], args[1 ].Get <i32>(), valueBuilder->GetDateBuilder ());
1258
1165
}
1259
- END_SIMPLE_ARROW_UDF (TShiftYears, TAddKernelExec<DoAddYears<TBlockItem>>::Do);
1260
1166
1261
- BEGIN_SIMPLE_STRICT_ARROW_UDF (TShiftQuarters, TOptional<TResource<TMResourceName>>(TAutoMap<TResource<TMResourceName>>, i32)) {
1262
- return DoAddQuarters (args[0 ], args[1 ].Get <i32>(), valueBuilder->GetDateBuilder ());
1167
+ SIMPLE_STRICT_UDF (TShiftQuarters, TOptional<TResource<TMResourceName>>(TAutoMap<TResource<TMResourceName>>, i32)) {
1168
+ return DoAddMonths (args[0 ], 3ll * args[1 ].Get <i32>(), valueBuilder->GetDateBuilder ());
1263
1169
}
1264
- END_SIMPLE_ARROW_UDF (TShiftQuarters, TAddKernelExec<DoAddQuarters<TBlockItem>>::Do);
1265
1170
1266
- BEGIN_SIMPLE_STRICT_ARROW_UDF (TShiftMonths, TOptional<TResource<TMResourceName>>(TAutoMap<TResource<TMResourceName>>, i32)) {
1171
+ SIMPLE_STRICT_UDF (TShiftMonths, TOptional<TResource<TMResourceName>>(TAutoMap<TResource<TMResourceName>>, i32)) {
1267
1172
return DoAddMonths (args[0 ], args[1 ].Get <i32>(), valueBuilder->GetDateBuilder ());
1268
1173
}
1269
- END_SIMPLE_ARROW_UDF (TShiftMonths, TAddKernelExec<DoAddMonths<TBlockItem>>::Do);
1270
1174
1271
1175
template <size_t Digits, bool Exacly = true >
1272
1176
struct PrintNDigits ;
0 commit comments