#ifndef QUERY_QUERY_PARTS_HPP #define QUERY_QUERY_PARTS_HPP #include "matador/query/query_part_visitor.hpp" #include "matador/query/criteria.hpp" #include "matador/query/internal/column_value_pair.hpp" #include "matador/query/query_part.hpp" #include "matador/query/column.hpp" #include "matador/query/table.hpp" #include "matador/object/attribute.hpp" #include "matador/object/constraint.hpp" #include "matador/utils/placeholder.hpp" #include namespace matador::query::internal { class query_alter_part final : public query_part { public: query_alter_part(); void accept(query_part_visitor &visitor) override; }; class query_alter_table_part final : public query_part { public: explicit query_alter_table_part(class table tab); void accept(query_part_visitor &visitor) override; [[nodiscard]] const class table& table() const; private: query::table table_; }; class query_add_key_constraint_part final : public query_part { public: explicit query_add_key_constraint_part(std::string name); void accept(query_part_visitor &visitor) override; [[nodiscard]] const std::string& name() const; private: std::string name_; }; class query_drop_key_constraint_part final : public query_part { public: explicit query_drop_key_constraint_part(std::string name); void accept(query_part_visitor &visitor) override; [[nodiscard]] const std::string& name() const; private: std::string name_; }; class query_add_foreign_key_constraint_part final : public query_part { public: explicit query_add_foreign_key_constraint_part( const std::vector& columns); void accept(query_part_visitor &visitor) override; [[nodiscard]] const std::vector& columns() const; private: std::vector columns_; }; class query_add_foreign_key_reference_part final : public query_part { public: explicit query_add_foreign_key_reference_part(class table tab, const std::vector& columns); void accept(query_part_visitor &visitor) override; [[nodiscard]] const class table& table() const; [[nodiscard]] const std::vector& columns() const; private: query::table table_; std::vector columns_; }; class query_add_primary_key_constraint_part final : public query_part { public: explicit query_add_primary_key_constraint_part( const std::vector& columns); void accept(query_part_visitor &visitor) override; [[nodiscard]] const std::vector& columns() const; private: std::vector columns_; }; class query_drop_foreign_key_constraint_part final : public query_part { public: query_drop_foreign_key_constraint_part(); void accept(query_part_visitor &visitor) override; }; /** * Represents the SQL SELECT part */ class query_select_part final : 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 final : public query_part { public: explicit query_from_part(class table tab); [[nodiscard]] const class table& table() const; private: void accept(query_part_visitor &visitor) override; private: class table table_; }; class query_join_part final : public query_part { public: explicit query_join_part(class table tab); [[nodiscard]] const class table& table() const; private: void accept(query_part_visitor &visitor) override; private: class table table_; }; class query_on_part final : public query_part { public: template < class Condition > explicit query_on_part(const Condition &cond) : query_part(sql::dialect_token::On) , condition_(new Condition(cond)) {} explicit query_on_part(std::unique_ptr &&cond); [[nodiscard]] const abstract_criteria& condition() const; private: void accept(query_part_visitor &visitor) override; private: std::unique_ptr condition_; }; class query_where_part final : public query_part { public: template < class Condition > explicit query_where_part(const Condition &cond) : query_part(sql::dialect_token::Where) , condition_(new Condition(cond)) {} explicit query_where_part(std::unique_ptr &&cond); [[nodiscard]] const abstract_criteria& condition() const; 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 token, std::string table_name); protected: std::string table_name_; }; class query_group_by_part final : public query_part { public: explicit query_group_by_part(class column col); [[nodiscard]] const class column& column() const; private: void accept(query_part_visitor &visitor) override; private: class column column_; }; class query_order_by_part final : public query_part { public: explicit query_order_by_part(class column col); [[nodiscard]] const class column& column() const; private: void accept(query_part_visitor &visitor) override; private: class column column_; }; class query_order_by_asc_part final : public query_part { public: query_order_by_asc_part(); private: void accept(query_part_visitor &visitor) override; }; class query_order_by_desc_part final : public query_part { public: query_order_by_desc_part(); private: void accept(query_part_visitor &visitor) override; }; class query_offset_part final : public query_part { public: explicit query_offset_part(size_t offset); [[nodiscard]] size_t offset() const; private: void accept(query_part_visitor &visitor) override; private: size_t offset_; }; class query_limit_part final : public query_part { public: explicit query_limit_part(size_t limit); [[nodiscard]] size_t limit() const; private: void accept(query_part_visitor &visitor) override; private: size_t limit_; }; class query_insert_part final : public query_part { public: query_insert_part(); private: void accept(query_part_visitor &visitor) override; }; class query_into_part final : public query_part { public: query_into_part(class table tab, std::vector columns); [[nodiscard]] const class table& table() const; [[nodiscard]] const std::vector& columns() const; private: void accept(query_part_visitor &visitor) override; private: class table table_; std::vector columns_; }; /** * Represents the SQL VALUES part */ class query_values_part final : public query_part { public: explicit query_values_part(std::vector> &&values); [[nodiscard]] const std::vector>& values() const; private: void accept(query_part_visitor &visitor) override; private: std::vector> values_; }; class query_update_part final : public query_part { public: explicit query_update_part(class table tab); [[nodiscard]] const class table& table() const; private: void accept(query_part_visitor &visitor) override; private: class table table_; }; class query_set_part final : public query_part { public: explicit query_set_part(const std::vector& key_value_pairs); [[nodiscard]] const std::vector& column_values() const; private: void accept(query_part_visitor &visitor) override; private: std::vector key_value_pairs_; }; class query_delete_part final : public query_part { public: query_delete_part(); private: void accept(query_part_visitor &visitor) override; }; class query_delete_from_part final : public query_part { public: explicit query_delete_from_part(class table tab); [[nodiscard]] const class table& table() const; private: void accept(query_part_visitor &visitor) override; private: class table table_; }; class query_create_part final : public query_part { public: query_create_part(); private: void accept(query_part_visitor &visitor) override; }; class query_create_table_part final : public query_part { public: explicit query_create_table_part(class table tab); [[nodiscard]] const class table& table() const; private: void accept(query_part_visitor &visitor) override; private: class table table_; }; class query_create_table_columns_part final : public query_part { public: explicit query_create_table_columns_part(const std::list &columns); [[nodiscard]] const std::list& columns() const; private: void accept(query_part_visitor &visitor) override; private: std::list columns_; }; class query_create_table_constraints_part final : public query_part { public: explicit query_create_table_constraints_part(const std::list &constraints); [[nodiscard]] const std::list& constraints() const; private: void accept(query_part_visitor &visitor) override; private: std::list constraints_; }; class query_create_schema_part final : public query_part { public: explicit query_create_schema_part(std::string schema); [[nodiscard]] const std::string& schema() const; private: void accept(query_part_visitor &visitor) override; private: std::string schema_; }; class query_drop_part final : public query_part { public: query_drop_part(); private: void accept(query_part_visitor &visitor) override; }; class query_drop_table_part final : public query_part { public: explicit query_drop_table_part(class table tab); [[nodiscard]] const class table& table() const; private: void accept(query_part_visitor &visitor) override; private: class table table_; }; class query_drop_schema_part final : public query_part { public: explicit query_drop_schema_part(std::string schema_); [[nodiscard]] const std::string& schema() const; private: void accept(query_part_visitor &visitor) override; private: std::string schema_; }; } #endif //QUERY_QUERY_PARTS_HPP