#ifndef QUERY_QUERY_INTERMEDIATES_HPP #define QUERY_QUERY_INTERMEDIATES_HPP #include "matador/sql/column.hpp" #include "matador/sql/column_generator.hpp" #include "matador/sql/column_name_generator.hpp" #include "matador/sql/key_value_generator.hpp" #include "matador/sql/key_value_pair.hpp" #include "matador/sql/query_builder.hpp" #include "matador/sql/query_result.hpp" #include "matador/sql/record.hpp" #include "matador/sql/table_repository.hpp" #include "matador/sql/value_extractor.hpp" #include namespace matador::sql { class basic_condition; class session; class query_intermediate { public: query_intermediate(session &db, query_builder &query); protected: session &session_; query_builder &builder_; }; class query_execute_finish : public query_intermediate { public: using query_intermediate::query_intermediate; std::pair execute(); }; class query_select_finish : public query_intermediate { protected: using query_intermediate::query_intermediate; public: template < class Type > query_result fetch_all() { return query_result(fetch()); } query_result fetch_all(); record fetch_one(); template Type fetch_value() { auto result = fetch_all(); return {}; } private: std::unique_ptr fetch(); }; class query_limit_intermediate : public query_select_finish { public: using query_select_finish::query_select_finish; }; class query_offset_intermediate : public query_intermediate { public: using query_intermediate::query_intermediate; query_limit_intermediate limit(size_t limit); }; class query_order_direction_intermediate : public query_select_finish { public: using query_select_finish::query_select_finish; query_offset_intermediate offset(size_t offset); query_limit_intermediate limit(size_t limit); }; class query_order_by_intermediate; class query_group_by_intermediate : public query_select_finish { public: using query_select_finish::query_select_finish; query_order_by_intermediate order_by(const std::string &name); }; class query_order_by_intermediate : public query_intermediate { public: using query_intermediate::query_intermediate; query_order_direction_intermediate asc(); query_order_direction_intermediate desc(); }; class query_where_intermediate : public query_select_finish { public: using query_select_finish::query_select_finish; query_group_by_intermediate group_by(const std::string &name); query_order_by_intermediate order_by(const std::string &name); }; class query_from_intermediate : public query_select_finish { public: using query_select_finish::query_select_finish; query_where_intermediate where(const basic_condition &cond); query_group_by_intermediate group_by(const std::string &name); query_order_by_intermediate order_by(const std::string &name); }; class query_start_intermediate { public: explicit query_start_intermediate(session &s); protected: session &session_; query_builder builder_; }; class query_select_intermediate : public query_start_intermediate { public: query_select_intermediate(session &s, const std::vector& columns); query_from_intermediate from(const std::string &table, const std::string &as = ""); }; class query_into_intermediate : public query_intermediate { public: using query_intermediate::query_intermediate; query_execute_finish values(std::initializer_list values); template query_execute_finish values(const Type &obj) { return {session_, builder_.values(value_extractor::extract(obj))}; } }; class query_create_intermediate : query_start_intermediate { public: query_create_intermediate(session &s, table_repository &repo); query_execute_finish table(const std::string &table, std::initializer_list columns); template query_execute_finish table(const std::string &table_name) { const auto &info = repository_.attach(table_name); return {session_, builder_.table(table_name, info.prototype.columns())}; } private: table_repository &repository_; }; class query_drop_intermediate : query_start_intermediate { public: explicit query_drop_intermediate(session &s); query_execute_finish table(const std::string &table); }; class query_insert_intermediate : public query_start_intermediate { public: explicit query_insert_intermediate(session &s); query_into_intermediate into(const std::string &table, std::initializer_list column_names); template query_into_intermediate into(const std::string &table) { return {session_, builder_.into(table, column_name_generator::generate())}; } template query_execute_finish into(const std::string &table, const Type &obj) { return {session_, builder_.into(table, column_name_generator::generate()) .values(value_extractor::extract(obj))}; } }; class query_execute_where_intermediate : public query_execute_finish { public: using query_execute_finish::query_execute_finish; query_execute_finish limit(int limit); }; class query_set_intermediate : public query_execute_finish { public: using query_execute_finish::query_execute_finish; query_execute_where_intermediate where(const basic_condition &cond); }; class query_update_intermediate : public query_start_intermediate { public: query_update_intermediate(session &s, std::string table_name); query_set_intermediate set(std::initializer_list columns); template query_set_intermediate set(const Type &obj) { return {session_, builder_.set(key_value_generator::generate(obj))}; } }; class query_delete_from_intermediate : public query_execute_finish { public: using query_execute_finish::query_execute_finish; query_execute_where_intermediate where(const basic_condition &cond); }; class query_delete_intermediate : public query_start_intermediate { public: explicit query_delete_intermediate(session &s); query_delete_from_intermediate from(const std::string &table); }; } #endif //QUERY_QUERY_INTERMEDIATES_HPP