diff options
| author | Tony-Romanov <[email protected]> | 2024-07-26 09:31:41 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-07-26 10:31:41 +0300 |
| commit | eb725d9dc7cf24e553fe0933ffbf64cc7057e1ea (patch) | |
| tree | 9706b493df64db07951b7821b91d767ad9e2c4ec | |
| parent | c2535723be3e0fe59cbd4b87eca40ef594401e63 (diff) | |
Remove unused output fields from GraceJoinCore/MapJoinCore. (#7095)
| -rw-r--r-- | ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp b/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp index e671f434bc0..ad65650a9df 100644 --- a/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp +++ b/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp @@ -5078,6 +5078,23 @@ TExprNode::TPtr DropUnusedArgs(const TExprNode& lambda, const std::vector<ui32>& return ctx.ChangeChild(*copy, 0U, ctx.NewArguments(copy->Head().Pos(), DropUnused(copy->Head().ChildrenList(), unused, skip))); } +void DropUnusedRenames(TExprNode::TPtr& renames, const std::vector<ui32>& unused, TExprContext& ctx) { + TExprNode::TListType children; + children.reserve(renames->ChildrenSize()); + for (auto i = 0U; i < renames->ChildrenSize() >> 1U; ++i) { + const auto idx = i << 1U; + const auto outIndex = renames->Child(1U + idx); + const auto oldOutPos = FromString<ui32>(outIndex->Content()); + if (const auto iter = std::lower_bound(unused.cbegin(), unused.cend(), oldOutPos); unused.cend() == iter || *iter != oldOutPos) { + children.emplace_back(renames->ChildPtr(idx)); + const auto newOutPos = oldOutPos - ui32(std::distance(unused.cbegin(), iter)); + children.emplace_back(ctx.NewAtom(outIndex->Pos(), newOutPos)); + } + } + + renames = ctx.ChangeChildren(*renames, std::move(children)); +} + TExprNode::TPtr DropUnusedStateFromUpdate(const TExprNode& lambda, const std::vector<ui32>& unused, TExprContext& ctx) { const auto& copy = ctx.DeepCopyLambda(lambda, DropUnused(GetLambdaBody(lambda), unused)); return ctx.ChangeChild(*copy, 0U, ctx.NewArguments(copy->Head().Pos(), DropUnused(copy->Head().ChildrenList(), unused, lambda.Head().ChildrenSize() - lambda.ChildrenSize() + 1U))); @@ -6472,6 +6489,17 @@ TExprNode::TPtr OptimizeWideMaps(const TExprNode::TPtr& node, TExprContext& ctx) .Add(1, DropUnusedArgs(node->Tail(), unusedState, ctx)) .Seal().Build(); } + } else if (input.IsCallable({"GraceJoinCore", "GraceSelfJoinCore", "MapJoinCore"})) { + YQL_CLOG(DEBUG, CorePeepHole) << node->Content() << " over " << input.Content() << " with " << unused.size() << " unused fields."; + auto children = input.ChildrenList(); + const bool self = input.IsCallable("GraceSelfJoinCore"); + DropUnusedRenames(children[5U], unused, ctx); + DropUnusedRenames(children[self ? 4U : 6U], unused, ctx); + return ctx.Builder(node->Pos()) + .Callable(node->Content()) + .Add(0, ctx.ChangeChildren(input, std::move(children))) + .Add(1, DropUnusedArgs(node->Tail(), unused, ctx)) + .Seal().Build(); } else if (node->IsCallable("WideMap") && input.IsCallable("ReplicateScalars")) { YQL_CLOG(DEBUG, CorePeepHole) << node->Content() << " over " << input.Content(); return SwapReplicateScalarsWithWideMap(node, ctx); |
