implemented lazy loading for object_ptr and belongs_to
This commit is contained in:
@@ -1,17 +0,0 @@
|
||||
#include "matador/orm/query_builder_exception.hpp"
|
||||
|
||||
namespace matador::orm {
|
||||
|
||||
query_builder_exception::query_builder_exception( const query_build_error error, utils::error&& err )
|
||||
: error_type_(error)
|
||||
, error_( std::move(err) ) {}
|
||||
|
||||
query_build_error query_builder_exception::error_type() const {
|
||||
return error_type_;
|
||||
}
|
||||
|
||||
const utils::error& query_builder_exception::error() const {
|
||||
return error_;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
#include "matador/sql/backend_provider.hpp"
|
||||
#include "matador/sql/dialect.hpp"
|
||||
#include "matador/sql/query_record_result.hpp"
|
||||
|
||||
#include "matador/query/query.hpp"
|
||||
|
||||
@@ -13,9 +14,11 @@ utils::error make_error(const error_code ec, const std::string &msg) {
|
||||
}
|
||||
|
||||
session::session(session_context&& ctx, const query::schema &scm)
|
||||
: cache_(ctx.bus, ctx.pool, ctx.cache_size)
|
||||
, dialect_(sql::backend_provider::instance().connection_dialect(ctx.pool.info().type))
|
||||
, schema_(scm) {
|
||||
: pool_(ctx.dns, ctx.connection_count, [ctx](const sql::connection_info& info) { return sql::connection(info, ctx.resolver_factory); })
|
||||
, cache_(ctx.bus, pool_, ctx.cache_size)
|
||||
, dialect_(sql::backend_provider::instance().connection_dialect(pool_.info().type))
|
||||
, schema_(scm)
|
||||
, resolver_factory_(ctx.resolver_factory) {
|
||||
}
|
||||
|
||||
utils::result<void, utils::error> session::drop_table(const std::string &table_name) const {
|
||||
@@ -54,10 +57,8 @@ utils::result<sql::query_result<sql::record>, utils::error> session::fetch_all(c
|
||||
if (!res) {
|
||||
return utils::failure(res.err());
|
||||
}
|
||||
const auto prototype = res.value()->prototype();
|
||||
return utils::ok(sql::query_result<sql::record>{std::move(*res), [prototype] {
|
||||
return sql::detail::create_prototype<sql::record>(prototype);
|
||||
}});
|
||||
const auto prototype = res.value()->prototype();
|
||||
return utils::ok(sql::query_result<sql::record>{std::move(*res), prototype});
|
||||
}
|
||||
|
||||
utils::result<size_t, utils::error> session::execute(const std::string &sql) const {
|
||||
@@ -84,6 +85,14 @@ const class sql::dialect &session::dialect() const {
|
||||
return dialect_;
|
||||
}
|
||||
|
||||
std::shared_ptr<sql::producer_resolver_factory> session::resolver_factory() const {
|
||||
return resolver_factory_;
|
||||
}
|
||||
|
||||
const query::basic_schema & session::schema() const {
|
||||
return schema_;
|
||||
}
|
||||
|
||||
utils::result<std::unique_ptr<sql::query_result_impl>, utils::error> session::fetch(const sql::query_context& ctx) const {
|
||||
if (const auto result = cache_.acquire(ctx); !result) {
|
||||
return utils::failure(result.err());
|
||||
@@ -112,7 +121,7 @@ std::string session::str(const sql::query_context& ctx) const {
|
||||
return ctx.sql;
|
||||
}
|
||||
|
||||
query::fetchable_query session::build_select_query(entity_query_data &&data) {
|
||||
query::fetchable_query session::build_select_query(query::entity_query_data &&data) {
|
||||
return query::query::select(data.columns)
|
||||
.from(*data.root_table)
|
||||
.join_left(data.joins)
|
||||
|
||||
@@ -1,83 +0,0 @@
|
||||
#include "matador/orm/session_query_builder.hpp"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
namespace matador::orm {
|
||||
criteria_transformer::criteria_transformer(const query::schema& repo, const std::unordered_map<std::string, query::table>& tables_by_name)
|
||||
: repo_(repo)
|
||||
, tables_by_name_(tables_by_name) {}
|
||||
|
||||
void criteria_transformer::visit( const query::between_criteria& node ) {
|
||||
update_criteria_column(node);
|
||||
}
|
||||
|
||||
void criteria_transformer::visit( const query::binary_criteria& node ) {
|
||||
update_criteria_column(node);
|
||||
}
|
||||
|
||||
void criteria_transformer::visit( const query::binary_column_criteria& /*node*/ ) {}
|
||||
|
||||
void criteria_transformer::visit( const query::collection_criteria& node ) {
|
||||
update_criteria_column(node);
|
||||
}
|
||||
|
||||
void criteria_transformer::visit( const query::collection_query_criteria& node ) {
|
||||
update_criteria_column(node);
|
||||
}
|
||||
|
||||
void criteria_transformer::visit( const query::like_criteria& node ) {
|
||||
update_criteria_column(node);
|
||||
}
|
||||
|
||||
void criteria_transformer::visit( const query::logical_criteria& node ) {
|
||||
node.left_clause()->accept(*this);
|
||||
node.right_clause()->accept(*this);
|
||||
}
|
||||
|
||||
void criteria_transformer::visit( const query::not_criteria& node ) {
|
||||
node.clause()->accept(*this);
|
||||
}
|
||||
|
||||
void criteria_transformer::update_criteria_column(const query::abstract_column_criteria& node) const {
|
||||
if (node.col().table() == nullptr) {
|
||||
return;
|
||||
}
|
||||
const auto it = tables_by_name_.find(node.col().table()->name());
|
||||
if (it == tables_by_name_.end()) {
|
||||
return;
|
||||
}
|
||||
|
||||
const_cast<query::table_column&>(node.col()).table(&it->second);
|
||||
}
|
||||
|
||||
void session_query_builder::on_revision(const char *id, uint64_t &/*rev*/) {
|
||||
push(id);
|
||||
}
|
||||
|
||||
void session_query_builder::push(const std::string &column_name) {
|
||||
const auto it = processed_tables_.find(table_info_stack_.top().info.name());
|
||||
if (it == processed_tables_.end()) {
|
||||
throw query_builder_exception{query_build_error::UnexpectedError};
|
||||
}
|
||||
entity_query_data_.columns.emplace_back(&it->second, column_name, build_alias('c', ++column_index));
|
||||
}
|
||||
|
||||
std::string session_query_builder::build_alias(const char prefix, const unsigned int count) {
|
||||
char str[4];
|
||||
snprintf(str, 4, "%c%02d", prefix, count);
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
[[nodiscard]] bool session_query_builder::is_root_entity() const {
|
||||
return table_info_stack_.size() == 1;
|
||||
}
|
||||
|
||||
void session_query_builder::append_join(const query::table_column &left, const query::table_column &right) {
|
||||
using namespace matador::query;
|
||||
entity_query_data_.joins.push_back({
|
||||
right.table(),
|
||||
std::make_unique<binary_column_criteria>(left, binary_operator::EQUALS, right)
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user