From d104222fddcc012b1afd0d837c0e5e1ab14d7a3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sascha=20K=C3=BChl?= Date: Fri, 19 Dec 2025 15:56:36 +0100 Subject: [PATCH] observer progress, added to schema and added schema_observer class --- .../matador/object/foreign_node_completer.hpp | 88 ++++++++----------- include/matador/object/relation_endpoint.hpp | 2 +- include/matador/object/repository.hpp | 4 +- include/matador/object/repository_node.hpp | 2 +- include/matador/orm/session_query_builder.hpp | 19 ++-- include/matador/query/column.hpp | 11 ++- include/matador/query/generator.hpp | 19 ++-- include/matador/query/schema.hpp | 62 ++++++++++--- source/core/object/repository.cpp | 4 + source/orm/orm/session_query_builder.cpp | 2 +- source/orm/query/column.cpp | 27 ++++-- source/orm/query/generator.cpp | 2 +- source/orm/query/schema.cpp | 18 +++- source/orm/query/table.cpp | 6 +- test/orm/orm/SessionQueryBuilderTest.cpp | 32 +++++-- test/orm/sql/ColumnGeneratorTest.cpp | 23 ++++- 16 files changed, 205 insertions(+), 116 deletions(-) diff --git a/include/matador/object/foreign_node_completer.hpp b/include/matador/object/foreign_node_completer.hpp index dbf5b4c..f771b69 100644 --- a/include/matador/object/foreign_node_completer.hpp +++ b/include/matador/object/foreign_node_completer.hpp @@ -12,24 +12,32 @@ #include "matador/logger/log_manager.hpp" #include - -#include "repository.hpp" +#include namespace matador::object { +template typename... Observers> +class completer { +public: + template + void foo(Observers&&... observers) { + (std::unique_ptr>(new Observers(std::forward(observers))), ...); + } +}; + /** * Processes the given node and ensures * that all foreign nodes needed by the given node * relations are attached in schema. */ -template +template typename ...Observers> class foreign_node_completer final { private: using node_ptr = std::shared_ptr; public: - static void complete(const std::shared_ptr &node) { + static void complete(const std::shared_ptr &node, Observers... observers) { internal::shadow_repository shadow(node->repo_); - foreign_node_completer completer(shadow); + foreign_node_completer completer(shadow, observers...); completer.complete_node(node); } @@ -60,18 +68,20 @@ public: } template - void on_has_many_to_many(const char *id, - CollectionType &collection, - const char *join_column, - const char *inverse_join_column, - const utils::foreign_attributes &attr); + static void on_has_many_to_many(const char * /*id*/, + CollectionType &/*collection*/, + const char * /*join_column*/, + const char * /*inverse_join_column*/, + const utils::foreign_attributes &/*attr*/) {} template - void on_has_many_to_many(const char *id, CollectionType &collection, const utils::foreign_attributes &attr); + static void on_has_many_to_many(const char * /*id*/, CollectionType &/*collection*/, const utils::foreign_attributes &/*attr*/) {} private: - explicit foreign_node_completer(internal::shadow_repository &shadow) + explicit foreign_node_completer(internal::shadow_repository &shadow, Observers... observers) : repo_(shadow) - , log_(logger::create_logger("node_completer")) {} + , log_(logger::create_logger("node_completer")) { + // observers_.emplace_back(observers...); + } void complete_node(const std::shared_ptr &node) { nodes_.push(node); @@ -160,7 +170,7 @@ private: const endpoint_ptr &other_endpoint); private: - template + template typename ...OtherObservers> friend class foreign_node_completer; private: @@ -168,69 +178,41 @@ private: internal::shadow_repository &repo_; logger::logger log_; join_columns_collector join_columns_collector_{}; + // const std::vector...> observers_; }; -template +template typename ...Observers> template -void foreign_node_completer::on_belongs_to(const char * /*id*/, ForeignPointerType &, const utils::foreign_attributes &) { +void foreign_node_completer::on_belongs_to(const char * /*id*/, ForeignPointerType &, const utils::foreign_attributes &) { attach_node(); } -template +template typename ...Observers> template -void foreign_node_completer::on_has_one(const char *, ForeignPointerType &, const utils::foreign_attributes &) { +void foreign_node_completer::on_has_one(const char *, ForeignPointerType &, const utils::foreign_attributes &) { attach_node(); } -template +template typename ...Observers> template -void foreign_node_completer::on_has_many(const char * /*id*/, +void foreign_node_completer::on_has_many(const char * /*id*/, CollectionType &, const char * /*join_column*/, const utils::foreign_attributes & /*attr*/, std::enable_if_t::value> *) { attach_node(); } -template -template -void foreign_node_completer::on_has_many_to_many(const char * /*id*/, - CollectionType & /*collection*/, - const char * /*join_column*/, - const char * /*inverse_join_column*/, - const utils::foreign_attributes & /*attr*/) { - // if (!repo_.expecting_relation_node(id)) { - // repo_.expect_relation_node(id, typeid(typename CollectionType::value_type::value_type)); - // } else { - // attach_relation_node(id, join_column, inverse_join_column); - // repo_.remove_expected_relation_node(id); - // } -} - -template -template -void foreign_node_completer::on_has_many_to_many(const char * /*id*/, - CollectionType & /*collection*/, - const utils::foreign_attributes & /*attr*/) { - // if (!repo_.expecting_relation_node(id)) { - // repo_.expect_relation_node(id, typeid(typename CollectionType::value_type::value_type)); - // } else { - // const auto join_columns = join_columns_collector_.collect(); - // attach_relation_node(id, join_columns.join_column, join_columns.inverse_join_column); - // repo_.remove_expected_relation_node(id); - // } -} - -template -void foreign_node_completer::register_relation_endpoints(const endpoint_ptr &endpoint, +template typename ...Observers> +void foreign_node_completer::register_relation_endpoints(const endpoint_ptr &endpoint, const endpoint_ptr &other_endpoint) { endpoint->node_->info_->register_relation_endpoint(other_endpoint->node_->type_index(), endpoint); other_endpoint->node_->info_->register_relation_endpoint(endpoint->node_->type_index(), other_endpoint); link_relation_endpoints(endpoint, other_endpoint); } -template -void foreign_node_completer::link_relation_endpoints(const endpoint_ptr &endpoint, const endpoint_ptr &other_endpoint) { +template typename ...Observers> +void foreign_node_completer::link_relation_endpoints(const endpoint_ptr &endpoint, const endpoint_ptr &other_endpoint) { endpoint->link_foreign_endpoint(other_endpoint); other_endpoint->link_foreign_endpoint(endpoint); } diff --git a/include/matador/object/relation_endpoint.hpp b/include/matador/object/relation_endpoint.hpp index 4db8bc1..f7c2264 100644 --- a/include/matador/object/relation_endpoint.hpp +++ b/include/matador/object/relation_endpoint.hpp @@ -43,7 +43,7 @@ public: private: template friend class relation_completer; - template + template typename ...Observers> friend class foreign_node_completer; std::string field_name_; diff --git a/include/matador/object/repository.hpp b/include/matador/object/repository.hpp index 2c48cad..cdef623 100644 --- a/include/matador/object/repository.hpp +++ b/include/matador/object/repository.hpp @@ -67,8 +67,6 @@ public: return utils::failure(result.err()); } - node->on_attach(); - foreign_node_completer::complete(node); relation_completer::complete(node); } else if (!has_node(name)) { @@ -200,7 +198,7 @@ private: private: friend class internal::shadow_repository; friend class repository_node; - template < typename NodeType > + template < typename NodeType, template typename ...Observers > friend class foreign_node_completer; friend class object_generator; diff --git a/include/matador/object/repository_node.hpp b/include/matador/object/repository_node.hpp index 46b566d..6002888 100644 --- a/include/matador/object/repository_node.hpp +++ b/include/matador/object/repository_node.hpp @@ -80,7 +80,7 @@ private: friend class repository; template friend class relation_completer; - template < typename NodeType > + template < typename NodeType, template typename ...Observers > friend class foreign_node_completer; friend class const_repository_node_iterator; diff --git a/include/matador/orm/session_query_builder.hpp b/include/matador/orm/session_query_builder.hpp index 184ed1d..7ff2ccd 100644 --- a/include/matador/orm/session_query_builder.hpp +++ b/include/matador/orm/session_query_builder.hpp @@ -5,6 +5,7 @@ #include "matador/query/criteria.hpp" #include "matador/query/query.hpp" +#include "matador/query/schema.hpp" #include "matador/sql/executor.hpp" #include "matador/sql/statement.hpp" @@ -33,7 +34,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 query::schema &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; @@ -47,19 +48,19 @@ private: void update_criteria_column(const query::abstract_column_criteria& node) const; private: - const object::repository &repo_; + const query::schema &repo_; const std::unordered_map>& tables_by_name_; }; class session_query_builder final { public: - session_query_builder(const object::repository &scm, sql::executor &exec) + session_query_builder(const query::schema &scm, sql::executor &exec) : schema_(scm) , executor_(exec){} template utils::result build(query::criteria_ptr clause = {}) { - const auto info = schema_.info(); + const auto info = schema_.repo().info(); if (!info) { return utils::failure(query_build_error::UnknownType); } @@ -114,7 +115,7 @@ public: template void on_has_many(const char * /*id*/, ContainerType &, const char *join_column, const utils::foreign_attributes &attr) { if (attr.fetch() == utils::fetch_type::Eager) { - const auto result = schema_.basic_info(typeid(typename ContainerType::value_type::value_type)); + const auto result = schema_.repo().basic_info(typeid(typename ContainerType::value_type::value_type)); if (!result) { throw query_builder_exception{query_build_error::UnknownType}; } @@ -146,7 +147,7 @@ public: if (attr.fetch() != utils::fetch_type::Eager) { return; } - const auto result = schema_.basic_info(typeid(typename ContainerType::value_type::value_type)); + const auto result = schema_.repo().basic_info(typeid(typename ContainerType::value_type::value_type)); if (!result) { throw query_builder_exception{query_build_error::UnknownType}; } @@ -186,7 +187,7 @@ public: if (attr.fetch() != utils::fetch_type::Eager) { return; } - const auto result = schema_.basic_info(typeid(typename ContainerType::value_type::value_type)); + const auto result = schema_.repo().basic_info(typeid(typename ContainerType::value_type::value_type)); if (!result) { throw query_builder_exception{query_build_error::UnknownType}; } @@ -239,7 +240,7 @@ private: std::stack table_info_stack_{}; std::unordered_map> processed_tables_{}; - const object::repository &schema_; + const query::schema &schema_; entity_query_data entity_query_data_{}; unsigned int column_index{0}; unsigned int table_index{0}; @@ -249,7 +250,7 @@ private: template void session_query_builder::on_foreign_object(const char *id, Pointer &, const utils::foreign_attributes &attr) { - const auto info = schema_.info(); + const auto info = schema_.repo().info(); if (!info) { throw query_builder_exception{query_build_error::UnknownType}; } diff --git a/include/matador/query/column.hpp b/include/matador/query/column.hpp index 2408cd5..6148156 100644 --- a/include/matador/query/column.hpp +++ b/include/matador/query/column.hpp @@ -16,10 +16,13 @@ class table; // ReSharper disable CppNonExplicitConvertingConstructor class column { public: - column(const char *name, const std::string& as = ""); // NOLINT(*-explicit-constructor) - column(std::string name, std::string as = ""); // NOLINT(*-explicit-constructor) + column(const char *name); // NOLINT(*-explicit-constructor) + column(std::string name); // NOLINT(*-explicit-constructor) + column(std::string name, std::string alias); column(sql::sql_function_t func, std::string name); - column(const class table* tab, std::string name, std::string as = ""); + column(const class table* tab, std::string name); + column(const class table* tab, std::string name, std::string alias); + column(const class table* tab, std::string name, utils::basic_type type, const utils::field_attributes& attributes); [[nodiscard]] bool equals(const column &x) const; @@ -45,6 +48,8 @@ private: static query::table* default_table(); private: + friend class table; + const query::table* table_{nullptr}; std::string name_; std::string alias_; diff --git a/include/matador/query/generator.hpp b/include/matador/query/generator.hpp index 4210169..1a710c9 100644 --- a/include/matador/query/generator.hpp +++ b/include/matador/query/generator.hpp @@ -6,12 +6,11 @@ #include #include -#include "matador/object/repository.hpp" - #include "matador/query/fk_value_extractor.hpp" #include "matador/query/internal/column_value_pair.hpp" #include "matador/query/table.hpp" +#include "matador/query/schema.hpp" #include @@ -48,7 +47,7 @@ class column_generator { public: explicit column_generator(const std::string &table_name = "", column_generator_options options = default_column_generator_options); - explicit column_generator(const object::repository &repo, + explicit column_generator(const schema &repo, const std::string &table_name = "", column_generator_options options = default_column_generator_options); @@ -94,7 +93,7 @@ public: if (!repo_) { return; } - const auto info = repo_->get().info(); + const auto info = repo_->get().repo().info(); if (!info) { return; } @@ -130,7 +129,7 @@ private: if (!repo_) { return; } - const auto info = repo_->get().info(); + const auto info = repo_->get().repo().info(); if (!info) { return; } @@ -148,7 +147,7 @@ private: void push(const std::string &column_name); private: - std::optional> repo_; + std::optional> repo_; std::vector result_; std::stack> table_stack_; std::unordered_set seen_tables; @@ -296,7 +295,7 @@ std::vector column_value_pairs() { } template -std::vector columns(const object::repository &repo, +std::vector columns(const schema &repo, const std::string &table_name = "", const column_generator_options options = default_column_generator_options) { column_generator generator(repo, table_name, options); @@ -304,10 +303,10 @@ std::vector columns(const object::repository &repo, } template -std::vector columns(const object::repository &repo, +std::vector columns(const schema &repo, const column_generator_options options) { std::string table_name; - if (const auto result = repo.info()) { + if (const auto result = repo.repo().info()) { table_name = result.value().get().name(); } column_generator generator(repo, table_name, options); @@ -316,7 +315,7 @@ std::vector columns(const object::repository &repo, template std::vector columns(const Type &obj, - const object::repository &repo, + const schema &repo, const std::string &table_name = "", const column_generator_options options = default_column_generator_options) { column_generator generator(repo, table_name, options); diff --git a/include/matador/query/schema.hpp b/include/matador/query/schema.hpp index 117a5de..de184c8 100644 --- a/include/matador/query/schema.hpp +++ b/include/matador/query/schema.hpp @@ -1,6 +1,7 @@ #ifndef MATADOR_SCHEMA_HPP #define MATADOR_SCHEMA_HPP +#include "matador/object/observer.hpp" #include "matador/object/repository.hpp" #include "matador/sql/query_context.hpp" @@ -28,19 +29,39 @@ private: std::unordered_map schema_map_; }; +template +class schema_observer final : public object::observer { +public: + explicit schema_observer(schema& s) + : schema_(s) {} + void on_attach(object::repository_node &node, const Type &prototype) override; + void on_detach(object::repository_node &node, const Type &prototype) override; + void on_insert(Type &obj) override; + void on_update(Type &obj) override; + void on_delete(Type &obj) override; + +private: + schema& schema_; +}; + class schema final { public: explicit schema(sql::connection_pool &pool); schema(sql::connection_pool &pool, const std::string &name); - template class ObserverType> - [[nodiscard]] utils::result attach(const std::string &name, const std::string &parent = "", std::initializer_list*> observer = {}) { - return repo_.attach(name, parent, observer); + template + [[nodiscard]] utils::result attach(const std::string &name, Observers&&... observers) { + return repo_.attach(name, schema_observer{*this}, std::forward(observers)...); } - template class ObserverType> - [[nodiscard]] utils::result attach(const std::string &name, std::initializer_list*> observer = {}) { - return repo_.attach(name, observer); + template + [[nodiscard]] utils::result attach(const std::string &name, const std::string &parent, Observers&&... observers) { + return repo_.attach(name, parent, schema_observer{*this}, std::forward(observers)...); + } + + template + [[nodiscard]] utils::result attach(const std::string &name, Observers&&... observers) { + return repo_.attach(name, schema_observer{*this}, std::forward(observers)...); } [[nodiscard]] utils::result create() const; @@ -53,13 +74,20 @@ public: [[nodiscard]] utils::result, utils::error> describe_table(const std::string &table_name) const; [[nodiscard]] utils::result table_exists(const std::string &table_name) const; -private: - [[nodiscard]] sql::query_context build_add_constraint_context( const object::repository_node& node, const object::restriction& cons ) const; - [[nodiscard]] sql::query_context build_drop_constraint_context( const object::repository_node& node, const object::restriction& cons ) const; + const object::repository &repo() const { return repo_; } private: + [[nodiscard]] sql::query_context build_add_constraint_context( const object::repository_node& node, const object::restriction& cons ) const; + [[nodiscard]] sql::query_context build_drop_constraint_context( const object::repository_node& node, const object::restriction& cons ) const; + + void insert_table(const std::type_index& ti, const object::repository_node &node); + +private: + template + friend class schema_observer; + object::repository repo_; - std::unordered_map table_map_; + std::unordered_map tables_; sql::connection_pool &pool_; }; @@ -72,6 +100,18 @@ utils::result schema::drop_table() { return utils::failure(info.err()); } - +template +void schema_observer::on_attach(object::repository_node &node, const Type &prototype) { + schema_.insert_table(typeid(Type), node); } + +template +void schema_observer::on_detach(object::repository_node &node, const Type &prototype) {} +template +void schema_observer::on_insert(Type &obj) {} +template +void schema_observer::on_update(Type &obj) {} +template +void schema_observer::on_delete(Type &obj) {} +} // namespace matador::query #endif //MATADOR_SCHEMA_HPP \ No newline at end of file diff --git a/source/core/object/repository.cpp b/source/core/object/repository.cpp index 3a8a6fc..f00b45d 100644 --- a/source/core/object/repository.cpp +++ b/source/core/object/repository.cpp @@ -22,6 +22,8 @@ utils::result repository::detach(const node_ptr &node) { remove_node(node); + node->on_detach(); + return utils::ok(); } @@ -126,6 +128,8 @@ utils::result repository::attach_node(const nodes_by_name_.insert({node->name(), node}); nodes_by_type_.insert({node->type_index(), node}); + node->on_attach(); + return utils::ok(node); } diff --git a/source/orm/orm/session_query_builder.cpp b/source/orm/orm/session_query_builder.cpp index 90b52db..45985fe 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 query::schema& repo, const std::unordered_map>& tables_by_name) : repo_(repo) , tables_by_name_(tables_by_name) {} diff --git a/source/orm/query/column.cpp b/source/orm/query/column.cpp index 676ed19..10518bf 100644 --- a/source/orm/query/column.cpp +++ b/source/orm/query/column.cpp @@ -21,25 +21,38 @@ column operator ""_col(const char *name, const size_t len) { return column{new table(str.substr(0, pos)), str.substr(pos + 1)}; } -column::column(const char *name, const std::string& as) -: column(std::string(name), as) +column::column(const char *name) +: column(std::string(name)) {} -column::column(std::string name, std::string as) +column::column(std::string name) +: table_(default_table()) +, name_(std::move(name)) {} +column::column(std::string name, std::string alias) : table_(default_table()) , name_(std::move(name)) -, alias_(std::move(as)) {} +, alias_(std::move(alias)) {} column::column(const sql::sql_function_t func, std::string name) : table_(default_table()) , name_(std::move(name)) , function_(func) {} -column::column(const class table* tab, std::string name, std::string as) +column::column(const class table* tab, std::string name) +: table_(tab) +, name_(std::move(name)) {} + +column::column(const class query::table* tab, std::string name, std::string alias) : table_(tab) , name_(std::move(name)) -, alias_(std::move(as)) { -} +, alias_(std::move(alias)) {} +column::column(const class query::table* tab, std::string name, + const utils::basic_type type, + const utils::field_attributes& attributes) +: table_(tab) +, name_(std::move(name)) +, type_(type) +, attributes_(attributes) {} bool column::equals(const column &x) const { return *table_ == *x.table_ && diff --git a/source/orm/query/generator.cpp b/source/orm/query/generator.cpp index 58b276d..c3452a2 100644 --- a/source/orm/query/generator.cpp +++ b/source/orm/query/generator.cpp @@ -6,7 +6,7 @@ column_generator::column_generator(const std::string& table_name, const column_g 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) +column_generator::column_generator(const schema& 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)); diff --git a/source/orm/query/schema.cpp b/source/orm/query/schema.cpp index 5f0eabf..7b657b9 100644 --- a/source/orm/query/schema.cpp +++ b/source/orm/query/schema.cpp @@ -2,6 +2,8 @@ #include "matador/query/query.hpp" +#include "matador/object/repository_node.hpp" + #include "matador/sql/backend_provider.hpp" #include "matador/sql/connection_pool.hpp" #include "matador/sql/dialect.hpp" @@ -196,9 +198,17 @@ sql::query_context schema::build_add_constraint_context( const object::repositor } sql::query_context schema::build_drop_constraint_context( const object::repository_node& node, const object::restriction& cons ) const { - return query::query::alter() - .table(node.name()) - .drop_constraint(cons) - .compile(*pool_.acquire()); + return query::query::alter() + .table(node.name()) + .drop_constraint(cons) + .compile(*pool_.acquire()); } + +void schema::insert_table(const std::type_index& ti, const object::repository_node& node) { + std::vector columns; + for (const auto &attr : node.info().attributes()) { + columns.emplace_back(nullptr, attr.name(), attr.type(), attr.attributes()); + } + std::ignore = tables_.insert({ti, table(node.name(), "", columns)}).first; } +} // namespace matador::query diff --git a/source/orm/query/table.cpp b/source/orm/query/table.cpp index a38653f..0747f1e 100644 --- a/source/orm/query/table.cpp +++ b/source/orm/query/table.cpp @@ -18,7 +18,11 @@ table::table(std::string name, std::string as) table::table( std::string name, std::string as, const std::vector& columns ) : name_(std::move(name)) , alias_(std::move(as)) -, columns_(columns) {} +, columns_(columns) { + for (auto& col : columns_) { + col.table_ = this; + } +} bool table::operator==( const table& x ) const { return name_ == x.name_; diff --git a/test/orm/orm/SessionQueryBuilderTest.cpp b/test/orm/orm/SessionQueryBuilderTest.cpp index 4be12e8..cf94563 100644 --- a/test/orm/orm/SessionQueryBuilderTest.cpp +++ b/test/orm/orm/SessionQueryBuilderTest.cpp @@ -3,11 +3,14 @@ #include "matador/sql/backend_provider.hpp" #include "matador/sql/connection.hpp" +#include "matador/sql/connection_pool.hpp" +#include "matador/sql/interface/connection_impl.hpp" #include "matador/query/criteria_evaluator.hpp" #include "matador/query/query.hpp" #include "matador/query/column.hpp" #include "matador/query/table.hpp" +#include "matador/query/schema.hpp" #include "matador/orm/session_query_builder.hpp" @@ -34,7 +37,9 @@ TEST_CASE("Create sql query data for entity with eager has one", "[query][entity using namespace matador::test; backend_provider::instance().register_backend("noop", std::make_unique()); connection db("noop://noop.db"); - repository scm("noop"); + connection_pool pool("noop://noop.db", 4); + + schema scm(pool); auto result = scm.attach("airplanes") .and_then( [&scm] { return scm.attach("flights"); } ); REQUIRE(result); @@ -82,7 +87,9 @@ TEST_CASE("Create sql query data for entity with eager belongs to", "[query][ent using namespace matador::test; backend_provider::instance().register_backend("noop", std::make_unique()); connection db("noop://noop.db"); - repository scm("noop"); + connection_pool pool("noop://noop.db", 4); + + schema scm(pool); auto result = scm.attach("authors") .and_then( [&scm] { return scm.attach("books"); } ); REQUIRE(result); @@ -145,7 +152,9 @@ TEST_CASE("Create sql query data for entity with eager has many belongs to", "[q using namespace matador::test; backend_provider::instance().register_backend("noop", std::make_unique()); connection db("noop://noop.db"); - repository scm("noop"); + connection_pool pool("noop://noop.db", 4); + + schema scm(pool); auto result = scm.attach("products") .and_then( [&scm] { return scm.attach("order_details"); } ) .and_then( [&scm] { return scm.attach("suppliers"); } ) @@ -206,10 +215,12 @@ TEST_CASE("Create sql query data for entity with eager many to many", "[query][e using namespace matador::test; backend_provider::instance().register_backend("noop", std::make_unique()); connection db("noop://noop.db"); - repository scm("noop"); + connection_pool pool("noop://noop.db", 4); + + schema scm(pool); auto result = scm.attach("recipes") .and_then( [&scm] { return scm.attach("ingredients"); } ); - // .and_then( [&scm] { return scm.attach("recipe_ingredients"); } ); + REQUIRE(result); session_query_builder eqb(scm, db); @@ -254,10 +265,12 @@ TEST_CASE("Create sql query data for entity with eager many to many (inverse par using namespace matador::test; backend_provider::instance().register_backend("noop", std::make_unique()); connection db("noop://noop.db"); - repository scm("noop"); + connection_pool pool("noop://noop.db", 4); + + schema scm(pool); auto result = scm.attach("students") .and_then( [&scm] { return scm.attach("courses"); } ); - // .and_then( [&scm] { return scm.attach("student_courses"); } ); + REQUIRE(result); session_query_builder eqb(scm, db); @@ -302,9 +315,12 @@ TEST_CASE("Test eager relationship", "[session][eager]") { using namespace matador::test; backend_provider::instance().register_backend("noop", std::make_unique()); connection db("noop://noop.db"); - repository scm("noop"); + connection_pool pool("noop://noop.db", 4); + + schema scm(pool); auto result = scm.attach("departments") .and_then( [&scm] { return scm.attach("employees"); } ); + REQUIRE(result); session_query_builder eqb(scm, db); diff --git a/test/orm/sql/ColumnGeneratorTest.cpp b/test/orm/sql/ColumnGeneratorTest.cpp index 5c0cd99..c56b137 100644 --- a/test/orm/sql/ColumnGeneratorTest.cpp +++ b/test/orm/sql/ColumnGeneratorTest.cpp @@ -1,10 +1,17 @@ #include +#include "matador/sql/backend_provider.hpp" +#include "matador/sql/connection_pool.hpp" +#include "matador/sql/interface/connection_impl.hpp" + #include "matador/query/generator.hpp" #include "matador/query/table.hpp" +#include "matador/query/schema.hpp" #include "matador/object/repository.hpp" +#include "../backend/test_backend_service.hpp" + #include "../test/models/product.hpp" #include "../test/models/order.hpp" #include "../test/models/book.hpp" @@ -12,10 +19,14 @@ using namespace matador::query; using namespace matador::object; +using namespace matador::sql; TEST_CASE("Generate columns from object", "[column][generator]") { using namespace matador::test; - repository s("main"); + backend_provider::instance().register_backend("noop", std::make_unique()); + connection_pool pool("noop://noop.db", 4); + + schema s(pool); auto result = s.attach("product"); REQUIRE( result ); @@ -42,7 +53,10 @@ TEST_CASE("Generate columns from object", "[column][generator]") { TEST_CASE("Generate columns for object with has many relation", "[column][generator][relation]") { using namespace matador::test; - repository s("main"); + backend_provider::instance().register_backend("noop", std::make_unique()); + connection_pool pool("noop://noop.db", 4); + + schema s(pool); auto result = s.attach("supplier") .and_then( [&s] { return s.attach("categories"); } ) .and_then( [&s] { return s.attach("order_details"); } ) @@ -82,7 +96,10 @@ TEST_CASE("Generate columns for object with has many relation", "[column][genera TEST_CASE("Generate columns for object with eager foreign key relation", "[column][generator][eager]") { using namespace matador::test; - repository s("main"); + backend_provider::instance().register_backend("noop", std::make_unique()); + connection_pool pool("noop://noop.db", 4); + + schema s(pool); auto result = s.attach("books") .and_then( [&s] { return s.attach("authors"); } ); REQUIRE(result);