diff --git a/backends/postgres/src/postgres_connection.cpp b/backends/postgres/src/postgres_connection.cpp index bac6c75..9294161 100644 --- a/backends/postgres/src/postgres_connection.cpp +++ b/backends/postgres/src/postgres_connection.cpp @@ -110,7 +110,7 @@ utils::result, utils::error> postgres_co std::string postgres_connection::generate_statement_name(const sql::query_context &query) { std::stringstream name; - name << query.table.name() << "_" << query.command_name; + name << query.table_name.name() << "_" << query.command_name; auto result = postgres_connection::statement_name_map_.find(name.str()); if (result == postgres_connection::statement_name_map_.end()) { diff --git a/demo/main.cpp b/demo/main.cpp index 28cd536..cd66de9 100644 --- a/demo/main.cpp +++ b/demo/main.cpp @@ -1,4 +1,4 @@ -#include "matador/sql/column.hpp" +#include "matador/query/column.hpp" #include "matador/sql/connection.hpp" #include "matador/sql/query_macro.hpp" diff --git a/include/matador/orm/session_query_builder.hpp b/include/matador/orm/session_query_builder.hpp index 3108967..6e44243 100644 --- a/include/matador/orm/session_query_builder.hpp +++ b/include/matador/orm/session_query_builder.hpp @@ -23,9 +23,9 @@ namespace matador::orm { struct entity_query_data { - std::shared_ptr root_table; + std::shared_ptr root_table; std::string pk_column_name{}; - std::vector columns{}; + std::vector columns{}; std::unordered_map lazy_loading_statements{}; std::vector joins{}; query::criteria_ptr where_clause{}; @@ -33,7 +33,7 @@ struct entity_query_data { class criteria_transformer final : public query::criteria_visitor { public: - criteria_transformer(const object::repository &repo, const std::unordered_map>& tables_by_name); + criteria_transformer(const object::repository &repo, const std::unordered_map>& tables_by_name); void visit( const query::between_criteria& node ) override; void visit( const query::binary_criteria& node ) override; void visit( const query::binary_column_criteria& node ) override; @@ -48,7 +48,7 @@ private: private: const object::repository &repo_; - const std::unordered_map>& tables_by_name_; + const std::unordered_map>& tables_by_name_; }; class session_query_builder final { @@ -63,7 +63,7 @@ public: if (!info) { return utils::failure(query_build_error::UnknownType); } - table_info_stack_.push({info.value(), std::make_shared(info.value().get().name(), build_alias('t', ++table_index))}); + table_info_stack_.push({info.value(), std::make_shared(info.value().get().name(), build_alias('t', ++table_index))}); entity_query_data_ = { table_info_stack_.top().table }; processed_tables_.insert({info->get().name(), entity_query_data_.root_table}); try { @@ -123,7 +123,7 @@ public: if (next != processed_tables_.end()) { return; } - table_info_stack_.push({info.value(), std::make_shared(info->get().name(), build_alias('t', ++table_index))}); + table_info_stack_.push({info.value(), std::make_shared(info->get().name(), build_alias('t', ++table_index))}); next = processed_tables_.insert({info->get().name(), table_info_stack_.top().table}).first; typename ContainerType::value_type::value_type obj; access::process(*this , obj); @@ -135,8 +135,8 @@ public: } append_join( - sql::column{table_info_stack_.top().table, table_info_stack_.top().info.get().definition().primary_key()->name()}, - sql::column{next->second, join_column} + query::column{table_info_stack_.top().table, table_info_stack_.top().info.get().definition().primary_key()->name()}, + query::column{next->second, join_column} ); } } @@ -157,10 +157,10 @@ public: } auto relation = processed_tables_.find(id); if (relation == processed_tables_.end()) { - relation = processed_tables_.insert({id, std::make_shared(id, build_alias('t', ++table_index))}).first; + relation = processed_tables_.insert({id, std::make_shared(id, build_alias('t', ++table_index))}).first; } - table_info_stack_.push({info.value(), std::make_shared(info->get().name(), build_alias('t', ++table_index))}); + table_info_stack_.push({info.value(), std::make_shared(info->get().name(), build_alias('t', ++table_index))}); next = processed_tables_.insert({info->get().name(), table_info_stack_.top().table}).first; typename ContainerType::value_type::value_type obj; access::process(*this , obj); @@ -172,12 +172,12 @@ public: } append_join( - sql::column{table_info_stack_.top().table, table_info_stack_.top().info.get().definition().primary_key()->name()}, - sql::column{relation->second, join_column} + query::column{table_info_stack_.top().table, table_info_stack_.top().info.get().definition().primary_key()->name()}, + query::column{relation->second, join_column} ); append_join( - sql::column{relation->second, inverse_join_column}, - sql::column{next->second, pk->name()} + query::column{relation->second, inverse_join_column}, + query::column{next->second, pk->name()} ); } @@ -198,9 +198,9 @@ public: auto relation = processed_tables_.find(id); if (relation == processed_tables_.end()) { - relation = processed_tables_.insert({id, std::make_shared(id, build_alias('t', ++table_index))}).first; + relation = processed_tables_.insert({id, std::make_shared(id, build_alias('t', ++table_index))}).first; } - table_info_stack_.push({info.value(), std::make_shared(info->get().name(), build_alias('t', ++table_index))}); + table_info_stack_.push({info.value(), std::make_shared(info->get().name(), build_alias('t', ++table_index))}); next = processed_tables_.insert({info->get().name(), table_info_stack_.top().table}).first; typename ContainerType::value_type::value_type obj; access::process(*this , obj); @@ -214,12 +214,12 @@ public: const auto join_columns = join_columns_collector_.collect(); append_join( - sql::column{table_info_stack_.top().table, table_info_stack_.top().info.get().definition().primary_key()->name()}, - sql::column{relation->second, join_columns.inverse_join_column} + query::column{table_info_stack_.top().table, table_info_stack_.top().info.get().definition().primary_key()->name()}, + query::column{relation->second, join_columns.inverse_join_column} ); append_join( - sql::column{relation->second, join_columns.join_column}, - sql::column{next->second, pk->name()} + query::column{relation->second, join_columns.join_column}, + query::column{next->second, pk->name()} ); } @@ -229,16 +229,16 @@ private: void push(const std::string &column_name); static std::string build_alias(char prefix, unsigned int count); [[nodiscard]] bool is_root_entity() const; - void append_join(const sql::column &left, const sql::column &right); + void append_join(const query::column &left, const query::column &right); private: struct table_info { std::reference_wrapper info; - std::shared_ptr table; + std::shared_ptr table; }; std::stack table_info_stack_{}; - std::unordered_map> processed_tables_{}; + std::unordered_map> processed_tables_{}; const object::repository &schema_; entity_query_data entity_query_data_{}; unsigned int column_index{0}; @@ -258,7 +258,7 @@ void session_query_builder::on_foreign_object(const char *id, Pointer &, const u throw query_builder_exception{query_build_error::MissingPrimaryKey}; } - const auto foreign_table = std::make_shared(info->get().name(), build_alias('t', ++table_index)); + const auto foreign_table = std::make_shared(info->get().name(), build_alias('t', ++table_index)); if (attr.fetch() == utils::fetch_type::EAGER) { auto next = processed_tables_.find(info->get().name()); @@ -272,8 +272,8 @@ void session_query_builder::on_foreign_object(const char *id, Pointer &, const u table_info_stack_.pop(); append_join( - sql::column{table_info_stack_.top().table, id}, - sql::column{next->second, pk->name()} + query::column{table_info_stack_.top().table, id}, + query::column{next->second, pk->name()} ); } else { push(id); @@ -282,7 +282,7 @@ void session_query_builder::on_foreign_object(const char *id, Pointer &, const u // create select query auto result = matador::query::query::select(generator::columns(schema_, generator::column_generator_options::ForceLazy)) .from(*foreign_table) - .where(sql::column(foreign_table, pk->name(), "") == _) + .where(column(foreign_table, pk->name(), "") == _) .prepare(executor_); if (!result) { throw query_builder_exception(query_build_error::QueryError, result.release_error()); diff --git a/include/matador/query/builder.hpp b/include/matador/query/builder.hpp new file mode 100644 index 0000000..a1550bc --- /dev/null +++ b/include/matador/query/builder.hpp @@ -0,0 +1,63 @@ +#ifndef MATADOR_BUILDER_HPP +#define MATADOR_BUILDER_HPP + +#include "matador/query/column.hpp" +#include "matador/query/table.hpp" + +#include + +namespace matador::query { + +class column_builder { +public: + explicit column_builder(std::string column_name); + + // ReSharper disable once CppNonExplicitConversionOperator + operator query::column() const; // NOLINT(*-explicit-constructor) + +private: + std::string column_name; +}; + +struct constraint { + std::string name; +}; + +class table_builder { +public: + explicit table_builder(std::string name); + + table_builder& as(std::string table_alias); + + // ReSharper disable once CppNonExplicitConversionOperator + operator query::table() const; // NOLINT(*-explicit-constructor) + +private: + std::string table_name; + std::string alias; +}; + +class constraint_builder { +public: + constraint_builder& constraint(std::string name); + constraint_builder& primary_key(std::string name); + constraint_builder& foreign_key(std::string name); + constraint_builder& references(std::string table, std::string column); + + // ReSharper disable once CppNonExplicitConversionOperator + operator query::constraint() const; // NOLINT(*-explicit-constructor) + +private: + std::string constraint_name; + std::string pk_column_name; + std::string fk_column_name; + std::string table_name; + std::string column_name; +}; + +constraint_builder constraint(std::string name); +table_builder table(std::string name); +column_builder column(std::string name); + +} +#endif //MATADOR_BUILDER_HPP \ No newline at end of file diff --git a/include/matador/sql/column.hpp b/include/matador/query/column.hpp similarity index 64% rename from include/matador/sql/column.hpp rename to include/matador/query/column.hpp index df60064..bf2c924 100644 --- a/include/matador/sql/column.hpp +++ b/include/matador/query/column.hpp @@ -1,28 +1,21 @@ #ifndef QUERY_COLUMN_HPP #define QUERY_COLUMN_HPP +#include "matador/sql/sql_functions.hpp" + #include #include #include -namespace matador::sql { +namespace matador::query { class table; -enum class sql_function_t { - None, - Count, - Avg, - Sum, - Min, - Max -}; - class column { public: column(const char *name, const std::string& as = ""); // NOLINT(*-explicit-constructor) - explicit column(std::string name, std::string as = ""); - column(sql_function_t func, std::string name); // NOLINT(*-explicit-constructor) + column(std::string name, std::string as = ""); + column(sql::sql_function_t func, std::string name); // NOLINT(*-explicit-constructor) column(const class table &tab, std::string name, std::string as = ""); column(const std::shared_ptr &t, std::string name, std::string as = ""); @@ -34,17 +27,18 @@ public: [[nodiscard]] std::string full_name() const; [[nodiscard]] const std::string& alias_name() const; [[nodiscard]] bool is_function() const; - [[nodiscard]] sql_function_t function() const; + [[nodiscard]] sql::sql_function_t function() const; [[nodiscard]] bool has_alias() const; [[nodiscard]] std::string alias() const; - [[nodiscard]] std::shared_ptr table() const; - void table(const std::shared_ptr& t); + + [[nodiscard]] std::shared_ptr
table() const; + void table(const std::shared_ptr& t); private: - std::shared_ptr table_; + std::shared_ptr table_; std::string name; std::string alias_; - sql_function_t function_{sql_function_t::None}; + sql::sql_function_t function_{sql::sql_function_t::None}; }; column operator ""_col(const char *name, size_t len); diff --git a/include/matador/query/criteria/abstract_column_criteria.hpp b/include/matador/query/criteria/abstract_column_criteria.hpp index 263c115..5f1b205 100644 --- a/include/matador/query/criteria/abstract_column_criteria.hpp +++ b/include/matador/query/criteria/abstract_column_criteria.hpp @@ -3,19 +3,19 @@ #include "matador/query/criteria/abstract_criteria.hpp" -#include "matador/sql/column.hpp" +#include "matador/query/column.hpp" namespace matador::query { class abstract_column_criteria : public abstract_criteria { public: abstract_column_criteria() = delete; - explicit abstract_column_criteria(sql::column column); + explicit abstract_column_criteria(column col); - [[nodiscard]] const sql::column& column() const; + [[nodiscard]] const column& col() const; protected: - sql::column column_; + column column_; }; } diff --git a/include/matador/query/criteria/between_criteria.hpp b/include/matador/query/criteria/between_criteria.hpp index 107b3c9..4ce863a 100644 --- a/include/matador/query/criteria/between_criteria.hpp +++ b/include/matador/query/criteria/between_criteria.hpp @@ -11,8 +11,8 @@ namespace matador::query { class between_criteria final : public abstract_column_criteria { public: between_criteria() = delete; - between_criteria(sql::column column, int64_t min, int64_t max); - between_criteria(sql::column column, utils::placeholder min, utils::placeholder max); + between_criteria(column col, int64_t min, int64_t max); + between_criteria(column col, utils::placeholder min, utils::placeholder max); void accept(criteria_visitor& visitor) const override; diff --git a/include/matador/query/criteria/binary_criteria.hpp b/include/matador/query/criteria/binary_criteria.hpp index 3670692..c8bf1a4 100644 --- a/include/matador/query/criteria/binary_criteria.hpp +++ b/include/matador/query/criteria/binary_criteria.hpp @@ -4,7 +4,7 @@ #include "matador/query/criteria/abstract_column_criteria.hpp" #include "matador/query/criteria/criteria_utils.hpp" -#include "matador/sql/column.hpp" +#include "matador/query/column.hpp" namespace matador::query { enum class binary_operator { @@ -19,7 +19,7 @@ enum class binary_operator { class binary_criteria final : public abstract_column_criteria { public: binary_criteria() = delete; - binary_criteria(sql::column column, binary_operator operand, criteria_value value); + binary_criteria(column col, binary_operator operand, criteria_value value); void accept( criteria_visitor& visitor ) const override; @@ -34,18 +34,18 @@ private: class binary_column_criteria final : public abstract_criteria { public: binary_column_criteria() = delete; - binary_column_criteria(sql::column left_column, binary_operator operand, sql::column right_column); + binary_column_criteria(column left_column, binary_operator operand, column right_column); void accept(criteria_visitor& visitor) const override; - [[nodiscard]] const sql::column& left_column() const; + [[nodiscard]] const column& left_column() const; [[nodiscard]] binary_operator operand() const; - [[nodiscard]] const sql::column& right_column() const; + [[nodiscard]] const column& right_column() const; private: - sql::column left_column_; + column left_column_; binary_operator operator_{}; - sql::column right_column_; + column right_column_; }; } #endif //CRITERIA_BINARY_CRITERIA_NODE_HPP \ No newline at end of file diff --git a/include/matador/query/criteria/collection_criteria.hpp b/include/matador/query/criteria/collection_criteria.hpp index 8db7bbf..15c321b 100644 --- a/include/matador/query/criteria/collection_criteria.hpp +++ b/include/matador/query/criteria/collection_criteria.hpp @@ -4,7 +4,7 @@ #include "matador/query/criteria/abstract_column_criteria.hpp" #include "matador/query/criteria/criteria_utils.hpp" -#include "matador/sql/column.hpp" +#include "matador/query/column.hpp" #include "matador/sql/query_context.hpp" namespace matador::query { @@ -36,8 +36,8 @@ public: * @param operand_ Operator to use * @param values List of values */ - collection_criteria(sql::column col, collection_operator operand_, std::vector values); - collection_criteria(sql::column col, collection_operator operand_, std::initializer_list values); + collection_criteria(column col, collection_operator operand_, std::vector values); + collection_criteria(column col, collection_operator operand_, std::initializer_list values); void accept(criteria_visitor& visitor) const override; @@ -52,7 +52,7 @@ private: class collection_query_criteria final : public abstract_column_criteria { public: collection_query_criteria() = delete; - collection_query_criteria(sql::column col, collection_operator operand_, sql::query_context ctx); + collection_query_criteria(column col, collection_operator operand_, sql::query_context ctx); void accept(criteria_visitor& visitor) const override; diff --git a/include/matador/query/criteria/criteria_operators.hpp b/include/matador/query/criteria/criteria_operators.hpp index 49e5e89..d39db25 100644 --- a/include/matador/query/criteria/criteria_operators.hpp +++ b/include/matador/query/criteria/criteria_operators.hpp @@ -4,7 +4,7 @@ #include "matador/query/criteria/binary_criteria.hpp" #include "matador/query/criteria/collection_criteria.hpp" -#include "matador/sql/column.hpp" +#include "matador/query/column.hpp" #include "matador/utils/placeholder.hpp" #include "matador/utils/value.hpp" @@ -15,48 +15,48 @@ struct query_context; namespace matador::query { template -criteria_ptr operator==(const sql::column &col, Type val) { +criteria_ptr operator==(const column &col, Type val) { return std::make_unique(col, binary_operator::EQUALS, utils::value(val)); } template -criteria_ptr operator!=(const sql::column &col, Type val) { +criteria_ptr operator!=(const column &col, Type val) { return std::make_unique(col, binary_operator::NOT_EQUALS, utils::value(val)); } template -criteria_ptr operator>(const sql::column &col, Type val) { +criteria_ptr operator>(const column &col, Type val) { return std::make_unique(col, binary_operator::GREATER_THAN, utils::value(val)); } template -criteria_ptr operator>=(const sql::column &col, Type val) { +criteria_ptr operator>=(const column &col, Type val) { return std::make_unique(col, binary_operator::GREATER_THAN_OR_EQUAL, utils::value(val)); } template -criteria_ptr operator<(const sql::column &col, Type val) { +criteria_ptr operator<(const column &col, Type val) { return std::make_unique(col, binary_operator::LESS_THAN, utils::value(val)); } template -criteria_ptr operator<=(const sql::column &col, Type val) { +criteria_ptr operator<=(const column &col, Type val) { return std::make_unique(col, binary_operator::LESS_THAN_OR_EQUAL, utils::value(val)); } -criteria_ptr operator==(const sql::column &col_left, const sql::column &col_right); -criteria_ptr operator!=(const sql::column &col_left, const sql::column &col_right); -criteria_ptr operator>(const sql::column &col_left, const sql::column &col_right); -criteria_ptr operator>=(const sql::column &col_left, const sql::column &col_right); -criteria_ptr operator<(const sql::column &col_left, const sql::column &col_right); -criteria_ptr operator<=(const sql::column &col_left, const sql::column &col_right); +criteria_ptr operator==(const column &col_left, const column &col_right); +criteria_ptr operator!=(const column &col_left, const column &col_right); +criteria_ptr operator>(const column &col_left, const column &col_right); +criteria_ptr operator>=(const column &col_left, const column &col_right); +criteria_ptr operator<(const column &col_left, const column &col_right); +criteria_ptr operator<=(const column &col_left, const column &col_right); -criteria_ptr operator==(const sql::column &col, utils::placeholder p); -criteria_ptr operator!=(const sql::column &col, utils::placeholder p); -criteria_ptr operator>(const sql::column &col, utils::placeholder p); -criteria_ptr operator>=(const sql::column &col, utils::placeholder p); -criteria_ptr operator<(const sql::column &col, utils::placeholder p); -criteria_ptr operator<=(const sql::column &col, utils::placeholder p); +criteria_ptr operator==(const column &col, utils::placeholder p); +criteria_ptr operator!=(const column &col, utils::placeholder p); +criteria_ptr operator>(const column &col, utils::placeholder p); +criteria_ptr operator>=(const column &col, utils::placeholder p); +criteria_ptr operator<(const column &col, utils::placeholder p); +criteria_ptr operator<=(const column &col, utils::placeholder p); criteria_ptr operator&&(criteria_ptr left, criteria_ptr right); @@ -65,7 +65,7 @@ criteria_ptr operator||(criteria_ptr left, criteria_ptr right); criteria_ptr operator!(criteria_ptr clause); template < class Type > -criteria_ptr in(const sql::column &col, std::initializer_list args) { +criteria_ptr in(const column &col, std::initializer_list args) { std::vector values; for ( auto &&arg : args ) { values.emplace_back(utils::value{std::move(arg)}); @@ -74,12 +74,12 @@ criteria_ptr in(const sql::column &col, std::initializer_list args) { } template <> -criteria_ptr in(const sql::column &col, std::initializer_list args); +criteria_ptr in(const column &col, std::initializer_list args); -criteria_ptr in(const sql::column &col, sql::query_context &&ctx); +criteria_ptr in(const column &col, sql::query_context &&ctx); template < class Type > -criteria_ptr out(const sql::column &col, std::initializer_list args) { +criteria_ptr out(const column &col, std::initializer_list args) { std::vector values; for ( auto &&arg : args ) { values.emplace_back(utils::value{std::move(arg)}); @@ -88,14 +88,14 @@ criteria_ptr out(const sql::column &col, std::initializer_list args) { } template <> -criteria_ptr out(const sql::column &col, std::initializer_list args); +criteria_ptr out(const column &col, std::initializer_list args); -criteria_ptr out(const sql::column &col, sql::query_context &&ctx); +criteria_ptr out(const column &col, sql::query_context &&ctx); -criteria_ptr between(const sql::column &col, int64_t min, int64_t max); -criteria_ptr between(const sql::column &col, utils::placeholder min, utils::placeholder max); +criteria_ptr between(const column &col, int64_t min, int64_t max); +criteria_ptr between(const column &col, utils::placeholder min, utils::placeholder max); -criteria_ptr like(const sql::column &col, const std::string &pattern); +criteria_ptr like(const column &col, const std::string &pattern); } #endif //CRITERIA_CRITERIA_OPERATORS_HPP \ No newline at end of file diff --git a/include/matador/query/criteria/like_criteria.hpp b/include/matador/query/criteria/like_criteria.hpp index 53f0f44..32e5f6b 100644 --- a/include/matador/query/criteria/like_criteria.hpp +++ b/include/matador/query/criteria/like_criteria.hpp @@ -3,13 +3,13 @@ #include "matador/query/criteria/abstract_column_criteria.hpp" -#include "matador/sql/column.hpp" +#include "matador/query/column.hpp" namespace matador::query { class like_criteria final : public abstract_column_criteria { public: like_criteria() = delete; - like_criteria(sql::column column, std::string pattern); + like_criteria(column col, std::string pattern); void accept(criteria_visitor &visitor) const override; diff --git a/include/matador/query/generator.hpp b/include/matador/query/generator.hpp index 8750a35..a70e018 100644 --- a/include/matador/query/generator.hpp +++ b/include/matador/query/generator.hpp @@ -11,7 +11,7 @@ #include "matador/query/fk_value_extractor.hpp" #include "matador/query/internal/column_value_pair.hpp" -#include "matador/sql/table.hpp" +#include "matador/query/table.hpp" #include @@ -53,13 +53,13 @@ public: column_generator_options options = default_column_generator_options); template< class Type > - std::vector generate() { + std::vector generate() { Type obj; return generate(obj); } template< class Type > - std::vector generate(const Type &obj) { + std::vector generate(const Type &obj) { result_.clear(); access::process(*this, obj); @@ -101,7 +101,7 @@ public: if (seen_tables.count(info->get().name()) == 0) { auto it = seen_tables.insert(info->get().name()).first; - table_stack_.push(std::make_shared(info.value().get().name())); + table_stack_.push(std::make_shared
(info.value().get().name())); typename ContainerType::value_type::value_type obj; access::process(*this, obj); table_stack_.pop(); @@ -136,7 +136,7 @@ private: } if (seen_tables.count(info->get().name()) == 0) { auto it = seen_tables.insert(info->get().name()).first; - table_stack_.push(std::make_shared(info.value().get().name())); + table_stack_.push(std::make_shared
(info.value().get().name())); typename Pointer::value_type obj; access::process(*this, obj); table_stack_.pop(); @@ -149,8 +149,8 @@ private: private: std::optional> repo_; - std::vector result_; - std::stack> table_stack_; + std::vector result_; + std::stack> table_stack_; std::unordered_set seen_tables; int column_index{0}; column_generator_options options_{false}; @@ -296,16 +296,16 @@ std::vector column_value_pairs() { } template -std::vector columns(const object::repository &repo, - const std::string &table_name = "", - const column_generator_options options = default_column_generator_options) { +std::vector columns(const object::repository &repo, + const std::string &table_name = "", + const column_generator_options options = default_column_generator_options) { column_generator generator(repo, table_name, options); return generator.generate(); } template -std::vector columns(const object::repository &repo, - const column_generator_options options) { +std::vector columns(const object::repository &repo, + const column_generator_options options) { std::string table_name; if (const auto result = repo.info()) { table_name = result.value().get().name(); @@ -315,25 +315,25 @@ std::vector columns(const object::repository &repo, } template -std::vector columns(const Type &obj, - const object::repository &repo, - const std::string &table_name = "", - const column_generator_options options = default_column_generator_options) { +std::vector columns(const Type &obj, + const object::repository &repo, + const std::string &table_name = "", + const column_generator_options options = default_column_generator_options) { column_generator generator(repo, table_name, options); return generator.generate(obj); } template -std::vector columns(const std::string &table_name = "", - const column_generator_options options = default_column_generator_options) { +std::vector columns(const std::string &table_name = "", + const column_generator_options options = default_column_generator_options) { column_generator generator(table_name, options); return generator.generate(); } template -std::vector columns(const Type &obj, - const std::string &table_name = "", - const column_generator_options options = default_column_generator_options) { +std::vector columns(const Type &obj, + const std::string &table_name = "", + const column_generator_options options = default_column_generator_options) { column_generator generator(table_name, options); return generator.generate(obj); } diff --git a/include/matador/query/intermediates/query_alter_intermediate.hpp b/include/matador/query/intermediates/query_alter_intermediate.hpp index 3a0763c..b09fc6c 100644 --- a/include/matador/query/intermediates/query_alter_intermediate.hpp +++ b/include/matador/query/intermediates/query_alter_intermediate.hpp @@ -9,7 +9,7 @@ class query_alter_intermediate : public query_intermediate { public: query_alter_intermediate(); - query_alter_table_intermediate table(const sql::table &table) const; + query_alter_table_intermediate table(const table &tab) const; }; } diff --git a/include/matador/query/intermediates/query_alter_table_intermediate.hpp b/include/matador/query/intermediates/query_alter_table_intermediate.hpp index 14f5da2..6f6b436 100644 --- a/include/matador/query/intermediates/query_alter_table_intermediate.hpp +++ b/include/matador/query/intermediates/query_alter_table_intermediate.hpp @@ -13,21 +13,21 @@ class query_add_foreign_key_constraint_intermediate final : public query_interme public: using query_intermediate::query_intermediate; - executable_query references(const sql::table& table, const std::vector& columns = {}); + executable_query references(const table& tab, const std::vector& columns = {}); private: - sql::table table_; - std::vector columns_; + table table_; + std::vector columns_; }; class query_add_key_constraint_intermediate final : public query_intermediate { public: using query_intermediate::query_intermediate; - query_add_primary_key_constraint_intermediate primary_key(const sql::column& column) const; - query_add_primary_key_constraint_intermediate primary_keys(const std::vector& columns) const; - query_add_foreign_key_constraint_intermediate foreign_key(const sql::column& column) const; - query_add_foreign_key_constraint_intermediate foreign_keys(const std::vector& columns) const; + [[nodiscard]] query_add_primary_key_constraint_intermediate primary_key(const column& col) const; + [[nodiscard]] query_add_primary_key_constraint_intermediate primary_keys(const std::vector& columns) const; + [[nodiscard]] query_add_foreign_key_constraint_intermediate foreign_key(const column& col) const; + [[nodiscard]] query_add_foreign_key_constraint_intermediate foreign_keys(const std::vector& columns) const; }; class query_alter_table_intermediate final : public query_intermediate { diff --git a/include/matador/query/intermediates/query_create_intermediate.hpp b/include/matador/query/intermediates/query_create_intermediate.hpp index 79400fe..df5c641 100644 --- a/include/matador/query/intermediates/query_create_intermediate.hpp +++ b/include/matador/query/intermediates/query_create_intermediate.hpp @@ -13,11 +13,11 @@ class query_create_intermediate : public query_intermediate { public: query_create_intermediate(); - executable_query table(const sql::table &table, std::initializer_list columns); - executable_query table(const sql::table &table, const std::vector &columns); + executable_query table(const query::table &tab, std::initializer_list columns); + executable_query table(const query::table &tab, const std::vector &columns); template - executable_query table(const sql::table &table, const object::repository &schema) { - return this->table(table, object::attribute_definition_generator::generate(schema)); + executable_query table(const query::table &tab, const object::repository &schema) { + return this->table(tab, object::attribute_definition_generator::generate(schema)); } executable_query schema(const std::string &schema_name); }; diff --git a/include/matador/query/intermediates/query_delete_intermediate.hpp b/include/matador/query/intermediates/query_delete_intermediate.hpp index ccf0577..c46338e 100644 --- a/include/matador/query/intermediates/query_delete_intermediate.hpp +++ b/include/matador/query/intermediates/query_delete_intermediate.hpp @@ -12,7 +12,7 @@ class query_delete_intermediate : public query_intermediate public: query_delete_intermediate(); - query_delete_from_intermediate from(const sql::table &table); + query_delete_from_intermediate from(const table &tab); }; } diff --git a/include/matador/query/intermediates/query_drop_intermediate.hpp b/include/matador/query/intermediates/query_drop_intermediate.hpp index 26dd33a..6beaaae 100644 --- a/include/matador/query/intermediates/query_drop_intermediate.hpp +++ b/include/matador/query/intermediates/query_drop_intermediate.hpp @@ -9,7 +9,7 @@ class query_drop_intermediate : query_intermediate { public: query_drop_intermediate(); - executable_query table(const sql::table &table); + executable_query table(const table &tab); executable_query schema(const std::string &schema_name); }; diff --git a/include/matador/query/intermediates/query_execute_where_intermediate.hpp b/include/matador/query/intermediates/query_execute_where_intermediate.hpp index 70b8a67..9f53f7c 100644 --- a/include/matador/query/intermediates/query_execute_where_intermediate.hpp +++ b/include/matador/query/intermediates/query_execute_where_intermediate.hpp @@ -14,7 +14,7 @@ public: using executable_query::executable_query; query_execute_limit_intermediate limit(size_t limit); - query_execute_order_by_intermediate order_by(const sql::column &col); + query_execute_order_by_intermediate order_by(const column &col); }; } diff --git a/include/matador/query/intermediates/query_from_intermediate.hpp b/include/matador/query/intermediates/query_from_intermediate.hpp index 5418ea4..b43e6ce 100644 --- a/include/matador/query/intermediates/query_from_intermediate.hpp +++ b/include/matador/query/intermediates/query_from_intermediate.hpp @@ -15,7 +15,7 @@ class query_from_intermediate : public fetchable_query public: using fetchable_query::fetchable_query; - query_join_intermediate join_left(const sql::table &t); + query_join_intermediate join_left(const table &t); query_from_intermediate join_left(join_data &data); query_from_intermediate join_left(std::vector &data_vector); @@ -25,8 +25,8 @@ public: // return where_clause(std::make_unique(std::move(cond))); // } query_where_intermediate where(std::unique_ptr &&cond); - query_group_by_intermediate group_by(const sql::column &col); - query_order_by_intermediate order_by(const sql::column &col); + query_group_by_intermediate group_by(const column &col); + query_order_by_intermediate order_by(const column &col); private: query_where_intermediate where_clause(std::unique_ptr &&cond); diff --git a/include/matador/query/intermediates/query_group_by_intermediate.hpp b/include/matador/query/intermediates/query_group_by_intermediate.hpp index 1fa7d83..5756745 100644 --- a/include/matador/query/intermediates/query_group_by_intermediate.hpp +++ b/include/matador/query/intermediates/query_group_by_intermediate.hpp @@ -12,7 +12,7 @@ class query_group_by_intermediate : public fetchable_query public: using fetchable_query::fetchable_query; - query_order_by_intermediate order_by(const sql::column &col); + query_order_by_intermediate order_by(const column &col); }; } diff --git a/include/matador/query/intermediates/query_insert_intermediate.hpp b/include/matador/query/intermediates/query_insert_intermediate.hpp index 31e145c..fbdf929 100644 --- a/include/matador/query/intermediates/query_insert_intermediate.hpp +++ b/include/matador/query/intermediates/query_insert_intermediate.hpp @@ -14,13 +14,13 @@ public: query_insert_intermediate(); template - query_into_intermediate into(const sql::table &table, const object::repository &schema) { - return into(table, generator::columns(schema)); + query_into_intermediate into(const table &tab, const object::repository &schema) { + return into(tab, generator::columns(schema)); } - query_into_intermediate into(const sql::table &table, std::initializer_list columns); - query_into_intermediate into(const sql::table &table, std::vector &&columns); - query_into_intermediate into(const sql::table &table, const std::vector &column_names); - query_into_intermediate into(const sql::table &table); + query_into_intermediate into(const table &tab, std::initializer_list columns); + query_into_intermediate into(const table &tab, std::vector &&columns); + query_into_intermediate into(const table &tab, const std::vector &column_names); + query_into_intermediate into(const table &tab); }; } diff --git a/include/matador/query/intermediates/query_select_intermediate.hpp b/include/matador/query/intermediates/query_select_intermediate.hpp index 8702e31..58b10df 100644 --- a/include/matador/query/intermediates/query_select_intermediate.hpp +++ b/include/matador/query/intermediates/query_select_intermediate.hpp @@ -10,9 +10,9 @@ class query_from_intermediate; class query_select_intermediate : public query_intermediate { public: - explicit query_select_intermediate(const std::vector& columns); + explicit query_select_intermediate(const std::vector& columns); - query_from_intermediate from(const sql::table& t); + query_from_intermediate from(const table& t); }; } diff --git a/include/matador/query/intermediates/query_update_intermediate.hpp b/include/matador/query/intermediates/query_update_intermediate.hpp index 3412b0c..a1c65b9 100644 --- a/include/matador/query/intermediates/query_update_intermediate.hpp +++ b/include/matador/query/intermediates/query_update_intermediate.hpp @@ -13,7 +13,7 @@ namespace matador::query { class query_update_intermediate : public query_intermediate { public: - explicit query_update_intermediate(const sql::table& table); + explicit query_update_intermediate(const table& tab); query_set_intermediate set(std::initializer_list columns); query_set_intermediate set(std::vector &&columns); diff --git a/include/matador/query/intermediates/query_where_intermediate.hpp b/include/matador/query/intermediates/query_where_intermediate.hpp index 15b990f..97d20fe 100644 --- a/include/matador/query/intermediates/query_where_intermediate.hpp +++ b/include/matador/query/intermediates/query_where_intermediate.hpp @@ -13,8 +13,8 @@ class query_where_intermediate : public fetchable_query public: using fetchable_query::fetchable_query; - query_group_by_intermediate group_by(const sql::column &col); - query_order_by_intermediate order_by(const sql::column &col); + query_group_by_intermediate group_by(const column &col); + query_order_by_intermediate order_by(const column &col); }; } diff --git a/include/matador/query/internal/column_value_pair.hpp b/include/matador/query/internal/column_value_pair.hpp index f17d48e..7674a7e 100644 --- a/include/matador/query/internal/column_value_pair.hpp +++ b/include/matador/query/internal/column_value_pair.hpp @@ -1,7 +1,7 @@ #ifndef QUERY_KEY_VALUE_PAIR_HPP #define QUERY_KEY_VALUE_PAIR_HPP -#include "matador/sql/column.hpp" +#include "matador/query/column.hpp" #include "matador/utils/placeholder.hpp" #include "matador/utils/types.hpp" @@ -10,7 +10,7 @@ namespace matador::query::internal { class column_value_pair { public: - column_value_pair(const sql::column &col, utils::database_type value); + column_value_pair(const column &col, utils::database_type value); column_value_pair(std::string name, utils::database_type value); column_value_pair(const char *name, utils::database_type value); column_value_pair(const char *name, utils::placeholder p); @@ -18,11 +18,11 @@ public: friend bool operator==(const column_value_pair &lhs, const column_value_pair &rhs); friend bool operator!=(const column_value_pair &lhs, const column_value_pair &rhs); - [[nodiscard]] const sql::column& col() const; + [[nodiscard]] const column& col() const; [[nodiscard]] const std::variant& value() const; private: - sql::column column_; + column column_; std::variant value_; }; diff --git a/include/matador/query/internal/query_parts.hpp b/include/matador/query/internal/query_parts.hpp index 6e0b49b..272abb7 100644 --- a/include/matador/query/internal/query_parts.hpp +++ b/include/matador/query/internal/query_parts.hpp @@ -6,10 +6,10 @@ #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/sql/column.hpp" #include "matador/object/attribute_definition.hpp" -#include "matador/sql/table.hpp" #include "matador/utils/placeholder.hpp" @@ -26,19 +26,19 @@ public: class query_alter_table_part final : public query_part { public: - explicit query_alter_table_part(sql::table table); + explicit query_alter_table_part(table tab); void accept(query_part_visitor &visitor) override; - [[nodiscard]] const sql::table& table() const; + [[nodiscard]] const table& table() const; private: - sql::table table_; + query::table table_; }; class query_add_key_constraint_part final : public query_part { public: - explicit query_add_key_constraint_part(const std::string& name); + explicit query_add_key_constraint_part(std::string name); void accept(query_part_visitor &visitor) override; [[nodiscard]] const std::string& name() const; @@ -48,7 +48,7 @@ private: class query_drop_key_constraint_part final : public query_part { public: - explicit query_drop_key_constraint_part(const std::string& name); + explicit query_drop_key_constraint_part(std::string name); void accept(query_part_visitor &visitor) override; [[nodiscard]] const std::string& name() const; @@ -58,35 +58,35 @@ private: class query_add_foreign_key_constraint_part final : public query_part { public: - explicit query_add_foreign_key_constraint_part( const std::vector& columns); + explicit query_add_foreign_key_constraint_part( const std::vector& columns); void accept(query_part_visitor &visitor) override; - [[nodiscard]] const std::vector& columns() const; + [[nodiscard]] const std::vector& columns() const; private: - std::vector columns_; + std::vector columns_; }; class query_add_foreign_key_reference_part final : public query_part { public: - explicit query_add_foreign_key_reference_part(sql::table table, const std::vector& columns); + explicit query_add_foreign_key_reference_part(table tab, const std::vector& columns); void accept(query_part_visitor &visitor) override; - [[nodiscard]] const sql::table& table() const; - [[nodiscard]] const std::vector& columns() const; + [[nodiscard]] const table& table() const; + [[nodiscard]] const std::vector& columns() const; private: - sql::table table_; - std::vector columns_; + 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); + explicit query_add_primary_key_constraint_part( const std::vector& columns); void accept(query_part_visitor &visitor) override; - [[nodiscard]] const std::vector& columns() const; + [[nodiscard]] const std::vector& columns() const; private: - std::vector columns_; + std::vector columns_; }; class query_drop_foreign_key_constraint_part final : public query_part { @@ -101,13 +101,13 @@ public: class query_select_part final : public query_part { public: - explicit query_select_part(std::vector columns); + explicit query_select_part(std::vector columns); void accept(query_part_visitor &visitor) override; - [[nodiscard]] const std::vector& columns() const; + [[nodiscard]] const std::vector& columns() const; private: - std::vector columns_; + std::vector columns_; }; /** @@ -116,29 +116,29 @@ private: class query_from_part final : public query_part { public: - explicit query_from_part(sql::table t); + explicit query_from_part(table t); - [[nodiscard]] const sql::table& table() const; + [[nodiscard]] const table& table() const; private: void accept(query_part_visitor &visitor) override; private: - sql::table table_; + class table table_; }; class query_join_part final : public query_part { public: - explicit query_join_part(sql::table t); + explicit query_join_part(table t); - [[nodiscard]] const sql::table& table() const; + [[nodiscard]] const table& table() const; private: void accept(query_part_visitor &visitor) override; private: - sql::table table_; + class table table_; }; class query_on_part final : public query_part @@ -189,29 +189,29 @@ protected: class query_group_by_part final : public query_part { public: - explicit query_group_by_part(sql::column col); + explicit query_group_by_part(column col); - [[nodiscard]] const sql::column& column() const; + [[nodiscard]] const column& column() const; private: void accept(query_part_visitor &visitor) override; private: - sql::column column_; + class column column_; }; class query_order_by_part final : public query_part { public: - explicit query_order_by_part(sql::column col); + explicit query_order_by_part(column col); - [[nodiscard]] const sql::column& column() const; + [[nodiscard]] const column& column() const; private: void accept(query_part_visitor &visitor) override; private: - sql::column column_; + class column column_; }; class query_order_by_asc_part final : public query_part @@ -272,17 +272,17 @@ private: class query_into_part final : public query_part { public: - query_into_part(sql::table t, std::vector columns); + query_into_part(table t, std::vector columns); - [[nodiscard]] const sql::table& table() const; - [[nodiscard]] const std::vector& columns() const; + [[nodiscard]] const table& table() const; + [[nodiscard]] const std::vector& columns() const; private: void accept(query_part_visitor &visitor) override; private: - sql::table table_; - std::vector columns_; + class table table_; + std::vector columns_; }; /** * Represents the SQL VALUES part @@ -304,15 +304,15 @@ private: class query_update_part final : public query_part { public: - explicit query_update_part(sql::table table); + explicit query_update_part(table table); - [[nodiscard]] const sql::table& table() const; + [[nodiscard]] const table& table() const; private: void accept(query_part_visitor &visitor) override; private: - sql::table table_; + class table table_; }; class query_set_part final : public query_part @@ -341,15 +341,15 @@ private: class query_delete_from_part final : public query_part { public: - explicit query_delete_from_part(sql::table table); + explicit query_delete_from_part(table table); - [[nodiscard]] const sql::table& table() const; + [[nodiscard]] const table& table() const; private: void accept(query_part_visitor &visitor) override; private: - sql::table table_; + class table table_; }; class query_create_part final : public query_part @@ -364,16 +364,16 @@ private: class query_create_table_part final : public query_part { public: - query_create_table_part(sql::table table, std::vector columns); + query_create_table_part(table table, std::vector columns); - [[nodiscard]] const sql::table& table() const; + [[nodiscard]] const table& table() const; [[nodiscard]] const std::vector& columns() const; private: void accept(query_part_visitor &visitor) override; private: - sql::table table_; + class table table_; std::vector columns_; }; @@ -402,15 +402,15 @@ private: class query_drop_table_part final : public query_part { public: - explicit query_drop_table_part(sql::table table); + explicit query_drop_table_part(table table); - [[nodiscard]] const sql::table& table() const; + [[nodiscard]] const table& table() const; private: void accept(query_part_visitor &visitor) override; private: - sql::table table_; + class table table_; }; class query_drop_schema_part final : public query_part { diff --git a/include/matador/query/join_data.hpp b/include/matador/query/join_data.hpp index 9554f01..c495564 100644 --- a/include/matador/query/join_data.hpp +++ b/include/matador/query/join_data.hpp @@ -3,14 +3,14 @@ #include "matador/query/criteria/abstract_criteria.hpp" -#include "matador/sql/table.hpp" +#include "matador/query/table.hpp" #include namespace matador::query { struct join_data { - std::shared_ptr join_table; + std::shared_ptr
join_table; std::unique_ptr condition; }; diff --git a/include/matador/query/query.hpp b/include/matador/query/query.hpp index 99fe701..ddfcf0d 100644 --- a/include/matador/query/query.hpp +++ b/include/matador/query/query.hpp @@ -10,10 +10,10 @@ class connection; } namespace matador::query { -sql::column alias(const std::string &column, const std::string &as); -sql::column alias(sql::column &&col, const std::string &as); -sql::column count(const std::string &column); -sql::column count_all(); +column alias(const std::string &column, const std::string &as); +column alias(column &&col, const std::string &as); +column count(const std::string &column); +column count_all(); class query { @@ -21,16 +21,16 @@ public: [[nodiscard]] static query_create_intermediate create(); [[nodiscard]] static query_drop_intermediate drop(); [[nodiscard]] static query_select_intermediate select(); - [[nodiscard]] static query_select_intermediate select(std::initializer_list columns); - [[nodiscard]] static query_select_intermediate select(const std::vector& columns); + [[nodiscard]] static query_select_intermediate select(std::initializer_list columns); + [[nodiscard]] static query_select_intermediate select(const std::vector& columns); [[nodiscard]] static query_select_intermediate select(const std::vector &column_names); - [[nodiscard]] static query_select_intermediate select(std::vector columns, std::initializer_list additional_columns); + [[nodiscard]] static query_select_intermediate select(std::vector columns, std::initializer_list additional_columns); template [[nodiscard]] static query_select_intermediate select(const object::repository &schema) { return select(generator::columns(schema)); } [[nodiscard]] static query_insert_intermediate insert(); - [[nodiscard]] static query_update_intermediate update(const sql::table &table); + [[nodiscard]] static query_update_intermediate update(const table &table); [[nodiscard]] static query_delete_intermediate remove(); [[nodiscard]] static query_alter_intermediate alter(); diff --git a/include/matador/query/query_compiler.hpp b/include/matador/query/query_compiler.hpp index 7363756..c334552 100644 --- a/include/matador/query/query_compiler.hpp +++ b/include/matador/query/query_compiler.hpp @@ -68,8 +68,7 @@ protected: void visit(internal::query_drop_table_part &part) override; void visit(internal::query_drop_schema_part& part) override; - static std::string build_table_name(sql::dialect_token token, const sql::dialect &d, const sql::table& t); - + static std::string build_table_name(sql::dialect_token token, const sql::dialect &d, const table& t); static std::string determine_value(value_visitor &visitor, const std::variant &val); protected: diff --git a/include/matador/query/query_data.hpp b/include/matador/query/query_data.hpp index bd0ff7f..cb78514 100644 --- a/include/matador/query/query_data.hpp +++ b/include/matador/query/query_data.hpp @@ -6,8 +6,7 @@ #include "matador/object/attribute_definition.hpp" -#include "matador/sql/table.hpp" - +#include "matador/query/table.hpp" #include "matador/query/query_part.hpp" namespace matador::query { @@ -15,7 +14,7 @@ namespace matador::query { struct query_data { std::vector> parts{}; std::vector columns{}; - std::unordered_map tables{}; + std::unordered_map tables{}; }; } diff --git a/include/matador/query/query_utils.hpp b/include/matador/query/query_utils.hpp new file mode 100644 index 0000000..9f9700e --- /dev/null +++ b/include/matador/query/query_utils.hpp @@ -0,0 +1,17 @@ +#ifndef MATADOR_QUERY_UTILS_HPP +#define MATADOR_QUERY_UTILS_HPP + +#include "matador/sql/dialect.hpp" + +#include + +namespace matador::sql { +class dialect; +} +namespace matador::query { +class column; + +[[nodiscard]] std::string prepare_identifier(const sql::dialect& d, const column &col); +[[nodiscard]] std::string prepare_criteria(const sql::dialect& d, const column &col); +} +#endif //MATADOR_QUERY_UTILS_HPP \ No newline at end of file diff --git a/include/matador/sql/table.hpp b/include/matador/query/table.hpp similarity index 94% rename from include/matador/sql/table.hpp rename to include/matador/query/table.hpp index e000680..aa02d72 100644 --- a/include/matador/sql/table.hpp +++ b/include/matador/query/table.hpp @@ -1,12 +1,12 @@ #ifndef QUERY_TABLE_HPP #define QUERY_TABLE_HPP -#include "matador/sql/column.hpp" +#include "column.hpp" #include #include -namespace matador::sql { +namespace matador::query { class column; diff --git a/include/matador/sql/dialect.hpp b/include/matador/sql/dialect.hpp index 7570114..e1de8f0 100644 --- a/include/matador/sql/dialect.hpp +++ b/include/matador/sql/dialect.hpp @@ -1,8 +1,8 @@ #ifndef QUERY_DIALECT_HPP #define QUERY_DIALECT_HPP -#include "matador/sql/column.hpp" #include "matador/sql/dialect_token.hpp" +#include "matador/sql/sql_functions.hpp" #include "matador/utils/basic_types.hpp" #include "matador/utils/types.hpp" @@ -42,6 +42,7 @@ public: public: [[nodiscard]] const std::string& token_at(dialect_token token) const; [[nodiscard]] const std::string& data_type_at(utils::basic_type type) const; + [[nodiscard]] const std::string& sql_function_at(sql_function_t func) const; /** * Prepare sql dialect identifier for execution @@ -51,9 +52,7 @@ public: * @param col The identifier string to be prepared * @return The prepared string */ - [[nodiscard]] std::string prepare_identifier(const column &col) const; [[nodiscard]] std::string prepare_identifier_string(const std::string &col) const; - [[nodiscard]] std::string prepare_condition(const column &col) const; [[nodiscard]] std::string table_name(const std::string &table, const std::string &schema_name) const; [[nodiscard]] const std::string& to_string(bool val) const; diff --git a/include/matador/sql/interface/connection_impl.hpp b/include/matador/sql/interface/connection_impl.hpp index ca304e2..73a969f 100644 --- a/include/matador/sql/interface/connection_impl.hpp +++ b/include/matador/sql/interface/connection_impl.hpp @@ -4,8 +4,10 @@ #include #include "matador/object/attribute_definition.hpp" + #include "matador/sql/connection_info.hpp" #include "matador/sql/query_context.hpp" + #include "matador/utils/error.hpp" #include "matador/utils/result.hpp" #include "matador/utils/version.hpp" diff --git a/include/matador/sql/query_context.hpp b/include/matador/sql/query_context.hpp index 2b5c902..c2d6941 100644 --- a/include/matador/sql/query_context.hpp +++ b/include/matador/sql/query_context.hpp @@ -2,7 +2,7 @@ #define QUERY_QUERY_DATA_HPP #include "matador/object/attribute_definition.hpp" -#include "matador/sql/table.hpp" +#include "matador/query/table.hpp" #include "matador/utils/types.hpp" @@ -35,7 +35,7 @@ struct query_context { sql_command command{}; std::string command_name{}; std::string schema_name{}; - sql::table table{""}; + std::string table_name{}; std::vector prototype{}; std::vector result_vars{}; std::vector bind_vars{}; diff --git a/include/matador/sql/query_macro.hpp b/include/matador/sql/query_macro.hpp index 0aaf0f9..69b8aad 100644 --- a/include/matador/sql/query_macro.hpp +++ b/include/matador/sql/query_macro.hpp @@ -3,8 +3,8 @@ #include "matador/utils/macro_map.hpp" -#include "matador/sql/table.hpp" -#include "matador/sql/column.hpp" +#include "matador/query/table.hpp" +#include "matador/query/column.hpp" #include #include diff --git a/include/matador/sql/record.hpp b/include/matador/sql/record.hpp index 0e7b573..7650b82 100644 --- a/include/matador/sql/record.hpp +++ b/include/matador/sql/record.hpp @@ -8,8 +8,6 @@ namespace matador::sql { -class column; - class record final { private: using field_ref = std::reference_wrapper; @@ -41,11 +39,11 @@ public: [[nodiscard]] const std::vector& columns() const; - [[nodiscard]] const field& at(const sql::column &col) const; + [[nodiscard]] const field& at(const std::string &name) const; [[nodiscard]] const field& at(size_t index) const; template - std::optional at(const column &col) const { - return at(col).as(); + std::optional at(const std::string &name) const { + return at(name).as(); } template std::optional at(const size_t index) const { diff --git a/include/matador/sql/sql_functions.hpp b/include/matador/sql/sql_functions.hpp new file mode 100644 index 0000000..030c254 --- /dev/null +++ b/include/matador/sql/sql_functions.hpp @@ -0,0 +1,14 @@ +#ifndef MATADOR_SQL_FUNCTIONS_HPP +#define MATADOR_SQL_FUNCTIONS_HPP + +namespace matador::sql { +enum class sql_function_t { + None, + Count, + Avg, + Sum, + Min, + Max +}; +} +#endif //MATADOR_SQL_FUNCTIONS_HPP \ No newline at end of file diff --git a/source/orm/CMakeLists.txt b/source/orm/CMakeLists.txt index 490433a..2e45154 100644 --- a/source/orm/CMakeLists.txt +++ b/source/orm/CMakeLists.txt @@ -4,6 +4,8 @@ add_library(matador-orm STATIC ../../include/matador/orm/session.hpp ../../include/matador/orm/session_query_builder.hpp ../../include/matador/query/attribute_string_writer.hpp + ../../include/matador/query/builder.hpp + ../../include/matador/query/column.hpp ../../include/matador/query/criteria.hpp ../../include/matador/query/criteria/abstract_column_criteria.hpp ../../include/matador/query/criteria/abstract_criteria.hpp @@ -16,6 +18,7 @@ add_library(matador-orm STATIC ../../include/matador/query/criteria/logical_criteria.hpp ../../include/matador/query/criteria_evaluator.hpp ../../include/matador/query/fk_value_extractor.hpp + ../../include/matador/query/generator.hpp ../../include/matador/query/intermediates/executable_query.hpp ../../include/matador/query/intermediates/fetchable_query.hpp ../../include/matador/query/intermediates/query_alter_intermediate.hpp @@ -53,10 +56,11 @@ add_library(matador-orm STATIC ../../include/matador/query/query_data.hpp ../../include/matador/query/query_intermediates.hpp ../../include/matador/query/query_part.hpp + ../../include/matador/query/query_utils.hpp + ../../include/matador/query/table.hpp ../../include/matador/query/value_extractor.hpp ../../include/matador/sql/abstract_sql_logger.hpp ../../include/matador/sql/backend_provider.hpp - ../../include/matador/sql/column.hpp ../../include/matador/sql/connection.hpp ../../include/matador/sql/connection_info.hpp ../../include/matador/sql/dialect.hpp @@ -77,14 +81,16 @@ add_library(matador-orm STATIC ../../include/matador/sql/query_macro.hpp ../../include/matador/sql/query_result.hpp ../../include/matador/sql/record.hpp + ../../include/matador/sql/sql_functions.hpp ../../include/matador/sql/statement.hpp - ../../include/matador/sql/table.hpp orm/error_code.cpp orm/query_builder_exception.cpp orm/schema.cpp orm/session.cpp orm/session_query_builder.cpp query/attribute_string_writer.cpp + query/builder.cpp + query/column.cpp query/criteria/abstract_column_criteria.cpp query/criteria/between_criteria.cpp query/criteria/binary_criteria.cpp @@ -94,6 +100,7 @@ add_library(matador-orm STATIC query/criteria/logical_criteria.cpp query/criteria/not_criteria.cpp query/criteria_evaluator.cpp + query/generator.cpp query/intermediates/executable_query.cpp query/intermediates/fetchable_query.cpp query/intermediates/query_alter_intermediate.cpp @@ -129,16 +136,16 @@ add_library(matador-orm STATIC query/query.cpp query/query_compiler.cpp query/query_part.cpp + query/query_utils.cpp + query/table.cpp query/value_extractor.cpp sql/backend_provider.cpp - sql/column.cpp sql/connection.cpp sql/connection_info.cpp sql/connection_pool.cpp sql/dialect.cpp sql/dialect_builder.cpp sql/error_code.cpp - sql/executor.cpp sql/field.cpp sql/interface/connection_impl.cpp sql/interface/query_result_reader.cpp @@ -151,9 +158,6 @@ add_library(matador-orm STATIC sql/record.cpp sql/statement.cpp sql/statement_cache.cpp - sql/table.cpp - ../../include/matador/query/generator.hpp - query/generator.cpp ) target_include_directories(matador-orm diff --git a/source/orm/orm/session.cpp b/source/orm/orm/session.cpp index 4c5d796..4c46dd3 100644 --- a/source/orm/orm/session.cpp +++ b/source/orm/orm/session.cpp @@ -90,13 +90,13 @@ utils::result, utils::error> session::fetch_all(c if (!c.valid()) { return utils::failure(make_error(error_code::NoConnectionAvailable, "Failed to acquire connection.")); } - auto it = prototypes_.find(q.table.name()); + auto it = prototypes_.find(q.table_name); if (it == prototypes_.end()) { - auto result = c->describe(q.table.name()); + auto result = c->describe(q.table_name); if (!result) { return utils::failure(result.err()); } - it = prototypes_.emplace(q.table.name(), *result).first; + it = prototypes_.emplace(q.table_name, *result).first; } // adjust columns from given query for (auto &col: q.prototype) { @@ -175,7 +175,7 @@ query::fetchable_query session::build_select_query(entity_query_data &&data) { .from(*data.root_table) .join_left(data.joins) .where(std::move(data.where_clause)) - .order_by(sql::column{data.root_table, data.pk_column_name}) + .order_by({data.root_table, data.pk_column_name}) .asc(); } } diff --git a/source/orm/orm/session_query_builder.cpp b/source/orm/orm/session_query_builder.cpp index d00e1f9..500c91e 100644 --- a/source/orm/orm/session_query_builder.cpp +++ b/source/orm/orm/session_query_builder.cpp @@ -3,7 +3,7 @@ #include namespace matador::orm { -criteria_transformer::criteria_transformer(const object::repository& repo, const std::unordered_map>& tables_by_name) +criteria_transformer::criteria_transformer(const object::repository& repo, const std::unordered_map>& tables_by_name) : repo_(repo) , tables_by_name_(tables_by_name) {} @@ -39,12 +39,12 @@ void criteria_transformer::visit( const query::not_criteria& node ) { } void criteria_transformer::update_criteria_column(const query::abstract_column_criteria& node) const { - const auto it = tables_by_name_.find(node.column().table()->name()); + const auto it = tables_by_name_.find(node.col().table()->name()); if (it == tables_by_name_.end()) { return; } - const_cast(node.column()).table(it->second); + const_cast(node.col()).table(it->second); } void session_query_builder::on_revision(const char *id, uint64_t &/*rev*/) { @@ -70,7 +70,7 @@ std::string session_query_builder::build_alias(const char prefix, const unsigned return table_info_stack_.size() == 1; } -void session_query_builder::append_join(const sql::column &left, const sql::column &right) { +void session_query_builder::append_join(const query::column &left, const query::column &right) { using namespace matador::query; entity_query_data_.joins.push_back({ {right.table()}, diff --git a/source/orm/query/builder.cpp b/source/orm/query/builder.cpp new file mode 100644 index 0000000..d2fed9a --- /dev/null +++ b/source/orm/query/builder.cpp @@ -0,0 +1,62 @@ +#include "matador/query/builder.hpp" + +namespace matador::query { + +column_builder::column_builder(std::string column_name) +: column_name( std::move(column_name) ) {} + +column_builder::operator class query::column() const { + return {column_name}; +} + +table_builder::table_builder(std::string name) +: table_name( std::move(name) ) {} + +table_builder& table_builder::as( std::string table_alias ) { + this->alias = std::move(table_alias); + return *this; +} + +table_builder::operator class query::table() const { + return {table_name, alias}; +} + +constraint_builder& constraint_builder::constraint( std::string name ) { + constraint_name = std::move(name); + return *this; +} + +constraint_builder& constraint_builder::primary_key( std::string name ) { + pk_column_name = std::move(name); + return *this; +} + +constraint_builder& constraint_builder::foreign_key( std::string name ) { + fk_column_name = std::move(name); + return *this; +} + +constraint_builder& constraint_builder::references( std::string table, std::string column ) { + this->table_name = std::move(table); + this->column_name = std::move(column); + return *this; +} + +constraint_builder::operator struct query::constraint() const { + return {constraint_name}; +} + +constraint_builder constraint( std::string name ) { + constraint_builder builder; + return builder.constraint(std::move(name)); +} + +table_builder table( std::string name ) { +return table_builder(std::move(name)); +} + +column_builder column( std::string name ) { + return column_builder(std::move(name)); +} + +} \ No newline at end of file diff --git a/source/orm/sql/column.cpp b/source/orm/query/column.cpp similarity index 72% rename from source/orm/sql/column.cpp rename to source/orm/query/column.cpp index 9983e8e..c7f9c1a 100644 --- a/source/orm/sql/column.cpp +++ b/source/orm/query/column.cpp @@ -1,12 +1,11 @@ -#include "matador/sql/column.hpp" +#include "matador/query/column.hpp" -#include "matador/sql/table.hpp" +#include "matador/query/table.hpp" #include #include - -namespace matador::sql { +namespace matador::query { column operator ""_col(const char *name, size_t len) { const std::string str(name, len); @@ -27,23 +26,23 @@ column::column(const char *name, const std::string& as) {} column::column(std::string name, std::string as) -: table_(std::make_shared()) +: table_(std::make_shared()) , name(std::move(name)) , alias_(std::move(as)) {} -column::column(const sql_function_t func, std::string name) -: table_(std::make_shared()) +column::column(const sql::sql_function_t func, std::string name) +: table_(std::make_shared()) , name(std::move(name)) , function_(func) {} -column::column(const sql::table& tab, std::string name, std::string as) -: table_(std::make_shared(tab)) +column::column(const query::table& tab, std::string name, std::string as) +: table_(std::make_shared(tab)) , name(std::move(name)) , alias_(std::move(as)) { table_->columns_.push_back(*this); } -column::column(const std::shared_ptr& t, std::string name, std::string as) +column::column(const std::shared_ptr& t, std::string name, std::string as) : table_(t) , name(std::move(name)) , alias_(std::move(as)) { @@ -77,10 +76,10 @@ const std::string& column::alias_name() const { } bool column::is_function() const { - return function_ != sql_function_t::None; + return function_ != sql::sql_function_t::None; } -sql_function_t column::function() const { +sql::sql_function_t column::function() const { return function_; } @@ -96,7 +95,7 @@ std::shared_ptr
column::table() const { return table_; } -void column::table( const std::shared_ptr& t ) { +void column::table( const std::shared_ptr& t ) { table_ = t; } } \ No newline at end of file diff --git a/source/orm/query/criteria/abstract_column_criteria.cpp b/source/orm/query/criteria/abstract_column_criteria.cpp index 6686217..fb27232 100644 --- a/source/orm/query/criteria/abstract_column_criteria.cpp +++ b/source/orm/query/criteria/abstract_column_criteria.cpp @@ -1,10 +1,10 @@ #include "matador/query/criteria/abstract_column_criteria.hpp" namespace matador::query { -abstract_column_criteria::abstract_column_criteria(sql::column column) -: column_(std::move(column)) {} +abstract_column_criteria::abstract_column_criteria(column col) +: column_(std::move(col)) {} -const sql::column& abstract_column_criteria::column() const { +const column& abstract_column_criteria::col() const { return column_; } } \ No newline at end of file diff --git a/source/orm/query/criteria/between_criteria.cpp b/source/orm/query/criteria/between_criteria.cpp index 6058faa..a200796 100644 --- a/source/orm/query/criteria/between_criteria.cpp +++ b/source/orm/query/criteria/between_criteria.cpp @@ -3,14 +3,14 @@ #include "matador/query/criteria/criteria_visitor.hpp" namespace matador::query{ -between_criteria::between_criteria(sql::column column, const int64_t min, const int64_t max) -: abstract_column_criteria(std::move(column)) +between_criteria::between_criteria(column col, const int64_t min, const int64_t max) +: abstract_column_criteria(std::move(col)) , min_(utils::value{min}) , max_(utils::value{max}) {} -between_criteria::between_criteria(sql::column column, utils::placeholder min, utils::placeholder max) -: abstract_column_criteria(std::move(column)) +between_criteria::between_criteria(column col, utils::placeholder min, utils::placeholder max) +: abstract_column_criteria(std::move(col)) , min_(min) , max_(max) {} diff --git a/source/orm/query/criteria/binary_criteria.cpp b/source/orm/query/criteria/binary_criteria.cpp index 65e05f9..ec3b864 100644 --- a/source/orm/query/criteria/binary_criteria.cpp +++ b/source/orm/query/criteria/binary_criteria.cpp @@ -3,8 +3,8 @@ #include "matador/query/criteria/criteria_visitor.hpp" namespace matador::query { -binary_criteria::binary_criteria(sql::column column, const binary_operator operand, criteria_value value) -: abstract_column_criteria(std::move(column)) +binary_criteria::binary_criteria(column col, const binary_operator operand, criteria_value value) +: abstract_column_criteria(std::move(col)) , operator_(operand) , value_(std::move(value)) {} @@ -21,7 +21,7 @@ const criteria_value& binary_criteria::value() const { return value_; } -binary_column_criteria::binary_column_criteria( sql::column left_column, binary_operator operand, sql::column right_column ) +binary_column_criteria::binary_column_criteria(column left_column, binary_operator operand, column right_column) : left_column_(std::move(left_column)) , operator_(operand) , right_column_(std::move(right_column)){} @@ -30,7 +30,7 @@ void binary_column_criteria::accept(criteria_visitor& visitor) const { visitor.visit(*this); } -const sql::column& binary_column_criteria::left_column() const { +const column& binary_column_criteria::left_column() const { return left_column_; } @@ -38,7 +38,7 @@ binary_operator binary_column_criteria::operand() const { return operator_; } -const sql::column& binary_column_criteria::right_column() const { +const column& binary_column_criteria::right_column() const { return right_column_; } } diff --git a/source/orm/query/criteria/collection_criteria.cpp b/source/orm/query/criteria/collection_criteria.cpp index dcc57f3..9db0ee5 100644 --- a/source/orm/query/criteria/collection_criteria.cpp +++ b/source/orm/query/criteria/collection_criteria.cpp @@ -3,13 +3,13 @@ #include "matador/query/criteria/criteria_visitor.hpp" namespace matador::query { -collection_criteria::collection_criteria(sql::column col, const collection_operator operand_, std::vector values ) +collection_criteria::collection_criteria(column col, const collection_operator operand_, std::vector values ) : abstract_column_criteria(std::move(col)) , operand_(operand_) , values_(std::move(values)) {} -collection_criteria::collection_criteria(sql::column col, const collection_operator operand_, const std::initializer_list values ) +collection_criteria::collection_criteria(column col, const collection_operator operand_, const std::initializer_list values ) : abstract_column_criteria(std::move(col)) , operand_(operand_) , values_(values) @@ -27,7 +27,7 @@ const std::vector& collection_criteria::values() const { return values_; } -collection_query_criteria::collection_query_criteria(sql::column col, collection_operator operand_, sql::query_context ctx) +collection_query_criteria::collection_query_criteria(column col, collection_operator operand_, sql::query_context ctx) : abstract_column_criteria(std::move(col)) , operand_(operand_) , query_context_(std::move(ctx)){ diff --git a/source/orm/query/criteria/criteria_operators.cpp b/source/orm/query/criteria/criteria_operators.cpp index d7de339..c648055 100644 --- a/source/orm/query/criteria/criteria_operators.cpp +++ b/source/orm/query/criteria/criteria_operators.cpp @@ -6,51 +6,51 @@ #include "matador/query/criteria/not_criteria.hpp" namespace matador::query { -criteria_ptr operator==(const sql::column &col, utils::placeholder p) { +criteria_ptr operator==(const column &col, utils::placeholder p) { return std::make_unique(col, binary_operator::EQUALS, p); } -criteria_ptr operator!=(const sql::column &col, utils::placeholder p) { +criteria_ptr operator!=(const column &col, utils::placeholder p) { return std::make_unique(col, binary_operator::NOT_EQUALS, p); } -criteria_ptr operator>(const sql::column &col, utils::placeholder p) { +criteria_ptr operator>(const column &col, utils::placeholder p) { return std::make_unique(col, binary_operator::GREATER_THAN, p); } -criteria_ptr operator>=(const sql::column &col, utils::placeholder p) { +criteria_ptr operator>=(const column &col, utils::placeholder p) { return std::make_unique(col, binary_operator::GREATER_THAN_OR_EQUAL, p); } -criteria_ptr operator<(const sql::column &col, utils::placeholder p) { +criteria_ptr operator<(const column &col, utils::placeholder p) { return std::make_unique(col, binary_operator::LESS_THAN, p); } -criteria_ptr operator<=(const sql::column &col, utils::placeholder p) { +criteria_ptr operator<=(const column &col, utils::placeholder p) { return std::make_unique(col, binary_operator::LESS_THAN_OR_EQUAL, p); } -criteria_ptr operator==( const sql::column& col_left, const sql::column& col_right ) { +criteria_ptr operator==( const column& col_left, const column& col_right ) { return std::make_unique(col_left, binary_operator::EQUALS, col_right); } -criteria_ptr operator!=( const sql::column& col_left, const sql::column& col_right ) { +criteria_ptr operator!=( const column& col_left, const column& col_right ) { return std::make_unique(col_left, binary_operator::NOT_EQUALS, col_right); } -criteria_ptr operator>( const sql::column& col_left, const sql::column& col_right ) { +criteria_ptr operator>( const column& col_left, const column& col_right ) { return std::make_unique(col_left, binary_operator::GREATER_THAN, col_right); } -criteria_ptr operator>=( const sql::column& col_left, const sql::column& col_right ) { +criteria_ptr operator>=( const column& col_left, const column& col_right ) { return std::make_unique(col_left, binary_operator::GREATER_THAN_OR_EQUAL, col_right); } -criteria_ptr operator<( const sql::column& col_left, const sql::column& col_right ) { +criteria_ptr operator<( const column& col_left, const column& col_right ) { return std::make_unique(col_left, binary_operator::LESS_THAN, col_right); } -criteria_ptr operator<=( const sql::column& col_left, const sql::column& col_right ) { +criteria_ptr operator<=( const column& col_left, const column& col_right ) { return std::make_unique(col_left, binary_operator::LESS_THAN_OR_EQUAL, col_right); } @@ -67,7 +67,7 @@ criteria_ptr operator!(criteria_ptr clause) { } template <> -criteria_ptr in(const sql::column &col, const std::initializer_list args) { +criteria_ptr in(const column &col, const std::initializer_list args) { std::vector values; for ( auto &&arg : args ) { values.emplace_back(arg); @@ -75,12 +75,12 @@ criteria_ptr in(const sql::column &col, const std::initializer_list(col, collection_operator::In, std::move(values)); } -criteria_ptr in(const sql::column &col, sql::query_context &&ctx) { +criteria_ptr in(const column &col, sql::query_context &&ctx) { return std::make_unique(col, collection_operator::In, std::move(ctx)); } template <> -criteria_ptr out(const sql::column &col, const std::initializer_list args) { +criteria_ptr out(const column &col, const std::initializer_list args) { std::vector values; for ( auto &&arg : args ) { values.emplace_back(arg); @@ -88,19 +88,19 @@ criteria_ptr out(const sql::column &col, const std::initializer_list(col, collection_operator::Out, values); } -criteria_ptr out(const sql::column &col, sql::query_context &&ctx) { +criteria_ptr out(const column &col, sql::query_context &&ctx) { return std::make_unique(col, collection_operator::In, std::move(ctx)); } -criteria_ptr between(const sql::column &col, const int64_t min, const int64_t max) { +criteria_ptr between(const column &col, const int64_t min, const int64_t max) { return std::make_unique(col, min, max); } -criteria_ptr between(const sql::column &col, utils::placeholder min, utils::placeholder max) { +criteria_ptr between(const column &col, utils::placeholder min, utils::placeholder max) { return std::make_unique(col, min, max); } -criteria_ptr like(const sql::column &col, const std::string &pattern) { +criteria_ptr like(const column &col, const std::string &pattern) { return std::make_unique(col, pattern); } } diff --git a/source/orm/query/criteria/like_criteria.cpp b/source/orm/query/criteria/like_criteria.cpp index 28a512c..28d67ed 100644 --- a/source/orm/query/criteria/like_criteria.cpp +++ b/source/orm/query/criteria/like_criteria.cpp @@ -3,8 +3,8 @@ #include "matador/query/criteria/criteria_visitor.hpp" namespace matador::query { -like_criteria::like_criteria(sql::column column, std::string pattern) -: abstract_column_criteria(std::move(column)) +like_criteria::like_criteria(column col, std::string pattern) +: abstract_column_criteria(std::move(col)) , pattern_(std::move(pattern)){} void like_criteria::accept(criteria_visitor &visitor) const { diff --git a/source/orm/query/criteria_evaluator.cpp b/source/orm/query/criteria_evaluator.cpp index 1ab3d69..daadad9 100644 --- a/source/orm/query/criteria_evaluator.cpp +++ b/source/orm/query/criteria_evaluator.cpp @@ -1,5 +1,6 @@ #include "matador/query/criteria_evaluator.hpp" +#include "matador/query/query_utils.hpp" #include "matador/query/criteria/between_criteria.hpp" #include "matador/query/criteria/binary_criteria.hpp" #include "matador/query/criteria/collection_criteria.hpp" @@ -38,9 +39,9 @@ std::string criteria_evaluator::evaluate(const abstract_criteria &node) { } void criteria_evaluator::visit(const between_criteria &node) { - query_.bind_vars.emplace_back(node.column().column_name()); - query_.bind_vars.emplace_back(node.column().column_name()); - clause_ += dialect_.prepare_identifier(node.column()) + " " + dialect_.token_at(sql::dialect_token::Between) + " "; + query_.bind_vars.emplace_back(node.col().column_name()); + query_.bind_vars.emplace_back(node.col().column_name()); + clause_ += prepare_identifier(dialect_, node.col()) + " " + dialect_.token_at(sql::dialect_token::Between) + " "; evaluate_value(node.minimum()); clause_ += " " + dialect_.token_at(sql::dialect_token::And) + " "; evaluate_value(node.maximum()); @@ -50,23 +51,23 @@ template struct overload : Ts... { using Ts::operator()...; }; template overload(Ts...) -> overload; void criteria_evaluator::visit(const binary_criteria &node) { - query_.bind_vars.emplace_back(node.column().column_name()); - clause_ += dialect_.prepare_condition(node.column()) + " " + detail::BinaryOperatorEnum.to_string(node.operand()) + " "; + query_.bind_vars.emplace_back(node.col().column_name()); + clause_ += prepare_criteria(dialect_, node.col()) + " " + detail::BinaryOperatorEnum.to_string(node.operand()) + " "; evaluate_value(node.value()); } void criteria_evaluator::visit( const binary_column_criteria& node ) { - clause_ += dialect_.prepare_condition(node.left_column()) + " " + detail::BinaryOperatorEnum.to_string(node.operand()) + " " + dialect_.prepare_condition(node.right_column()); + clause_ += prepare_criteria(dialect_, node.left_column()) + " " + detail::BinaryOperatorEnum.to_string(node.operand()) + " " + prepare_criteria(dialect_, node.right_column()); } void criteria_evaluator::visit(const collection_criteria &node) { const auto count = node.values().size(); for (size_t i = 0; i < count; ++i) { - query_.bind_vars.emplace_back(node.column().column_name()); + query_.bind_vars.emplace_back(node.col().column_name()); } - clause_ += dialect_.prepare_identifier(node.column()) + + clause_ += prepare_identifier(dialect_, node.col()) + (node.operand() == collection_operator::Out ? " " + dialect_.token_at(sql::dialect_token::Not) + " " : " ") + dialect_.token_at(sql::dialect_token::In) + " ("; if (node.values().size() < 2) { @@ -85,13 +86,13 @@ void criteria_evaluator::visit(const collection_criteria &node) { } void criteria_evaluator::visit(const collection_query_criteria &node) { - clause_ += dialect_.prepare_identifier(node.column()) + + clause_ += prepare_identifier(dialect_, node.col()) + (node.operand() == collection_operator::Out ? " " + dialect_.token_at(sql::dialect_token::Not) + " " : " ") + dialect_.token_at(sql::dialect_token::In) + " (" +node.context().sql + ")"; } void criteria_evaluator::visit(const like_criteria &node) { - clause_ += dialect_.prepare_condition(node.column()) + " " + dialect_.token_at(sql::dialect_token::Like) + + clause_ += prepare_criteria(dialect_, node.col()) + " " + dialect_.token_at(sql::dialect_token::Like) + " " + dialect_.token_at(sql::dialect_token::BeginStringData) + node.pattern() + dialect_.token_at( sql::dialect_token::EndStringData); } diff --git a/source/orm/query/generator.cpp b/source/orm/query/generator.cpp index e130579..949d174 100644 --- a/source/orm/query/generator.cpp +++ b/source/orm/query/generator.cpp @@ -3,13 +3,13 @@ namespace matador::query::generator { column_generator::column_generator( const std::string& table_name, const column_generator_options options) : options_(options) { - table_stack_.push(table_name.empty() ? std::make_shared() : std::make_shared(table_name)); + table_stack_.push(table_name.empty() ? std::make_shared
() : std::make_shared
(table_name)); } column_generator::column_generator(const object::repository& repo, const std::string& table_name, const column_generator_options options) : repo_(std::cref(repo)) , options_(options) { - table_stack_.push(table_name.empty() ? std::make_shared() : std::make_shared(table_name)); + table_stack_.push(table_name.empty() ? std::make_shared
() : std::make_shared
(table_name)); } void column_generator::on_revision( const char* id, uint64_t& ) { diff --git a/source/orm/query/intermediates/query_alter_intermediate.cpp b/source/orm/query/intermediates/query_alter_intermediate.cpp index cd1626f..cc901a8 100644 --- a/source/orm/query/intermediates/query_alter_intermediate.cpp +++ b/source/orm/query/intermediates/query_alter_intermediate.cpp @@ -7,8 +7,8 @@ query_alter_intermediate::query_alter_intermediate() { context_->parts.push_back(std::make_unique()); } -query_alter_table_intermediate query_alter_intermediate::table( const sql::table& table ) const { - context_->parts.push_back(std::make_unique(table)); +query_alter_table_intermediate query_alter_intermediate::table(const class table& tab) const { + context_->parts.push_back(std::make_unique(tab)); return {context_}; } } \ No newline at end of file diff --git a/source/orm/query/intermediates/query_alter_table_intermediate.cpp b/source/orm/query/intermediates/query_alter_table_intermediate.cpp index 2baa17f..7d4c0c9 100644 --- a/source/orm/query/intermediates/query_alter_table_intermediate.cpp +++ b/source/orm/query/intermediates/query_alter_table_intermediate.cpp @@ -3,27 +3,27 @@ #include "matador/query/internal/query_parts.hpp" namespace matador::query { -executable_query query_add_foreign_key_constraint_intermediate::references( const sql::table& table, const std::vector& columns) { - context_->parts.push_back(std::make_unique(table, columns)); +executable_query query_add_foreign_key_constraint_intermediate::references( const table& tab, const std::vector& columns) { + context_->parts.push_back(std::make_unique(tab, columns)); return {context_}; } -query_add_primary_key_constraint_intermediate query_add_key_constraint_intermediate::primary_key(const sql::column& column) const { - return primary_keys({column}); +query_add_primary_key_constraint_intermediate query_add_key_constraint_intermediate::primary_key(const column& col) const { + return primary_keys({col}); } -query_add_primary_key_constraint_intermediate query_add_key_constraint_intermediate::primary_keys( const std::vector& columns ) const { +query_add_primary_key_constraint_intermediate query_add_key_constraint_intermediate::primary_keys( const std::vector& columns) const { context_->parts.push_back(std::make_unique(columns)); return {context_}; } -query_add_foreign_key_constraint_intermediate query_add_key_constraint_intermediate::foreign_key(const sql::column& column) const { - return foreign_keys({column}); +query_add_foreign_key_constraint_intermediate query_add_key_constraint_intermediate::foreign_key(const column& col) const { + return foreign_keys({col}); } -query_add_foreign_key_constraint_intermediate query_add_key_constraint_intermediate::foreign_keys( const std::vector& columns ) const { +query_add_foreign_key_constraint_intermediate query_add_key_constraint_intermediate::foreign_keys(const std::vector& columns) const { context_->parts.push_back(std::make_unique(columns)); return {context_}; diff --git a/source/orm/query/intermediates/query_create_intermediate.cpp b/source/orm/query/intermediates/query_create_intermediate.cpp index 0895ba7..859968f 100644 --- a/source/orm/query/intermediates/query_create_intermediate.cpp +++ b/source/orm/query/intermediates/query_create_intermediate.cpp @@ -8,12 +8,12 @@ query_create_intermediate::query_create_intermediate() { context_->parts.push_back(std::make_unique()); } -executable_query query_create_intermediate::table(const sql::table &table, const std::initializer_list columns) { - return this->table(table, std::vector{columns}); +executable_query query_create_intermediate::table(const class table &tab, const std::initializer_list columns) { + return this->table(tab, std::vector{columns}); } -executable_query query_create_intermediate::table(const sql::table &table, const std::vector &columns) { - context_->parts.push_back(std::make_unique(table, columns)); +executable_query query_create_intermediate::table(const class table &tab, const std::vector &columns) { + context_->parts.push_back(std::make_unique(tab, columns)); return {context_}; } diff --git a/source/orm/query/intermediates/query_delete_intermediate.cpp b/source/orm/query/intermediates/query_delete_intermediate.cpp index 2e7c9e3..f7da22a 100644 --- a/source/orm/query/intermediates/query_delete_intermediate.cpp +++ b/source/orm/query/intermediates/query_delete_intermediate.cpp @@ -6,14 +6,12 @@ namespace matador::query { -query_delete_intermediate::query_delete_intermediate() -{ +query_delete_intermediate::query_delete_intermediate() { context_->parts.push_back(std::make_unique()); } -query_delete_from_intermediate query_delete_intermediate::from(const sql::table &table) -{ - context_->parts.push_back(std::make_unique(table)); +query_delete_from_intermediate query_delete_intermediate::from(const table &tab) { + context_->parts.push_back(std::make_unique(tab)); return {context_}; } diff --git a/source/orm/query/intermediates/query_drop_intermediate.cpp b/source/orm/query/intermediates/query_drop_intermediate.cpp index ae9814e..d3f633c 100644 --- a/source/orm/query/intermediates/query_drop_intermediate.cpp +++ b/source/orm/query/intermediates/query_drop_intermediate.cpp @@ -8,8 +8,8 @@ query_drop_intermediate::query_drop_intermediate() { context_->parts.push_back(std::make_unique()); } -executable_query query_drop_intermediate::table(const sql::table &table) { - context_->parts.push_back(std::make_unique(table)); +executable_query query_drop_intermediate::table(const class table &tab) { + context_->parts.push_back(std::make_unique(tab)); return {context_}; } diff --git a/source/orm/query/intermediates/query_execute_where_intermediate.cpp b/source/orm/query/intermediates/query_execute_where_intermediate.cpp index edc0991..a778ec2 100644 --- a/source/orm/query/intermediates/query_execute_where_intermediate.cpp +++ b/source/orm/query/intermediates/query_execute_where_intermediate.cpp @@ -7,14 +7,12 @@ namespace matador::query { -query_execute_limit_intermediate query_execute_where_intermediate::limit(size_t limit) -{ +query_execute_limit_intermediate query_execute_where_intermediate::limit(size_t limit) { context_->parts.push_back(std::make_unique(limit)); return {context_}; } -query_execute_order_by_intermediate query_execute_where_intermediate::order_by(const sql::column &col) -{ +query_execute_order_by_intermediate query_execute_where_intermediate::order_by(const column &col) { context_->parts.push_back(std::make_unique(col)); return {context_}; } diff --git a/source/orm/query/intermediates/query_from_intermediate.cpp b/source/orm/query/intermediates/query_from_intermediate.cpp index 41e32b0..2342e2b 100644 --- a/source/orm/query/intermediates/query_from_intermediate.cpp +++ b/source/orm/query/intermediates/query_from_intermediate.cpp @@ -8,7 +8,7 @@ namespace matador::query { -query_join_intermediate query_from_intermediate::join_left(const sql::table &t) { +query_join_intermediate query_from_intermediate::join_left(const table &t) { context_->parts.push_back(std::make_unique(t)); return {context_}; } @@ -38,12 +38,12 @@ query_where_intermediate query_from_intermediate::where_clause(std::unique_ptrparts.push_back(std::make_unique(col)); return {context_}; } -query_order_by_intermediate query_from_intermediate::order_by(const sql::column &col) { +query_order_by_intermediate query_from_intermediate::order_by(const column &col) { context_->parts.push_back(std::make_unique(col)); return {context_}; } diff --git a/source/orm/query/intermediates/query_group_by_intermediate.cpp b/source/orm/query/intermediates/query_group_by_intermediate.cpp index f915b7c..4dd64c8 100644 --- a/source/orm/query/intermediates/query_group_by_intermediate.cpp +++ b/source/orm/query/intermediates/query_group_by_intermediate.cpp @@ -5,8 +5,7 @@ namespace matador::query { -query_order_by_intermediate query_group_by_intermediate::order_by(const sql::column &col) -{ +query_order_by_intermediate query_group_by_intermediate::order_by(const column &col) { context_->parts.push_back(std::make_unique(col)); return {context_}; } diff --git a/source/orm/query/intermediates/query_insert_intermediate.cpp b/source/orm/query/intermediates/query_insert_intermediate.cpp index f48a695..b6d574a 100644 --- a/source/orm/query/intermediates/query_insert_intermediate.cpp +++ b/source/orm/query/intermediates/query_insert_intermediate.cpp @@ -6,33 +6,30 @@ namespace matador::query { -query_insert_intermediate::query_insert_intermediate() -{ +query_insert_intermediate::query_insert_intermediate() { context_->parts.push_back(std::make_unique()); } -query_into_intermediate query_insert_intermediate::into(const sql::table &table, const std::initializer_list columns) -{ - return into(table, std::move(std::vector{columns})); +query_into_intermediate query_insert_intermediate::into(const table &tab, const std::initializer_list columns) { + return into(tab, std::move(std::vector{columns})); } -query_into_intermediate query_insert_intermediate::into(const sql::table &table, std::vector &&columns) -{ - context_->parts.push_back(std::make_unique(table, columns)); +query_into_intermediate query_insert_intermediate::into(const table &tab, std::vector &&columns) { + context_->parts.push_back(std::make_unique(tab, columns)); return {context_}; } -query_into_intermediate query_insert_intermediate::into(const sql::table &table, const std::vector &column_names) { - std::vector columns; +query_into_intermediate query_insert_intermediate::into(const table &tab, const std::vector &column_names) { + std::vector columns; columns.reserve(column_names.size()); for (const auto &col_name : column_names) { columns.emplace_back(col_name); } - return into(table, std::move(columns)); + return into(tab, std::move(columns)); } -query_into_intermediate query_insert_intermediate::into(const sql::table &table) { - context_->parts.push_back(std::make_unique(table, table.columns())); +query_into_intermediate query_insert_intermediate::into(const table &tab) { + context_->parts.push_back(std::make_unique(tab, tab.columns())); return {context_}; } diff --git a/source/orm/query/intermediates/query_select_intermediate.cpp b/source/orm/query/intermediates/query_select_intermediate.cpp index 029ffc4..e35752f 100644 --- a/source/orm/query/intermediates/query_select_intermediate.cpp +++ b/source/orm/query/intermediates/query_select_intermediate.cpp @@ -6,13 +6,11 @@ namespace matador::query { -query_select_intermediate::query_select_intermediate(const std::vector& columns) -{ +query_select_intermediate::query_select_intermediate(const std::vector& columns) { context_->parts.push_back(std::make_unique(columns)); } -query_from_intermediate query_select_intermediate::from(const sql::table& t) -{ +query_from_intermediate query_select_intermediate::from(const table& t) { context_->parts.push_back(std::make_unique(t)); context_->tables.insert({t.name(), t}); return {context_}; diff --git a/source/orm/query/intermediates/query_update_intermediate.cpp b/source/orm/query/intermediates/query_update_intermediate.cpp index 0d1b369..de1ce46 100644 --- a/source/orm/query/intermediates/query_update_intermediate.cpp +++ b/source/orm/query/intermediates/query_update_intermediate.cpp @@ -4,18 +4,15 @@ namespace matador::query { -query_update_intermediate::query_update_intermediate(const sql::table& table) -{ - context_->parts.push_back(std::make_unique(table)); +query_update_intermediate::query_update_intermediate(const table& tab) { + context_->parts.push_back(std::make_unique(tab)); } -query_set_intermediate query_update_intermediate::set(const std::initializer_list columns) -{ +query_set_intermediate query_update_intermediate::set(const std::initializer_list columns) { return set(std::vector{columns}); } -query_set_intermediate query_update_intermediate::set(std::vector &&columns) -{ +query_set_intermediate query_update_intermediate::set(std::vector &&columns) { context_->parts.push_back(std::make_unique(std::move(columns))); return {context_}; } diff --git a/source/orm/query/intermediates/query_where_intermediate.cpp b/source/orm/query/intermediates/query_where_intermediate.cpp index 2b3a47d..91743b5 100644 --- a/source/orm/query/intermediates/query_where_intermediate.cpp +++ b/source/orm/query/intermediates/query_where_intermediate.cpp @@ -6,14 +6,12 @@ namespace matador::query { -query_group_by_intermediate query_where_intermediate::group_by(const sql::column &col) -{ +query_group_by_intermediate query_where_intermediate::group_by(const column &col) { context_->parts.push_back(std::make_unique(col)); return {context_}; } -query_order_by_intermediate query_where_intermediate::order_by(const sql::column &col) -{ +query_order_by_intermediate query_where_intermediate::order_by(const column &col) { context_->parts.push_back(std::make_unique(col)); return {context_}; } diff --git a/source/orm/query/internal/column_value_pair.cpp b/source/orm/query/internal/column_value_pair.cpp index 45826ff..360314d 100644 --- a/source/orm/query/internal/column_value_pair.cpp +++ b/source/orm/query/internal/column_value_pair.cpp @@ -9,7 +9,7 @@ column_value_pair::column_value_pair(std::string name, utils::database_type valu , value_(std::move(value)) { } -column_value_pair::column_value_pair(const sql::column &col, utils::database_type value) +column_value_pair::column_value_pair(const column &col, utils::database_type value) : column_(col) , value_(std::move(value)) { } @@ -23,7 +23,7 @@ column_value_pair::column_value_pair( const char* name, utils::placeholder p ) : column_(name) , value_(p) {} -const sql::column &column_value_pair::col() const { +const column &column_value_pair::col() const { return column_; } diff --git a/source/orm/query/internal/query_parts.cpp b/source/orm/query/internal/query_parts.cpp index b87dfeb..9911437 100644 --- a/source/orm/query/internal/query_parts.cpp +++ b/source/orm/query/internal/query_parts.cpp @@ -10,21 +10,21 @@ void query_alter_part::accept( query_part_visitor& visitor ) { visitor.visit(*this); } -query_alter_table_part::query_alter_table_part(sql::table table ) +query_alter_table_part::query_alter_table_part(class table tab) : query_part(sql::dialect_token::Table) -, table_(std::move(table)) {} +, table_(std::move(tab)) {} -void query_alter_table_part::accept( query_part_visitor& visitor ) { +void query_alter_table_part::accept(query_part_visitor& visitor) { visitor.visit(*this); } -const sql::table& query_alter_table_part::table() const { +const table& query_alter_table_part::table() const { return table_; } -query_add_key_constraint_part::query_add_key_constraint_part(const std::string& name) +query_add_key_constraint_part::query_add_key_constraint_part(std::string name) : query_part(sql::dialect_token::AddConstraint) -, name_(name){} +, name_(std::move(name)){} void query_add_key_constraint_part::accept( query_part_visitor& visitor ) { visitor.visit(*this); @@ -34,9 +34,9 @@ const std::string& query_add_key_constraint_part::name() const { return name_; } -query_drop_key_constraint_part::query_drop_key_constraint_part( const std::string& name ) +query_drop_key_constraint_part::query_drop_key_constraint_part(std::string name) : query_part( sql::dialect_token::DropConstraint ) -, name_( name ){} +, name_(std::move( name )){} void query_drop_key_constraint_part::accept( query_part_visitor& visitor ) { visitor.visit(*this); @@ -53,7 +53,7 @@ void query_drop_foreign_key_constraint_part::accept( query_part_visitor& visitor visitor.visit(*this); } -query_add_foreign_key_constraint_part::query_add_foreign_key_constraint_part(const std::vector& columns) +query_add_foreign_key_constraint_part::query_add_foreign_key_constraint_part(const std::vector& columns) : query_part(sql::dialect_token::ForeignKey) , columns_(columns) {} @@ -61,28 +61,28 @@ void query_add_foreign_key_constraint_part::accept( query_part_visitor& visitor visitor.visit(*this); } -const std::vector& query_add_foreign_key_constraint_part::columns() const { +const std::vector& query_add_foreign_key_constraint_part::columns() const { return columns_; } -query_add_foreign_key_reference_part::query_add_foreign_key_reference_part( sql::table table, const std::vector& columns ) +query_add_foreign_key_reference_part::query_add_foreign_key_reference_part(class table tab, const std::vector& columns) : query_part(sql::dialect_token::References) -, table_(std::move(table)) +, table_(std::move(tab)) , columns_(columns) {} void query_add_foreign_key_reference_part::accept( query_part_visitor& visitor ) { visitor.visit(*this); } -const sql::table& query_add_foreign_key_reference_part::table() const { +const table& query_add_foreign_key_reference_part::table() const { return table_; } -const std::vector& query_add_foreign_key_reference_part::columns() const { +const std::vector& query_add_foreign_key_reference_part::columns() const { return columns_; } -query_add_primary_key_constraint_part::query_add_primary_key_constraint_part(const std::vector& columns) +query_add_primary_key_constraint_part::query_add_primary_key_constraint_part(const std::vector& columns) : query_part(sql::dialect_token::PrimaryKey) , columns_(columns) {} @@ -90,11 +90,11 @@ void query_add_primary_key_constraint_part::accept( query_part_visitor& visitor visitor.visit(*this); } -const std::vector& query_add_primary_key_constraint_part::columns() const { +const std::vector& query_add_primary_key_constraint_part::columns() const { return columns_; } -query_select_part::query_select_part(std::vector columns) +query_select_part::query_select_part(std::vector columns) : query_part(sql::dialect_token::Select) , columns_(std::move(columns)) {} @@ -103,16 +103,16 @@ void query_select_part::accept(query_part_visitor &visitor) visitor.visit(*this); } -const std::vector& query_select_part::columns() const +const std::vector& query_select_part::columns() const { return columns_; } -query_from_part::query_from_part(sql::table t) +query_from_part::query_from_part(class table t) : query_part(sql::dialect_token::From) , table_(std::move(t)) {} -const sql::table &query_from_part::table() const +const table &query_from_part::table() const { return table_; } @@ -122,11 +122,11 @@ void query_from_part::accept(query_part_visitor &visitor) visitor.visit(*this); } -query_join_part::query_join_part(sql::table t) +query_join_part::query_join_part(class table t) : query_part(sql::dialect_token::Join) , table_(std::move(t)) {} -const sql::table &query_join_part::table() const +const table &query_join_part::table() const { return table_; } @@ -168,12 +168,12 @@ query_table_name_part::query_table_name_part(const sql::dialect_token token, std : query_part(token) , table_name_(std::move(table_name)) {} -query_group_by_part::query_group_by_part(sql::column col) +query_group_by_part::query_group_by_part(class column col) : query_part(sql::dialect_token::GroupBy) , column_(std::move(col)) {} -const sql::column &query_group_by_part::column() const +const column &query_group_by_part::column() const { return column_; } @@ -183,12 +183,12 @@ void query_group_by_part::accept(query_part_visitor &visitor) visitor.visit(*this); } -query_order_by_part::query_order_by_part(sql::column col) +query_order_by_part::query_order_by_part(class column col) : query_part(sql::dialect_token::OrderBy) , column_(std::move(col)) {} -const sql::column &query_order_by_part::column() const +const column &query_order_by_part::column() const { return column_; } @@ -252,17 +252,17 @@ void query_insert_part::accept(query_part_visitor &visitor) visitor.visit(*this); } -query_into_part::query_into_part(sql::table t, std::vector columns) +query_into_part::query_into_part(class table t, std::vector columns) : query_part(sql::dialect_token::Insert) , table_(std::move(t)) , columns_(std::move(columns)) {} -const sql::table &query_into_part::table() const +const table &query_into_part::table() const { return table_; } -const std::vector &query_into_part::columns() const +const std::vector &query_into_part::columns() const { return columns_; } @@ -286,11 +286,11 @@ void query_values_part::accept(query_part_visitor &visitor) visitor.visit(*this); } -query_update_part::query_update_part(sql::table table) +query_update_part::query_update_part(class table table) : query_part(sql::dialect_token::Update) , table_(std::move(table)) {} -const sql::table& query_update_part::table() const +const table& query_update_part::table() const { return table_; } @@ -322,11 +322,11 @@ void query_delete_part::accept(query_part_visitor &visitor) visitor.visit(*this); } -query_delete_from_part::query_delete_from_part(sql::table table) +query_delete_from_part::query_delete_from_part(class table table) : query_part(sql::dialect_token::From) , table_(std::move(table)) {} -const sql::table &query_delete_from_part::table() const +const table &query_delete_from_part::table() const { return table_; } @@ -344,12 +344,12 @@ void query_create_part::accept(query_part_visitor &visitor) visitor.visit(*this); } -query_create_table_part::query_create_table_part(sql::table table, std::vector columns) +query_create_table_part::query_create_table_part(class table table, std::vector columns) : query_part(sql::dialect_token::Table) , table_(std::move(table)) , columns_(std::move(columns)) {} -const sql::table &query_create_table_part::table() const +const table &query_create_table_part::table() const { return table_; } @@ -384,11 +384,11 @@ void query_drop_part::accept(query_part_visitor &visitor) visitor.visit(*this); } -query_drop_table_part::query_drop_table_part(sql::table table) +query_drop_table_part::query_drop_table_part(class table table) : query_part(sql::dialect_token::Table) , table_(std::move(table)) {} -const sql::table &query_drop_table_part::table() const +const table &query_drop_table_part::table() const { return table_; } diff --git a/source/orm/query/query.cpp b/source/orm/query/query.cpp index dd6f74f..5d730e9 100644 --- a/source/orm/query/query.cpp +++ b/source/orm/query/query.cpp @@ -2,24 +2,20 @@ namespace matador::query { -sql::column alias(const std::string &column, const std::string &as) -{ - return sql::column{column, as}; +column alias(const std::string &column, const std::string &as) { + return {column, as}; } -sql::column alias(sql::column &&col, const std::string &as) -{ +column alias(column &&col, const std::string &as) { col.as(as); return std::move(col); } -sql::column count(const std::string &column) -{ +column count(const std::string &column) { return {sql::sql_function_t::Count, column}; } -sql::column count_all() -{ +column count_all() { return count("*"); } @@ -36,16 +32,16 @@ query_select_intermediate query::select() { return query_select_intermediate{{}}; } -query_select_intermediate query::select( const std::initializer_list columns) { - return select(std::vector{columns}); +query_select_intermediate query::select( const std::initializer_list columns) { + return select(std::vector{columns}); } -query_select_intermediate query::select(const std::vector& columns) { +query_select_intermediate query::select(const std::vector& columns) { return query_select_intermediate{columns}; } query_select_intermediate query::select(const std::vector &column_names) { - std::vector columns; + std::vector columns; columns.reserve(column_names.size()); for (const auto &col_name : column_names) { columns.emplace_back(col_name); @@ -53,7 +49,7 @@ query_select_intermediate query::select(const std::vector &column_n return select(columns); } -query_select_intermediate query::select(std::vector columns, const std::initializer_list additional_columns) { +query_select_intermediate query::select(std::vector columns, const std::initializer_list additional_columns) { for (const auto &col : additional_columns) { columns.push_back(col); } @@ -64,7 +60,7 @@ query_insert_intermediate query::insert() { return {}; } -query_update_intermediate query::update(const sql::table &table) { +query_update_intermediate query::update(const table &table) { return query_update_intermediate{table}; } diff --git a/source/orm/query/query_compiler.cpp b/source/orm/query/query_compiler.cpp index 196dd3e..c24edc3 100644 --- a/source/orm/query/query_compiler.cpp +++ b/source/orm/query/query_compiler.cpp @@ -1,8 +1,11 @@ #include "matador/query/query_compiler.hpp" +#include "matador/object/object_definition.hpp" + #include "matador/query/attribute_string_writer.hpp" #include "matador/query/query_data.hpp" #include "matador/query/criteria_evaluator.hpp" +#include "matador/query/query_utils.hpp" #include "matador/query/internal/basic_type_to_string_visitor.hpp" #include "matador/query/internal/query_parts.hpp" @@ -33,7 +36,7 @@ sql::query_context query_compiler::compile(const query_data &data, return {query_}; } -std::string handle_column(sql::query_context &ctx, const sql::dialect *d, const query_data &data, const sql::column &col) { +std::string handle_column(sql::query_context &ctx, const sql::dialect *d, const query_data &data, const column &col) { ctx.result_vars.emplace_back(col.column_name()); const auto& column_table = col.table().get(); ctx.column_aliases.insert({column_table->has_alias() ? column_table->alias() : column_table->name() + "." + col.column_name(), col.alias()}); @@ -45,10 +48,10 @@ std::string handle_column(sql::query_context &ctx, const sql::dialect *d, const } if (const auto it = data.tables.find(col.table()->name()); it != data.tables.end()) { - return d->prepare_identifier({it->second, col.column_name(), col.alias()}); + return prepare_identifier(*d, {it->second, col.column_name(), col.alias()}); } - return d->prepare_identifier(col); + return prepare_identifier(*d, col); } void query_compiler::visit(internal::query_alter_part& part) { @@ -134,11 +137,10 @@ void query_compiler::visit(internal::query_select_part &part) query_.sql += result; } -void query_compiler::visit(internal::query_from_part &part) -{ - query_.table = part.table(); - query_.sql += " " + build_table_name(part.token(), *dialect_, query_.table); - query_.table_aliases.insert({query_.table.name(), query_.table.alias()}); +void query_compiler::visit(internal::query_from_part &part) { + query_.table_name = part.table().alias(); + query_.sql += " " + build_table_name(part.token(), *dialect_, query_.table_name); + query_.table_aliases.insert({query_.table_name, part.table().alias()}); } void query_compiler::visit(internal::query_join_part &part) @@ -159,13 +161,13 @@ void query_compiler::visit(internal::query_where_part &part) { } void query_compiler::visit(internal::query_group_by_part &part) { - query_.sql += " " + dialect_->token_at(sql::dialect_token::GroupBy) + " " + dialect_->prepare_identifier(part.column()); + query_.sql += " " + dialect_->token_at(sql::dialect_token::GroupBy) + " " + prepare_identifier(*dialect_, part.column()); } void query_compiler::visit(internal::query_order_by_part &part) { query_.sql += " " + dialect_->token_at(sql::dialect_token::OrderBy) + - " " + dialect_->prepare_condition(part.column()); + " " + prepare_criteria(*dialect_, part.column()); } void query_compiler::visit(internal::query_order_by_asc_part &/*order_by_asc_part*/) @@ -196,7 +198,7 @@ void query_compiler::visit(internal::query_insert_part &/*insert_part*/) void query_compiler::visit(internal::query_into_part &part) { - query_.table = part.table(); + query_.table_name = part.table().name(); query_.sql += " " + dialect_->token_at(sql::dialect_token::Into) + " " + dialect_->prepare_identifier_string(part.table().name()); @@ -267,8 +269,8 @@ void query_compiler::visit(internal::query_values_part &part) { void query_compiler::visit(internal::query_update_part &part) { query_.command = sql::sql_command::SQL_UPDATE; - query_.table = part.table(); - query_.sql += query_compiler::build_table_name(part.token(), *dialect_, query_.table); + query_.table_name = part.table().name(); + query_.sql += query_compiler::build_table_name(part.token(), *dialect_, query_.table_name); } void query_compiler::visit(internal::query_delete_part &/*delete_part*/) @@ -279,8 +281,8 @@ void query_compiler::visit(internal::query_delete_part &/*delete_part*/) void query_compiler::visit(internal::query_delete_from_part &part) { - query_.table = part.table(); - query_.sql += " " + build_table_name(part.token(), *dialect_, query_.table); + query_.table_name = part.table().name(); + query_.sql += " " + build_table_name(part.token(), *dialect_, query_.table_name); } void query_compiler::visit(internal::query_create_part &/*create_part*/) @@ -305,7 +307,7 @@ std::string build_create_column(const object::attribute_definition &col, const s void query_compiler::visit(internal::query_create_table_part &part) { query_.sql += " " + dialect_->token_at(sql::dialect_token::Table) + " " + dialect_->prepare_identifier_string(part.table().name()) + " "; - query_.table = part.table(); + query_.table_name = part.table().name(); std::string result = "("; @@ -329,11 +331,11 @@ void query_compiler::visit(internal::query_create_table_part &part) } for (const auto &[column, reference_column]: context.foreign_contexts) { // ALTER TABLE Orders ADD CONSTRAINT FK_PersonOrder FOREIGN KEY (PersonID) REFERENCES Persons(PersonID); - std::string fk_cmd = "ALTER TABLE " + dialect_->prepare_identifier_string(query_.table.name()) + " ADD"; - fk_cmd += " CONSTRAINT FK_" + query_.table.name(); + std::string fk_cmd = "ALTER TABLE " + dialect_->prepare_identifier_string(query_.table_name) + " ADD"; + fk_cmd += " CONSTRAINT FK_" + query_.table_name; fk_cmd += "_" + column; fk_cmd += " FOREIGN KEY (" + dialect_->prepare_identifier_string(column) + ")"; - fk_cmd += " REFERENCES " + reference_column->table_name() + "(" + reference_column->name() + ")"; + fk_cmd += " REFERENCES " + reference_column->object()->name() + "(" + reference_column->name() + ")"; query_.additional_commands.push_back({fk_cmd, sql::sql_command::SQL_ALTER_TABLE}); } @@ -383,8 +385,8 @@ void query_compiler::visit(internal::query_set_part &part) { void query_compiler::visit(internal::query_drop_table_part &part) { - query_.table = part.table(); - query_.sql += " " + query_compiler::build_table_name(part.token(), *dialect_, query_.table); + query_.table_name = part.table().name(); + query_.sql += " " + build_table_name(part.token(), *dialect_, query_.table_name); } std::string build_create_column(const object::attribute_definition &col, const sql::dialect &d, column_context &context) @@ -409,7 +411,7 @@ std::string build_create_column(const object::attribute_definition &col, const s return result; } -std::string query_compiler::build_table_name(const sql::dialect_token token, const sql::dialect &d, const sql::table& t) +std::string query_compiler::build_table_name(const sql::dialect_token token, const sql::dialect &d, const table& t) { return d.token_at(token) + " " + (!d.default_schema_name().empty() ? d.prepare_identifier_string(d.default_schema_name()) + "." : "") + diff --git a/source/orm/query/query_utils.cpp b/source/orm/query/query_utils.cpp new file mode 100644 index 0000000..fff4592 --- /dev/null +++ b/source/orm/query/query_utils.cpp @@ -0,0 +1,39 @@ +#include "matador/query/query_utils.hpp" + +#include "matador/query/table.hpp" + +namespace matador::query { +std::string prepare_identifier( const sql::dialect& d, const column& col ) { + std::string result; + if (!col.is_function()) { + if (!col.table()->name().empty()) { + result = d.prepare_identifier_string(col.table()->has_alias() ? col.table()->alias() : col.table()->name()) + "."; + } + result += d.prepare_identifier_string(col.column_name()); + } else { + result = d.sql_function_at(col.function()) + "(" + col.column_name() + ")"; + } + if (!col.alias().empty()) { + result += " AS " + col.alias(); + } + return result; +} + +std::string prepare_criteria(const sql::dialect& d, const column& col) { + std::string result; + if (!col.is_function()) { + // if (!col.alias.empty()) { + // result = col.alias; + // } else { + if (!col.table()->name().empty()) { + result = d.prepare_identifier_string(col.table()->has_alias() ? col.table()->alias() : col.table()->name()) + "."; + } + result += d.prepare_identifier_string(col.column_name()); + // } + } else { + result = d.sql_function_at(col.function()) + "(" + col.column_name() + ")"; + } + + return result; +} +} \ No newline at end of file diff --git a/source/orm/sql/table.cpp b/source/orm/query/table.cpp similarity index 94% rename from source/orm/sql/table.cpp rename to source/orm/query/table.cpp index ef2dafa..2ed5c54 100644 --- a/source/orm/sql/table.cpp +++ b/source/orm/query/table.cpp @@ -1,6 +1,6 @@ -#include "matador/sql/table.hpp" +#include "matador/query/table.hpp" -namespace matador::sql { +namespace matador::query { table::table(const char* name) : table(std::string(name)) diff --git a/source/orm/sql/connection.cpp b/source/orm/sql/connection.cpp index b6a21dd..f69b545 100644 --- a/source/orm/sql/connection.cpp +++ b/source/orm/sql/connection.cpp @@ -221,7 +221,7 @@ const class dialect &connection::dialect() const utils::result, utils::error> connection::perform_prepare(const query_context& ctx) const { if (ctx.command != sql_command::SQL_CREATE_TABLE && (ctx.prototype.empty() || has_unknown_columns(ctx.prototype))) { - if (const auto result = describe(ctx.table.name()); result.is_ok()) { + if (const auto result = describe(ctx.table_name); result.is_ok()) { for (auto &col: ctx.prototype) { const auto rit = std::find_if( std::begin(*result), diff --git a/source/orm/sql/dialect.cpp b/source/orm/sql/dialect.cpp index 533bd99..fa9eebf 100644 --- a/source/orm/sql/dialect.cpp +++ b/source/orm/sql/dialect.cpp @@ -6,31 +6,16 @@ namespace matador::sql { -const std::string& dialect::token_at(const dialect_token token) const -{ +const std::string& dialect::token_at(const dialect_token token) const { return tokens_.at(token); } -const std::string &dialect::data_type_at(const utils::basic_type type) const -{ +const std::string &dialect::data_type_at(const utils::basic_type type) const { return data_types_.at(type); } -std::string dialect::prepare_identifier(const sql::column &col) const -{ - std::string result; - if (!col.is_function()) { - if (!col.table()->name().empty()) { - result = prepare_identifier_string(col.table()->has_alias() ? col.table()->alias() : col.table()->name()) + "."; - } - result += prepare_identifier_string(col.column_name()); - } else { - result = sql_func_map_.at(col.function()) + "(" + col.column_name() + ")"; - } - if (!col.alias().empty()) { - result += " AS " + col.alias(); - } - return result; +const std::string& dialect::sql_function_at(const sql_function_t func) const { + return sql_func_map_.at(func); } std::string dialect::table_name( const std::string& table, const std::string& schema_name ) const { @@ -43,25 +28,6 @@ std::string dialect::table_name( const std::string& table, const std::string& sc return prepare_identifier_string( schema_name ) + "." + prepare_identifier_string( table ); } -std::string dialect::prepare_condition(const sql::column& col) const -{ - std::string result; - if (!col.is_function()) { - // if (!col.alias.empty()) { - // result = col.alias; - // } else { - if (!col.table()->name().empty()) { - result = prepare_identifier_string(col.table()->has_alias() ? col.table()->alias() : col.table()->name()) + "."; - } - result += prepare_identifier_string(col.column_name()); - // } - } else { - result = sql_func_map_.at(col.function()) + "(" + col.column_name() + ")"; - } - - return result; -} - const std::string& dialect::to_string(const bool val) const { return bool_strings_[static_cast(val)]; diff --git a/source/orm/sql/executor.cpp b/source/orm/sql/executor.cpp deleted file mode 100644 index d94524b..0000000 --- a/source/orm/sql/executor.cpp +++ /dev/null @@ -1,4 +0,0 @@ -#include "matador/sql/executor.hpp" - -namespace matador::sql { -} diff --git a/source/orm/sql/record.cpp b/source/orm/sql/record.cpp index bf4863e..7a4fa4b 100644 --- a/source/orm/sql/record.cpp +++ b/source/orm/sql/record.cpp @@ -1,5 +1,4 @@ #include "matador/sql/record.hpp" -#include "matador/sql/column.hpp" #include #include @@ -67,9 +66,8 @@ const std::vector &record::columns() const // return columns_[pk_index_]; //} -const field &record::at(const sql::column &col) const -{ - const auto &res = fields_by_name_.at(col.column_name()); +const field &record::at(const std::string &name) const { + const auto &res = fields_by_name_.at(name); const auto &f = res.first; return f; } diff --git a/test/backends/QueryRecordTest.cpp b/test/backends/QueryRecordTest.cpp index 2ac6534..d4d2d03 100644 --- a/test/backends/QueryRecordTest.cpp +++ b/test/backends/QueryRecordTest.cpp @@ -1,10 +1,10 @@ #include -#include "matador/sql/column.hpp" #include "matador/sql/connection.hpp" #include "matador/query/criteria.hpp" #include "matador/query/query.hpp" +#include "matador/query/column.hpp" #include "matador/utils/types.hpp" #include "matador/utils/string.hpp" diff --git a/test/backends/QueryStatementTests.cpp b/test/backends/QueryStatementTests.cpp index 24eb3e8..ce2320f 100644 --- a/test/backends/QueryStatementTests.cpp +++ b/test/backends/QueryStatementTests.cpp @@ -1,10 +1,10 @@ #include -#include "matador/sql/column.hpp" #include "matador/sql/connection.hpp" #include "matador/query/criteria.hpp" #include "matador/query/query.hpp" +#include "matador/query/column.hpp" #include "models/person.hpp" diff --git a/test/orm/orm/SessionQueryBuilderTest.cpp b/test/orm/orm/SessionQueryBuilderTest.cpp index 16fbbc0..2451258 100644 --- a/test/orm/orm/SessionQueryBuilderTest.cpp +++ b/test/orm/orm/SessionQueryBuilderTest.cpp @@ -3,11 +3,11 @@ #include "matador/sql/backend_provider.hpp" #include "matador/sql/connection.hpp" -#include "matador/sql/column.hpp" -#include "matador/sql/table.hpp" #include "matador/query/criteria_evaluator.hpp" #include "matador/query/query.hpp" +#include "matador/query/column.hpp" +#include "matador/query/table.hpp" #include "matador/orm/session_query_builder.hpp" diff --git a/test/orm/query/GeneratorTests.cpp b/test/orm/query/GeneratorTests.cpp index 315b158..ada6902 100644 --- a/test/orm/query/GeneratorTests.cpp +++ b/test/orm/query/GeneratorTests.cpp @@ -1,15 +1,13 @@ #include #include "matador/query/generator.hpp" - -#include "matador/sql/column.hpp" +#include "matador/query/column.hpp" #include "../../models/airplane.hpp" #include "../../models/flight.hpp" using namespace matador::utils; using namespace matador::query; -using namespace matador::sql; using namespace matador::test; TEST_CASE("Test placeholder generator", "[generator][placeholder]") { diff --git a/test/orm/query/QueryBuilderTest.cpp b/test/orm/query/QueryBuilderTest.cpp index d9539d9..cbe72d7 100644 --- a/test/orm/query/QueryBuilderTest.cpp +++ b/test/orm/query/QueryBuilderTest.cpp @@ -4,11 +4,11 @@ #include #include +#include "matador/query/table.hpp" #include "matador/object/attribute_definition_generator.hpp" #include "matador/sql/connection.hpp" -#include "matador/sql/table.hpp" #include "matador/utils/placeholder.hpp" diff --git a/test/orm/sql/ColumnGeneratorTest.cpp b/test/orm/sql/ColumnGeneratorTest.cpp index a26d963..34dccbd 100644 --- a/test/orm/sql/ColumnGeneratorTest.cpp +++ b/test/orm/sql/ColumnGeneratorTest.cpp @@ -1,6 +1,7 @@ #include #include "matador/query/generator.hpp" +#include "matador/query/table.hpp" #include "matador/object/repository.hpp" @@ -8,9 +9,7 @@ #include "../test/models/order.hpp" #include "../test/models/book.hpp" #include "../test/models/author.hpp" -#include "matador/sql/table.hpp" -using namespace matador::sql; using namespace matador::query; using namespace matador::object;