@@ -5078,6 +5078,23 @@ TExprNode::TPtr DropUnusedArgs(const TExprNode& lambda, const std::vector<ui32>&
5078
5078
return ctx.ChangeChild (*copy, 0U , ctx.NewArguments (copy->Head ().Pos (), DropUnused (copy->Head ().ChildrenList (), unused, skip)));
5079
5079
}
5080
5080
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
+
5081
5098
TExprNode::TPtr DropUnusedStateFromUpdate (const TExprNode& lambda, const std::vector<ui32>& unused, TExprContext& ctx) {
5082
5099
const auto & copy = ctx.DeepCopyLambda (lambda, DropUnused (GetLambdaBody (lambda), unused));
5083
5100
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)
6472
6489
.Add (1 , DropUnusedArgs (node->Tail (), unusedState, ctx))
6473
6490
.Seal ().Build ();
6474
6491
}
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 ();
6475
6503
} else if (node->IsCallable (" WideMap" ) && input.IsCallable (" ReplicateScalars" )) {
6476
6504
YQL_CLOG (DEBUG, CorePeepHole) << node->Content () << " over " << input.Content ();
6477
6505
return SwapReplicateScalarsWithWideMap (node, ctx);
0 commit comments