From 6b24a0e41384072b53df076c7192b22823f44cff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sascha=20K=C3=BChl?= Date: Tue, 19 Aug 2025 18:07:27 +0200 Subject: [PATCH] proxy lazy resolve progress --- include/matador/orm/session.hpp | 4 ++-- include/matador/orm/session_query_builder.hpp | 12 +++++++----- .../matador/query/intermediates/fetchable_query.hpp | 2 +- source/orm/query/intermediates/fetchable_query.cpp | 10 +++++----- test/orm/orm/SessionQueryBuilderTest.cpp | 12 ++++++------ 5 files changed, 21 insertions(+), 19 deletions(-) diff --git a/include/matador/orm/session.hpp b/include/matador/orm/session.hpp index fd91468..6ec45a5 100644 --- a/include/matador/orm/session.hpp +++ b/include/matador/orm/session.hpp @@ -59,7 +59,7 @@ public: return utils::failure(make_error(error_code::UnknownType, "Failed to determine requested type.")); } - session_query_builder eqb(*schema_); + session_query_builder eqb(*schema_, *this); auto data = eqb.build(pk); if (!data.is_ok()) { return utils::failure(make_error(error_code::FailedToBuildQuery, "Failed to build query for type " + info->get().name() + ".")); @@ -87,7 +87,7 @@ public: return utils::failure(make_error(error_code::UnknownType, "Failed to determine requested type.")); } - session_query_builder eqb(*schema_); + session_query_builder eqb(*schema_, *this); auto data = eqb.build(); if (!data.is_ok()) { return utils::failure(make_error(error_code::FailedToBuildQuery, "Failed to build query for type " + info->get().name() + ".")); diff --git a/include/matador/orm/session_query_builder.hpp b/include/matador/orm/session_query_builder.hpp index 1ecf344..78abd89 100644 --- a/include/matador/orm/session_query_builder.hpp +++ b/include/matador/orm/session_query_builder.hpp @@ -7,6 +7,7 @@ #include "matador/query/query.hpp" #include "matador/sql/connection.hpp" +#include "matador/sql/executor.hpp" #include "matador/object/join_columns_collector.hpp" #include "matador/object/schema.hpp" @@ -28,11 +29,11 @@ struct entity_query_data { std::unique_ptr where_clause{}; }; -class session_query_builder final -{ +class session_query_builder final { public: - explicit session_query_builder(const object::schema &scm) - : schema_(scm) {} + session_query_builder(const object::schema &scm, sql::executor &exec) + : schema_(scm) + , executor_(exec){} template utils::result build(const PrimaryKeyType &pk) { @@ -250,6 +251,7 @@ private: unsigned int column_index{0}; unsigned int table_index{0}; object::join_columns_collector join_columns_collector_; + sql::executor &executor_; }; template @@ -287,7 +289,7 @@ void session_query_builder::on_foreign_object(const char *id, Pointer &, const u const auto result = matador::query::query::select(schema_) .from(*foreign_table) .where(sql::column(foreign_table, id, "") == _) - .com; + .prepare(executor_); } } diff --git a/include/matador/query/intermediates/fetchable_query.hpp b/include/matador/query/intermediates/fetchable_query.hpp index 223f710..b2fdd08 100644 --- a/include/matador/query/intermediates/fetchable_query.hpp +++ b/include/matador/query/intermediates/fetchable_query.hpp @@ -71,7 +71,7 @@ public: [[nodiscard]] utils::result prepare(sql::executor &exec) const; [[nodiscard]] std::string str(const sql::executor &exec) const; - [[nodiscard]] sql::query_context compile(const sql::executor &exec, query_mode mode) const; + [[nodiscard]] sql::query_context compile(const sql::dialect &d, query_mode mode) const; private: [[nodiscard]] utils::result, utils::error> fetch(const sql::executor &exec) const; diff --git a/source/orm/query/intermediates/fetchable_query.cpp b/source/orm/query/intermediates/fetchable_query.cpp index 37fff2d..84fc4fe 100644 --- a/source/orm/query/intermediates/fetchable_query.cpp +++ b/source/orm/query/intermediates/fetchable_query.cpp @@ -32,21 +32,21 @@ utils::result, utils::error> fetchable_query::fetch_o } std::string fetchable_query::str(const sql::executor &exec) const { - return exec.str(compile(exec, query_mode::Direct)); + return exec.str(compile(exec.dialect(), query_mode::Direct)); } -sql::query_context fetchable_query::compile(const sql::executor &exec, const query_mode mode) const { +sql::query_context fetchable_query::compile(const sql::dialect &d, const query_mode mode) const { query_compiler compiler; context_->mode = mode; - return compiler.compile(*context_, exec.dialect(), std::nullopt); + return compiler.compile(*context_, d, std::nullopt); } utils::result, utils::error> fetchable_query::fetch(const sql::executor &exec) const { - return exec.fetch(compile(exec, query_mode::Direct)); + return exec.fetch(compile(exec.dialect(), query_mode::Direct)); } utils::result fetchable_query::prepare(sql::executor &exec) const { - return exec.prepare(compile(exec, query_mode::Prepared)); + return exec.prepare(compile(exec.dialect(), query_mode::Prepared)); } } \ No newline at end of file diff --git a/test/orm/orm/SessionQueryBuilderTest.cpp b/test/orm/orm/SessionQueryBuilderTest.cpp index e617440..0f42705 100644 --- a/test/orm/orm/SessionQueryBuilderTest.cpp +++ b/test/orm/orm/SessionQueryBuilderTest.cpp @@ -37,7 +37,7 @@ TEST_CASE("Create sql query data for entity with eager has one", "[query][entity .and_then( [&scm] { return scm.attach("flights"); } ); REQUIRE(result); - session_query_builder eqb(scm); + session_query_builder eqb(scm, db); auto data = eqb.build(17U); @@ -82,7 +82,7 @@ TEST_CASE("Create sql query data for entity with eager belongs to", "[query][ent .and_then( [&scm] { return scm.attach("books"); } ); REQUIRE(result); - session_query_builder eqb(scm); + session_query_builder eqb(scm, db); auto data = eqb.build(17); @@ -145,7 +145,7 @@ TEST_CASE("Create sql query data for entity with eager has many belongs to", "[q .and_then( [&scm] { return scm.attach("orders"); } ); REQUIRE(result); - session_query_builder eqb(scm); + session_query_builder eqb(scm, db); auto data = eqb.build(17); @@ -200,7 +200,7 @@ TEST_CASE("Create sql query data for entity with eager many to many", "[query][e .and_then( [&scm] { return scm.attach("ingredients"); } ); // .and_then( [&scm] { return scm.attach("recipe_ingredients"); } ); - session_query_builder eqb(scm); + session_query_builder eqb(scm, db); auto data = eqb.build(17); @@ -245,7 +245,7 @@ TEST_CASE("Create sql query data for entity with eager many to many (inverse par .and_then( [&scm] { return scm.attach("courses"); } ); // .and_then( [&scm] { return scm.attach("student_courses"); } ); - session_query_builder eqb(scm); + session_query_builder eqb(scm, db); auto data = eqb.build(17); @@ -289,7 +289,7 @@ TEST_CASE("Test eager relationship", "[session][eager]") { auto result = scm.attach("departments") .and_then( [&scm] { return scm.attach("employees"); } ); - session_query_builder eqb(scm); + session_query_builder eqb(scm, db); auto data = eqb.build(); REQUIRE(data.is_ok());