//===----------------------------------------------------------------------===// // DuckDB // // duckdb/optimizer/deliminator.hpp // // //===----------------------------------------------------------------------===// #pragma once #include "duckdb/parser/expression_map.hpp" #include "duckdb/planner/column_binding_map.hpp" #include "duckdb/planner/logical_operator.hpp" #include "duckdb/planner/logical_operator_visitor.hpp" namespace duckdb { class Optimizer; class DeliminatorPlanUpdater; //! The Deliminator optimizer traverses the logical operator tree and removes any redundant DelimGets/DelimJoins class Deliminator { public: explicit Deliminator(ClientContext &context) : context(context) { } //! Perform DelimJoin elimination unique_ptr Optimize(unique_ptr op); private: //! Find Joins with a DelimGet that can be removed void FindCandidates(unique_ptr *op_ptr, vector *> &candidates); //! Try to remove a Join with a DelimGet, returns true if it was successful bool RemoveCandidate(unique_ptr *plan, unique_ptr *candidate, DeliminatorPlanUpdater &updater); //! Try to remove an inequality Join with a DelimGet, returns true if it was successful bool RemoveInequalityCandidate(unique_ptr *plan, unique_ptr *candidate, DeliminatorPlanUpdater &updater); private: ClientContext &context; }; } // namespace duckdb