Skip to content

Commit

Permalink
Subtraction for all dates (#5942)
Browse files Browse the repository at this point in the history
  • Loading branch information
vitstn authored Jun 26, 2024
1 parent 6ac8593 commit ed1e090
Show file tree
Hide file tree
Showing 16 changed files with 433 additions and 176 deletions.
72 changes: 47 additions & 25 deletions ydb/library/yql/minikql/invoke_builtins/mkql_builtins_sub.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -263,30 +263,27 @@ using TAnyDateTimeSubIntervalTz = TAnyDateTimeSubIntervalT<TLeft, TRight, TOutpu

template <bool LeftTz, bool RightTz, bool LeftBig, bool RightBig>
void RegisterDateSub(IBuiltinFunctionRegistry& registry) {
static_assert(!(LeftTz && LeftBig), "Expect either Tz or Big date type");
static_assert(!(RightTz && RightBig), "Expect either Tz or Big date type");

using TDateLeft1 = std::conditional_t<LeftBig,
NUdf::TDataType<NUdf::TDate32>,
std::conditional_t<LeftTz, NUdf::TDataType<NUdf::TTzDate32>, NUdf::TDataType<NUdf::TDate32>>,
std::conditional_t<LeftTz, NUdf::TDataType<NUdf::TTzDate>, NUdf::TDataType<NUdf::TDate>>>;
using TDateLeft2 = std::conditional_t<LeftBig,
NUdf::TDataType<NUdf::TDatetime64>,
std::conditional_t<LeftTz, NUdf::TDataType<NUdf::TTzDatetime64>, NUdf::TDataType<NUdf::TDatetime64>>,
std::conditional_t<LeftTz, NUdf::TDataType<NUdf::TTzDatetime>, NUdf::TDataType<NUdf::TDatetime>>>;
using TDateLeft3 = std::conditional_t<LeftBig,
NUdf::TDataType<NUdf::TTimestamp64>,
std::conditional_t<LeftTz, NUdf::TDataType<NUdf::TTzTimestamp64>, NUdf::TDataType<NUdf::TTimestamp64>>,
std::conditional_t<LeftTz, NUdf::TDataType<NUdf::TTzTimestamp>, NUdf::TDataType<NUdf::TTimestamp>>>;

using TDateRight1 = std::conditional_t<RightBig,
NUdf::TDataType<NUdf::TDate32>,
std::conditional_t<RightTz, NUdf::TDataType<NUdf::TTzDate32>, NUdf::TDataType<NUdf::TDate32>>,
std::conditional_t<RightTz, NUdf::TDataType<NUdf::TTzDate>, NUdf::TDataType<NUdf::TDate>>>;
using TDateRight2 = std::conditional_t<RightBig,
NUdf::TDataType<NUdf::TDatetime64>,
std::conditional_t<RightTz, NUdf::TDataType<NUdf::TTzDatetime64>, NUdf::TDataType<NUdf::TDatetime64>>,
std::conditional_t<RightTz, NUdf::TDataType<NUdf::TTzDatetime>, NUdf::TDataType<NUdf::TDatetime>>>;
using TDateRight3 = std::conditional_t<RightBig,
NUdf::TDataType<NUdf::TTimestamp64>,
std::conditional_t<RightTz, NUdf::TDataType<NUdf::TTzTimestamp64>, NUdf::TDataType<NUdf::TTimestamp64>>,
std::conditional_t<RightTz, NUdf::TDataType<NUdf::TTzTimestamp>, NUdf::TDataType<NUdf::TTimestamp>>>;

using TOutput = std::conditional_t<LeftBig || RightBig,
using TOutput = std::conditional_t<LeftBig || RightBig,
NUdf::TDataType<NUdf::TInterval64>,
NUdf::TDataType<NUdf::TInterval>>;

Expand Down Expand Up @@ -314,30 +311,27 @@ void RegisterDateSub(IBuiltinFunctionRegistry& registry) {

template <bool LeftTz, bool RightTz, bool LeftBig, bool RightBig>
void RegisterDateSub(TKernelFamilyBase& owner) {
static_assert(!(LeftTz && LeftBig), "Expect either Tz or Big date type");
static_assert(!(RightTz && RightBig), "Expect either Tz or Big date type");

using TDateLeft1 = std::conditional_t<LeftBig,
NUdf::TDataType<NUdf::TDate32>,
std::conditional_t<LeftTz, NUdf::TDataType<NUdf::TTzDate32>, NUdf::TDataType<NUdf::TDate32>>,
std::conditional_t<LeftTz, NUdf::TDataType<NUdf::TTzDate>, NUdf::TDataType<NUdf::TDate>>>;
using TDateLeft2 = std::conditional_t<LeftBig,
NUdf::TDataType<NUdf::TDatetime64>,
std::conditional_t<LeftTz, NUdf::TDataType<NUdf::TTzDatetime64>, NUdf::TDataType<NUdf::TDatetime64>>,
std::conditional_t<LeftTz, NUdf::TDataType<NUdf::TTzDatetime>, NUdf::TDataType<NUdf::TDatetime>>>;
using TDateLeft3 = std::conditional_t<LeftBig,
NUdf::TDataType<NUdf::TTimestamp64>,
std::conditional_t<LeftTz, NUdf::TDataType<NUdf::TTzTimestamp64>, NUdf::TDataType<NUdf::TTimestamp64>>,
std::conditional_t<LeftTz, NUdf::TDataType<NUdf::TTzTimestamp>, NUdf::TDataType<NUdf::TTimestamp>>>;

using TDateRight1 = std::conditional_t<RightBig,
NUdf::TDataType<NUdf::TDate32>,
std::conditional_t<RightTz, NUdf::TDataType<NUdf::TTzDate32>, NUdf::TDataType<NUdf::TDate32>>,
std::conditional_t<RightTz, NUdf::TDataType<NUdf::TTzDate>, NUdf::TDataType<NUdf::TDate>>>;
using TDateRight2 = std::conditional_t<RightBig,
NUdf::TDataType<NUdf::TDatetime64>,
std::conditional_t<RightTz, NUdf::TDataType<NUdf::TTzDatetime64>, NUdf::TDataType<NUdf::TDatetime64>>,
std::conditional_t<RightTz, NUdf::TDataType<NUdf::TTzDatetime>, NUdf::TDataType<NUdf::TDatetime>>>;
using TDateRight3 = std::conditional_t<RightBig,
NUdf::TDataType<NUdf::TTimestamp64>,
std::conditional_t<RightTz, NUdf::TDataType<NUdf::TTzTimestamp64>, NUdf::TDataType<NUdf::TTimestamp64>>,
std::conditional_t<RightTz, NUdf::TDataType<NUdf::TTzTimestamp>, NUdf::TDataType<NUdf::TTimestamp>>>;

using TOutput = std::conditional_t<LeftBig || RightBig,
using TOutput = std::conditional_t<LeftBig || RightBig,
NUdf::TDataType<NUdf::TInterval64>,
NUdf::TDataType<NUdf::TInterval>>;

Expand Down Expand Up @@ -366,11 +360,18 @@ void RegisterSub(IBuiltinFunctionRegistry& registry) {
// NarrowDate minus BigDate
RegisterDateSub<false, false, false, true>(registry);
RegisterDateSub<true, false, false, true>(registry);
RegisterDateSub<false, true, false, true>(registry);
RegisterDateSub<true, true, false, true>(registry);
// BigDate minus NarrowDate
RegisterDateSub<false, false, true, false>(registry);
RegisterDateSub<false, true, true, false>(registry);
RegisterDateSub<true, false, true, false>(registry);
RegisterDateSub<true, true, true, false>(registry);
// BigDate minus BigDate
RegisterDateSub<false, false, true, true>(registry);
RegisterDateSub<true, false, true, true>(registry);
RegisterDateSub<false, true, true, true>(registry);
RegisterDateSub<true, true, true, true>(registry);

RegisterFunctionBinPolyOpt<NUdf::TDataType<NUdf::TInterval>, NUdf::TDataType<NUdf::TInterval>,
NUdf::TDataType<NUdf::TInterval>, TIntervalSubInterval, TBinaryArgsOptWithNullableResult>(registry, "Sub");
Expand Down Expand Up @@ -422,20 +423,32 @@ void RegisterSub(IBuiltinFunctionRegistry& registry) {
NUdf::TDataType<NUdf::TDatetime64>, TAnyDateTimeSubInterval, TBinaryArgsOptWithNullableResult>(registry, "Sub");
RegisterFunctionBinPolyOpt<NUdf::TDataType<NUdf::TTimestamp64>, NUdf::TDataType<NUdf::TInterval>,
NUdf::TDataType<NUdf::TTimestamp64>, TAnyDateTimeSubInterval, TBinaryArgsOptWithNullableResult>(registry, "Sub");

RegisterFunctionBinPolyOpt<NUdf::TDataType<NUdf::TTzDate32>, NUdf::TDataType<NUdf::TInterval64>,
NUdf::TDataType<NUdf::TTzDate32>, TAnyDateTimeSubIntervalTz, TBinaryArgsOptWithNullableResult>(registry, "Sub");
RegisterFunctionBinPolyOpt<NUdf::TDataType<NUdf::TTzDatetime64>, NUdf::TDataType<NUdf::TInterval64>,
NUdf::TDataType<NUdf::TTzDatetime64>, TAnyDateTimeSubIntervalTz, TBinaryArgsOptWithNullableResult>(registry, "Sub");
RegisterFunctionBinPolyOpt<NUdf::TDataType<NUdf::TTzTimestamp64>, NUdf::TDataType<NUdf::TInterval64>,
NUdf::TDataType<NUdf::TTzTimestamp64>, TAnyDateTimeSubIntervalTz, TBinaryArgsOptWithNullableResult>(registry, "Sub");

RegisterFunctionBinPolyOpt<NUdf::TDataType<NUdf::TTzDate32>, NUdf::TDataType<NUdf::TInterval>,
NUdf::TDataType<NUdf::TTzDate32>, TAnyDateTimeSubIntervalTz, TBinaryArgsOptWithNullableResult>(registry, "Sub");
RegisterFunctionBinPolyOpt<NUdf::TDataType<NUdf::TTzDatetime64>, NUdf::TDataType<NUdf::TInterval>,
NUdf::TDataType<NUdf::TTzDatetime64>, TAnyDateTimeSubIntervalTz, TBinaryArgsOptWithNullableResult>(registry, "Sub");
RegisterFunctionBinPolyOpt<NUdf::TDataType<NUdf::TTzTimestamp64>, NUdf::TDataType<NUdf::TInterval>,
NUdf::TDataType<NUdf::TTzTimestamp64>, TAnyDateTimeSubIntervalTz, TBinaryArgsOptWithNullableResult>(registry, "Sub");
}

template <bool Tz, bool BigDate, bool BigInterval>
void RegisterDateSubInterval(TKernelFamilyBase& owner) {
static_assert(!(Tz && BigDate), "Expect either Tz or Big date type");

using TDateLeft1 = std::conditional_t<BigDate,
NUdf::TDataType<NUdf::TDate32>,
std::conditional_t<Tz, NUdf::TDataType<NUdf::TTzDate32>, NUdf::TDataType<NUdf::TDate32>>,
std::conditional_t<Tz, NUdf::TDataType<NUdf::TTzDate>, NUdf::TDataType<NUdf::TDate>>>;
using TDateLeft2 = std::conditional_t<BigDate,
NUdf::TDataType<NUdf::TDatetime64>,
std::conditional_t<Tz, NUdf::TDataType<NUdf::TTzDatetime64>, NUdf::TDataType<NUdf::TDatetime64>>,
std::conditional_t<Tz, NUdf::TDataType<NUdf::TTzDatetime>, NUdf::TDataType<NUdf::TDatetime>>>;
using TDateLeft3 = std::conditional_t<BigDate,
NUdf::TDataType<NUdf::TTimestamp64>,
std::conditional_t<Tz, NUdf::TDataType<NUdf::TTzTimestamp64>, NUdf::TDataType<NUdf::TTimestamp64>>,
std::conditional_t<Tz, NUdf::TDataType<NUdf::TTzTimestamp>, NUdf::TDataType<NUdf::TTimestamp>>>;

using TIntervalRight = std::conditional_t<BigInterval,
Expand Down Expand Up @@ -477,19 +490,28 @@ void RegisterSub(TKernelFamilyMap& kernelFamilyMap) {
// NarrowDate minus BigDate
RegisterDateSub<false, false, false, true>(*family);
RegisterDateSub<true, false, false, true>(*family);
RegisterDateSub<false, true, false, true>(*family);
RegisterDateSub<true, true, false, true>(*family);
// BigDate minus NarrowDate
RegisterDateSub<false, false, true, false>(*family);
RegisterDateSub<false, true, true, false>(*family);
RegisterDateSub<true, false, true, false>(*family);
RegisterDateSub<true, true, true, false>(*family);
// BigDate minus BigDate
RegisterDateSub<false, false, true, true>(*family);
RegisterDateSub<false, true, true, true>(*family);
RegisterDateSub<true, false, true, true>(*family);
RegisterDateSub<true, true, true, true>(*family);

RegisterDateSubInterval<false, false, false>(*family);
RegisterDateSubInterval<true, false, false>(*family);
RegisterDateSubInterval<false, true, false>(*family);
RegisterDateSubInterval<true, true, false>(*family);

RegisterDateSubInterval<false, false, true>(*family);
RegisterDateSubInterval<true, false, true>(*family);
RegisterDateSubInterval<false, true, true>(*family);
RegisterDateSubInterval<true, true, true>(*family);

RegisterIntervalSubInterval<false, false>(*family);
RegisterIntervalSubInterval<false, true>(*family);
Expand Down
18 changes: 9 additions & 9 deletions ydb/library/yql/tests/sql/dq_file/part18/canondata/result.json
Original file line number Diff line number Diff line change
Expand Up @@ -500,23 +500,23 @@
"test.test[blocks-date_group_by--Results]": [],
"test.test[blocks-date_sub_scalar--Analyze]": [
{
"checksum": "e8b45a26a526cda4ea5cd83ccb9bb9a2",
"size": 4921,
"uri": "https://{canondata_backend}/1775319/21cd8e1d0bdd8f0ad1770c8084252628093f80c4/resource.tar.gz#test.test_blocks-date_sub_scalar--Analyze_/plan.txt"
"checksum": "ddf86e4b60e819f8f4118ad27fc4c801",
"size": 7069,
"uri": "https://{canondata_backend}/1814674/a71168cd07531a101c5ea9b29bae77a3ea1d4693/resource.tar.gz#test.test_blocks-date_sub_scalar--Analyze_/plan.txt"
}
],
"test.test[blocks-date_sub_scalar--Debug]": [
{
"checksum": "2b97fb68ddd427edcbae52184c895a7e",
"size": 8752,
"uri": "https://{canondata_backend}/1937027/65db208ba11cd5e90b41bbb5f58baaa54793e4a9/resource.tar.gz#test.test_blocks-date_sub_scalar--Debug_/opt.yql_patched"
"checksum": "a26d82b13177303908d8c42e2e906c7a",
"size": 14123,
"uri": "https://{canondata_backend}/1814674/a71168cd07531a101c5ea9b29bae77a3ea1d4693/resource.tar.gz#test.test_blocks-date_sub_scalar--Debug_/opt.yql_patched"
}
],
"test.test[blocks-date_sub_scalar--Plan]": [
{
"checksum": "e8b45a26a526cda4ea5cd83ccb9bb9a2",
"size": 4921,
"uri": "https://{canondata_backend}/1775319/21cd8e1d0bdd8f0ad1770c8084252628093f80c4/resource.tar.gz#test.test_blocks-date_sub_scalar--Plan_/plan.txt"
"checksum": "ddf86e4b60e819f8f4118ad27fc4c801",
"size": 7069,
"uri": "https://{canondata_backend}/1814674/a71168cd07531a101c5ea9b29bae77a3ea1d4693/resource.tar.gz#test.test_blocks-date_sub_scalar--Plan_/plan.txt"
}
],
"test.test[blocks-date_sub_scalar--Results]": [],
Expand Down
36 changes: 18 additions & 18 deletions ydb/library/yql/tests/sql/dq_file/part7/canondata/result.json
Original file line number Diff line number Diff line change
Expand Up @@ -492,45 +492,45 @@
"test.test[blocks-combine_hashed_minmax_nested--Results]": [],
"test.test[blocks-date_sub_interval--Analyze]": [
{
"checksum": "f795c30f6ae91198b611e02645f3918d",
"size": 5207,
"uri": "https://{canondata_backend}/1031349/0db72bc457fea36ffb7a9c3f14265b7fe8fa48b0/resource.tar.gz#test.test_blocks-date_sub_interval--Analyze_/plan.txt"
"checksum": "b7b0a23c218f14fbddbddefe816c2dd1",
"size": 5366,
"uri": "https://{canondata_backend}/1923547/d0656f40d6f986668efaffc1efccda90baa2359a/resource.tar.gz#test.test_blocks-date_sub_interval--Analyze_/plan.txt"
}
],
"test.test[blocks-date_sub_interval--Debug]": [
{
"checksum": "c3a372224afca3357970d0266f46aef2",
"size": 3349,
"uri": "https://{canondata_backend}/1942100/0f7afbcaf8b5511a96df7f526006d3ea93b53c26/resource.tar.gz#test.test_blocks-date_sub_interval--Debug_/opt.yql_patched"
"checksum": "a6ed9b4e2552afca78b25c3c73c108e7",
"size": 4213,
"uri": "https://{canondata_backend}/1923547/d0656f40d6f986668efaffc1efccda90baa2359a/resource.tar.gz#test.test_blocks-date_sub_interval--Debug_/opt.yql_patched"
}
],
"test.test[blocks-date_sub_interval--Plan]": [
{
"checksum": "f795c30f6ae91198b611e02645f3918d",
"size": 5207,
"uri": "https://{canondata_backend}/1031349/0db72bc457fea36ffb7a9c3f14265b7fe8fa48b0/resource.tar.gz#test.test_blocks-date_sub_interval--Plan_/plan.txt"
"checksum": "b7b0a23c218f14fbddbddefe816c2dd1",
"size": 5366,
"uri": "https://{canondata_backend}/1923547/d0656f40d6f986668efaffc1efccda90baa2359a/resource.tar.gz#test.test_blocks-date_sub_interval--Plan_/plan.txt"
}
],
"test.test[blocks-date_sub_interval--Results]": [],
"test.test[blocks-date_sub_interval_scalar--Analyze]": [
{
"checksum": "a7735abc118d08f4ff9334ba7d36d92c",
"size": 4973,
"uri": "https://{canondata_backend}/1031349/0db72bc457fea36ffb7a9c3f14265b7fe8fa48b0/resource.tar.gz#test.test_blocks-date_sub_interval_scalar--Analyze_/plan.txt"
"checksum": "13bf2d11ab5bc079dc45be91f40f6dd3",
"size": 5060,
"uri": "https://{canondata_backend}/1923547/d0656f40d6f986668efaffc1efccda90baa2359a/resource.tar.gz#test.test_blocks-date_sub_interval_scalar--Analyze_/plan.txt"
}
],
"test.test[blocks-date_sub_interval_scalar--Debug]": [
{
"checksum": "b615905f66127bdf25e71648590c768c",
"size": 4671,
"uri": "https://{canondata_backend}/1942100/0f7afbcaf8b5511a96df7f526006d3ea93b53c26/resource.tar.gz#test.test_blocks-date_sub_interval_scalar--Debug_/opt.yql_patched"
"checksum": "8906faa3ab76a1f5fb932b6e1efb7f36",
"size": 5650,
"uri": "https://{canondata_backend}/1923547/d0656f40d6f986668efaffc1efccda90baa2359a/resource.tar.gz#test.test_blocks-date_sub_interval_scalar--Debug_/opt.yql_patched"
}
],
"test.test[blocks-date_sub_interval_scalar--Plan]": [
{
"checksum": "a7735abc118d08f4ff9334ba7d36d92c",
"size": 4973,
"uri": "https://{canondata_backend}/1031349/0db72bc457fea36ffb7a9c3f14265b7fe8fa48b0/resource.tar.gz#test.test_blocks-date_sub_interval_scalar--Plan_/plan.txt"
"checksum": "13bf2d11ab5bc079dc45be91f40f6dd3",
"size": 5060,
"uri": "https://{canondata_backend}/1923547/d0656f40d6f986668efaffc1efccda90baa2359a/resource.tar.gz#test.test_blocks-date_sub_interval_scalar--Plan_/plan.txt"
}
],
"test.test[blocks-date_sub_interval_scalar--Results]": [],
Expand Down
18 changes: 9 additions & 9 deletions ydb/library/yql/tests/sql/dq_file/part8/canondata/result.json
Original file line number Diff line number Diff line change
Expand Up @@ -773,23 +773,23 @@
"test.test[blocks-combine_hashed_some--Results]": [],
"test.test[blocks-date_sub--Analyze]": [
{
"checksum": "73c99eb3c8d812f93e81e41e2e528965",
"size": 5233,
"uri": "https://{canondata_backend}/1031349/d2bfbcf3a83f9468e81d8ee6f41bc03f4a4ed82c/resource.tar.gz#test.test_blocks-date_sub--Analyze_/plan.txt"
"checksum": "29abcf6f7856c6c5aad292c345095270",
"size": 6356,
"uri": "https://{canondata_backend}/1920236/35006d56f02bf6830f30b607dded3342ab6fe947/resource.tar.gz#test.test_blocks-date_sub--Analyze_/plan.txt"
}
],
"test.test[blocks-date_sub--Debug]": [
{
"checksum": "c17c40c1e6d7a734556fd44ea4b6e653",
"size": 6259,
"uri": "https://{canondata_backend}/1942100/a3bffaeb27f79f639a5d43f1ae80b9f2b22f2f0b/resource.tar.gz#test.test_blocks-date_sub--Debug_/opt.yql_patched"
"checksum": "bdc3d25bfbdd3746424797ba7df9ab74",
"size": 9603,
"uri": "https://{canondata_backend}/1920236/35006d56f02bf6830f30b607dded3342ab6fe947/resource.tar.gz#test.test_blocks-date_sub--Debug_/opt.yql_patched"
}
],
"test.test[blocks-date_sub--Plan]": [
{
"checksum": "73c99eb3c8d812f93e81e41e2e528965",
"size": 5233,
"uri": "https://{canondata_backend}/1031349/d2bfbcf3a83f9468e81d8ee6f41bc03f4a4ed82c/resource.tar.gz#test.test_blocks-date_sub--Plan_/plan.txt"
"checksum": "29abcf6f7856c6c5aad292c345095270",
"size": 6356,
"uri": "https://{canondata_backend}/1920236/35006d56f02bf6830f30b607dded3342ab6fe947/resource.tar.gz#test.test_blocks-date_sub--Plan_/plan.txt"
}
],
"test.test[blocks-date_sub--Results]": [],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -687,16 +687,16 @@
],
"test.test[blocks-date_sub_scalar--Debug]": [
{
"checksum": "05dee9a44e286862c95f70e8415572cd",
"size": 13110,
"uri": "https://{canondata_backend}/1773845/6e12a9ad8ca1393c67d99ce6c0f78660e657fae0/resource.tar.gz#test.test_blocks-date_sub_scalar--Debug_/opt.yql_patched"
"checksum": "eb79b95cc8ab6ece8cda0d373ffc3cb7",
"size": 24887,
"uri": "https://{canondata_backend}/1814674/9488849b466e427dfdcf2f4a65bd7c6352ffabd6/resource.tar.gz#test.test_blocks-date_sub_scalar--Debug_/opt.yql_patched"
}
],
"test.test[blocks-date_sub_scalar--Plan]": [
{
"checksum": "0e278aa62af2bd9061a3135d4033a8c0",
"size": 6542,
"uri": "https://{canondata_backend}/1775319/41ea8ee5e004d52a40ece3b87cdacf535917057e/resource.tar.gz#test.test_blocks-date_sub_scalar--Plan_/plan.txt"
"checksum": "12018a00b8a92db5880e226557881949",
"size": 11319,
"uri": "https://{canondata_backend}/1814674/9488849b466e427dfdcf2f4a65bd7c6352ffabd6/resource.tar.gz#test.test_blocks-date_sub_scalar--Plan_/plan.txt"
}
],
"test.test[blocks-finalize_hashed_keys--Debug]": [
Expand Down
Loading

0 comments on commit ed1e090

Please sign in to comment.