From 12905e3df3e88b3a09257dcd4cf70f2dc1306477 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sascha=20K=C3=BChl?= Date: Wed, 1 Oct 2025 15:39:58 +0200 Subject: [PATCH] fixed some repository-related tests --- backends/postgres/test/CMakeLists.txt | 4 ++-- include/matador/object/foreign_node_completer.hpp | 12 ++++++------ include/matador/object/repository.hpp | 5 +++++ include/matador/sql/column_generator.hpp | 2 ++ include/matador/sql/connection_pool.hpp | 2 +- source/core/object/repository.cpp | 9 +++++++++ source/orm/sql/column_generator.cpp | 13 +++++++++++++ source/orm/sql/connection_pool.cpp | 6 ++++-- test/backends/QueryTest.cpp | 5 ++--- test/models/flight.hpp | 2 +- 10 files changed, 45 insertions(+), 15 deletions(-) diff --git a/backends/postgres/test/CMakeLists.txt b/backends/postgres/test/CMakeLists.txt index 9afaa56..29dcd44 100644 --- a/backends/postgres/test/CMakeLists.txt +++ b/backends/postgres/test/CMakeLists.txt @@ -2,8 +2,8 @@ CPMAddPackage("gh:catchorg/Catch2@3.7.1") list(APPEND CMAKE_MODULE_PATH ${catch2_SOURCE_DIR}/extras) -set(POSTGRES_CONNECTION_STRING "postgres://news:news@127.0.0.1:15432/matador") -#set(POSTGRES_CONNECTION_STRING "postgres://test:test123!@127.0.0.1:15432/matador") +#set(POSTGRES_CONNECTION_STRING "postgres://news:news@127.0.0.1:15432/matador") +set(POSTGRES_CONNECTION_STRING "postgres://test:test123!@127.0.0.1:15442/matador") configure_file(Connection.hpp.in ${PROJECT_BINARY_DIR}/backends/postgres/test/connection.hpp @ONLY IMMEDIATE) diff --git a/include/matador/object/foreign_node_completer.hpp b/include/matador/object/foreign_node_completer.hpp index 4c8331b..4f3dfc7 100644 --- a/include/matador/object/foreign_node_completer.hpp +++ b/include/matador/object/foreign_node_completer.hpp @@ -68,11 +68,11 @@ private: } template - void attach_node() { + void attach_node(const std::string &name = "") { if (repo_.contains(typeid(Type))) { return; } - const auto node = repository_node::make_node(repo_.repo(), ""); + const auto node = repository_node::make_node(repo_.repo(), name); if (auto result = repo_.attach_node(node)) { complete(result.value()); } @@ -101,13 +101,13 @@ void foreign_node_completer::on_has_many( const char* /*id*/, CollectionType&, c } 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*/ ) { - attach_node(); +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*/ ) { + attach_node(/*id*/); } template -void foreign_node_completer::on_has_many_to_many( const char* /*id*/, CollectionType& /*collection*/, const utils::foreign_attributes& /*attr*/ ) { - attach_node(); +void foreign_node_completer::on_has_many_to_many( const char* id, CollectionType& /*collection*/, const utils::foreign_attributes& /*attr*/ ) { + attach_node(/*id*/); } } diff --git a/include/matador/object/repository.hpp b/include/matador/object/repository.hpp index 96a5bf0..c101bf8 100644 --- a/include/matador/object/repository.hpp +++ b/include/matador/object/repository.hpp @@ -49,6 +49,9 @@ public: } else if (!has_node(name)) { it->second->update_name(name); nodes_by_name_[name] = it->second; + if (const auto i = nodes_by_name_.find(""); i != nodes_by_name_.end()) { + nodes_by_name_.erase(i); + } relation_completer::complete(it->second); log_.info("attach: update node name to '%s' (type: %s)", it->second->name().c_str(), it->second->type_index().name()); } else { @@ -135,6 +138,8 @@ public: return utils::ok(result.value()->info()); } + [[nodiscard]] utils::result basic_info(const std::string &name) const; + template [[nodiscard]] utils::result basic_info() const { auto result = find_node(std::type_index(typeid(Type))); diff --git a/include/matador/sql/column_generator.hpp b/include/matador/sql/column_generator.hpp index 051238c..0740812 100644 --- a/include/matador/sql/column_generator.hpp +++ b/include/matador/sql/column_generator.hpp @@ -39,6 +39,8 @@ public: return columns; } + static std::vector generate(const object::repository &scm, const std::string &name, bool force_lazy = false); + template < class Type > static std::vector generate_has_many_to_many(const object::repository &scm, const bool force_lazy = false) { const auto info = scm.info(); diff --git a/include/matador/sql/connection_pool.hpp b/include/matador/sql/connection_pool.hpp index 7aeee18..c38b430 100644 --- a/include/matador/sql/connection_pool.hpp +++ b/include/matador/sql/connection_pool.hpp @@ -15,7 +15,7 @@ namespace matador::sql { class connection_pool; struct identifiable_connection { - identifiable_connection(size_t id, connection conn); + identifiable_connection(size_t id, connection &&conn); size_t id{}; connection conn; }; diff --git a/source/core/object/repository.cpp b/source/core/object/repository.cpp index fa5a6df..b4e9ff5 100644 --- a/source/core/object/repository.cpp +++ b/source/core/object/repository.cpp @@ -53,6 +53,15 @@ bool repository::contains( const std::type_index& index ) const { return nodes_by_type_.count(index) > 0; } +utils::result repository::basic_info( const std::string& name ) const { + auto result = find_node(name); + if (!result) { + return utils::failure(result.err()); + } + + return utils::ok(basic_object_info_ref{result.value()->info()}); +} + utils::result, utils::error> repository::reference_column(const std::type_index &type_index) const { const auto result = find_node(type_index); if (result) { diff --git a/source/orm/sql/column_generator.cpp b/source/orm/sql/column_generator.cpp index 3bb5e6f..49958cc 100644 --- a/source/orm/sql/column_generator.cpp +++ b/source/orm/sql/column_generator.cpp @@ -18,6 +18,19 @@ column_generator::column_generator(std::vector &column_infos, seen_tables.insert(table_name); } +std::vector column_generator::generate( const object::repository& scm, const std::string& name, bool force_lazy ) { + const auto info = scm.basic_info(name); + if (!info) { + return {}; + } + + std::vector columns; + for (const auto attr : info.value().get().definition()) { + columns.push_back(column{attr.name()}); + } + return columns; +} + void column_generator::on_revision(const char *id, unsigned long long int &) { if (has_many_to_many_) { diff --git a/source/orm/sql/connection_pool.cpp b/source/orm/sql/connection_pool.cpp index c991d22..cea5f02 100644 --- a/source/orm/sql/connection_pool.cpp +++ b/source/orm/sql/connection_pool.cpp @@ -4,7 +4,7 @@ #include namespace matador::sql { -identifiable_connection::identifiable_connection(const size_t id, connection conn) +identifiable_connection::identifiable_connection(const size_t id, connection &&conn) : id(id) , conn(std::move(conn)){} @@ -57,7 +57,9 @@ connection_pool::connection_pool(const std::string& dns, size_t count) : info_(connection_info::parse(dns)) { connection_repo_.reserve(count); while (count) { - connection_repo_.emplace_back(count, connection{info_}); + connection c(info_); + connection_repo_.emplace_back(count, std::move(c)); + // connection_repo_.emplace_back(count, connection{info_}); auto &conn = connection_repo_.back(); idle_connections_.emplace(conn.id, &conn); // Todo: handle result diff --git a/test/backends/QueryTest.cpp b/test/backends/QueryTest.cpp index 8c9816e..04785c3 100644 --- a/test/backends/QueryTest.cpp +++ b/test/backends/QueryTest.cpp @@ -385,8 +385,7 @@ TEST_CASE_METHOD(QueryFixture, "Select statement with foreign key and for single TEST_CASE_METHOD(QueryFixture, "Select statement with many to many relationship", "[query][join][many_to_many]") { auto result = repo.attach("recipes") - .and_then( [this] { return repo.attach("ingredients"); } ) - .and_then( [this] { return repo.attach("recipe_ingredients"); } ); + .and_then( [this] { return repo.attach("ingredients"); } ); auto res = query::create() .table("recipes", repo) @@ -462,7 +461,7 @@ TEST_CASE_METHOD(QueryFixture, "Select statement with many to many relationship" for (const auto &ri: recipe_ingredients) { res = query::insert() - .into("recipe_ingredients", column_generator::generate(repo, true)) + .into("recipe_ingredients", column_generator::generate(repo, "recipe_ingredients", true)) .values({ri.first, ri.second}) .execute(db); REQUIRE(res.is_ok()); diff --git a/test/models/flight.hpp b/test/models/flight.hpp index 1194eb6..6188e2e 100644 --- a/test/models/flight.hpp +++ b/test/models/flight.hpp @@ -28,7 +28,7 @@ struct flight { namespace field = matador::access; using namespace matador::utils; field::primary_key(op, "id", id); - field::has_one(op, "airplane_id", plane, {utils::cascade_type::ALL, fetch_type::EAGER}); + field::belongs_to(op, "airplane_id", plane, {utils::cascade_type::ALL, fetch_type::EAGER}); field::attribute(op, "pilot_name", pilot_name, 255); } };