#include "matador/sql/query_intermediates.hpp" #include "matador/sql/session.hpp" #include "matador/sql/query_compiler.hpp" #include "matador/sql/condition.hpp" namespace matador::sql { basic_query_intermediate::basic_query_intermediate(connection &db, const std::shared_ptr & schema) : connection_(db) , schema_(schema) {} query_result query_select_finish::fetch_all() { query_compiler compiler(connection_.dialect()); return connection_.fetch(compiler.compile(&data_)); } record query_select_finish::fetch_one() { query_compiler compiler(connection_.dialect()); return *connection_.fetch(compiler.compile(&data_)).begin().get(); } std::string query_select_finish::str() const { query_compiler compiler(connection_.dialect()); return compiler.compile(&data_).sql; } std::unique_ptr query_select_finish::fetch() { query_compiler compiler(connection_.dialect()); return connection_.fetch(compiler.compile(&data_).sql); } statement query_select_finish::prepare() { query_compiler compiler(connection_.dialect()); return connection_.prepare(compiler.compile(&data_)); } query_intermediate::query_intermediate(connection &db, const std::shared_ptr &schema, query_data &data) : basic_query_intermediate(db, schema), data_(data) {} query_offset_intermediate query_limit_intermediate::offset(size_t offset) { data_.parts.push_back(std::make_unique(offset)); return {connection_, schema_, data_}; } query_limit_intermediate query_offset_intermediate::limit(size_t limit) { data_.parts.push_back(std::make_unique(limit)); return {connection_, schema_, data_}; } query_limit_intermediate query_order_direction_intermediate::limit(size_t limit) { data_.parts.push_back(std::make_unique(limit)); return {connection_, schema_, data_}; } query_order_by_intermediate query_group_by_intermediate::order_by(const column &col) { data_.parts.push_back(std::make_unique(col)); return {connection_, schema_, data_}; } query_order_direction_intermediate query_order_by_intermediate::asc() { data_.parts.push_back(std::make_unique()); return {connection_, schema_, data_}; } query_order_direction_intermediate query_order_by_intermediate::desc() { data_.parts.push_back(std::make_unique()); return {connection_, schema_, data_}; } query_where_intermediate query_from_intermediate::where_clause(std::unique_ptr &&cond) { data_.parts.push_back(std::make_unique(std::move(cond))); return {connection_, schema_, data_}; } query_group_by_intermediate query_from_intermediate::group_by(const column &col) { data_.parts.push_back(std::make_unique(col)); return {connection_, schema_, data_}; } query_order_by_intermediate query_from_intermediate::order_by(const column &col) { data_.parts.push_back(std::make_unique(col)); return {connection_, schema_, data_}; } query_group_by_intermediate query_where_intermediate::group_by(const column &col) { data_.parts.push_back(std::make_unique(col)); return {connection_, schema_, data_}; } query_order_by_intermediate query_where_intermediate::order_by(const column &col) { data_.parts.push_back(std::make_unique(col)); return {connection_, schema_, data_}; } query_join_intermediate query_on_intermediate::join_left(const table &t) { data_.parts.push_back(std::make_unique(t)); return {connection_, schema_, data_}; } query_where_intermediate query_on_intermediate::where_clause(std::unique_ptr &&cond) { data_.parts.push_back(std::make_unique(std::move(cond))); return {connection_, schema_, data_}; } query_group_by_intermediate query_on_intermediate::group_by(const column &col) { data_.parts.push_back(std::make_unique(col)); return {connection_, schema_, data_}; } query_order_by_intermediate query_on_intermediate::order_by(const column &col) { data_.parts.push_back(std::make_unique(col)); return {connection_, schema_, data_}; } query_on_intermediate query_join_intermediate::on_clause(std::unique_ptr &&cond) { data_.parts.push_back(std::make_unique(std::move(cond))); return {connection_, schema_, data_}; } query_join_intermediate query_from_intermediate::join_left(const table &t) { data_.parts.push_back(std::make_unique(t)); return {connection_, schema_, data_}; } query_select_intermediate::query_select_intermediate(connection &db, const std::shared_ptr &schema, const std::vector& columns) : query_start_intermediate(db, schema) { data_.parts.push_back(std::make_unique(columns)); } query_from_intermediate query_select_intermediate::from(const table& t) { data_.parts.push_back(std::make_unique(t)); return {connection_, schema_, data_}; } query_insert_intermediate::query_insert_intermediate(connection &db, const std::shared_ptr &schema) : query_start_intermediate(db, schema) { data_.parts.push_back(std::make_unique()); } query_into_intermediate query_insert_intermediate::into(const sql::table &table, std::initializer_list column_names) { return into(table, std::move(std::vector{column_names})); } query_into_intermediate query_insert_intermediate::into(const table &table, std::vector &&column_names) { data_.parts.push_back(std::make_unique(table, column_names)); return {connection_, schema_, data_}; } size_t query_execute_finish::execute() { query_compiler compiler(connection_.dialect()); return connection_.execute(compiler.compile(&data_).sql); } statement query_execute_finish::prepare() { query_compiler compiler(connection_.dialect()); return connection_.prepare(compiler.compile(&data_)); } std::string query_execute_finish::str() const { query_compiler compiler(connection_.dialect()); return compiler.compile(&data_).sql; } query_execute_finish query_into_intermediate::values(std::initializer_list values) { return this->values(std::vector(values)); } query_execute_finish query_into_intermediate::values(std::vector &&values) { data_.parts.push_back(std::make_unique(std::move(values))); return {connection_, schema_, data_}; } query_create_intermediate::query_create_intermediate(connection &db, const std::shared_ptr &schema) : query_start_intermediate(db, schema) { data_.parts.push_back(std::make_unique()); } query_execute_finish query_create_intermediate::table(const sql::table &table, std::initializer_list columns) { return this->table(table, std::vector{columns}); } query_execute_finish query_create_intermediate::table(const sql::table &table, const std::vector &columns) { data_.parts.push_back(std::make_unique(table, columns)); return {connection_, schema_, data_}; } query_drop_intermediate::query_drop_intermediate(connection &db, const std::shared_ptr &schema) : query_start_intermediate(db, schema) { data_.parts.push_back(std::make_unique()); } query_execute_finish query_drop_intermediate::table(const sql::table &table) { data_.parts.push_back(std::make_unique(table)); return {connection_, schema_, data_}; } query_execute_finish query_execute_where_intermediate::limit(int limit) { return {connection_, schema_, data_}; // return {connection_, builder_.limit(limit)}; } query_execute_where_intermediate query_set_intermediate::where_clause(std::unique_ptr &&cond) { data_.parts.push_back(std::make_unique(std::move(cond))); return {connection_, schema_, data_}; } query_update_intermediate::query_update_intermediate(connection &db, const std::shared_ptr &schema, const sql::table& table) : query_start_intermediate(db, schema) { data_.parts.push_back(std::make_unique(table)); } query_set_intermediate query_update_intermediate::set(std::initializer_list columns) { return set(std::vector{columns}); } query_set_intermediate query_update_intermediate::set(std::vector &&columns) { data_.parts.push_back(std::make_unique(std::move(columns))); return {connection_, schema_, data_}; } query_execute_where_intermediate query_delete_from_intermediate::where_clause(std::unique_ptr &&cond) { data_.parts.push_back(std::make_unique(std::move(cond))); return {connection_, schema_, data_}; } query_delete_intermediate::query_delete_intermediate(connection &db, const std::shared_ptr &schema) : query_start_intermediate(db, schema) { data_.parts.push_back(std::make_unique()); } query_delete_from_intermediate query_delete_intermediate::from(const sql::table &table) { return {connection_, schema_, data_}; } query_start_intermediate::query_start_intermediate(connection &db, const std::shared_ptr &schema) : basic_query_intermediate(db, schema) {} }