#ifndef QUERY_QUERY_PARTS_HPP #define QUERY_QUERY_PARTS_HPP #include "matador/sql/query_part_visitor.hpp" #include "matador/sql/column.hpp" #include "matador/sql/column_definition.hpp" #include "matador/sql/dialect.hpp" #include namespace matador::sql { class basic_condition; class query_part { protected: explicit query_part(sql::dialect::token_t token); public: virtual ~query_part() = default; virtual void accept(query_part_visitor &visitor) = 0; protected: sql::dialect::token_t token_; }; /** * Represents the SQL SELECT part */ class query_select_part : public query_part { public: explicit query_select_part(std::vector columns); void accept(query_part_visitor &visitor) override; [[nodiscard]] const std::vector& columns() const; private: std::vector columns_; }; /** * Represents the SQL FROM part */ class query_from_part : public query_part { public: explicit query_from_part(std::string table_name); query_from_part(std::string table_name, std::string as); private: void accept(query_part_visitor &visitor) override; private: std::string table_; std::string alias_; }; class query_where_part : public query_part { public: template < class Condition > explicit query_where_part(const Condition &cond) : query_part(dialect::token_t::WHERE) , condition_(new Condition(cond)) {} private: void accept(query_part_visitor &visitor) override; private: std::unique_ptr condition_; }; class query_table_name_part : public query_part { protected: explicit query_table_name_part(sql::dialect::token_t token, std::string table_name); protected: std::string table_name_; }; class query_group_by_part : public query_table_name_part { public: explicit query_group_by_part(const std::string &table_name); private: void accept(query_part_visitor &visitor) override; }; class query_order_by_part : public query_table_name_part { public: explicit query_order_by_part(const std::string &table_name); private: void accept(query_part_visitor &visitor) override; }; class query_order_by_asc_part : public query_part { public: query_order_by_asc_part(); private: void accept(query_part_visitor &visitor) override; }; class query_order_by_desc_part : public query_part { public: query_order_by_desc_part(); private: void accept(query_part_visitor &visitor) override; }; class query_insert_part : public query_part { public: query_insert_part(); private: void accept(query_part_visitor &visitor) override; }; /** * Represents the SQL VALUES part */ class query_values_part : public query_part { public: query_values_part(std::initializer_list values); private: void accept(query_part_visitor &visitor) override; private: std::vector values_; }; class query_update_part : public query_table_name_part { public: explicit query_update_part(const std::string &table_name); private: void accept(query_part_visitor &visitor) override; }; class query_delete_part : public query_part { public: query_delete_part(); private: void accept(query_part_visitor &visitor) override; }; class query_create_part : public query_part { public: query_create_part(); private: void accept(query_part_visitor &visitor) override; }; class query_drop_part : public query_part { public: query_drop_part(); private: void accept(query_part_visitor &visitor) override; }; } #endif //QUERY_QUERY_PARTS_HPP