#ifndef QUERY_QUERY_COMPILER_HPP #define QUERY_QUERY_COMPILER_HPP #include "matador/query/query_part_visitor.hpp" #include "matador/query/query_data.hpp" #include "matador/sql/query_context.hpp" #include "matador/utils/placeholder.hpp" #include #include namespace matador::sql { class connection_impl; class dialect; } namespace matador::query { namespace internal { struct basic_type_to_string_visitor; } struct query_data; struct value_visitor; class query_compiler final : public query_part_visitor { public: sql::query_context compile(const query_data &data, const sql::dialect &d, std::optional> conn); protected: void visit(internal::query_alter_part& part) override; void visit(internal::query_alter_table_part& part) override; void visit(internal::query_add_key_constraint_part& part) override; void visit(internal::query_add_foreign_key_constraint_part& part) override; void visit(internal::query_add_primary_key_constraint_part& part) override; void visit(internal::query_add_foreign_key_reference_part& part) override; void visit(internal::query_add_constraint_part_by_constraint &part) override; void visit(internal::query_drop_key_constraint_part_by_name &part) override; void visit(internal::query_drop_key_constraint_part_by_constraint &part) override; protected: void visit(internal::query_select_part &part) override; void visit(internal::query_from_part &part) override; void visit(internal::query_join_part &part) override; void visit(internal::query_on_part &part) override; void visit(internal::query_where_part &part) override; void visit(internal::query_group_by_part &part) override; void visit(internal::query_order_by_part &part) override; void visit(internal::query_order_by_asc_part &part) override; void visit(internal::query_order_by_desc_part &part) override; void visit(internal::query_offset_part &part) override; void visit(internal::query_limit_part &part) override; void visit(internal::query_insert_part &part) override; void visit(internal::query_into_part &part) override; void visit(internal::query_values_part &part) override; void visit(internal::query_update_part &part) override; void visit(internal::query_set_part &part) override; void visit(internal::query_delete_part &part) override; void visit(internal::query_delete_from_part &part) override; void visit(internal::query_create_part &part) override; void visit(internal::query_create_table_part &part) override; void visit(internal::query_create_table_columns_part& part) override; void visit(internal::query_create_table_constraints_part& part) override; void visit(internal::query_create_schema_part& part) override; void visit(internal::query_drop_part &part) override; void visit(internal::query_drop_table_part &part) override; void visit(internal::query_drop_schema_part& part) override; static std::string build_table_name(sql::dialect_token token, const sql::dialect &d, const table& t); static std::string determine_value(value_visitor &visitor, const std::variant &val); std::string build_add_constraint_string(const class constraint& c); std::string build_drop_constraint_string(const class constraint& c); std::string build_constraint_name(const class constraint& c); protected: const query_data *data_{}; sql::query_context query_; size_t table_index{0}; const sql::dialect *dialect_{nullptr}; std::optional> connection_{}; std::function finisher_ = [](sql::query_context&) {}; }; } #endif //QUERY_QUERY_COMPILER_HPP