Skip to content

Commit c3043b6

Browse files
Vadim AverinMrLolthe1st
authored andcommitted
Implement ListTop/ListTopSort builtins (ydb-platform#4231)
1 parent 65a9823 commit c3043b6

File tree

9 files changed

+156
-0
lines changed

9 files changed

+156
-0
lines changed

ydb/library/yql/core/type_ann/type_ann_core.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12471,6 +12471,12 @@ template <NKikimr::NUdf::EDataSlot DataSlot>
1247112471
Functions["ListFlatten"] = &ListFlattenWrapper;
1247212472
Functions["ListUniq"] = &ListUniqWrapper;
1247312473
Functions["ListUniqStable"] = &ListUniqStableWrapper;
12474+
Functions["ListTop"] = &ListTopSortWrapper;
12475+
Functions["ListTopAsc"] = &ListTopSortWrapper;
12476+
Functions["ListTopDesc"] = &ListTopSortWrapper;
12477+
Functions["ListTopSort"] = &ListTopSortWrapper;
12478+
Functions["ListTopSortAsc"] = &ListTopSortWrapper;
12479+
Functions["ListTopSortDesc"] = &ListTopSortWrapper;
1247412480

1247512481
Functions["ExpandMap"] = &ExpandMapWrapper;
1247612482
Functions["WideMap"] = &WideMapWrapper;

ydb/library/yql/core/type_ann/type_ann_list.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1431,6 +1431,45 @@ namespace {
14311431
return OptListWrapperImpl<3U>(input, output, ctx, "Sort");
14321432
}
14331433

1434+
IGraphTransformer::TStatus ListTopSortWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx) {
1435+
if (!EnsureMinMaxArgsCount(*input, 2, 3, ctx.Expr)) {
1436+
return IGraphTransformer::TStatus::Error;
1437+
}
1438+
1439+
TStringBuf newName = input->Content();
1440+
newName.Skip(4);
1441+
bool desc = false;
1442+
if (newName.EndsWith("Asc")) {
1443+
newName.Chop(3);
1444+
} else if (newName.EndsWith("Desc")) {
1445+
newName.Chop(4);
1446+
desc = true;
1447+
}
1448+
1449+
TExprNode::TPtr sortLambda = nullptr;
1450+
if (input->ChildrenSize() == 3) {
1451+
sortLambda = input->ChildPtr(2);
1452+
} else {
1453+
sortLambda = ctx.Expr.Builder(input->Pos())
1454+
.Lambda()
1455+
.Param("item")
1456+
.Arg("item")
1457+
.Seal()
1458+
.Build();
1459+
}
1460+
1461+
return OptListWrapperImpl<4U, 4U>(ctx.Expr.Builder(input->Pos())
1462+
.Callable(newName)
1463+
.Add(0, input->ChildPtr(0))
1464+
.Add(1, input->ChildPtr(1))
1465+
.Callable(2, "Bool")
1466+
.Atom(0, desc ? "false" : "true")
1467+
.Seal()
1468+
.Add(3, sortLambda)
1469+
.Seal()
1470+
.Build(), output, ctx, newName);
1471+
}
1472+
14341473
IGraphTransformer::TStatus ListExtractWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx) {
14351474
return OptListWrapperImpl<2U>(input, output, ctx, "OrderedExtract");
14361475
}

ydb/library/yql/core/type_ann/type_ann_list.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ namespace NTypeAnnImpl {
3737
IGraphTransformer::TStatus ListEnumerateWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx);
3838
IGraphTransformer::TStatus ListReverseWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx);
3939
IGraphTransformer::TStatus ListSortWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx);
40+
IGraphTransformer::TStatus ListTopWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx);
41+
IGraphTransformer::TStatus ListTopSortWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx);
4042
IGraphTransformer::TStatus ListExtractWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx);
4143
IGraphTransformer::TStatus ListCollectWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx);
4244
IGraphTransformer::TStatus FoldMapWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx);

ydb/library/yql/sql/v1/builtin.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2904,6 +2904,12 @@ struct TBuiltinFuncData {
29042904
{"listcollect", BuildNamedArgcBuiltinFactoryCallback<TCallNodeImpl>("ListCollect", 1, 1) },
29052905
{"listnotnull", BuildNamedArgcBuiltinFactoryCallback<TCallNodeImpl>("ListNotNull", 1, 1)},
29062906
{"listflatten", BuildNamedArgcBuiltinFactoryCallback<TCallNodeImpl>("ListFlatten", 1, 1)},
2907+
{"listtop", BuildNamedArgcBuiltinFactoryCallback<TCallNodeImpl>("ListTop", 2, 3)},
2908+
{"listtopasc", BuildNamedArgcBuiltinFactoryCallback<TCallNodeImpl>("ListTopAsc", 2, 3)},
2909+
{"listtopdesc", BuildNamedArgcBuiltinFactoryCallback<TCallNodeImpl>("ListTopDesc", 2, 3)},
2910+
{"listtopsort", BuildNamedArgcBuiltinFactoryCallback<TCallNodeImpl>("ListTopSort", 2, 3)},
2911+
{"listtopsortasc", BuildNamedArgcBuiltinFactoryCallback<TCallNodeImpl>("ListTopSortAsc", 2, 3)},
2912+
{"listtopsortdesc", BuildNamedArgcBuiltinFactoryCallback<TCallNodeImpl>("ListTopSortDesc", 2, 3)},
29072913

29082914
// Dict builtins
29092915
{"dictlength", BuildNamedArgcBuiltinFactoryCallback<TCallNodeImpl>("Length", 1, 1)},

ydb/library/yql/tests/sql/dq_file/part12/canondata/result.json

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -948,6 +948,28 @@
948948
}
949949
],
950950
"test.test[expr-expr_null-default.txt-Results]": [],
951+
"test.test[expr-list_top_sort-default.txt-Analyze]": [
952+
{
953+
"checksum": "01775e7c945a56ebf0edc2d478f4f68d",
954+
"size": 2567,
955+
"uri": "https://{canondata_backend}/1130705/02b49b8f7de27e2bd653274fbb3967717e0d56f2/resource.tar.gz#test.test_expr-list_top_sort-default.txt-Analyze_/plan.txt"
956+
}
957+
],
958+
"test.test[expr-list_top_sort-default.txt-Debug]": [
959+
{
960+
"checksum": "df5a5689f7d16f67cdde86a519852534",
961+
"size": 1805,
962+
"uri": "https://{canondata_backend}/1777230/f087d19aefc64f43c561b1716c8824e128ac8093/resource.tar.gz#test.test_expr-list_top_sort-default.txt-Debug_/opt.yql_patched"
963+
}
964+
],
965+
"test.test[expr-list_top_sort-default.txt-Plan]": [
966+
{
967+
"checksum": "01775e7c945a56ebf0edc2d478f4f68d",
968+
"size": 2567,
969+
"uri": "https://{canondata_backend}/1130705/02b49b8f7de27e2bd653274fbb3967717e0d56f2/resource.tar.gz#test.test_expr-list_top_sort-default.txt-Plan_/plan.txt"
970+
}
971+
],
972+
"test.test[expr-list_top_sort-default.txt-Results]": [],
951973
"test.test[expr-many_opt_comp-default.txt-Analyze]": [
952974
{
953975
"checksum": "01775e7c945a56ebf0edc2d478f4f68d",

ydb/library/yql/tests/sql/hybrid_file/part10/canondata/result.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1049,6 +1049,20 @@
10491049
"uri": "https://{canondata_backend}/1775319/3515b86fb929979a6751f93bd43a0291eaa01262/resource.tar.gz#test.test_expr-lds_empty_compare-default.txt-Plan_/plan.txt"
10501050
}
10511051
],
1052+
"test.test[expr-list_top_sort-default.txt-Debug]": [
1053+
{
1054+
"checksum": "049a4840aed77024dcb5f9caf73a672f",
1055+
"size": 1804,
1056+
"uri": "https://{canondata_backend}/1937424/ef4272c0e98c55575149317381e8efaa85a26157/resource.tar.gz#test.test_expr-list_top_sort-default.txt-Debug_/opt.yql_patched"
1057+
}
1058+
],
1059+
"test.test[expr-list_top_sort-default.txt-Plan]": [
1060+
{
1061+
"checksum": "01775e7c945a56ebf0edc2d478f4f68d",
1062+
"size": 2567,
1063+
"uri": "https://{canondata_backend}/1903885/804adfc45546340f178ce737d7f1d1e8feb56e81/resource.tar.gz#test.test_expr-list_top_sort-default.txt-Plan_/plan.txt"
1064+
}
1065+
],
10521066
"test.test[expr-to_hashed_dict_list_key-default.txt-Debug]": [
10531067
{
10541068
"checksum": "044532517685890dde36188f8d1567cc",

ydb/library/yql/tests/sql/sql2yql/canondata/result.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5837,6 +5837,13 @@
58375837
"uri": "https://{canondata_backend}/1784117/d56ae82ad9d30397a41490647be1bd2124718f98/resource.tar.gz#test_sql2yql.test_expr-list_to_from_tuple_/sql.yql"
58385838
}
58395839
],
5840+
"test_sql2yql.test[expr-list_top_sort]": [
5841+
{
5842+
"checksum": "b2acc119076239ea4f4ada66e164330b",
5843+
"size": 15716,
5844+
"uri": "https://{canondata_backend}/995452/0828572c263b2cebd15b1dcd234d39fd5315b924/resource.tar.gz#test_sql2yql.test_expr-list_top_sort_/sql.yql"
5845+
}
5846+
],
58405847
"test_sql2yql.test[expr-list_uniq]": [
58415848
{
58425849
"checksum": "d15d661e6b25dd80b507f95fb057c207",
@@ -24408,6 +24415,13 @@
2440824415
"uri": "https://{canondata_backend}/1925842/ffeacd65677f75bcab2445d237890283afc5e8f6/resource.tar.gz#test_sql_format.test_expr-list_to_from_tuple_/formatted.sql"
2440924416
}
2441024417
],
24418+
"test_sql_format.test[expr-list_top_sort]": [
24419+
{
24420+
"checksum": "a0af54a6ec4d671db9f8a91cc09877bf",
24421+
"size": 1594,
24422+
"uri": "https://{canondata_backend}/1689644/47813afec92f7bbc83af4667f9074aac865e7ffe/resource.tar.gz#test_sql_format.test_expr-list_top_sort_/formatted.sql"
24423+
}
24424+
],
2441124425
"test_sql_format.test[expr-list_uniq]": [
2441224426
{
2441324427
"checksum": "74f6f47d443fa97917b2d52760056649",
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/* syntax version 1 */
2+
3+
$list = [45, 20, 34, 16];
4+
$empty = [];
5+
6+
$digit = ($x) -> { return $x % 10; };
7+
8+
SELECT
9+
ListTopSort($list, 2), ListTopSort($list, 4), ListTopSort($list, 5),
10+
ListTopSort($list, 2, $digit),
11+
ListTopSort(NULL, 2), ListTopSort(Just($list), 2), ListTopSort($empty, 0);
12+
SELECT
13+
ListTopSortAsc($list, 2), ListTopSortAsc($list, 4), ListTopSortAsc($list, 5),
14+
ListTopSortAsc($list, 2, $digit),
15+
ListTopSortAsc(NULL, 2), ListTopSortAsc(Just($list), 2), ListTopSortAsc($empty, 0);
16+
SELECT
17+
ListTopSortDesc($list, 2), ListTopSortDesc($list, 4), ListTopSortDesc($list, 5),
18+
ListTopSortDesc($list, 2, $digit),
19+
ListTopSortDesc(NULL, 2), ListTopSortDesc(Just($list), 2), ListTopSortDesc($empty, 0);
20+
21+
SELECT
22+
ListSort(ListTop($list, 2)), ListSort(ListTop($list, 4)), ListSort(ListTop($list, 5)),
23+
ListSort(ListTop($list, 2, $digit)),
24+
ListSort(ListTop(NULL, 2)), ListSort(ListTop(Just($list), 2)), ListSort(ListTop($empty, 0));
25+
SELECT
26+
ListSort(ListTopAsc($list, 2)), ListSort(ListTopAsc($list, 4)), ListSort(ListTopAsc($list, 5)),
27+
ListSort(ListTopAsc($list, 2, $digit)),
28+
ListSort(ListTopAsc(NULL, 2)), ListSort(ListTopAsc(Just($list), 2)), ListSort(ListTopAsc($empty, 0));
29+
SELECT
30+
ListSort(ListTopDesc($list, 2)), ListSort(ListTopDesc($list, 4)), ListSort(ListTopDesc($list, 5)),
31+
ListSort(ListTopDesc($list, 2, $digit)),
32+
ListSort(ListTopDesc(NULL, 2)), ListSort(ListTopDesc(Just($list), 2)), ListSort(ListTopDesc($empty, 0));

ydb/library/yql/tests/sql/yt_native_file/part12/canondata/result.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -975,6 +975,27 @@
975975
"uri": "https://{canondata_backend}/1881367/f7c9625b9d66b51a2a5927015bd3050c9cb7f8d2/resource.tar.gz#test.test_expr-expr_null-default.txt-Results_/results.txt"
976976
}
977977
],
978+
"test.test[expr-list_top_sort-default.txt-Debug]": [
979+
{
980+
"checksum": "7f0089c8ef7e1971bdf7f46c7d96b45c",
981+
"size": 1733,
982+
"uri": "https://{canondata_backend}/1923547/ddadfd08d4d18962f17ecb8528c68375e0f1cf53/resource.tar.gz#test.test_expr-list_top_sort-default.txt-Debug_/opt.yql"
983+
}
984+
],
985+
"test.test[expr-list_top_sort-default.txt-Plan]": [
986+
{
987+
"checksum": "01775e7c945a56ebf0edc2d478f4f68d",
988+
"size": 2567,
989+
"uri": "https://{canondata_backend}/1937492/5708f4083beb3611506ac1fc16491e776779d1cf/resource.tar.gz#test.test_expr-list_top_sort-default.txt-Plan_/plan.txt"
990+
}
991+
],
992+
"test.test[expr-list_top_sort-default.txt-Results]": [
993+
{
994+
"checksum": "79ad276e0af4567e7f2c7aa689438f80",
995+
"size": 23306,
996+
"uri": "https://{canondata_backend}/1923547/ddadfd08d4d18962f17ecb8528c68375e0f1cf53/resource.tar.gz#test.test_expr-list_top_sort-default.txt-Results_/results.txt"
997+
}
998+
],
978999
"test.test[expr-many_opt_comp-default.txt-Debug]": [
9791000
{
9801001
"checksum": "cf876c64f15a29de2edc2b23e3b21565",

0 commit comments

Comments
 (0)