From 0a0e3752ea90b453dc2d64df86c714260f6b00e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sascha=20K=C3=BChl?= Date: Thu, 16 Apr 2026 07:00:37 +0200 Subject: [PATCH] insert_query_builder progress --- .../matador/query/insert_query_builder.hpp | 54 ++++++++++--------- source/orm/query/insert_query_builder.cpp | 9 +--- 2 files changed, 31 insertions(+), 32 deletions(-) diff --git a/include/matador/query/insert_query_builder.hpp b/include/matador/query/insert_query_builder.hpp index cf8f11c..36e5770 100644 --- a/include/matador/query/insert_query_builder.hpp +++ b/include/matador/query/insert_query_builder.hpp @@ -51,38 +51,39 @@ private: std::string join_column_; }; +struct insert_step { + sql::query_context ctx; + utils::result acquire_and_bind(sql::statement_cache &cache) const; + + // Session uses these to handle manual/sequence/table pre-insert PKs + utils::generator_type pk_generator{utils::generator_type::Manual}; + utils::primary_key_accessor pk_accessor; + + // Identity post-insert + std::function apply_returning{}; + std::function bind_object{}; +}; + +template class insert_query_builder { public: - using step_query_t = std::variant; + explicit insert_query_builder(const basic_schema &schema, const std::unordered_map &contexts_by_type) + : schema_(schema) + , contexts_by_type_{contexts_by_type} + {} - struct insert_step { - sql::query_context ctx; - - utils::result acquire_and_bind(sql::statement_cache &cache) const; - - // Session uses these to handle manual/sequence/table pre-insert PKs - utils::generator_type pk_generator{utils::generator_type::Manual}; - utils::primary_key_accessor pk_accessor; - - // Identity post-insert - std::function apply_returning{}; - std::function bind_object{}; - }; - -public: - explicit insert_query_builder(const basic_schema &schema, const std::unordered_map &contexts_by_type); - - template - utils::result, query_build_error> build(const object::object_ptr &ptr) { - if (const auto it = schema_.find(typeid(EntityType)); it == schema_.end()) { + utils::result, query_build_error> build(const object::object_ptr &ptr) { + if (const auto it = schema_.find(typeid(ObjectType)); it == schema_.end()) { return utils::failure(query_build_error::UnknownType); } steps_.clear(); visited_.clear(); + ptr_ = ptr; build_for(ptr); + ptr_.reset(); // relation inserts must run after all entity inserts were collected for (auto &s : relation_steps_) { @@ -95,7 +96,7 @@ public: template < class PrimaryKeyType > static void on_primary_key(const char * /*id*/, PrimaryKeyType &, const utils::primary_key_attribute& /*attr*/) {} - static void on_revision(const char *id, uint64_t &/*rev*/); + static void on_revision(const char * /*id*/, uint64_t &/*rev*/) {} template static void on_attribute(const char * /*id*/, Type &, const utils::field_attributes &/*attr*/) {} @@ -109,13 +110,16 @@ public: on_foreign_object(obj, attr); } template - void on_has_many(const char * /*id*/, CollectionType &con, const char *, const utils::foreign_attributes &attr, std::enable_if_t::value> * = nullptr) { + void on_has_many(const char * /*id*/, CollectionType &objects, const char *join_column, const utils::foreign_attributes &attr, std::enable_if_t::value> * = nullptr) { if (!utils::is_cascade_type_set(attr.cascade(), utils::cascade_type::Insert)) { return; } - for (auto &obj : con) { + + has_many_linker linker(ptr_, join_column); + for (auto &obj : objects) { obj.is_persistent() ? build_for(obj) : on_foreign_object(obj, attr); + access::process(linker, obj); } } @@ -250,6 +254,8 @@ private: const basic_schema &schema_; const std::unordered_map &contexts_by_type_; + object::object_ptr ptr_; + std::vector steps_; std::vector relation_steps_; std::unordered_set, visit_key_hash> visited_; diff --git a/source/orm/query/insert_query_builder.cpp b/source/orm/query/insert_query_builder.cpp index 71d08e7..08455ea 100644 --- a/source/orm/query/insert_query_builder.cpp +++ b/source/orm/query/insert_query_builder.cpp @@ -3,12 +3,7 @@ #include "matador/sql/statement_cache.hpp" namespace matador::query { -insert_query_builder::insert_query_builder(const basic_schema& schema, const std::unordered_map &contexts_by_type) -: schema_(schema) -, contexts_by_type_{contexts_by_type} -{} - -utils::result insert_query_builder::insert_step::acquire_and_bind(sql::statement_cache &cache) const { +utils::result insert_step::acquire_and_bind(sql::statement_cache &cache) const { auto result = cache.acquire(ctx); if (!result.is_ok()) { return utils::failure(result.err()); @@ -18,6 +13,4 @@ utils::result insert_query_builder::insert_step::a return utils::ok(std::move(*result)); } - -void insert_query_builder::on_revision(const char* /*id*/, uint64_t&) {} } // namespace matador::query \ No newline at end of file