From dd737623f4d3f9904081d5f0bc1cfd6abd13275b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sascha=20K=C3=BChl?= Date: Tue, 15 Jul 2025 07:09:40 +0200 Subject: [PATCH] session topological sorted table creation (progress) --- include/matador/object/relation_endpoint.hpp | 2 + source/core/object/relation_endpoint.cpp | 4 ++ source/orm/orm/session.cpp | 51 +++++++++----------- 3 files changed, 30 insertions(+), 27 deletions(-) diff --git a/include/matador/object/relation_endpoint.hpp b/include/matador/object/relation_endpoint.hpp index bf82aa2..01379c1 100644 --- a/include/matador/object/relation_endpoint.hpp +++ b/include/matador/object/relation_endpoint.hpp @@ -31,6 +31,8 @@ public: [[nodiscard]] std::string type_name() const; [[nodiscard]] const schema_node& node() const; + std::shared_ptr node_ptr() const; + [[nodiscard]] bool is_has_one() const; [[nodiscard]] bool is_has_many() const; [[nodiscard]] bool is_belongs_to() const; diff --git a/source/core/object/relation_endpoint.cpp b/source/core/object/relation_endpoint.cpp index a8f179e..50d30f7 100644 --- a/source/core/object/relation_endpoint.cpp +++ b/source/core/object/relation_endpoint.cpp @@ -25,6 +25,10 @@ const schema_node &relation_endpoint::node() const { return *node_; } +std::shared_ptr relation_endpoint::node_ptr() const { + return node_; +} + bool relation_endpoint::is_has_one() const { return type_ == relation_type::HAS_ONE; } diff --git a/source/orm/orm/session.cpp b/source/orm/orm/session.cpp index d54ec94..e5bfd64 100644 --- a/source/orm/orm/session.cpp +++ b/source/orm/orm/session.cpp @@ -19,23 +19,6 @@ session::session(sql::connection_pool &pool) } utils::result session::create_schema() const { - std::vector > relations_nodes; - auto c = pool_.acquire(); - for (const auto &node: *schema_) { - // if (!node->info().has_primary_key()) { - // relations_nodes.push_back(node); - // continue; - // } - auto result = query::query::create() - .table(node->name(), node->info().definition().columns()) - .execute(*c); - if (!result) { - return utils::failure(result.err()); - } - } - return utils::ok(); - - // Step 1: Build dependency graph std::unordered_map > dependency_graph; std::unordered_map> in_degree; @@ -44,14 +27,14 @@ utils::result session::create_schema() const { for (auto it = node->info().endpoint_begin(); it != node->info().endpoint_end(); ++it) { dependency_graph[node->name()].push_back(it->second->node().name()); - in_degree[it->second->node().name()] = std::make_pair(0, it->second->node()); - in_degree[it->second->node().name()]++; + in_degree[it->second->node().name()] = std::make_pair(0, it->second->node_ptr()); + in_degree[it->second->node().name()].first++; } // Ensure the current node exists in the graph representation if (in_degree.find(node->name()) == in_degree.end()) { - in_degree[node->name()] = 0; + in_degree[node->name()].first = 0; } } @@ -60,8 +43,8 @@ utils::result session::create_schema() const { std::vector sorted_order; for (const auto &[table, degree]: in_degree) { - if (degree == 0) { - zero_in_degree.push(table); + if (degree.first == 0) { + zero_in_degree.push(degree.second); } } @@ -70,11 +53,11 @@ utils::result session::create_schema() const { zero_in_degree.pop(); sorted_order.push_back(current); - for (const auto &neighbor: dependency_graph[current]) { - in_degree[neighbor]--; + for (const auto &neighbor: dependency_graph[current->name()]) { + in_degree[neighbor].first--; - if (in_degree[neighbor] == 0) { - zero_in_degree.push(neighbor); + if (in_degree[neighbor].first == 0) { + zero_in_degree.push(in_degree[neighbor].second); } } } @@ -87,7 +70,8 @@ utils::result session::create_schema() const { // Step 4: Create tables in the sorted order - for (const auto &table_name : sorted_order) { + for (const auto &node : sorted_order) { + std::cout << "Creating table " << node->name() << std::endl; // schema_. // auto result = query::query::create() // @@ -101,6 +85,19 @@ utils::result session::create_schema() const { // // } } + + auto c = pool_.acquire(); + for (const auto &node: *schema_) { + auto result = query::query::create() + .table(node->name(), node->info().definition().columns()) + .execute(*c); + if (!result) { + return utils::failure(result.err()); + } + } + + return utils::ok(); + } utils::result session::drop_table(const std::string &table_name) const {