//===----------------------------------------------------------------------===// // DuckDB // // duckdb/planner/logical_operator_visitor.hpp // // //===----------------------------------------------------------------------===// #pragma once #include "duckdb/common/common.hpp" #include "duckdb/planner/bound_tokens.hpp" #include "duckdb/planner/logical_tokens.hpp" #include namespace duckdb { //! The LogicalOperatorVisitor is an abstract base class that implements the //! Visitor pattern on LogicalOperator. class LogicalOperatorVisitor { public: virtual ~LogicalOperatorVisitor() {}; virtual void VisitOperator(LogicalOperator &op); virtual void VisitExpression(unique_ptr *expression); static void EnumerateExpressions(LogicalOperator &op, const std::function *child)> &callback); protected: //! Automatically calls the Visit method for LogicalOperator children of the current operator. Can be overloaded to //! change this behavior. void VisitOperatorChildren(LogicalOperator &op); //! Automatically calls the Visit method for Expression children of the current operator. Can be overloaded to //! change this behavior. void VisitOperatorExpressions(LogicalOperator &op); // The VisitExpressionChildren method is called at the end of every call to VisitExpression to recursively visit all // expressions in an expression tree. It can be overloaded to prevent automatically visiting the entire tree. virtual void VisitExpressionChildren(Expression &expression); virtual unique_ptr VisitReplace(BoundAggregateExpression &expr, unique_ptr *expr_ptr); virtual unique_ptr VisitReplace(BoundBetweenExpression &expr, unique_ptr *expr_ptr); virtual unique_ptr VisitReplace(BoundCaseExpression &expr, unique_ptr *expr_ptr); virtual unique_ptr VisitReplace(BoundCastExpression &expr, unique_ptr *expr_ptr); virtual unique_ptr VisitReplace(BoundColumnRefExpression &expr, unique_ptr *expr_ptr); virtual unique_ptr VisitReplace(BoundComparisonExpression &expr, unique_ptr *expr_ptr); virtual unique_ptr VisitReplace(BoundConjunctionExpression &expr, unique_ptr *expr_ptr); virtual unique_ptr VisitReplace(BoundConstantExpression &expr, unique_ptr *expr_ptr); virtual unique_ptr VisitReplace(BoundDefaultExpression &expr, unique_ptr *expr_ptr); virtual unique_ptr VisitReplace(BoundFunctionExpression &expr, unique_ptr *expr_ptr); virtual unique_ptr VisitReplace(BoundOperatorExpression &expr, unique_ptr *expr_ptr); virtual unique_ptr VisitReplace(BoundReferenceExpression &expr, unique_ptr *expr_ptr); virtual unique_ptr VisitReplace(BoundSubqueryExpression &expr, unique_ptr *expr_ptr); virtual unique_ptr VisitReplace(BoundParameterExpression &expr, unique_ptr *expr_ptr); virtual unique_ptr VisitReplace(BoundWindowExpression &expr, unique_ptr *expr_ptr); virtual unique_ptr VisitReplace(BoundUnnestExpression &expr, unique_ptr *expr_ptr); }; } // namespace duckdb