added alter table command to fluent query builder

This commit is contained in:
Sascha Kühl
2025-11-05 11:05:03 +01:00
parent c87a4c29b4
commit 4b51ad21da
27 changed files with 343 additions and 282 deletions
@@ -77,7 +77,7 @@ public:
[[nodiscard]] utils::result<sql::statement, utils::error> prepare(sql::executor &exec) const;
[[nodiscard]] std::string str(const sql::executor &exec) const;
[[nodiscard]] sql::query_context compile(const sql::dialect &d, query_mode mode) const;
[[nodiscard]] sql::query_context compile(const sql::dialect &d) const;
private:
[[nodiscard]] utils::result<std::unique_ptr<sql::query_result_impl>, utils::error> fetch(const sql::executor &exec) const;
@@ -9,8 +9,7 @@
namespace matador::query {
class query_create_intermediate : public query_intermediate
{
class query_create_intermediate : public query_intermediate {
public:
query_create_intermediate();
@@ -20,6 +19,7 @@ public:
executable_query table(const sql::table &table, const object::repository &schema) {
return this->table(table, object::attribute_definition_generator::generate<Type>(schema));
}
executable_query schema(const std::string &schema_name);
};
}
@@ -5,12 +5,12 @@
namespace matador::query {
class query_drop_intermediate : query_intermediate
{
class query_drop_intermediate : query_intermediate {
public:
query_drop_intermediate();
executable_query table(const sql::table &table);
executable_query schema(const std::string &schema_name);
};
}
@@ -3,6 +3,7 @@
#include "matador/sql/column.hpp"
#include "matador/utils/placeholder.hpp"
#include "matador/utils/types.hpp"
namespace matador::query::internal {
@@ -12,13 +13,14 @@ public:
key_value_pair(const sql::column &col, utils::database_type value);
key_value_pair(std::string name, utils::database_type value);
key_value_pair(const char *name, utils::database_type value);
key_value_pair(const char *name, utils::placeholder p);
[[nodiscard]] const std::string& name() const;
[[nodiscard]] const utils::database_type& value() const;
[[nodiscard]] const std::variant<utils::placeholder, utils::database_type>& value() const;
private:
std::string name_;
utils::database_type value_;
std::variant<utils::placeholder, utils::database_type> value_;
};
}
+27 -1
View File
@@ -91,7 +91,7 @@ private:
class query_drop_foreign_key_constraint_part final : public query_part {
public:
explicit query_drop_foreign_key_constraint_part( const std::vector<sql::column>& columns);
query_drop_foreign_key_constraint_part();
void accept(query_part_visitor &visitor) override;
};
@@ -377,6 +377,19 @@ private:
std::vector<object::attribute_definition> columns_;
};
class query_create_schema_part final : public query_part {
public:
explicit query_create_schema_part(std::string schema);
[[nodiscard]] const std::string& schema() const;
private:
void accept(query_part_visitor &visitor) override;
private:
std::string schema_;
};
class query_drop_part final : public query_part
{
public:
@@ -400,5 +413,18 @@ private:
sql::table table_;
};
class query_drop_schema_part final : public query_part {
public:
explicit query_drop_schema_part(std::string schema_);
[[nodiscard]] const std::string& schema() const;
private:
void accept(query_part_visitor &visitor) override;
private:
std::string schema_;
};
}
#endif //QUERY_QUERY_PARTS_HPP
+1
View File
@@ -20,6 +20,7 @@ class query
public:
[[nodiscard]] static query_create_intermediate create();
[[nodiscard]] static query_drop_intermediate drop();
[[nodiscard]] static query_select_intermediate select();
[[nodiscard]] static query_select_intermediate select(std::initializer_list<sql::column> columns);
[[nodiscard]] static query_select_intermediate select(const std::vector<sql::column>& columns);
[[nodiscard]] static query_select_intermediate select(const std::vector<std::string> &column_names);
+31 -29
View File
@@ -22,8 +22,7 @@ struct basic_type_to_string_visitor;
struct query_data;
struct value_visitor;
class query_compiler final : public query_part_visitor
{
class query_compiler final : public query_part_visitor {
public:
sql::query_context compile(const query_data &data,
const sql::dialect &d,
@@ -33,42 +32,45 @@ 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_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_drop_foreign_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;
void visit(internal::query_on_part &on_part) override;
void visit(internal::query_where_part &where_part) override;
void visit(internal::query_group_by_part &group_by_part) override;
void visit(internal::query_order_by_part &order_by_part) override;
void visit(internal::query_order_by_asc_part &order_by_asc_part) override;
void visit(internal::query_order_by_desc_part &order_by_desc_part) override;
void visit(internal::query_offset_part &offset_part) override;
void visit(internal::query_limit_part &limit_part) override;
void visit(internal::query_insert_part &insert_part) override;
void visit(internal::query_into_part &into_part) override;
void visit(internal::query_values_part &values_part) override;
protected:
void visit(internal::query_select_part &part) override;
void visit(internal::query_from_part &part) override;
void visit(internal::query_join_part &part) override;
void visit(internal::query_on_part &part) override;
void visit(internal::query_where_part &part) override;
void visit(internal::query_group_by_part &part) override;
void visit(internal::query_order_by_part &part) override;
void visit(internal::query_order_by_asc_part &part) override;
void visit(internal::query_order_by_desc_part &part) override;
void visit(internal::query_offset_part &part) override;
void visit(internal::query_limit_part &part) override;
void visit(internal::query_insert_part &part) override;
void visit(internal::query_into_part &part) override;
void visit(internal::query_values_part &part) override;
void visit(internal::query_update_part &update_part) override;
void visit(internal::query_set_part &set_part) override;
void visit(internal::query_update_part &part) override;
void visit(internal::query_set_part &part) override;
void visit(internal::query_delete_part &delete_part) override;
void visit(internal::query_delete_from_part &delete_from_part) override;
void visit(internal::query_delete_part &part) override;
void visit(internal::query_delete_from_part &part) override;
void visit(internal::query_create_part &create_part) override;
void visit(internal::query_create_table_part &create_table_part) override;
void visit(internal::query_create_part &part) override;
void visit(internal::query_create_table_part &part) override;
void visit(internal::query_create_schema_part& part) override;
void visit(internal::query_drop_part &drop_part) override;
void visit(internal::query_drop_table_part &drop_table_part) override;
void visit(internal::query_drop_part &part) override;
void visit(internal::query_drop_table_part &part) override;
void visit(internal::query_drop_schema_part& part) override;
static std::string build_table_name(sql::dialect_token token, const sql::dialect &d, const sql::table& t);
std::string determine_value(value_visitor &visitor, const std::variant<utils::placeholder, utils::database_type> &val);
std::string determine_set_value(internal::basic_type_to_string_visitor &visitor, const utils::database_type &val);
static std::string determine_value(value_visitor &visitor, const std::variant<utils::placeholder, utils::database_type> &val);
protected:
const query_data *data_{};
+3 -9
View File
@@ -12,16 +12,10 @@
namespace matador::query {
enum struct query_mode {
Direct = 0,
Prepared = 1
};
struct query_data {
std::vector<std::unique_ptr<query_part>> parts{};
std::vector<object::attribute_definition> columns{};
std::unordered_map<std::string, sql::table> tables{};
query_mode mode = query_mode::Direct;
std::vector<std::unique_ptr<query_part>> parts{};
std::vector<object::attribute_definition> columns{};
std::unordered_map<std::string, sql::table> tables{};
};
}
+28 -22
View File
@@ -8,6 +8,7 @@ class query_alter_part;
class query_alter_table_part;
class query_add_key_constraint_part;
class query_drop_key_constraint_part;
class query_drop_foreign_key_constraint_part;
class query_add_foreign_key_constraint_part;
class query_add_foreign_key_reference_part;
class query_add_primary_key_constraint_part;
@@ -31,8 +32,10 @@ class query_delete_part;
class query_delete_from_part;
class query_create_part;
class query_create_table_part;
class query_create_schema_part;
class query_drop_part;
class query_drop_table_part;
class query_drop_schema_part;
}
class query_part_visitor {
@@ -46,34 +49,37 @@ public:
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_drop_foreign_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;
virtual void visit(internal::query_on_part &on_part) = 0;
virtual void visit(internal::query_where_part &where_part) = 0;
virtual void visit(internal::query_group_by_part &group_by_part) = 0;
virtual void visit(internal::query_order_by_part &order_by_part) = 0;
virtual void visit(internal::query_order_by_asc_part &order_by_asc_part) = 0;
virtual void visit(internal::query_order_by_desc_part &order_by_desc_part) = 0;
virtual void visit(internal::query_offset_part &offset_part) = 0;
virtual void visit(internal::query_limit_part &limit_part) = 0;
virtual void visit(internal::query_select_part &part) = 0;
virtual void visit(internal::query_from_part &part) = 0;
virtual void visit(internal::query_join_part &part) = 0;
virtual void visit(internal::query_on_part &part) = 0;
virtual void visit(internal::query_where_part &part) = 0;
virtual void visit(internal::query_group_by_part &part) = 0;
virtual void visit(internal::query_order_by_part &part) = 0;
virtual void visit(internal::query_order_by_asc_part &part) = 0;
virtual void visit(internal::query_order_by_desc_part &part) = 0;
virtual void visit(internal::query_offset_part &part) = 0;
virtual void visit(internal::query_limit_part &part) = 0;
virtual void visit(internal::query_insert_part &insert_part) = 0;
virtual void visit(internal::query_into_part &into_part) = 0;
virtual void visit(internal::query_values_part &values_part) = 0;
virtual void visit(internal::query_insert_part &part) = 0;
virtual void visit(internal::query_into_part &part) = 0;
virtual void visit(internal::query_values_part &part) = 0;
virtual void visit(internal::query_update_part &update_part) = 0;
virtual void visit(internal::query_set_part &set_part) = 0;
virtual void visit(internal::query_update_part &part) = 0;
virtual void visit(internal::query_set_part &part) = 0;
virtual void visit(internal::query_delete_part &delete_part) = 0;
virtual void visit(internal::query_delete_from_part &delete_from_part) = 0;
virtual void visit(internal::query_delete_part &part) = 0;
virtual void visit(internal::query_delete_from_part &part) = 0;
virtual void visit(internal::query_create_part &create_part) = 0;
virtual void visit(internal::query_create_table_part &create_table_part) = 0;
virtual void visit(internal::query_create_part &part) = 0;
virtual void visit(internal::query_create_table_part &part) = 0;
virtual void visit(internal::query_create_schema_part &part) = 0;
virtual void visit(internal::query_drop_part &drop_part) = 0;
virtual void visit(internal::query_drop_table_part &drop_table_part) = 0;
virtual void visit(internal::query_drop_part &part) = 0;
virtual void visit(internal::query_drop_table_part &part) = 0;
virtual void visit(internal::query_drop_schema_part &part) = 0;
};
}
+44 -45
View File
@@ -136,58 +136,57 @@ private:
escape_identifier_t identifier_escape_type_ = escape_identifier_t::ESCAPE_BOTH_SAME;
std::string default_schema_name_;
// std::unique_ptr<query_compiler> compiler_;
token_to_string_map tokens_ {
{dialect_token::Create, "CREATE"},
{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"},
{dialect_token::Update, "UPDATE"},
{dialect_token::Select, "SELECT"},
{dialect_token::Columns, "COLUMNS"},
{dialect_token::Column, "COLUMN"},
{dialect_token::From, "FROM"},
{dialect_token::Join, "LEFT JOIN"},
{dialect_token::On, "ON"},
{dialect_token::Where, "WHERE"},
{dialect_token::And, "AND"},
{dialect_token::Or, "OR"},
{dialect_token::Not, "NOT"},
{dialect_token::Like, "LIKE"},
{dialect_token::Between, "BETWEEN"},
{dialect_token::In, "IN"},
{dialect_token::OrderBy, "ORDER BY"},
{dialect_token::GroupBy, "GROUP BY"},
{dialect_token::Asc, "ASC"},
{dialect_token::Desc, "DESC"},
{dialect_token::Offset, "OFFSET"},
{dialect_token::Limit, "LIMIT"},
{dialect_token::As, "AS"},
{dialect_token::Offset, "OFFSET"},
{dialect_token::Distinct, "DISTINCT"},
{dialect_token::Set, "SET"},
{dialect_token::NotNull, "NOT NULL"},
{dialect_token::PrimaryKey, "PRIMARY KEY"},
{dialect_token::ForeignKey, "FOREIGN KEY"},
{dialect_token::References, "REFERENCES"},
{dialect_token::AddConstraint, "ADD CONSTRAINT"},
{dialect_token::DropConstraint, "DROP CONSTRAINT"},
{dialect_token::Alter, "ALTER"},
{dialect_token::And, "AND"},
{dialect_token::As, "AS"},
{dialect_token::Asc, "ASC"},
{dialect_token::Asterisk, "*"},
{dialect_token::Begin, "BEGIN TRANSACTION"},
{dialect_token::Commit, "COMMIT TRANSACTION"},
{dialect_token::Rollback, "ROLLBACK TRANSACTION"},
{dialect_token::StartQuote, "\""},
{dialect_token::EndQuote, "\""},
{dialect_token::StringQuote, "'"},
{dialect_token::BeginBinaryData, "X'"},
{dialect_token::EndBinaryData, "'"},
{dialect_token::BeginStringData, "'"},
{dialect_token::Between, "BETWEEN"},
{dialect_token::Column, "COLUMN"},
{dialect_token::Columns, "COLUMNS"},
{dialect_token::Commit, "COMMIT TRANSACTION"},
{dialect_token::Create, "CREATE"},
{dialect_token::Desc, "DESC"},
{dialect_token::Distinct, "DISTINCT"},
{dialect_token::Drop, "DROP"},
{dialect_token::DropConstraint, "DROP CONSTRAINT"},
{dialect_token::EndBinaryData, "'"},
{dialect_token::EndQuote, "\""},
{dialect_token::EndStringData, "'"},
{dialect_token::None, ""}
{dialect_token::ForeignKey, "FOREIGN KEY"},
{dialect_token::From, "FROM"},
{dialect_token::GroupBy, "GROUP BY"},
{dialect_token::In, "IN"},
{dialect_token::Insert, "INSERT"},
{dialect_token::Into, "INTO"},
{dialect_token::Join, "LEFT JOIN"},
{dialect_token::Like, "LIKE"},
{dialect_token::Limit, "LIMIT"},
{dialect_token::None, ""},
{dialect_token::Not, "NOT"},
{dialect_token::NotNull, "NOT NULL"},
{dialect_token::Offset, "OFFSET"},
{dialect_token::On, "ON"},
{dialect_token::Or, "OR"},
{dialect_token::OrderBy, "ORDER BY"},
{dialect_token::PrimaryKey, "PRIMARY KEY"},
{dialect_token::References, "REFERENCES"},
{dialect_token::Remove, "DELETE"},
{dialect_token::Rollback, "ROLLBACK TRANSACTION"},
{dialect_token::Select, "SELECT"},
{dialect_token::Set, "SET"},
{dialect_token::StartQuote, "\""},
{dialect_token::StringQuote, "'"},
{dialect_token::Table, "TABLE"},
{dialect_token::Update, "UPDATE"},
{dialect_token::Values, "VALUES"},
{dialect_token::Where, "WHERE"}
};
data_type_to_string_map data_types_ {
+44 -46
View File
@@ -6,59 +6,57 @@
namespace matador::sql {
enum class dialect_token : uint8_t {
Create = 0,
Drop,
Remove,
Insert,
Update,
Select,
AddConstraint = 0,
Alter,
ForeignKey,
PrimaryKey,
AddConstraint,
DropConstraint,
References,
Schema,
Database,
Table,
Values,
InsertValues,
Columns,
Column,
From,
Join,
On,
Into,
Where,
WhereClause,
And,
Or,
Not,
Like,
Between,
In,
OrderBy,
GroupBy,
Asc,
Desc,
Limit,
As,
Offset,
Distinct,
Set,
UpdateValues,
NotNull,
Asc,
Asterisk,
Begin,
Commit,
Rollback,
StartQuote,
EndQuote,
StringQuote,
BeginBinaryData,
EndBinaryData,
BeginStringData,
Between,
Column,
Columns,
Commit,
Create,
Database,
Desc,
Distinct,
Drop,
DropConstraint,
EndBinaryData,
EndQuote,
EndStringData,
None
ForeignKey,
From,
GroupBy,
In,
Insert,
Into,
Join,
Like,
Limit,
None,
Not,
NotNull,
Offset,
On,
Or,
OrderBy,
PrimaryKey,
References,
Remove,
Rollback,
Schema,
Select,
Set,
StartQuote,
StringQuote,
Table,
Update,
Values,
Where
};
}
+2
View File
@@ -10,6 +10,7 @@ namespace matador::sql {
enum class sql_command {
SQL_UNKNOWN,
SQL_CREATE,
SQL_CREATE_TABLE,
SQL_CREATE_SCHEMA,
SQL_CREATE_DATABASE,
@@ -17,6 +18,7 @@ enum class sql_command {
SQL_INSERT,
SQL_DELETE,
SQL_SELECT,
SQL_DROP,
SQL_DROP_TABLE,
SQL_DROP_SCHEMA,
SQL_DROP_DATABASE,
+3 -10
View File
@@ -10,8 +10,7 @@ namespace matador::sql {
struct column;
class record
{
class record final {
private:
using field_ref = std::reference_wrapper<field>;
using field_by_index = std::vector<field_ref>;
@@ -45,13 +44,11 @@ public:
[[nodiscard]] const field& at(const column &col) const;
[[nodiscard]] const field& at(size_t index) const;
template<class Type>
std::optional<Type> at(const column &col) const
{
std::optional<Type> at(const column &col) const {
return at(col).as<Type>();
}
template<class Type>
std::optional<Type> at(size_t index) const
{
std::optional<Type> at(const size_t index) const {
return at(index).as<Type>();
}
@@ -70,8 +67,6 @@ public:
[[nodiscard]] bool empty() const;
void clear();
// [[nodiscard]] bool unknown() const;
private:
void init();
void add_to_map(field &col, size_t index);
@@ -79,8 +74,6 @@ private:
private:
field_by_index fields_;
field_by_name_map fields_by_name_;
// int pk_index_{-1};
};
}
+1 -1
View File
@@ -68,7 +68,7 @@ public:
return bus_.subscribe<EventType>(handler);
}
connection_pool& pool() const;
[[nodiscard]] connection_pool& pool() const;
private:
size_t max_size_{};