@@ -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 ()
@@ -213,9 +213,55 @@ TMaybeNode<TExprBase> JsonExistsPushdown(const TCoJsonExists& jsonExists, TExprC
213
213
.Done ();
214
214
}
215
215
216
+ TMaybeNode<TExprBase> SafeCastPredicatePushdown (const TCoFlatMap& inputFlatmap, const TExprNode& argument, TExprContext& ctx, TPositionHandle pos)
217
+ {
218
+ /*
219
+ * There are three ways of comparison in following format:
220
+ *
221
+ * FlatMap (LeftArgument, FlatMap(RightArgument(), Just(Predicate))
222
+ *
223
+ * Examples:
224
+ * FlatMap (SafeCast(), FlatMap(Member(), Just(Comparison))
225
+ * FlatMap (Member(), FlatMap(SafeCast(), Just(Comparison))
226
+ * FlatMap (SafeCast(), FlatMap(SafeCast(), Just(Comparison))
227
+ */
228
+ auto left = ConvertComparisonNode (inputFlatmap.Input (), argument, ctx, pos);
229
+ if (left.empty ()) {
230
+ return NullNode;
231
+ }
232
+
233
+ auto flatmap = inputFlatmap.Lambda ().Body ().Cast <TCoFlatMap>();
234
+ auto right = ConvertComparisonNode (flatmap.Input (), argument, ctx, pos);
235
+ if (right.empty ()) {
236
+ return NullNode;
237
+ }
238
+
239
+ auto predicate = flatmap.Lambda ().Body ().Cast <TCoJust>().Input ().Cast <TCoCompare>();
240
+
241
+ std::vector<std::pair<TExprBase, TExprBase>> parameters;
242
+ if (left.size () != right.size ()) {
243
+ return NullNode;
244
+ }
245
+
246
+ for (ui32 i = 0 ; i < left.size (); ++i) {
247
+ parameters.emplace_back (std::move (std::make_pair (left[i], right[i])));
248
+ }
249
+
250
+ return ComparisonPushdown (parameters, predicate, ctx, pos);
251
+ }
252
+
253
+ TMaybeNode<TExprBase> SimplePredicatePushdown (const TCoCompare& predicate, const TExprNode& argument, TExprContext& ctx, TPositionHandle pos)
254
+ {
255
+ const auto parameters = ExtractComparisonParameters (predicate, argument, ctx, pos);
256
+ if (parameters.empty ()) {
257
+ return NullNode;
258
+ }
259
+
260
+ return ComparisonPushdown (parameters, predicate, ctx, pos);
261
+ }
262
+
216
263
std::vector<TExprBase> ConvertComparisonNode (const TExprBase& nodeIn, const TExprNode& argument, TExprContext& ctx, TPositionHandle pos)
217
264
{
218
- std::vector<TExprBase> out;
219
265
const auto convertNode = [&ctx, &pos, &argument](const TExprBase& node) -> TMaybeNode<TExprBase> {
220
266
if (node.Maybe <TCoNull>()) {
221
267
return node;
@@ -299,7 +345,7 @@ std::vector<TExprBase> ConvertComparisonNode(const TExprBase& nodeIn, const TExp
299
345
}
300
346
301
347
if (const auto maybeCoalesce = node.Maybe <TCoCoalesce>()) {
302
- return YqlCoalescePushdown (maybeCoalesce.Cast (), argument, ctx);
348
+ return CoalescePushdown (maybeCoalesce.Cast (), argument, ctx);
303
349
}
304
350
305
351
if (const auto maybeCompare = node.Maybe <TCoCompare>()) {
@@ -308,6 +354,11 @@ std::vector<TExprBase> ConvertComparisonNode(const TExprBase& nodeIn, const TExp
308
354
}
309
355
}
310
356
357
+ if (const auto maybeFlatmap = node.Maybe <TCoFlatMap>()) {
358
+ return SafeCastPredicatePushdown (maybeFlatmap.Cast (), argument, ctx, pos);
359
+ } else if (auto maybePredicate = node.Maybe <TCoCompare>()) {
360
+ return SimplePredicatePushdown (maybePredicate.Cast (), argument, ctx, pos);
361
+ }
311
362
312
363
if constexpr (NKikimr::NSsa::RuntimeVersion >= 5U ) {
313
364
return YqlApplyPushdown (node, argument, ctx);
@@ -316,36 +367,27 @@ std::vector<TExprBase> ConvertComparisonNode(const TExprBase& nodeIn, const TExp
316
367
}
317
368
};
318
369
319
- // Columns & values may be single element
320
- TMaybeNode<TExprBase> node = convertNode (nodeIn);
321
-
322
- if (node.IsValid ()) {
323
- out.emplace_back (std::move (node.Cast ()));
324
- return out;
325
- }
326
-
327
- // Or columns and values can be Tuple
328
- if (!nodeIn.Maybe <TExprList>()) {
329
- // something unusual found, return empty vector
330
- return out;
331
- }
370
+ if (const auto & list = nodeIn.Maybe <TExprList>()) {
371
+ const auto & tuple = list.Cast ();
372
+ std::vector<TExprBase> out;
332
373
333
- auto tuple = nodeIn.Cast <TExprList>();
374
+ out.reserve (tuple.Size ());
375
+ for (ui32 i = 0 ; i < tuple.Size (); ++i) {
376
+ TMaybeNode<TExprBase> node = convertNode (tuple.Item (i));
334
377
335
- out. reserve (tuple. Size ());
336
-
337
- for (ui32 i = 0 ; i < tuple. Size (); ++i) {
338
- TMaybeNode<TExprBase> node = convertNode (tuple. Item (i));
378
+ if (!node. IsValid ()) {
379
+ // Return empty vector
380
+ return TVector<TExprBase> ();
381
+ }
339
382
340
- if (!node.IsValid ()) {
341
- // Return empty vector
342
- return TVector<TExprBase>();
383
+ out.emplace_back (node.Cast ());
343
384
}
344
-
345
- out.emplace_back (node.Cast ());
385
+ return out;
386
+ } else if (const auto & node = convertNode (nodeIn); node.IsValid ()) {
387
+ return {node.Cast ()};
388
+ } else {
389
+ return {};
346
390
}
347
-
348
- return out;
349
391
}
350
392
351
393
TExprBase BuildOneElementComparison (const std::pair<TExprBase, TExprBase>& parameter, const TCoCompare& predicate,
@@ -480,16 +522,6 @@ TMaybeNode<TExprBase> ComparisonPushdown(const std::vector<std::pair<TExprBase,
480
522
.Done ();
481
523
}
482
524
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
525
// TODO: Check how to reduce columns if they are not needed. Unfortunately columnshard need columns list
494
526
// for every column present in program even if it is not used in result set.
495
527
// #define ENABLE_COLUMNS_PRUNING
@@ -528,62 +560,10 @@ TMaybeNode<TExprBase> ExistsPushdown(const TCoExists& exists, TExprContext& ctx,
528
560
.Done ();
529
561
}
530
562
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
563
TFilterOpsLevels PredicatePushdown (const TExprBase& predicate, const TExprNode& argument, TExprContext& ctx, TPositionHandle pos)
584
564
{
585
565
if (const auto maybeCoalesce = predicate.Maybe <TCoCoalesce>()) {
586
- auto coalescePred = CoalescePushdown (maybeCoalesce.Cast (), argument, ctx, pos );
566
+ auto coalescePred = CoalescePushdown (maybeCoalesce.Cast (), argument, ctx);
587
567
return TFilterOpsLevels (coalescePred);
588
568
}
589
569
@@ -753,7 +733,7 @@ TExprBase KqpPushOlapFilter(TExprBase node, TExprContext& ctx, const TKqpOptimiz
753
733
754
734
const auto & lambda = flatmap.Lambda ();
755
735
756
- YQL_CLOG (TRACE , ProviderKqp) << " Initial OLAP lambda: " << KqpExprToPrettyString (lambda, ctx);
736
+ YQL_CLOG (ERROR , ProviderKqp) << " Initial OLAP lambda: " << KqpExprToPrettyString (lambda, ctx);
757
737
758
738
const auto maybeOptionalIf = lambda.Body ().Maybe <TCoOptionalIf>();
759
739
if (!maybeOptionalIf.IsValid ()) {
@@ -824,7 +804,7 @@ TExprBase KqpPushOlapFilter(TExprBase node, TExprContext& ctx, const TKqpOptimiz
824
804
.Build ()
825
805
.Done ();
826
806
827
- YQL_CLOG (TRACE , ProviderKqp) << " Pushed OLAP lambda: " << KqpExprToPrettyString (newProcessLambda, ctx);
807
+ YQL_CLOG (ERROR , ProviderKqp) << " Pushed OLAP lambda: " << KqpExprToPrettyString (newProcessLambda, ctx);
828
808
829
809
#ifdef ENABLE_COLUMNS_PRUNING
830
810
TMaybeNode<TCoAtomList> readColumns = BuildColumnsFromLambda (lambda, ctx, node.Pos ());
0 commit comments