collection_resolver progress

This commit is contained in:
Sascha Kühl
2026-02-02 13:40:53 +01:00
parent f9333158e2
commit 621c3703fd
7 changed files with 38 additions and 54 deletions
@@ -6,9 +6,6 @@
#include "matador/object/object_resolver.hpp"
#include "matador/query/table.hpp"
#include "matador/query/select_query_builder.hpp"
namespace matador::sql {
class executor;
}
@@ -17,41 +14,20 @@ namespace matador::query {
template<typename Type>
class query_object_resolver : public object::object_resolver<Type> {
public:
explicit query_object_resolver(const basic_schema &repo, sql::executor& exec, const table &tab, std::string pk_name)
: executor_(exec)
, schema_(repo)
, table_(tab)
, pk_name_(std::move(pk_name)) {}
explicit query_object_resolver(sql::statement &&stmt)
: stmt_(std::move(stmt)) {}
std::shared_ptr<Type> resolve(const utils::identifier &id) override;
protected:
sql::executor& executor_;
const basic_schema &schema_;
const table &table_;
std::string pk_name_;
std::type_index index{typeid(Type)};
sql::statement stmt_;
};
utils::result<sql::statement, utils::error> prepare_statement(sql::executor& exec, entity_query_data &&data);
template<typename Type>
std::shared_ptr<Type> query_object_resolver<Type>::resolve(const utils::identifier &id) {
select_query_builder qb(schema_, executor_);
const auto *pk_column = table_[pk_name_];
auto builder_result = qb.build<Type>(*pk_column == utils::_);
if (!builder_result) {
return nullptr;
}
auto stmt = prepare_statement(executor_, builder_result.release());
if (!stmt) {
return nullptr;
}
sql::identifier_statement_binder binder(*stmt);
sql::identifier_statement_binder binder(stmt_);
binder.bind(id);
auto result = stmt->template fetch_one_raw<Type>();
auto result = stmt_.template fetch_one_raw<Type>();
if (!result) {
return nullptr;
}
+23 -1
View File
@@ -9,6 +9,7 @@
#include "matador/query/query_collection_resolver.hpp"
#include "matador/query/query_object_resolver.hpp"
#include "matador/query/select_query_builder.hpp"
#include "matador/query/basic_schema.hpp"
namespace matador::sql {
@@ -119,7 +120,28 @@ public:
Type obj;
access::process(pc, obj);
return std::make_shared<query_object_resolver<Type>>(repo_, exec, table_, std::move(pk_name_));
select_query_builder qb(repo_, exec);
const auto *pk_column = table_[pk_name_];
auto builder_result = qb.build<Type>(*pk_column == utils::_);
if (!builder_result) {
return nullptr;
}
auto data = builder_result.release();
auto stmt = query::query::select(data.columns)
.from(*data.root_table)
.join_left(data.joins)
.where(std::move(data.where_clause))
.order_by({data.root_table, data.pk_column_name})
.asc()
.prepare(exec);
if (!stmt) {
return nullptr;
}
return std::make_shared<query_object_resolver<Type>>(stmt.release());
}
private:
@@ -5,12 +5,12 @@
#include "matador/query/criteria.hpp"
#include "matador/query/query.hpp"
#include "matador/query/criteria/criteria_visitor.hpp"
#include "matador/sql/statement.hpp"
#include "matador/object/join_columns_collector.hpp"
#include "matador/object/repository.hpp"
#include "matador/query/criteria/criteria_visitor.hpp"
#include "matador/utils/primary_key_attribute.hpp"
#include "matador/utils/result.hpp"