collection_resolver progress
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user