Skip to content

Commit c677d75

Browse files
committed
regularize coalesce pushdown
1 parent f43e9dd commit c677d75

File tree

1 file changed

+55
-65
lines changed

1 file changed

+55
-65
lines changed

ydb/core/kqp/opt/physical/kqp_opt_phy_olap_filter.cpp

Lines changed: 55 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ std::vector<std::pair<TExprBase, TExprBase>> ExtractComparisonParameters(const T
139139
TMaybeNode<TExprBase> ComparisonPushdown(const std::vector<std::pair<TExprBase, TExprBase>>& parameters, const TCoCompare& predicate, TExprContext& ctx, TPositionHandle pos);
140140

141141
[[maybe_unused]]
142-
TMaybeNode<TExprBase> YqlCoalescePushdown(const TCoCoalesce& coalesce, const TExprNode& argument, TExprContext& ctx) {
142+
TMaybeNode<TExprBase> CoalescePushdown(const TCoCoalesce& coalesce, const TExprNode& argument, TExprContext& ctx) {
143143
if (const auto params = ExtractBinaryFunctionParameters(coalesce, argument, ctx, coalesce.Pos())) {
144144
return Build<TKqpOlapFilterBinaryOp>(ctx, coalesce.Pos())
145145
.Operator().Value("??", TNodeFlags::Default).Build()
@@ -212,6 +212,53 @@ TMaybeNode<TExprBase> JsonExistsPushdown(const TCoJsonExists& jsonExists, TExprC
212212
.Path(jsonExists.JsonPath().Cast<TCoUtf8>())
213213
.Done();
214214
}
215+
TMaybeNode<TExprBase> SimplePredicatePushdown(const TCoCompare& predicate, const TExprNode& argument, TExprContext& ctx, TPositionHandle pos)
216+
{
217+
const auto parameters = ExtractComparisonParameters(predicate, argument, ctx, pos);
218+
if (parameters.empty()) {
219+
return NullNode;
220+
}
221+
222+
return ComparisonPushdown(parameters, predicate, ctx, pos);
223+
}
224+
225+
TMaybeNode<TExprBase> SafeCastPredicatePushdown(const TCoFlatMap& inputFlatmap, const TExprNode& argument, TExprContext& ctx, TPositionHandle pos)
226+
{
227+
/*
228+
* There are three ways of comparison in following format:
229+
*
230+
* FlatMap (LeftArgument, FlatMap(RightArgument(), Just(Predicate))
231+
*
232+
* Examples:
233+
* FlatMap (SafeCast(), FlatMap(Member(), Just(Comparison))
234+
* FlatMap (Member(), FlatMap(SafeCast(), Just(Comparison))
235+
* FlatMap (SafeCast(), FlatMap(SafeCast(), Just(Comparison))
236+
*/
237+
auto left = ConvertComparisonNode(inputFlatmap.Input(), argument, ctx, pos);
238+
if (left.empty()) {
239+
return NullNode;
240+
}
241+
242+
auto flatmap = inputFlatmap.Lambda().Body().Cast<TCoFlatMap>();
243+
auto right = ConvertComparisonNode(flatmap.Input(), argument, ctx, pos);
244+
if (right.empty()) {
245+
return NullNode;
246+
}
247+
248+
auto predicate = flatmap.Lambda().Body().Cast<TCoJust>().Input().Cast<TCoCompare>();
249+
250+
std::vector<std::pair<TExprBase, TExprBase>> parameters;
251+
if (left.size() != right.size()) {
252+
return NullNode;
253+
}
254+
255+
for (ui32 i = 0; i < left.size(); ++i) {
256+
parameters.emplace_back(std::move(std::make_pair(left[i], right[i])));
257+
}
258+
259+
return ComparisonPushdown(parameters, predicate, ctx, pos);
260+
}
261+
215262

216263
std::vector<TExprBase> ConvertComparisonNode(const TExprBase& nodeIn, const TExprNode& argument, TExprContext& ctx, TPositionHandle pos)
217264
{
@@ -299,7 +346,7 @@ std::vector<TExprBase> ConvertComparisonNode(const TExprBase& nodeIn, const TExp
299346
}
300347

301348
if (const auto maybeCoalesce = node.Maybe<TCoCoalesce>()) {
302-
return YqlCoalescePushdown(maybeCoalesce.Cast(), argument, ctx);
349+
return CoalescePushdown(maybeCoalesce.Cast(), argument, ctx);
303350
}
304351

305352
if (const auto maybeCompare = node.Maybe<TCoCompare>()) {
@@ -308,6 +355,11 @@ std::vector<TExprBase> ConvertComparisonNode(const TExprBase& nodeIn, const TExp
308355
}
309356
}
310357

358+
if (const auto maybeFlatmap = node.Maybe<TCoFlatMap>()) {
359+
return SafeCastPredicatePushdown(maybeFlatmap.Cast(), argument, ctx, pos);
360+
} else if (auto maybePredicate = node.Maybe<TCoCompare>()) {
361+
return SimplePredicatePushdown(maybePredicate.Cast(), argument, ctx, pos);
362+
}
311363

312364
if constexpr (NKikimr::NSsa::RuntimeVersion >= 5U) {
313365
return YqlApplyPushdown(node, argument, ctx);
@@ -480,16 +532,6 @@ TMaybeNode<TExprBase> ComparisonPushdown(const std::vector<std::pair<TExprBase,
480532
.Done();
481533
}
482534

483-
TMaybeNode<TExprBase> SimplePredicatePushdown(const TCoCompare& predicate, const TExprNode& argument, TExprContext& ctx, TPositionHandle pos)
484-
{
485-
const auto parameters = ExtractComparisonParameters(predicate, argument, ctx, pos);
486-
if (parameters.empty()) {
487-
return NullNode;
488-
}
489-
490-
return ComparisonPushdown(parameters, predicate, ctx, pos);
491-
}
492-
493535
// TODO: Check how to reduce columns if they are not needed. Unfortunately columnshard need columns list
494536
// for every column present in program even if it is not used in result set.
495537
//#define ENABLE_COLUMNS_PRUNING
@@ -528,62 +570,10 @@ TMaybeNode<TExprBase> ExistsPushdown(const TCoExists& exists, TExprContext& ctx,
528570
.Done();
529571
}
530572

531-
TMaybeNode<TExprBase> SafeCastPredicatePushdown(const TCoFlatMap& inputFlatmap, const TExprNode& argument, TExprContext& ctx, TPositionHandle pos)
532-
{
533-
/*
534-
* There are three ways of comparison in following format:
535-
*
536-
* FlatMap (LeftArgument, FlatMap(RightArgument(), Just(Predicate))
537-
*
538-
* Examples:
539-
* FlatMap (SafeCast(), FlatMap(Member(), Just(Comparison))
540-
* FlatMap (Member(), FlatMap(SafeCast(), Just(Comparison))
541-
* FlatMap (SafeCast(), FlatMap(SafeCast(), Just(Comparison))
542-
*/
543-
auto left = ConvertComparisonNode(inputFlatmap.Input(), argument, ctx, pos);
544-
if (left.empty()) {
545-
return NullNode;
546-
}
547-
548-
auto flatmap = inputFlatmap.Lambda().Body().Cast<TCoFlatMap>();
549-
auto right = ConvertComparisonNode(flatmap.Input(), argument, ctx, pos);
550-
if (right.empty()) {
551-
return NullNode;
552-
}
553-
554-
auto predicate = flatmap.Lambda().Body().Cast<TCoJust>().Input().Cast<TCoCompare>();
555-
556-
std::vector<std::pair<TExprBase, TExprBase>> parameters;
557-
if (left.size() != right.size()) {
558-
return NullNode;
559-
}
560-
561-
for (ui32 i = 0; i < left.size(); ++i) {
562-
parameters.emplace_back(std::move(std::make_pair(left[i], right[i])));
563-
}
564-
565-
return ComparisonPushdown(parameters, predicate, ctx, pos);
566-
}
567-
568-
TMaybeNode<TExprBase> CoalescePushdown(const TCoCoalesce& coalesce, const TExprNode& argument, TExprContext& ctx, TPositionHandle pos)
569-
{
570-
if (const auto node = YqlCoalescePushdown(coalesce, argument, ctx)) {
571-
return node;
572-
}
573-
574-
auto predicate = coalesce.Predicate();
575-
if (const auto maybeFlatmap = predicate.Maybe<TCoFlatMap>()) {
576-
return SafeCastPredicatePushdown(maybeFlatmap.Cast(), argument, ctx, pos);
577-
} else if (auto maybePredicate = predicate.Maybe<TCoCompare>()) {
578-
return SimplePredicatePushdown(maybePredicate.Cast(), argument, ctx, pos);
579-
}
580-
return NullNode;
581-
}
582-
583573
TFilterOpsLevels PredicatePushdown(const TExprBase& predicate, const TExprNode& argument, TExprContext& ctx, TPositionHandle pos)
584574
{
585575
if (const auto maybeCoalesce = predicate.Maybe<TCoCoalesce>()) {
586-
auto coalescePred = CoalescePushdown(maybeCoalesce.Cast(), argument, ctx, pos);
576+
auto coalescePred = CoalescePushdown(maybeCoalesce.Cast(), argument, ctx);
587577
return TFilterOpsLevels(coalescePred);
588578
}
589579

0 commit comments

Comments
 (0)