#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/placeholder_generator.hpp" #include "matador/sql/query_builder.hpp" #include "matador/sql/query_result.hpp" #include "matador/sql/record.hpp" #include "matador/sql/statement.hpp" #include "matador/sql/table_repository.hpp" #include "matador/sql/value_extractor.hpp" #include namespace matador::sql { class basic_condition; class connection; class query_intermediate { public: query_intermediate(connection &db, query_builder &query); protected: connection &connection_; query_builder &builder_; }; class query_execute_finish : public query_intermediate { public: using query_intermediate::query_intermediate; size_t execute(); statement prepare(); }; 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() { return fetch_one().at(0).as(); } statement prepare(); 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(connection &s); protected: connection &connection_; query_builder builder_; }; class query_select_intermediate : public query_start_intermediate { public: query_select_intermediate(connection &s, const std::vector& columns); query_from_intermediate from(const std::string &table, const std::string &as = ""); }; template < class Type > std::vector as_placeholder(const Type &obj) { placeholder_generator generator; matador::utils::access::process(generator, obj); return generator.placeholder_values; } 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() { Type obj; return {connection_, builder_.values(as_placeholder(obj))}; } template query_execute_finish values(const Type &obj) { return {connection_, builder_.values(value_extractor::extract(obj))}; } }; class query_create_intermediate : public query_start_intermediate { public: explicit query_create_intermediate(connection &db); query_execute_finish table(const std::string &table, std::initializer_list columns); template query_execute_finish table(const std::string &table_name) { if (!tables()->exists()) { tables()->attach(table_name); } return {connection_, builder_.table(table_name, column_generator::generate(*tables()))}; } private: std::shared_ptr tables() const; }; class query_drop_intermediate : query_start_intermediate { public: explicit query_drop_intermediate(connection &s); query_execute_finish table(const std::string &table); }; class query_insert_intermediate : public query_start_intermediate { public: explicit query_insert_intermediate(connection &s); query_into_intermediate into(const std::string &table, std::initializer_list column_names); template query_into_intermediate into(const std::string &table) { return {connection_, builder_.into(table, column_name_generator::generate())}; } template query_execute_finish into(const std::string &table, const Type &obj) { return {connection_, 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(connection &s, const std::string& table_name); query_set_intermediate set(std::initializer_list columns); template query_set_intermediate set(const Type &obj) { return {connection_, 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(connection &s); query_delete_from_intermediate from(const std::string &table); }; } #endif //QUERY_QUERY_INTERMEDIATES_HPP