//===----------------------------------------------------------------------===// // DuckDB // // duckdb/optimizer/filter_pullup.hpp // // //===----------------------------------------------------------------------===// #pragma once #include "duckdb/common/unordered_set.hpp" #include "duckdb/planner/logical_operator.hpp" #include "duckdb/planner/operator/logical_filter.hpp" #include "duckdb/common/vector.hpp" namespace duckdb { class FilterPullup { public: explicit FilterPullup(bool pullup = false, bool add_column = false) : can_pullup(pullup), can_add_column(add_column) { } //! Perform filter pullup unique_ptr Rewrite(unique_ptr op); private: vector> filters_expr_pullup; // only pull up filters when there is a fork bool can_pullup = false; // identifiy case the branch is a set operation (INTERSECT or EXCEPT) bool can_add_column = false; private: // Generate logical filters pulled up unique_ptr GeneratePullupFilter(unique_ptr child, vector> &expressions); //! Pull up a LogicalFilter op unique_ptr PullupFilter(unique_ptr op); //! Pull up filter in a LogicalProjection op unique_ptr PullupProjection(unique_ptr op); //! Pull up filter in a LogicalCrossProduct op unique_ptr PullupCrossProduct(unique_ptr op); unique_ptr PullupJoin(unique_ptr op); // PPullup filter in a left join unique_ptr PullupFromLeft(unique_ptr op); // Pullup filter in a inner join unique_ptr PullupInnerJoin(unique_ptr op); // Pullup filter in LogicalIntersect or LogicalExcept op unique_ptr PullupSetOperation(unique_ptr op); unique_ptr PullupBothSide(unique_ptr op); // Finish pull up at this operator unique_ptr FinishPullup(unique_ptr op); // special treatment for SetOperations and projections void ProjectSetOperation(LogicalProjection &proj); }; // end FilterPullup } // namespace duckdb