added alter table command to fluent query builder (progress)

This commit is contained in:
Sascha Kühl
2025-11-03 16:21:26 +01:00
parent 557abecf91
commit c3c7ea57a2
22 changed files with 451 additions and 26 deletions
+10 -6
View File
@@ -4,17 +4,21 @@ add_library(matador-orm STATIC
../../include/matador/orm/session.hpp
../../include/matador/orm/session_query_builder.hpp
../../include/matador/query/attribute_string_writer.hpp
../../include/matador/query/criteria.hpp
../../include/matador/query/criteria/abstract_column_criteria.hpp
../../include/matador/query/criteria/abstract_criteria.hpp
../../include/matador/query/criteria/between_criteria.hpp
../../include/matador/query/criteria/collection_criteria.hpp
../../include/matador/query/criteria.hpp
../../include/matador/query/criteria/criteria_operators.hpp
../../include/matador/query/criteria/criteria_utils.hpp
../../include/matador/query/criteria/criteria_visitor.hpp
../../include/matador/query/criteria/like_criteria.hpp
../../include/matador/query/criteria/logical_criteria.hpp
../../include/matador/query/criteria_evaluator.hpp
../../include/matador/query/fk_value_extractor.hpp
../../include/matador/query/intermediates/executable_query.hpp
../../include/matador/query/intermediates/fetchable_query.hpp
../../include/matador/query/intermediates/query_alter_intermediate.hpp
../../include/matador/query/intermediates/query_create_intermediate.hpp
../../include/matador/query/intermediates/query_delete_from_intermediate.hpp
../../include/matador/query/intermediates/query_delete_intermediate.hpp
@@ -81,6 +85,7 @@ add_library(matador-orm STATIC
orm/session.cpp
orm/session_query_builder.cpp
query/attribute_string_writer.cpp
query/criteria/abstract_column_criteria.cpp
query/criteria/between_criteria.cpp
query/criteria/binary_criteria.cpp
query/criteria/collection_criteria.cpp
@@ -88,8 +93,10 @@ add_library(matador-orm STATIC
query/criteria/like_criteria.cpp
query/criteria/logical_criteria.cpp
query/criteria/not_criteria.cpp
query/criteria_evaluator.cpp
query/intermediates/executable_query.cpp
query/intermediates/fetchable_query.cpp
query/intermediates/query_alter_intermediate.cpp
query/intermediates/query_create_intermediate.cpp
query/intermediates/query_delete_from_intermediate.cpp
query/intermediates/query_delete_intermediate.cpp
@@ -145,11 +152,8 @@ add_library(matador-orm STATIC
sql/statement.cpp
sql/statement_cache.cpp
sql/table.cpp
../../include/matador/query/criteria_evaluator.hpp
query/criteria_evaluator.cpp
../../include/matador/query/criteria/criteria_utils.hpp
../../include/matador/query/criteria/abstract_column_criteria.hpp
query/criteria/abstract_column_criteria.cpp
../../include/matador/query/intermediates/query_alter_table_intermediate.hpp
query/intermediates/query_alter_table_intermediate.cpp
)
target_include_directories(matador-orm
+40 -1
View File
@@ -2,11 +2,19 @@
#include "matador/orm/error_code.hpp"
#include "matador/orm/session.hpp"
#include "matador/query/query.hpp"
#include "matador/sql/backend_provider.hpp"
#include "matador/sql/connection_pool.hpp"
#include "matador/sql/dialect.hpp"
namespace matador::orm {
schema::schema(sql::connection_pool& pool)
: repo_(sql::backend_provider::instance().connection_dialect(pool.info().type).default_schema_name())
, pool_(pool) {
}
schema::schema(sql::connection_pool &pool, const std::string& name)
: repo_(name)
, pool_(pool) {}
@@ -69,7 +77,38 @@ matador::utils::result<void, matador::utils::error> matador::orm::schema::create
}
matador::utils::result<void, matador::utils::error> matador::orm::schema::drop() const {
return utils::ok<void>();
std::vector<std::string> drop_sql_commands;
auto c = pool_.acquire();
for (const auto &node: repo_) {
auto ctx = query::query::drop()
.table(node->name())
.compile(*c);
drop_sql_commands.push_back(ctx.sql);
// determine constraints and drop them
for (auto it = node->info().endpoint_begin(); it != node->info().endpoint_end(); ++it) {
const auto ctx = query::query::alter()
.table( "" )
.add_constraint( it->second->node().name() )
.foreign_key( "" )
.references( "" ).compile(*c);
}
// for ( const auto& [sql, command] : ctx.additional_commands ) {
// if (auto result = c->execute(ctx.sql); !result) {
// return utils::failure(result.err());
// }
// }
}
// execute additional commands (e.g. ALTER TABLE ADD FK)
for (const auto &sql: drop_sql_commands) {
std::cout << sql << std::endl;
if (auto result = c->execute(sql); !result) {
return utils::failure(result.err());
}
}
return utils::ok<void>();
}
matador::utils::result<void, matador::utils::error> matador::orm::schema::drop_table(const std::string& table_name) const {
@@ -0,0 +1,14 @@
#include "matador/query/intermediates/query_alter_intermediate.hpp"
#include "matador/query/internal/query_parts.hpp"
namespace matador::query {
query_alter_intermediate::query_alter_intermediate() {
context_->parts.push_back(std::make_unique<internal::query_alter_part>());
}
query_alter_table_intermediate query_alter_intermediate::table( const sql::table& table ) const {
context_->parts.push_back(std::make_unique<internal::query_alter_table_part>(table));
return {context_};
}
}
@@ -0,0 +1,50 @@
#include "matador/query/intermediates/query_alter_table_intermediate.hpp"
#include "matador/query/internal/query_parts.hpp"
namespace matador::query {
executable_query query_add_foreign_key_constraint_intermediate::references( const sql::table& table, const std::vector<sql::column>& columns) {
context_->parts.push_back(std::make_unique<internal::query_add_foreign_key_reference_part>(table, columns));
return {context_};
}
query_add_primary_key_constraint_intermediate query_add_key_constraint_intermediate::primary_key(const sql::column& column) const {
return primary_keys({column});
}
query_add_primary_key_constraint_intermediate query_add_key_constraint_intermediate::primary_keys( const std::vector<sql::column>& columns ) const {
context_->parts.push_back(std::make_unique<internal::query_add_primary_key_constraint_part>(columns));
return {context_};
}
query_add_foreign_key_constraint_intermediate query_add_key_constraint_intermediate::foreign_key(const sql::column& column) const {
return foreign_keys({column});
}
query_add_foreign_key_constraint_intermediate query_add_key_constraint_intermediate::foreign_keys( const std::vector<sql::column>& columns ) const {
context_->parts.push_back(std::make_unique<internal::query_add_foreign_key_constraint_part>(columns));
return {context_};
}
void query_drop_key_constraint_intermediate::constraint( const std::string& name ) {}
void query_drop_key_constraint_intermediate::primary_key() {}
void query_drop_key_constraint_intermediate::foreign_key( const std::string& name ) {}
void query_drop_key_constraint_intermediate::foreign_keys( const std::vector<std::string>& names ) {}
query_add_key_constraint_intermediate query_alter_table_intermediate::add_constraint( const std::string& name ) {
context_->parts.push_back(std::make_unique<internal::query_add_key_constraint_part>(name));
return {context_};
}
query_drop_key_constraint_intermediate query_alter_table_intermediate::drop_constraint( const std::string& name ) {
context_->parts.push_back(std::make_unique<internal::query_drop_key_constraint_part>(name));
return {context_};
}
}
+84 -1
View File
@@ -3,6 +3,89 @@
#include <utility>
namespace matador::query::internal {
query_alter_part::query_alter_part()
: query_part(sql::dialect_token::Alter) {}
void query_alter_part::accept( query_part_visitor& visitor ) {
visitor.visit(*this);
}
query_alter_table_part::query_alter_table_part(sql::table table )
: query_part(sql::dialect_token::Table)
, table_(std::move(table)) {}
void query_alter_table_part::accept( query_part_visitor& visitor ) {
visitor.visit(*this);
}
const sql::table& query_alter_table_part::table() const {
return table_;
}
query_add_key_constraint_part::query_add_key_constraint_part(const std::string& name)
: query_part(sql::dialect_token::AddConstraint)
, name_(name){}
void query_add_key_constraint_part::accept( query_part_visitor& visitor ) {
visitor.visit(*this);
}
const std::string& query_add_key_constraint_part::name() const {
return name_;
}
query_drop_key_constraint_part::query_drop_key_constraint_part( const std::string& name )
: query_part( sql::dialect_token::DropConstraint )
, name_( name ){}
void query_drop_key_constraint_part::accept( query_part_visitor& visitor ) {
visitor.visit(*this);
}
const std::string& query_drop_key_constraint_part::name() const {
return name_;
}
query_add_foreign_key_constraint_part::query_add_foreign_key_constraint_part(const std::vector<sql::column>& columns)
: query_part(sql::dialect_token::ForeignKey)
, columns_(columns) {}
void query_add_foreign_key_constraint_part::accept( query_part_visitor& visitor ) {
visitor.visit(*this);
}
const std::vector<sql::column>& query_add_foreign_key_constraint_part::columns() const {
return columns_;
}
query_add_foreign_key_reference_part::query_add_foreign_key_reference_part( sql::table table, const std::vector<sql::column>& columns )
: query_part(sql::dialect_token::References)
, table_(std::move(table))
, columns_(columns) {}
void query_add_foreign_key_reference_part::accept( query_part_visitor& visitor ) {
visitor.visit(*this);
}
const sql::table& query_add_foreign_key_reference_part::table() const {
return table_;
}
const std::vector<sql::column>& query_add_foreign_key_reference_part::columns() const {
return columns_;
}
query_add_primary_key_constraint_part::query_add_primary_key_constraint_part(const std::vector<sql::column>& columns)
: query_part(sql::dialect_token::PrimaryKey)
, columns_(columns) {}
void query_add_primary_key_constraint_part::accept( query_part_visitor& visitor ) {
visitor.visit(*this);
}
const std::vector<sql::column>& query_add_primary_key_constraint_part::columns() const {
return columns_;
}
query_select_part::query_select_part(std::vector<sql::column> columns)
: query_part(sql::dialect_token::Select)
@@ -74,7 +157,7 @@ const abstract_criteria &query_where_part::condition() const
return *condition_;
}
query_table_name_part::query_table_name_part(sql::dialect_token token, std::string table_name)
query_table_name_part::query_table_name_part(const sql::dialect_token token, std::string table_name)
: query_part(token)
, table_name_(std::move(table_name)) {}
+3
View File
@@ -68,4 +68,7 @@ query_delete_intermediate query::remove() {
return {};
}
query_alter_intermediate query::alter() {
return {};
}
}
+22
View File
@@ -51,6 +51,28 @@ std::string handle_column(sql::query_context &ctx, const sql::dialect *d, const
return d->prepare_identifier(col);
}
void query_compiler::visit(internal::query_alter_part& part) {
query_.sql = dialect_->token_at(sql::dialect_token::Create);
}
void query_compiler::visit(internal::query_alter_table_part& part) {
query_.command = sql::sql_command::SQL_ALTER_TABLE;
query_.sql += " " + dialect_->token_at(sql::dialect_token::Table) + " " +
dialect_->prepare_identifier_string(part.table().name);
}
void query_compiler::visit(internal::query_add_key_constraint_part& part) {
query_.sql += " " + dialect_->token_at(sql::dialect_token::AddConstraint) + " " + part.name();
}
void query_compiler::visit( internal::query_add_foreign_key_constraint_part& part ) {}
void query_compiler::visit( internal::query_add_primary_key_constraint_part& part ) {}
void query_compiler::visit( internal::query_add_foreign_key_reference_part& part ) {}
void query_compiler::visit(internal::query_drop_key_constraint_part& part) {}
void query_compiler::visit(internal::query_select_part &select_part)
{
query_.command = sql::sql_command::SQL_SELECT;