diff options
author | aneporada <aneporada@ydb.tech> | 2023-04-10 11:09:12 +0300 |
---|---|---|
committer | aneporada <aneporada@ydb.tech> | 2023-04-10 11:09:12 +0300 |
commit | 3e0fcfe80ecdcf2e1ea22a826cd9798d8a047942 (patch) | |
tree | 5eaf7ee3441638e5652c03ebb215a8a9ec3bac08 | |
parent | de6ebe03178907936cd22e28f9dc4acf7f189d0d (diff) | |
download | ydb-3e0fcfe80ecdcf2e1ea22a826cd9798d8a047942.tar.gz |
Implement column order for window functions
initial
-rw-r--r-- | ydb/library/yql/core/type_ann/type_ann_columnorder.cpp | 23 | ||||
-rw-r--r-- | ydb/library/yql/core/type_ann/type_ann_columnorder.h | 1 | ||||
-rw-r--r-- | ydb/library/yql/core/type_ann/type_ann_core.cpp | 1 |
3 files changed, 25 insertions, 0 deletions
diff --git a/ydb/library/yql/core/type_ann/type_ann_columnorder.cpp b/ydb/library/yql/core/type_ann/type_ann_columnorder.cpp index 3a6a71ced74..9befa13e82e 100644 --- a/ydb/library/yql/core/type_ann/type_ann_columnorder.cpp +++ b/ydb/library/yql/core/type_ann/type_ann_columnorder.cpp @@ -266,6 +266,29 @@ IGraphTransformer::TStatus OrderForEquiJoin(const TExprNode::TPtr& node, TExprNo return ctx.Types.SetColumnOrder(*node, resultColumnOrder, ctx.Expr); }; +IGraphTransformer::TStatus OrderForCalcOverWindow(const TExprNode::TPtr& node, TExprNode::TPtr& output, TExtContext& ctx) { + Y_UNUSED(output); + + auto inputOrder = ctx.Types.LookupColumnOrder(node->Head()); + if (!inputOrder) { + return IGraphTransformer::TStatus::Ok; + } + + const TStructExprType* inputType = node->Head().GetTypeAnn()->Cast<TListExprType>()->GetItemType()->Cast<TStructExprType>(); + const TStructExprType* outputType = node->GetTypeAnn()->Cast<TListExprType>()->GetItemType()->Cast<TStructExprType>(); + + // we simply add new CalcOverWindow columns after original input columns + TVector<TString> resultOrder = *inputOrder; + for (auto& item : outputType->GetItems()) { + auto col = item->GetName(); + if (!inputType->FindItem(col)) { + resultOrder.emplace_back(col); + } + } + + return ctx.Types.SetColumnOrder(*node, resultOrder, ctx.Expr); +} + IGraphTransformer::TStatus OrderFromFirst(const TExprNode::TPtr& node, TExprNode::TPtr& output, TExtContext& ctx) { Y_UNUSED(output); if (auto columnOrder = ctx.Types.LookupColumnOrder(node->Head())) { diff --git a/ydb/library/yql/core/type_ann/type_ann_columnorder.h b/ydb/library/yql/core/type_ann/type_ann_columnorder.h index dc9e9c0a564..90c17236a30 100644 --- a/ydb/library/yql/core/type_ann/type_ann_columnorder.h +++ b/ydb/library/yql/core/type_ann/type_ann_columnorder.h @@ -14,6 +14,7 @@ IGraphTransformer::TStatus OrderForSqlProject(const TExprNode::TPtr& node, TExpr IGraphTransformer::TStatus OrderForMergeExtend(const TExprNode::TPtr& node, TExprNode::TPtr& output, TExtContext& ctx); IGraphTransformer::TStatus OrderForUnionAll(const TExprNode::TPtr& node, TExprNode::TPtr& output, TExtContext& ctx); IGraphTransformer::TStatus OrderForEquiJoin(const TExprNode::TPtr& node, TExprNode::TPtr& output, TExtContext& ctx); +IGraphTransformer::TStatus OrderForCalcOverWindow(const TExprNode::TPtr& node, TExprNode::TPtr& output, TExtContext& ctx); IGraphTransformer::TStatus OrderFromFirst(const TExprNode::TPtr& node, TExprNode::TPtr& output, TExtContext& ctx); IGraphTransformer::TStatus OrderFromFirstAndOutputType(const TExprNode::TPtr& node, TExprNode::TPtr& output, TExtContext& ctx); diff --git a/ydb/library/yql/core/type_ann/type_ann_core.cpp b/ydb/library/yql/core/type_ann/type_ann_core.cpp index f5335777945..81d50565c68 100644 --- a/ydb/library/yql/core/type_ann/type_ann_core.cpp +++ b/ydb/library/yql/core/type_ann/type_ann_core.cpp @@ -12000,6 +12000,7 @@ template <NKikimr::NUdf::EDataSlot DataSlot> ColumnOrderFunctions[RightName] = &OrderFromFirst; ColumnOrderFunctions["UnionAll"] = &OrderForUnionAll; ColumnOrderFunctions["EquiJoin"] = &OrderForEquiJoin; + ColumnOrderFunctions["CalcOverWindow"] = &OrderForCalcOverWindow; ColumnOrderFunctions["RemovePrefixMembers"] = &OrderFromFirstAndOutputType; ColumnOrderFunctions["Sort"] = ColumnOrderFunctions["Take"] = ColumnOrderFunctions["Skip"] = |