@@ -139,7 +139,7 @@ std::vector<std::pair<TExprBase, TExprBase>> ExtractComparisonParameters(const T
139
139
TMaybeNode<TExprBase> ComparisonPushdown (const std::vector<std::pair<TExprBase, TExprBase>>& parameters, const TCoCompare& predicate, TExprContext& ctx, TPositionHandle pos);
140
140
141
141
[[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) {
143
143
if (const auto params = ExtractBinaryFunctionParameters (coalesce, argument, ctx, coalesce.Pos ())) {
144
144
return Build<TKqpOlapFilterBinaryOp>(ctx, coalesce.Pos ())
145
145
.Operator ().Value (" ??" , TNodeFlags::Default).Build ()
@@ -212,6 +212,53 @@ TMaybeNode<TExprBase> JsonExistsPushdown(const TCoJsonExists& jsonExists, TExprC
212
212
.Path (jsonExists.JsonPath ().Cast <TCoUtf8>())
213
213
.Done ();
214
214
}
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
+
215
262
216
263
std::vector<TExprBase> ConvertComparisonNode (const TExprBase& nodeIn, const TExprNode& argument, TExprContext& ctx, TPositionHandle pos)
217
264
{
@@ -299,7 +346,7 @@ std::vector<TExprBase> ConvertComparisonNode(const TExprBase& nodeIn, const TExp
299
346
}
300
347
301
348
if (const auto maybeCoalesce = node.Maybe <TCoCoalesce>()) {
302
- return YqlCoalescePushdown (maybeCoalesce.Cast (), argument, ctx);
349
+ return CoalescePushdown (maybeCoalesce.Cast (), argument, ctx);
303
350
}
304
351
305
352
if (const auto maybeCompare = node.Maybe <TCoCompare>()) {
@@ -308,6 +355,11 @@ std::vector<TExprBase> ConvertComparisonNode(const TExprBase& nodeIn, const TExp
308
355
}
309
356
}
310
357
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
+ }
311
363
312
364
if constexpr (NKikimr::NSsa::RuntimeVersion >= 5U ) {
313
365
return YqlApplyPushdown (node, argument, ctx);
@@ -480,16 +532,6 @@ TMaybeNode<TExprBase> ComparisonPushdown(const std::vector<std::pair<TExprBase,
480
532
.Done ();
481
533
}
482
534
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
-
493
535
// TODO: Check how to reduce columns if they are not needed. Unfortunately columnshard need columns list
494
536
// for every column present in program even if it is not used in result set.
495
537
// #define ENABLE_COLUMNS_PRUNING
@@ -528,62 +570,10 @@ TMaybeNode<TExprBase> ExistsPushdown(const TCoExists& exists, TExprContext& ctx,
528
570
.Done ();
529
571
}
530
572
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
-
583
573
TFilterOpsLevels PredicatePushdown (const TExprBase& predicate, const TExprNode& argument, TExprContext& ctx, TPositionHandle pos)
584
574
{
585
575
if (const auto maybeCoalesce = predicate.Maybe <TCoCoalesce>()) {
586
- auto coalescePred = CoalescePushdown (maybeCoalesce.Cast (), argument, ctx, pos );
576
+ auto coalescePred = CoalescePushdown (maybeCoalesce.Cast (), argument, ctx);
587
577
return TFilterOpsLevels (coalescePred);
588
578
}
589
579
0 commit comments