delete has many to many progress

This commit is contained in:
2026-05-28 15:45:46 +02:00
parent 73bd6f641c
commit 68d67b17b7
15 changed files with 417 additions and 244 deletions
+57
View File
@@ -0,0 +1,57 @@
#include "matador/query/schema_utils.hpp"
#include "matador/query/query.hpp"
#include "matador/query/criteria.hpp"
using namespace matador::utils;
namespace matador::query {
query_contexts to_query_contexts(const schema_node& node, const sql::dialect &d) {
query_contexts queries;
// SELECT all
queries.select_all = select(node.table())
.from(node.name())
.compile(d);
if (node.table().has_primary_key()) {
// SELECT one
queries.select_one = select(node.table())
.from(node.name())
.where(*node.table().primary_key_column() == _)
.compile(d);
// UPDATE one
auto update_set = query::update(node.table());
for (const auto &col: node.table().columns()) {
update_set.set(col, _);
}
queries.update_one = update_set.where(*node.table().primary_key_column() == _)
.compile(d);
// DELETE one
queries.delete_one = query::remove()
.from(node.name())
.where(*node.table().primary_key_column() == _)
.compile(d);
}
// INSERT one
std::vector<table_column> columns;
for (const auto &col: node.table().columns()) {
if (col.is_primary_key() && utils::is_constraint_set(col.attributes().options(), constraints::Identity)) {
continue;
}
columns.push_back(col);
}
if (node.pk_generator().type() == utils::generator_type::Identity) {
queries.insert = query::insert()
.into(node.name(), columns)
.values(generator::placeholders(columns.size()))
.returning(node.table().primary_key_column()->as(node.table().primary_key_column()->column_name()))
.compile(d);
} else {
queries.insert = query::insert()
.into(node.name(), columns)
.values(generator::placeholders(columns.size()))
.compile(d);
}
return queries;
}
}
+2 -47
View File
@@ -3,9 +3,8 @@
#include "matador/sql/backend_provider.hpp"
#include "matador/sql/dialect.hpp"
#include "matador/query/query.hpp"
#include "matador/query/generator.hpp"
#include "matador/query/basic_schema.hpp"
#include "matador/query/schema_utils.hpp"
#include <stdexcept>
@@ -23,51 +22,7 @@ session::session(session_context&& ctx, const basic_schema &scm)
, resolver_service_(ctx.resolver_service) {
using namespace matador::utils;
for (const auto &[type, node] : schema_) {
query_contexts queries;
// SELECT all
queries.select_all = select(node.table())
.from(node.name())
.compile(dialect_);
if (node.table().has_primary_key()) {
// SELECT one
queries.select_one = select(node.table())
.from(node.name())
.where(*node.table().primary_key_column() == _)
.compile(dialect_);
// UPDATE one
auto update_set = query::update(node.table());
for (const auto &col: node.table().columns()) {
update_set.set(col, _);
}
queries.update_one = update_set.where(*node.table().primary_key_column() == _)
.compile(dialect_);
// DELETE one
queries.delete_one = query::remove()
.from(node.name())
.where(*node.table().primary_key_column() == _)
.compile(dialect_);
}
// INSERT one
std::vector<table_column> columns;
for (const auto &col: node.table().columns()) {
if (col.is_primary_key() && utils::is_constraint_set(col.attributes().options(), constraints::Identity)) {
continue;
}
columns.push_back(col);
}
if (node.pk_generator().type() == utils::generator_type::Identity) {
queries.insert = query::insert()
.into(node.name(), columns)
.values(generator::placeholders(columns.size()))
.returning(node.table().primary_key_column()->as(node.table().primary_key_column()->column_name()))
.compile(dialect_);
} else {
queries.insert = query::insert()
.into(node.name(), columns)
.values(generator::placeholders(columns.size()))
.compile(dialect_);
}
query_contexts queries = to_query_contexts(node, dialect_);
queries.insert.resolver = resolver_service_;
queries.update_one.resolver = resolver_service_;