From c3c7ea57a2699dafdfb9d9bbe66fd66d3cef4af5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sascha=20K=C3=BChl?= Date: Mon, 3 Nov 2025 16:21:26 +0100 Subject: [PATCH] added alter table command to fluent query builder (progress) --- backends/postgres/test/CMakeLists.txt | 2 + include/matador/orm/schema.hpp | 9 +- .../query_alter_intermediate.hpp | 16 ++++ .../query_alter_table_intermediate.hpp | 52 ++++++++++++ .../matador/query/internal/query_parts.hpp | 78 +++++++++++++++++ include/matador/query/query.hpp | 2 + include/matador/query/query_compiler.hpp | 8 ++ include/matador/query/query_intermediates.hpp | 1 + include/matador/query/query_part_visitor.hpp | 18 +++- include/matador/sql/dialect.hpp | 4 + include/matador/sql/dialect_token.hpp | 6 +- source/orm/CMakeLists.txt | 16 ++-- source/orm/orm/schema.cpp | 41 ++++++++- .../query_alter_intermediate.cpp | 14 +++ .../query_alter_table_intermediate.cpp | 50 +++++++++++ source/orm/query/internal/query_parts.cpp | 85 ++++++++++++++++++- source/orm/query/query.cpp | 3 + source/orm/query/query_compiler.cpp | 22 +++++ test/backends/SchemaFixture.cpp | 8 ++ test/backends/SchemaFixture.hpp | 16 ++++ test/backends/SchemaTest.cpp | 25 +++--- test/core/CMakeLists.txt | 1 + 22 files changed, 451 insertions(+), 26 deletions(-) create mode 100644 include/matador/query/intermediates/query_alter_intermediate.hpp create mode 100644 include/matador/query/intermediates/query_alter_table_intermediate.hpp create mode 100644 source/orm/query/intermediates/query_alter_intermediate.cpp create mode 100644 source/orm/query/intermediates/query_alter_table_intermediate.cpp create mode 100644 test/backends/SchemaFixture.cpp create mode 100644 test/backends/SchemaFixture.hpp diff --git a/backends/postgres/test/CMakeLists.txt b/backends/postgres/test/CMakeLists.txt index 1d627ba..5c5040d 100644 --- a/backends/postgres/test/CMakeLists.txt +++ b/backends/postgres/test/CMakeLists.txt @@ -22,6 +22,8 @@ set(TEST_SOURCES ../../../test/backends/QueryRecordTest.cpp ../../../test/backends/QueryStatementTests.cpp ../../../test/backends/QueryTest.cpp + ../../../test/backends/SchemaFixture.cpp + ../../../test/backends/SchemaFixture.hpp ../../../test/backends/SchemaTest.cpp ../../../test/backends/SessionFixture.cpp ../../../test/backends/SessionFixture.hpp diff --git a/include/matador/orm/schema.hpp b/include/matador/orm/schema.hpp index 8f73302..acbd308 100644 --- a/include/matador/orm/schema.hpp +++ b/include/matador/orm/schema.hpp @@ -26,6 +26,7 @@ private: class schema final { public: + explicit schema(sql::connection_pool &pool); schema(sql::connection_pool &pool, const std::string &name); template @@ -38,12 +39,12 @@ public: return repo_.attach(name); } - utils::result create() const; - utils::result drop() const; + [[nodiscard]] utils::result create() const; + [[nodiscard]] utils::result drop() const; template - utils::result drop_table(); - utils::result drop_table(const std::string &table_name) const; + [[nodiscard]] utils::result drop_table(); + [[nodiscard]] utils::result drop_table(const std::string &table_name) const; [[nodiscard]] utils::result, utils::error> describe_table(const std::string &table_name) const; [[nodiscard]] utils::result table_exists(const std::string &table_name) const; diff --git a/include/matador/query/intermediates/query_alter_intermediate.hpp b/include/matador/query/intermediates/query_alter_intermediate.hpp new file mode 100644 index 0000000..3a0763c --- /dev/null +++ b/include/matador/query/intermediates/query_alter_intermediate.hpp @@ -0,0 +1,16 @@ +#ifndef MATADOR_QUERY_ALTER_INTERMEDIATE_HPP +#define MATADOR_QUERY_ALTER_INTERMEDIATE_HPP + +#include "matador/query/intermediates/query_alter_table_intermediate.hpp" +#include "matador/query/intermediates/query_intermediate.hpp" + +namespace matador::query { +class query_alter_intermediate : public query_intermediate { +public: + query_alter_intermediate(); + + query_alter_table_intermediate table(const sql::table &table) const; +}; + +} +#endif //MATADOR_QUERY_ALTER_INTERMEDIATE_HPP \ No newline at end of file diff --git a/include/matador/query/intermediates/query_alter_table_intermediate.hpp b/include/matador/query/intermediates/query_alter_table_intermediate.hpp new file mode 100644 index 0000000..0e66157 --- /dev/null +++ b/include/matador/query/intermediates/query_alter_table_intermediate.hpp @@ -0,0 +1,52 @@ +#ifndef MATADOR_QUERY_ALTER_TABLE_INTERMEDIATE_HPP +#define MATADOR_QUERY_ALTER_TABLE_INTERMEDIATE_HPP + +#include "executable_query.hpp" +#include "matador/query/intermediates/query_intermediate.hpp" + +namespace matador::query { +class query_add_primary_key_constraint_intermediate final : public query_intermediate { +public: +}; + +class query_add_foreign_key_constraint_intermediate final : public query_intermediate { +public: + using query_intermediate::query_intermediate; + + executable_query references(const sql::table& table, const std::vector& columns = {}); + +private: + sql::table table_; + std::vector columns_; +}; + +class query_add_key_constraint_intermediate final : public query_intermediate { +public: + using query_intermediate::query_intermediate; + + query_add_primary_key_constraint_intermediate primary_key(const sql::column& column) const; + query_add_primary_key_constraint_intermediate primary_keys(const std::vector& columns) const; + query_add_foreign_key_constraint_intermediate foreign_key(const sql::column& column) const; + query_add_foreign_key_constraint_intermediate foreign_keys(const std::vector& columns) const; +}; + +class query_drop_key_constraint_intermediate final : public query_intermediate { +public: + using query_intermediate::query_intermediate; + + void constraint(const std::string& name); + void primary_key(); + void foreign_key(const std::string& name); + void foreign_keys(const std::vector& names); +}; + +class query_alter_table_intermediate final : public query_intermediate { +public: + using query_intermediate::query_intermediate; + + query_add_key_constraint_intermediate add_constraint(const std::string& name); + query_drop_key_constraint_intermediate drop_constraint(const std::string& name); +}; +} + +#endif //MATADOR_QUERY_ALTER_TABLE_INTERMEDIATE_HPP \ No newline at end of file diff --git a/include/matador/query/internal/query_parts.hpp b/include/matador/query/internal/query_parts.hpp index 7a1db27..15f0e52 100644 --- a/include/matador/query/internal/query_parts.hpp +++ b/include/matador/query/internal/query_parts.hpp @@ -17,6 +17,84 @@ namespace matador::query::internal { +class query_alter_part final : public query_part { +public: + query_alter_part(); + + void accept(query_part_visitor &visitor) override; +}; + +class query_alter_table_part final : public query_part { +public: + explicit query_alter_table_part(sql::table table); + + void accept(query_part_visitor &visitor) override; + + [[nodiscard]] const sql::table& table() const; + +private: + sql::table table_; +}; + +class query_add_key_constraint_part final : public query_part { +public: + explicit query_add_key_constraint_part(const std::string& name); + void accept(query_part_visitor &visitor) override; + + [[nodiscard]] const std::string& name() const; +private: + std::string name_; +}; + +class query_drop_key_constraint_part final : public query_part { +public: + explicit query_drop_key_constraint_part(const std::string& name); + void accept(query_part_visitor &visitor) override; + + [[nodiscard]] const std::string& name() const; +private: + std::string name_; +}; + +class query_add_foreign_key_constraint_part final : public query_part { +public: + explicit query_add_foreign_key_constraint_part( const std::vector& columns); + void accept(query_part_visitor &visitor) override; + + [[nodiscard]] const std::vector& columns() const; +private: + std::vector columns_; +}; + +class query_add_foreign_key_reference_part final : public query_part { +public: + explicit query_add_foreign_key_reference_part(sql::table table, const std::vector& columns); + void accept(query_part_visitor &visitor) override; + + [[nodiscard]] const sql::table& table() const; + [[nodiscard]] const std::vector& columns() const; + +private: + sql::table table_; + std::vector columns_; +}; + +class query_add_primary_key_constraint_part final : public query_part { +public: + explicit query_add_primary_key_constraint_part( const std::vector& columns); + void accept(query_part_visitor &visitor) override; + + [[nodiscard]] const std::vector& columns() const; +private: + std::vector columns_; +}; + +class query_drop_foreign_key_constraint_part final : public query_part { +public: + explicit query_drop_foreign_key_constraint_part( const std::vector& columns); + void accept(query_part_visitor &visitor) override; +}; + /** * Represents the SQL SELECT part */ diff --git a/include/matador/query/query.hpp b/include/matador/query/query.hpp index 13d4073..c5df24a 100644 --- a/include/matador/query/query.hpp +++ b/include/matador/query/query.hpp @@ -31,6 +31,8 @@ public: [[nodiscard]] static query_insert_intermediate insert(); [[nodiscard]] static query_update_intermediate update(const sql::table &table); [[nodiscard]] static query_delete_intermediate remove(); + + [[nodiscard]] static query_alter_intermediate alter(); }; } diff --git a/include/matador/query/query_compiler.hpp b/include/matador/query/query_compiler.hpp index 4b1d560..0fc0642 100644 --- a/include/matador/query/query_compiler.hpp +++ b/include/matador/query/query_compiler.hpp @@ -30,6 +30,14 @@ public: std::optional> conn); protected: + void visit(internal::query_alter_part& part) override; + void visit(internal::query_alter_table_part& part) override; + void visit(internal::query_add_key_constraint_part& part) override; + void visit( internal::query_add_foreign_key_constraint_part& part ) override; + void visit( internal::query_add_primary_key_constraint_part& part ) override; + void visit( internal::query_add_foreign_key_reference_part& part ) override; + void visit(internal::query_drop_key_constraint_part& part) override; + void visit(internal::query_select_part &select_part) override; void visit(internal::query_from_part &from_part) override; void visit(internal::query_join_part &join_part) override; diff --git a/include/matador/query/query_intermediates.hpp b/include/matador/query/query_intermediates.hpp index 45ea28d..cedf581 100644 --- a/include/matador/query/query_intermediates.hpp +++ b/include/matador/query/query_intermediates.hpp @@ -3,6 +3,7 @@ #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" diff --git a/include/matador/query/query_part_visitor.hpp b/include/matador/query/query_part_visitor.hpp index bc59bc4..ce9b530 100644 --- a/include/matador/query/query_part_visitor.hpp +++ b/include/matador/query/query_part_visitor.hpp @@ -4,6 +4,13 @@ namespace matador::query { namespace internal { +class query_alter_part; +class query_alter_table_part; +class query_add_key_constraint_part; +class query_drop_key_constraint_part; +class query_add_foreign_key_constraint_part; +class query_add_foreign_key_reference_part; +class query_add_primary_key_constraint_part; class query_select_part; class query_from_part; class query_join_part; @@ -28,11 +35,18 @@ class query_drop_part; class query_drop_table_part; } -class query_part_visitor -{ +class query_part_visitor { public: virtual ~query_part_visitor() = default; + virtual void visit(internal::query_alter_part &part) = 0; + virtual void visit(internal::query_alter_table_part &part) = 0; + virtual void visit(internal::query_add_key_constraint_part &part) = 0; + virtual void visit(internal::query_add_foreign_key_constraint_part &part) = 0; + virtual void visit(internal::query_add_primary_key_constraint_part &part) = 0; + virtual void visit(internal::query_add_foreign_key_reference_part &part) = 0; + virtual void visit(internal::query_drop_key_constraint_part &part) = 0; + virtual void visit(internal::query_select_part &select_part) = 0; virtual void visit(internal::query_from_part &from_part) = 0; virtual void visit(internal::query_join_part &join_part) = 0; diff --git a/include/matador/sql/dialect.hpp b/include/matador/sql/dialect.hpp index 9dad7e1..6baa362 100644 --- a/include/matador/sql/dialect.hpp +++ b/include/matador/sql/dialect.hpp @@ -143,6 +143,7 @@ private: {dialect_token::Drop, "DROP"}, {dialect_token::Remove, "DELETE"}, {dialect_token::Insert, "INSERT"}, + {dialect_token::Alter, "ALTER"}, {dialect_token::Table, "TABLE"}, {dialect_token::Into, "INTO"}, {dialect_token::Values, "VALUES"}, @@ -172,6 +173,9 @@ private: {dialect_token::Set, "SET"}, {dialect_token::NotNull, "NOT NULL"}, {dialect_token::PrimaryKey, "PRIMARY KEY"}, + {dialect_token::ForeignKey, "FOREIGN KEY"}, + {dialect_token::AddConstraint, "Add CONSTRAINT"}, + {dialect_token::DropConstraint, "DROP CONSTRAINT"}, {dialect_token::Begin, "BEGIN TRANSACTION"}, {dialect_token::Commit, "COMMIT TRANSACTION"}, {dialect_token::Rollback, "ROLLBACK TRANSACTION"}, diff --git a/include/matador/sql/dialect_token.hpp b/include/matador/sql/dialect_token.hpp index c6b90d6..3703789 100644 --- a/include/matador/sql/dialect_token.hpp +++ b/include/matador/sql/dialect_token.hpp @@ -13,6 +13,11 @@ enum class dialect_token : uint8_t { Update, Select, Alter, + ForeignKey, + PrimaryKey, + AddConstraint, + DropConstraint, + References, Schema, Database, Table, @@ -43,7 +48,6 @@ enum class dialect_token : uint8_t { Set, UpdateValues, NotNull, - PrimaryKey, Begin, Commit, Rollback, diff --git a/source/orm/CMakeLists.txt b/source/orm/CMakeLists.txt index 2e54d4c..f0326d5 100644 --- a/source/orm/CMakeLists.txt +++ b/source/orm/CMakeLists.txt @@ -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 diff --git a/source/orm/orm/schema.cpp b/source/orm/orm/schema.cpp index ace9a33..dc46e53 100644 --- a/source/orm/orm/schema.cpp +++ b/source/orm/orm/schema.cpp @@ -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 matador::orm::schema::create } matador::utils::result matador::orm::schema::drop() const { - return utils::ok(); + std::vector 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(); } matador::utils::result matador::orm::schema::drop_table(const std::string& table_name) const { diff --git a/source/orm/query/intermediates/query_alter_intermediate.cpp b/source/orm/query/intermediates/query_alter_intermediate.cpp new file mode 100644 index 0000000..cd1626f --- /dev/null +++ b/source/orm/query/intermediates/query_alter_intermediate.cpp @@ -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()); +} + +query_alter_table_intermediate query_alter_intermediate::table( const sql::table& table ) const { + context_->parts.push_back(std::make_unique(table)); + return {context_}; +} +} \ No newline at end of file diff --git a/source/orm/query/intermediates/query_alter_table_intermediate.cpp b/source/orm/query/intermediates/query_alter_table_intermediate.cpp new file mode 100644 index 0000000..ebfcccd --- /dev/null +++ b/source/orm/query/intermediates/query_alter_table_intermediate.cpp @@ -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& columns) { + context_->parts.push_back(std::make_unique(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& columns ) const { + context_->parts.push_back(std::make_unique(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& columns ) const { + context_->parts.push_back(std::make_unique(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& names ) {} + +query_add_key_constraint_intermediate query_alter_table_intermediate::add_constraint( const std::string& name ) { + context_->parts.push_back(std::make_unique(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(name)); + return {context_}; +} +} \ No newline at end of file diff --git a/source/orm/query/internal/query_parts.cpp b/source/orm/query/internal/query_parts.cpp index dc5611c..1e2151d 100644 --- a/source/orm/query/internal/query_parts.cpp +++ b/source/orm/query/internal/query_parts.cpp @@ -3,6 +3,89 @@ #include 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& 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& 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& 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& 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& 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& query_add_primary_key_constraint_part::columns() const { + return columns_; +} query_select_part::query_select_part(std::vector 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)) {} diff --git a/source/orm/query/query.cpp b/source/orm/query/query.cpp index 66b2115..c575f4e 100644 --- a/source/orm/query/query.cpp +++ b/source/orm/query/query.cpp @@ -68,4 +68,7 @@ query_delete_intermediate query::remove() { return {}; } +query_alter_intermediate query::alter() { + return {}; +} } \ No newline at end of file diff --git a/source/orm/query/query_compiler.cpp b/source/orm/query/query_compiler.cpp index 9ae3f5b..c777519 100644 --- a/source/orm/query/query_compiler.cpp +++ b/source/orm/query/query_compiler.cpp @@ -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; diff --git a/test/backends/SchemaFixture.cpp b/test/backends/SchemaFixture.cpp new file mode 100644 index 0000000..cbdbcc4 --- /dev/null +++ b/test/backends/SchemaFixture.cpp @@ -0,0 +1,8 @@ +#include "SchemaFixture.hpp" + +#include "connection.hpp" + +namespace matador::test { +SchemaFixture::SchemaFixture() +: pool(connection::dns, 4) {} +} diff --git a/test/backends/SchemaFixture.hpp b/test/backends/SchemaFixture.hpp new file mode 100644 index 0000000..4215c76 --- /dev/null +++ b/test/backends/SchemaFixture.hpp @@ -0,0 +1,16 @@ +#ifndef MATADOR_QUERY_SCHEMA_FIXTURE_HPP +#define MATADOR_QUERY_SCHEMA_FIXTURE_HPP + +#include "matador/sql/connection_pool.hpp" + +namespace matador::test { +class SchemaFixture { +public: + SchemaFixture(); + +protected: + sql::connection_pool pool; +}; +} + +#endif //MATADOR_QUERY_SCHEMA_FIXTURE_HPP \ No newline at end of file diff --git a/test/backends/SchemaTest.cpp b/test/backends/SchemaTest.cpp index f95bf40..f8347a3 100644 --- a/test/backends/SchemaTest.cpp +++ b/test/backends/SchemaTest.cpp @@ -1,24 +1,20 @@ #include +#include "SchemaFixture.hpp" + #include "matador/sql/backend_provider.hpp" #include "matador/sql/connection_pool.hpp" #include "matador/orm/schema.hpp" -#include "../orm/backend/test_connection.hpp" -#include "../orm/backend/test_backend_service.hpp" - #include "../models/department.hpp" using namespace matador; +using namespace matador::test; -TEST_CASE("Test schema", "[schema]") { +TEST_CASE_METHOD(SchemaFixture, "Test schema", "[schema]") { using namespace matador::test; - sql::backend_provider::instance().register_backend("noop", std::make_unique()); - - sql::connection_pool pool("noop://noop.db", 4); - - matador::orm::schema repo(pool, "NoopSchema"); + matador::orm::schema repo(pool/*, "NoopSchema"*/); auto result = repo.attach("departments") .and_then( [&repo] { return repo.attach("employees"); } ); @@ -27,7 +23,14 @@ TEST_CASE("Test schema", "[schema]") { result = repo.create(); REQUIRE(result); - const auto exists_result = repo.table_exists("departments"); + auto exists_result = repo.table_exists("departments"); REQUIRE(exists_result.is_ok()); REQUIRE(exists_result.value()); -} \ No newline at end of file + + result = repo.drop(); + REQUIRE(result); + + exists_result = repo.table_exists("departments"); + REQUIRE(exists_result.is_ok()); + REQUIRE(!exists_result.value()); +} diff --git a/test/core/CMakeLists.txt b/test/core/CMakeLists.txt index 6c02879..595147d 100644 --- a/test/core/CMakeLists.txt +++ b/test/core/CMakeLists.txt @@ -18,6 +18,7 @@ add_executable(CoreTests object/PrimaryKeyResolverTest.cpp object/SchemaTest.cpp utils/MessageBusTest.cpp + ../backends/SchemaFixture.hpp ) target_link_libraries(CoreTests matador-core Catch2::Catch2WithMain)