@@ -139,7 +139,7 @@ std::vector<std::pair<TExprBase, TExprBase>> ExtractComparisonParameters(const T
139139TMaybeNode<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
216263std::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-
583573TFilterOpsLevels 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