From ab2d39407c9eee80f311bba8a817e5446a0dce77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sascha=20K=C3=BChl?= Date: Wed, 31 Dec 2025 11:56:12 +0100 Subject: [PATCH] schema progress (does not compile) --- .../matador/object/foreign_node_completer.hpp | 83 +--- .../internal/observer_list_copy_creator.hpp | 57 +++ .../object/internal/observer_list_creator.hpp | 69 ++++ .../object/internal/shadow_repository.hpp | 5 + include/matador/object/object_generator.hpp | 12 +- include/matador/object/object_info.hpp | 44 +- include/matador/object/observer.hpp | 10 +- include/matador/object/relation_completer.hpp | 111 ++--- include/matador/object/relation_endpoint.hpp | 2 +- include/matador/object/repository.hpp | 48 ++- include/matador/object/repository_node.hpp | 45 +- include/matador/orm/session_query_builder.hpp | 199 +++++---- include/matador/query/builder.hpp | 20 +- include/matador/query/column.hpp | 11 +- include/matador/query/constraint.hpp | 3 + .../criteria/abstract_column_criteria.hpp | 6 +- .../query/criteria/between_criteria.hpp | 6 +- .../query/criteria/binary_criteria.hpp | 12 +- .../query/criteria/collection_criteria.hpp | 10 +- .../query/criteria/criteria_operators.hpp | 54 +-- .../matador/query/criteria/like_criteria.hpp | 6 +- include/matador/query/generator.hpp | 17 - .../query_insert_intermediate.hpp | 9 +- include/matador/query/query.hpp | 5 +- include/matador/query/query_compiler.hpp | 6 +- include/matador/query/query_utils.hpp | 1 - include/matador/query/schema.hpp | 82 ++-- include/matador/query/table.hpp | 30 +- include/matador/sql/query_macro.hpp | 9 +- source/core/CMakeLists.txt | 2 + source/core/object/attribute.cpp | 4 +- .../object/internal/shadow_repository.cpp | 18 +- source/core/object/object_generator.cpp | 2 +- source/core/object/repository.cpp | 23 +- source/core/object/repository_node.cpp | 6 - source/orm/orm/session.cpp | 2 +- source/orm/orm/session_query_builder.cpp | 19 +- source/orm/query/builder.cpp | 37 +- source/orm/query/column.cpp | 69 +++- source/orm/query/constraint.cpp | 17 + .../criteria/abstract_column_criteria.cpp | 4 +- .../orm/query/criteria/between_criteria.cpp | 8 +- source/orm/query/criteria/binary_criteria.cpp | 14 +- .../query/criteria/collection_criteria.cpp | 13 +- source/orm/query/criteria/like_criteria.cpp | 5 +- source/orm/query/generator.cpp | 5 - .../query_create_intermediate.cpp | 30 +- source/orm/query/query_compiler.cpp | 38 +- source/orm/query/query_utils.cpp | 32 +- source/orm/query/schema.cpp | 391 ++++++++++-------- source/orm/query/table.cpp | 90 +++- test/backends/QueryBasicTest.cpp | 14 +- test/backends/QueryFixture.cpp | 2 + test/backends/QueryFixture.hpp | 6 +- test/backends/QueryRecordTest.cpp | 138 ++++--- test/backends/QueryStatementTests.cpp | 50 +-- test/backends/QueryTest.cpp | 15 +- test/backends/SchemaTest.cpp | 22 +- test/backends/StatementTest.cpp | 11 +- test/backends/TypeTraitsTest.cpp | 2 +- test/core/object/RepositoryTest.cpp | 31 +- test/orm/orm/SessionQueryBuilderTest.cpp | 119 ++++-- test/orm/query/GeneratorTests.cpp | 30 +- test/orm/query/QueryBuilderTest.cpp | 30 +- test/orm/sql/ColumnGeneratorTest.cpp | 6 +- 65 files changed, 1355 insertions(+), 922 deletions(-) create mode 100644 include/matador/object/internal/observer_list_copy_creator.hpp create mode 100644 include/matador/object/internal/observer_list_creator.hpp diff --git a/include/matador/object/foreign_node_completer.hpp b/include/matador/object/foreign_node_completer.hpp index f771b69..01e8ff2 100644 --- a/include/matador/object/foreign_node_completer.hpp +++ b/include/matador/object/foreign_node_completer.hpp @@ -2,6 +2,7 @@ #define FOREIGN_NODE_COMPLETER_HPP #include "matador/object/internal/shadow_repository.hpp" +#include "matador/object/internal/observer_list_copy_creator.hpp" #include "matador/object/many_to_many_relation.hpp" #include "matador/object/repository_node.hpp" #include "matador/object/join_columns_collector.hpp" @@ -35,9 +36,9 @@ private: using node_ptr = std::shared_ptr; public: - static void complete(const std::shared_ptr &node, Observers... observers) { + static void complete(const std::shared_ptr &node, const std::vector>> &observers) { internal::shadow_repository shadow(node->repo_); - foreign_node_completer completer(shadow, observers...); + foreign_node_completer completer(shadow, observers); completer.complete_node(node); } @@ -77,11 +78,10 @@ public: 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, Observers... observers) + explicit foreign_node_completer(internal::shadow_repository &shadow, const std::vector>> &observers) : repo_(shadow) - , log_(logger::create_logger("node_completer")) { - // observers_.emplace_back(observers...); - } + , log_(logger::create_logger("node_completer")) + , observers_(observers) {} void complete_node(const std::shared_ptr &node) { nodes_.push(node); @@ -91,75 +91,22 @@ private: nodes_.pop(); } - template - void attach_node(const std::string &name) { - if (repo_.contains(typeid(Type))) { - return; - } - const auto node = repository_node::make_node(repo_.repo(), name); - if (auto result = repo_.attach_node(node)) { - foreign_node_completer::complete(result.value()); - } - } - template void attach_node() { if (repo_.contains(typeid(Type))) { return; } - const auto node = repository_node::make_node(repo_.repo(), "", []{ return std::make_unique(); }); - if (auto result = repo_.attach_node(node)) { - foreign_node_completer::complete(result.value()); - } - } + auto observers = internal::observer_list_copy_creator::copy_create(observers_); - template - void attach_relation_node(const std::string &name, const std::string &join_column, const std::string &inverse_join_column) { - using relation_value_type = many_to_many_relation; - using value_type = Type; - - // Check if the object_ptr type is already inserted in the schema (by id) - auto result = repo_.find_node(typeid(value_type)); - if (!result) { - // Todo: throw internal error or attach node + if (repo_.is_node_announced(typeid(Type))) { return; } - - const auto foreign_node = result.value(); - result = repo_.find_node(name); - if (result) { - return; - } - // Relation does not exist. Create it. - auto creator = [join_column, inverse_join_column] { - return std::make_unique(join_column, inverse_join_column); - }; - - auto node = repository_node::make_node(repo_.repo(), name, std::move(creator)); - result = repo_.attach_node(node); - if (!result) { - // Todo: throw internal error - return; - } - - foreign_node_completer::complete(result.value()); - - // auto& node = result.value(); - const auto local_endpoint = std::make_shared(name, relation_type::HasMany, node); - const auto join_endpoint = std::make_shared(join_column, relation_type::BelongsTo, nodes_.top()); - const auto inverse_join_endpoint = std::make_shared(inverse_join_column, relation_type::BelongsTo, foreign_node); - const auto foreign_endpoint = std::make_shared(name, relation_type::HasMany, node); - // register relation endpoint in local node - nodes_.top()->info_->register_relation_endpoint(typeid(value_type), local_endpoint); - // register relation endpoint in foreign node - foreign_node->info_->register_relation_endpoint(nodes_.top()->type_index(), foreign_endpoint); - // register endpoints in relation node - node->info_->register_relation_endpoint(nodes_.top()->type_index(), join_endpoint); - node->info_->register_relation_endpoint(typeid(value_type), inverse_join_endpoint); - // link endpoints - link_relation_endpoints(local_endpoint, join_endpoint); - link_relation_endpoints(foreign_endpoint, inverse_join_endpoint); + const auto node = repository_node::make_node(repo_.repo(), "", []{ return std::make_unique(); }, std::move(observers)); + repo_.push_announce_node(typeid(Type), node); + // if (auto result = repo_.attach_node(node)) { + // foreign_node_completer::complete(result.value(), {}); + // } } private: @@ -178,7 +125,7 @@ private: internal::shadow_repository &repo_; logger::logger log_; join_columns_collector join_columns_collector_{}; - // const std::vector...> observers_; + const std::vector>>& observers_; }; @@ -190,7 +137,7 @@ void foreign_node_completer::on_belongs_to(const char * 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 * /*id*/, ForeignPointerType &, const utils::foreign_attributes &) { attach_node(); } diff --git a/include/matador/object/internal/observer_list_copy_creator.hpp b/include/matador/object/internal/observer_list_copy_creator.hpp new file mode 100644 index 0000000..1eaba10 --- /dev/null +++ b/include/matador/object/internal/observer_list_copy_creator.hpp @@ -0,0 +1,57 @@ +#ifndef MATADOR_OBSERVER_LIST_COPY_CREATOR_HPP +#define MATADOR_OBSERVER_LIST_COPY_CREATOR_HPP + +#include "matador/object/observer.hpp" + +#include +#include + +namespace matador::object::internal { +template class... ObserverType> +class observer_list_copy_creator +{ +public: + using source_observer_vector = std::vector>>; + using observer_vector = std::vector>>; + using iterator = typename observer_vector::iterator; + + static observer_vector copy_create(const source_observer_vector &source_observers) { + observer_list_copy_creator creator(source_observers); + + return std::move(creator.observers_); + } + +private: + explicit observer_list_copy_creator(const source_observer_vector &source_observers) + : source_observers_(source_observers) { + if constexpr (sizeof...(ObserverType) != 0) { + copy_observer(); + } + } + + template