Skip to content

Commit 238a753

Browse files
authored
UDF Datetime2 big dates Split/Make (#8084)
1 parent 8dfd693 commit 238a753

24 files changed

+1600
-62
lines changed

ydb/library/yql/core/yql_expr_type_annotation.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,21 @@ IGraphTransformer::TStatus TryConvertToImpl(TExprContext& ctx, TExprNode::TPtr&
179179
.Seal()
180180
.Build();
181181

182+
return IGraphTransformer::TStatus::Repeat;
183+
}
184+
} else if (expectedType.GetKind() == ETypeAnnotationKind::Resource && sourceType.GetKind() == ETypeAnnotationKind::Resource) {
185+
const auto from = sourceType.Cast<TResourceExprType>()->GetTag();
186+
const auto to = expectedType.Cast<TResourceExprType>()->GetTag();
187+
if (from == "DateTime2.TM" && to == "DateTime2.TM64") {
188+
node = ctx.Builder(node->Pos())
189+
.Callable("Apply")
190+
.Callable(0, "Udf")
191+
.Atom(0, "DateTime2.Convert", TNodeFlags::Default)
192+
.Seal()
193+
.Add(1, std::move(node))
194+
.Seal()
195+
.Build();
196+
182197
return IGraphTransformer::TStatus::Repeat;
183198
}
184199
} else if (expectedType.GetKind() == ETypeAnnotationKind::Resource && sourceType.GetKind() == ETypeAnnotationKind::Data) {
@@ -232,8 +247,7 @@ IGraphTransformer::TStatus TryConvertToImpl(TExprContext& ctx, TExprNode::TPtr&
232247
.Build();
233248

234249
return IGraphTransformer::TStatus::Repeat;
235-
236-
} else if ((GetDataTypeInfo(fromSlot).Features & (NUdf::EDataTypeFeatures::DateType | NUdf::EDataTypeFeatures::TzDateType)) && to == "DateTime2.TM") {
250+
} else if ((GetDataTypeInfo(fromSlot).Features & (NUdf::EDataTypeFeatures::DateType | NUdf::EDataTypeFeatures::TzDateType)) && (to == "DateTime2.TM" || to == "DateTime2.TM64")) {
237251
node = ctx.Builder(node->Pos())
238252
.Callable("Apply")
239253
.Callable(0, "Udf")

ydb/library/yql/minikql/computation/mkql_value_builder.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,31 @@ bool TDefaultValueBuilder::GetSecureParam(NUdf::TStringRef key, NUdf::TStringRef
323323
return false;
324324
}
325325

326+
bool TDefaultValueBuilder::SplitTzDate32(i32 date, i32& year, ui32& month, ui32& day,
327+
ui32& dayOfYear, ui32& weekOfYear, ui32& weekOfYearIso8601, ui32& dayOfWeek, ui16 timezoneId) const
328+
{
329+
return ::NKikimr::NMiniKQL::SplitTzDate32(date, year, month, day, dayOfYear, weekOfYear, weekOfYearIso8601, dayOfWeek, timezoneId);
330+
}
331+
332+
bool TDefaultValueBuilder::SplitTzDatetime64(i64 datetime, i32& year, ui32& month, ui32& day,
333+
ui32& hour, ui32& minute, ui32& second,
334+
ui32& dayOfYear, ui32& weekOfYear, ui32& weekOfYearIso8601, ui32& dayOfWeek, ui16 timezoneId) const
335+
{
336+
return ::NKikimr::NMiniKQL::SplitTzDatetime64(
337+
datetime, year, month, day, hour, minute, second,
338+
dayOfYear, weekOfYear, weekOfYearIso8601, dayOfWeek, timezoneId);
339+
}
340+
341+
bool TDefaultValueBuilder::MakeTzDate32(i32 year, ui32 month, ui32 day, i32& date, ui16 timezoneId) const {
342+
return ::NKikimr::NMiniKQL::MakeTzDate32(year, month, day, date, timezoneId);
343+
}
344+
345+
bool TDefaultValueBuilder::MakeTzDatetime64(i32 year, ui32 month, ui32 day,
346+
ui32 hour, ui32 minute, ui32 second, i64& datetime, ui16 timezoneId) const
347+
{
348+
return ::NKikimr::NMiniKQL::MakeTzDatetime64(year, month, day, hour, minute, second, datetime, timezoneId);
349+
}
350+
326351
NUdf::IListValueBuilder::TPtr TDefaultValueBuilder::NewListBuilder() const {
327352
return HolderFactory_.NewList();
328353
}

ydb/library/yql/minikql/computation/mkql_value_builder.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,15 @@ class TDefaultValueBuilder final: public NUdf::IValueBuilder, private TNonCopyab
9191

9292
NUdf::TUnboxedValue NewArray64(ui64 count, NUdf::TUnboxedValue*& itemsPtr) const final;
9393

94+
bool SplitTzDate32(i32 date, i32& year, ui32& month, ui32& day,
95+
ui32& dayOfYear, ui32& weekOfYear, ui32& weekOfYearIso8601, ui32& dayOfWeek, ui16 timezoneId = 0) const final;
96+
bool SplitTzDatetime64(i64 datetime, i32& year, ui32& month, ui32& day,
97+
ui32& hour, ui32& minute, ui32& second,
98+
ui32& dayOfYear, ui32& weekOfYear, ui32& weekOfYearIso8601, ui32& dayOfWeek, ui16 timezoneId = 0) const final;
99+
bool MakeTzDate32(i32 year, ui32 month, ui32 day, i32& date, ui16 timezoneId = 0) const final;
100+
bool MakeTzDatetime64(i32 year, ui32 month, ui32 day,
101+
ui32 hour, ui32 minute, ui32 second, i64& datetime, ui16 timezoneId = 0) const final;
102+
94103
NUdf::IListValueBuilder::TPtr NewListBuilder() const final;
95104

96105
private:
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
#pragma once
2+
3+
#include <util/datetime/base.h>
4+
5+
#include "datetime.h"
6+
7+
namespace NYql::DateTime {
8+
9+
struct TTM64Storage {
10+
i32 Year : 19;
11+
ui32 DayOfYear : 9;
12+
ui32 WeekOfYear : 6;
13+
ui32 WeekOfYearIso8601 : 6;
14+
ui32 DayOfWeek : 3;
15+
ui32 Month : 4;
16+
ui32 Day : 5;
17+
ui32 Hour : 5;
18+
ui32 Minute : 6;
19+
ui32 Second : 6;
20+
ui32 Microsecond : 20;
21+
ui32 TimezoneId : 16;
22+
23+
TTM64Storage() {
24+
Zero(*this);
25+
}
26+
27+
static bool IsUniversal(ui16 tzId) {
28+
return tzId == 0;
29+
}
30+
31+
void MakeDefault() {
32+
Year = 1970;
33+
Month = 1;
34+
Day = 1;
35+
Hour = 0;
36+
Minute = 0;
37+
Second = 0;
38+
Microsecond = 0;
39+
TimezoneId = 0;
40+
}
41+
42+
void From(const TTMStorage& narrow) {
43+
Year = narrow.Year;
44+
DayOfYear = narrow.DayOfYear;
45+
WeekOfYear = narrow.WeekOfYear;
46+
WeekOfYearIso8601 = narrow.WeekOfYearIso8601;
47+
DayOfWeek = narrow.DayOfWeek;
48+
Month = narrow.Month;
49+
Day = narrow.Day;
50+
Hour = narrow.Hour;
51+
Minute = narrow.Minute;
52+
Second = narrow.Second;
53+
Microsecond = narrow.Microsecond;
54+
TimezoneId = narrow.TimezoneId;
55+
}
56+
57+
void FromDate32(const NUdf::IDateBuilder& builder, i32 value, ui16 tzId = 0) {
58+
i32 year;
59+
ui32 month, day, dayOfYear, weekOfYear, weekOfYearIso8601, dayOfWeek;
60+
61+
if (!builder.SplitTzDate32(value, year, month, day, dayOfYear, weekOfYear, weekOfYearIso8601, dayOfWeek, tzId)) {
62+
ythrow yexception() << "Error in SplitTzDate32 tzId " << tzId << " value " << value;
63+
}
64+
65+
TimezoneId = tzId;
66+
Year = year;
67+
Month = month;
68+
Day = day;
69+
DayOfYear = dayOfYear;
70+
WeekOfYear = weekOfYear;
71+
WeekOfYearIso8601 = weekOfYearIso8601;
72+
DayOfWeek = dayOfWeek;
73+
}
74+
75+
void FromDatetime64(const NUdf::IDateBuilder& builder, i64 value, ui16 tzId = 0) {
76+
i32 year;
77+
ui32 month, day, dayOfYear, weekOfYear, weekOfYearIso8601, dayOfWeek;
78+
ui32 hour, minute, second;
79+
80+
if (!builder.SplitTzDatetime64(
81+
value, year, month, day, hour, minute, second,
82+
dayOfYear, weekOfYear, weekOfYearIso8601, dayOfWeek, tzId))
83+
{
84+
ythrow yexception() << "Error in SplitTzDatetime64 tzId " << tzId << " value " << value;
85+
}
86+
87+
TimezoneId = tzId;
88+
Year = year;
89+
Month = month;
90+
Day = day;
91+
Hour = hour;
92+
Minute = minute;
93+
Second = second;
94+
DayOfYear = dayOfYear;
95+
WeekOfYear = weekOfYear;
96+
WeekOfYearIso8601 = weekOfYearIso8601;
97+
DayOfWeek = dayOfWeek;
98+
}
99+
100+
void FromTimestamp64(const NUdf::IDateBuilder& builder, i64 value, ui16 tzId = 0) {
101+
i64 datetime = value / 1000000ll;
102+
if (value % 1000000ll < 0) {
103+
datetime -= 1;
104+
}
105+
FromDatetime64(builder, datetime, tzId);
106+
Microsecond = value - datetime * 1000000ll;
107+
}
108+
109+
i32 ToDate32(const NUdf::IDateBuilder& builder) const {
110+
i32 date;
111+
if (!builder.MakeTzDate32(Year, Month, Day, date, TimezoneId)) {
112+
ythrow yexception() << "Error in MakeTzDate32 tzId " << TimezoneId
113+
<< " " << Year << "-" << Month << "-" << Day;
114+
}
115+
return date;
116+
}
117+
118+
i64 ToDatetime64(const NUdf::IDateBuilder& builder) const {
119+
i64 datetime;
120+
if (!builder.MakeTzDatetime64(Year, Month, Day, Hour, Minute, Second, datetime, TimezoneId)) {
121+
ythrow yexception() << "Error in MakeTzDatetime64 tzId " << TimezoneId
122+
<< " " << Year << "-" << Month << "-" << Day << "T" << Hour << ":" << Minute << ":" << Second;
123+
}
124+
return datetime;
125+
}
126+
127+
i64 ToTimestamp64(const NUdf::IDateBuilder& builder) const {
128+
return ToDatetime64(builder) * 1000000ll + Microsecond;
129+
}
130+
131+
};
132+
133+
}

0 commit comments

Comments
 (0)