| 1 | #include "duckdb/optimizer/filter_pullup.hpp" |
|---|---|
| 2 | |
| 3 | namespace duckdb { |
| 4 | |
| 5 | unique_ptr<LogicalOperator> FilterPullup::PullupBothSide(unique_ptr<LogicalOperator> op) { |
| 6 | FilterPullup left_pullup(true, can_add_column); |
| 7 | FilterPullup right_pullup(true, can_add_column); |
| 8 | op->children[0] = left_pullup.Rewrite(op: std::move(op->children[0])); |
| 9 | op->children[1] = right_pullup.Rewrite(op: std::move(op->children[1])); |
| 10 | D_ASSERT(left_pullup.can_add_column == can_add_column); |
| 11 | D_ASSERT(right_pullup.can_add_column == can_add_column); |
| 12 | |
| 13 | // merging filter expressions |
| 14 | for (idx_t i = 0; i < right_pullup.filters_expr_pullup.size(); ++i) { |
| 15 | left_pullup.filters_expr_pullup.push_back(x: std::move(right_pullup.filters_expr_pullup[i])); |
| 16 | } |
| 17 | |
| 18 | if (!left_pullup.filters_expr_pullup.empty()) { |
| 19 | return GeneratePullupFilter(child: std::move(op), expressions&: left_pullup.filters_expr_pullup); |
| 20 | } |
| 21 | return op; |
| 22 | } |
| 23 | |
| 24 | } // namespace duckdb |
| 25 |