diff options
author | a-romanov <Anton.Romanov@ydb.tech> | 2023-02-27 21:01:45 +0300 |
---|---|---|
committer | a-romanov <Anton.Romanov@ydb.tech> | 2023-02-27 21:01:45 +0300 |
commit | 13baabf7885e98651484e65c69bd6c78ab80d064 (patch) | |
tree | 25e4b157d5e65ad8d3e5914a807a3e36e895dd45 | |
parent | 9b4ad7622e194abb175d789bf48db7081282300f (diff) | |
download | ydb-13baabf7885e98651484e65c69bd6c78ab80d064.tar.gz |
Extract original members after join with changed keys.
-rw-r--r-- | ydb/library/yql/dq/opt/dq_opt_join.cpp | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/ydb/library/yql/dq/opt/dq_opt_join.cpp b/ydb/library/yql/dq/opt/dq_opt_join.cpp index d761555b0c..47058f2cd5 100644 --- a/ydb/library/yql/dq/opt/dq_opt_join.cpp +++ b/ydb/library/yql/dq/opt/dq_opt_join.cpp @@ -1113,13 +1113,20 @@ TExprBase DqBuildHashJoin(const TDqJoin& join, EHashJoinMode mode, TExprContext& if (!PrepareJoinSide<false>(connRight, rightNames, rightJoinKeys, remapRight, filter || leftKind, joinKeys, ctx, optCtx)) return join; - return Build<TDqJoin>(ctx, join.Pos()) - .LeftInput(connLeft) - .LeftLabel(join.LeftLabel()) - .RightInput(connRight) - .RightLabel(join.RightLabel()) - .JoinType(join.JoinType()) - .JoinKeys(ctx.ChangeChildren(join.JoinKeys().Ref(), std::move(joinKeys))) + const auto& items = GetSeqItemType(*join.Ref().GetTypeAnn()).Cast<TStructExprType>()->GetItems(); + TExprNode::TListType fields(items.size()); + std::transform(items.cbegin(), items.cend(), fields.begin(), [&](const TItemExprType* item) { return ctx.NewAtom(join.Pos(), item->GetName()); }); + + return Build<TCoExtractMembers>(ctx, join.Pos()) + .Input<TDqJoin>() + .LeftInput(connLeft) + .LeftLabel(join.LeftLabel()) + .RightInput(connRight) + .RightLabel(join.RightLabel()) + .JoinType(join.JoinType()) + .JoinKeys(ctx.ChangeChildren(join.JoinKeys().Ref(), std::move(joinKeys))) + .Build() + .Members().Add(std::move(fields)).Build() .Done(); } |