From dfa4aa2a4de59d6689248d6e2e7eba6e42678698 Mon Sep 17 00:00:00 2001 From: Anton Romanov Date: Thu, 25 Jul 2024 13:01:30 +0200 Subject: [PATCH] Remove unused output fields from GraceJoinCore/MapJoinCore. --- .../yql_opt_peephole_physical.cpp | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) 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 e671f434bc02..ad65650a9df4 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& return ctx.ChangeChild(*copy, 0U, ctx.NewArguments(copy->Head().Pos(), DropUnused(copy->Head().ChildrenList(), unused, skip))); } +void DropUnusedRenames(TExprNode::TPtr& renames, const std::vector& 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(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& 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);