Skip to content

Commit eb725d9

Browse files
authored
Remove unused output fields from GraceJoinCore/MapJoinCore. (#7095)
1 parent c253572 commit eb725d9

File tree

1 file changed

+28
-0
lines changed

1 file changed

+28
-0
lines changed

ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5078,6 +5078,23 @@ TExprNode::TPtr DropUnusedArgs(const TExprNode& lambda, const std::vector<ui32>&
50785078
return ctx.ChangeChild(*copy, 0U, ctx.NewArguments(copy->Head().Pos(), DropUnused(copy->Head().ChildrenList(), unused, skip)));
50795079
}
50805080

5081+
void DropUnusedRenames(TExprNode::TPtr& renames, const std::vector<ui32>& unused, TExprContext& ctx) {
5082+
TExprNode::TListType children;
5083+
children.reserve(renames->ChildrenSize());
5084+
for (auto i = 0U; i < renames->ChildrenSize() >> 1U; ++i) {
5085+
const auto idx = i << 1U;
5086+
const auto outIndex = renames->Child(1U + idx);
5087+
const auto oldOutPos = FromString<ui32>(outIndex->Content());
5088+
if (const auto iter = std::lower_bound(unused.cbegin(), unused.cend(), oldOutPos); unused.cend() == iter || *iter != oldOutPos) {
5089+
children.emplace_back(renames->ChildPtr(idx));
5090+
const auto newOutPos = oldOutPos - ui32(std::distance(unused.cbegin(), iter));
5091+
children.emplace_back(ctx.NewAtom(outIndex->Pos(), newOutPos));
5092+
}
5093+
}
5094+
5095+
renames = ctx.ChangeChildren(*renames, std::move(children));
5096+
}
5097+
50815098
TExprNode::TPtr DropUnusedStateFromUpdate(const TExprNode& lambda, const std::vector<ui32>& unused, TExprContext& ctx) {
50825099
const auto& copy = ctx.DeepCopyLambda(lambda, DropUnused(GetLambdaBody(lambda), unused));
50835100
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)
64726489
.Add(1, DropUnusedArgs(node->Tail(), unusedState, ctx))
64736490
.Seal().Build();
64746491
}
6492+
} else if (input.IsCallable({"GraceJoinCore", "GraceSelfJoinCore", "MapJoinCore"})) {
6493+
YQL_CLOG(DEBUG, CorePeepHole) << node->Content() << " over " << input.Content() << " with " << unused.size() << " unused fields.";
6494+
auto children = input.ChildrenList();
6495+
const bool self = input.IsCallable("GraceSelfJoinCore");
6496+
DropUnusedRenames(children[5U], unused, ctx);
6497+
DropUnusedRenames(children[self ? 4U : 6U], unused, ctx);
6498+
return ctx.Builder(node->Pos())
6499+
.Callable(node->Content())
6500+
.Add(0, ctx.ChangeChildren(input, std::move(children)))
6501+
.Add(1, DropUnusedArgs(node->Tail(), unused, ctx))
6502+
.Seal().Build();
64756503
} else if (node->IsCallable("WideMap") && input.IsCallable("ReplicateScalars")) {
64766504
YQL_CLOG(DEBUG, CorePeepHole) << node->Content() << " over " << input.Content();
64776505
return SwapReplicateScalarsWithWideMap(node, ctx);

0 commit comments

Comments
 (0)