From 95c555d03a19a7c6f460f35964cafdea166e01cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sascha=20K=C3=BChl?= Date: Wed, 19 Nov 2025 16:17:25 +0100 Subject: [PATCH] compilation fixes --- .../matador/object/attribute_definition.hpp | 7 -- .../object/attribute_definition_generator.hpp | 2 +- include/matador/object/basic_object_info.hpp | 8 +-- include/matador/object/object_definition.hpp | 1 + include/matador/object/repository.hpp | 1 - include/matador/object/repository_node.hpp | 24 +++---- include/matador/orm/session.hpp | 6 +- include/matador/query/builder.hpp | 67 +++++++++++++++++-- include/matador/query/query_compiler.hpp | 2 + include/matador/utils/constraints.hpp | 4 +- source/core/object/attribute_definition.cpp | 3 +- source/core/object/basic_object_info.cpp | 10 +-- source/core/object/repository.cpp | 19 ------ source/core/object/repository_node.cpp | 24 +++---- source/orm/orm/schema.cpp | 2 +- source/orm/orm/session.cpp | 2 +- source/orm/query/builder.cpp | 4 +- test/orm/sql/ColumnTest.cpp | 7 +- test/orm/sql/FieldTest.cpp | 2 +- todo.md | 3 + 20 files changed, 118 insertions(+), 80 deletions(-) diff --git a/include/matador/object/attribute_definition.hpp b/include/matador/object/attribute_definition.hpp index 992f885..84dae91 100644 --- a/include/matador/object/attribute_definition.hpp +++ b/include/matador/object/attribute_definition.hpp @@ -4,10 +4,8 @@ #include "matador/utils/basic_types.hpp" #include "matador/utils/default_type_traits.hpp" #include "matador/utils/field_attributes.hpp" -#include "matador/utils/value.hpp" #include -#include namespace matador::object { @@ -95,14 +93,9 @@ public: return type() == utils::data_type_traits::type(attributes().size()); } -private: - using data_type_index = std::vector; - private: friend class object_definition; - static const data_type_index data_type_index_; - std::string name_; std::shared_ptr object_{}; attribute_options options_; diff --git a/include/matador/object/attribute_definition_generator.hpp b/include/matador/object/attribute_definition_generator.hpp index e563a57..756f716 100644 --- a/include/matador/object/attribute_definition_generator.hpp +++ b/include/matador/object/attribute_definition_generator.hpp @@ -8,7 +8,7 @@ #include "matador/utils/error.hpp" #include "matador/utils/field_attributes.hpp" #include "matador/utils/primary_key_attribute.hpp" - +#include "matador/utils/result.hpp" #include #include diff --git a/include/matador/object/basic_object_info.hpp b/include/matador/object/basic_object_info.hpp index b3efd9d..7d657e4 100644 --- a/include/matador/object/basic_object_info.hpp +++ b/include/matador/object/basic_object_info.hpp @@ -24,7 +24,7 @@ public: [[nodiscard]] std::type_index type_index() const; [[nodiscard]] std::string name() const; - [[nodiscard]] const object_definition& definition() const; + [[nodiscard]] std::shared_ptr definition() const; [[nodiscard]] std::shared_ptr reference_column() const; [[nodiscard]] bool has_primary_key() const; @@ -49,13 +49,13 @@ public: [[nodiscard]] bool endpoints_empty() const; protected: - basic_object_info(std::shared_ptr node, utils::identifier &&pk, const std::shared_ptr &pk_column, object_definition &&definition); + basic_object_info(std::shared_ptr node, utils::identifier &&pk, const std::shared_ptr &pk_column, const std::shared_ptr &definition); basic_object_info(std::shared_ptr node, utils::identifier &&pk, const std::shared_ptr &pk_column); - basic_object_info(std::shared_ptr node, object_definition &&definition); + basic_object_info(std::shared_ptr node, const std::shared_ptr &definition); protected: std::shared_ptr node_; /**< prototype node of the represented object type */ - object_definition definition_; + std::shared_ptr definition_; std::optional identifier_; std::shared_ptr pk_column_; t_endpoint_map relation_endpoints_; diff --git a/include/matador/object/object_definition.hpp b/include/matador/object/object_definition.hpp index 2cfc83d..29d3865 100644 --- a/include/matador/object/object_definition.hpp +++ b/include/matador/object/object_definition.hpp @@ -3,6 +3,7 @@ #include "matador/object/attribute_definition.hpp" +#include #include namespace matador::object { diff --git a/include/matador/object/repository.hpp b/include/matador/object/repository.hpp index c101bf8..2f3e793 100644 --- a/include/matador/object/repository.hpp +++ b/include/matador/object/repository.hpp @@ -161,7 +161,6 @@ private: using t_type_index_node_map = std::unordered_map; [[nodiscard]] utils::result attach_node(const node_ptr &node, const std::string &parent); - // [[nodiscard]] utils::result attach_node(const node_ptr &node, const std::type_index &type_index); [[nodiscard]] utils::result find_node(const std::string &name) const; [[nodiscard]] utils::result find_node(const std::type_index &type_index) const; template diff --git a/include/matador/object/repository_node.hpp b/include/matador/object/repository_node.hpp index fe0a48e..3bb0d2e 100644 --- a/include/matador/object/repository_node.hpp +++ b/include/matador/object/repository_node.hpp @@ -21,18 +21,18 @@ public: auto node = std::shared_ptr(new repository_node(repo, name, typeid(Type))); primary_key_resolver resolver; - object_definition obj{name, {}}; + auto obj = std::make_shared(name); auto pk_info = resolver.resolve(); auto ref_column = determine_reference_column(typeid(Type), name, pk_info, repo); const auto attributes = attribute_definition_generator::generate(repo); for (auto&& attr : attributes) { - obj.append(std::move(attr)); + obj->append(std::move(attr)); } auto info = std::make_unique>( node, std::move(pk_info.pk), ref_column, - std::move(obj), + obj, []{ return std::make_unique(); } ); node->info_ = std::move(info); @@ -41,8 +41,8 @@ public: } template < typename Type, typename CreatorFunc > - static utils::result make_relation_node(object::repository& tree, const std::string& name, CreatorFunc &&creator) { - const auto result = make_and_attach_node(tree, name, typeid(Type)); + static utils::result make_relation_node(repository& repo, const std::string& name, CreatorFunc &&creator) { + const auto result = make_and_attach_node(repo, name, typeid(Type)); if (!result) { return result; } @@ -50,7 +50,7 @@ public: auto obj = creator(); auto info = std::make_unique>( result.value(), - object_definition{attribute_definition_generator::generate(*obj, tree)}, + std::make_shared(attribute_definition_generator::generate(*obj, repo)), std::move(creator) ); result.value()->info_ = std::move(info); @@ -58,7 +58,7 @@ public: return result; } - static std::shared_ptr make_null_node(repository& tree); + static std::shared_ptr make_null_node(repository& repo); repository_node(const repository_node& other) = delete; repository_node(repository_node&& other) = default; @@ -81,20 +81,20 @@ public: return std::ref(static_cast&>(*info_)); } - [[nodiscard]] const object::repository& schema() const; + [[nodiscard]] const repository& schema() const; [[nodiscard]] bool has_children() const; private: - explicit repository_node(object::repository& tree); - repository_node(object::repository& tree, const std::type_index& ti); - repository_node(object::repository& tree, std::string name, const std::type_index& ti); + explicit repository_node(repository& repo); + repository_node(repository& repo, const std::type_index& ti); + repository_node(repository& repo, std::string name, const std::type_index& ti); void unlink(); static utils::result make_and_attach_node(repository& repo, const std::string& name, const std::type_index& ti); static std::shared_ptr determine_reference_column(const std::type_index& ti, - object_definition& obj, + const std::shared_ptr& obj, const primary_key_info& pk_info, repository& repo); diff --git a/include/matador/orm/session.hpp b/include/matador/orm/session.hpp index c7e1630..28f8e35 100644 --- a/include/matador/orm/session.hpp +++ b/include/matador/orm/session.hpp @@ -246,7 +246,7 @@ utils::result, utils::error> session::update( const obj using namespace matador::utils; using namespace matador::query; - const auto col = sql::column(info.value().get().definition().primary_key()->name()); + const auto col = column(info.value().get().definition().primary_key()->name()); auto res = matador::query::query::update(info->get().name()) .set(generator::column_value_pairs()) .where(col == _) @@ -272,7 +272,7 @@ utils::result session::remove( const object::object_ptrname()); + const auto col = column(info.value().get().definition().primary_key()->name()); auto res = matador::query::query::remove() .from( info->get().name() ) .where(col == _) @@ -301,7 +301,7 @@ utils::result, utils::error> session::find(const Primar const auto& type_info = info.value().get(); session_query_builder eqb(*schema_, *this); - const sql::column col(sql::table{type_info.reference_column()->table_name()}, type_info.reference_column()->name()); + const query::column col(query::table{type_info.reference_column()->table_name()}, type_info.reference_column()->name()); using namespace matador::query; auto data = eqb.build(col == utils::_); if (!data.is_ok()) { diff --git a/include/matador/query/builder.hpp b/include/matador/query/builder.hpp index a1550bc..4c9d23e 100644 --- a/include/matador/query/builder.hpp +++ b/include/matador/query/builder.hpp @@ -1,11 +1,72 @@ #ifndef MATADOR_BUILDER_HPP #define MATADOR_BUILDER_HPP +#include "matador/object/attribute_definition.hpp" + #include "matador/query/column.hpp" #include "matador/query/table.hpp" +#include "matador/utils/basic_types.hpp" + #include +namespace matador::object { + +class entity { +public: + explicit entity(std::string name) + : name_(std::move(name)) {} + + [[nodiscard]] const std::string& name() const; + +private: + std::string name_; + std::string alias_; +}; + +class attribute { +public: + attribute(std::string name, const utils::basic_type type) + : name_(std::move(name)) + , type_(type) {} + + [[nodiscard]] const std::string& name() const; + [[nodiscard]] utils::basic_type type() const; + [[nodiscard]] const attribute_options& options() const; + +private: + friend class entity; + + std::string name_; + std::string alias_; + utils::basic_type type_{}; + attribute_options options_; + + entity* owner_{nullptr}; +}; + +class constraint { +public: + explicit constraint(std::string name) + : name_(std::move(name)) {} + + [[nodiscard]] const std::string& name() const; + [[nodiscard]] const std::string& column_name() const; + [[nodiscard]] const utils::constraints& type() const; + [[nodiscard]] bool is_primary_key_constraint() const; + [[nodiscard]] bool is_foreign_key_constraint() const; + [[nodiscard]] bool is_unique_constraint() const; + [[nodiscard]] const std::string& referenced_table() const; + [[nodiscard]] const std::string& referenced_column() const; + +private: + std::string name_; + std::string column_name_; + utils::constraints type_{}; + std::string referenced_table_; + std::string referenced_column_; +}; +} namespace matador::query { class column_builder { @@ -19,10 +80,6 @@ private: std::string column_name; }; -struct constraint { - std::string name; -}; - class table_builder { public: explicit table_builder(std::string name); @@ -45,7 +102,7 @@ public: constraint_builder& references(std::string table, std::string column); // ReSharper disable once CppNonExplicitConversionOperator - operator query::constraint() const; // NOLINT(*-explicit-constructor) + operator object::constraint() const; // NOLINT(*-explicit-constructor) private: std::string constraint_name; diff --git a/include/matador/query/query_compiler.hpp b/include/matador/query/query_compiler.hpp index c334552..b7f629f 100644 --- a/include/matador/query/query_compiler.hpp +++ b/include/matador/query/query_compiler.hpp @@ -8,6 +8,8 @@ #include "matador/utils/placeholder.hpp" +#include + namespace matador::sql { class connection_impl; class dialect; diff --git a/include/matador/utils/constraints.hpp b/include/matador/utils/constraints.hpp index 247d0b9..aa7304d 100644 --- a/include/matador/utils/constraints.hpp +++ b/include/matador/utils/constraints.hpp @@ -14,8 +14,8 @@ enum class constraints : unsigned char { inline constraints operator|(constraints a, constraints b) { return static_cast(static_cast(a) | static_cast(b)); } inline constraints operator&(constraints a, constraints b) { return static_cast(static_cast(a) & static_cast(b)); } -inline constraints& operator|= (constraints& a, constraints b) { return (constraints&)((int&)a |= (int)b); } -inline constraints& operator&= (constraints& a, constraints b) { return (constraints&)((int&)a &= (int)b); } +inline constraints& operator|= (constraints& a, constraints b) { return reinterpret_cast(reinterpret_cast(a) |= static_cast(b)); } +inline constraints& operator&= (constraints& a, constraints b) { return reinterpret_cast(reinterpret_cast(a) &= static_cast(b)); } inline bool is_constraint_set(const constraints source, const constraints needle) { return static_cast(source & needle) > 0; } diff --git a/source/core/object/attribute_definition.cpp b/source/core/object/attribute_definition.cpp index e2ac16b..cae01a9 100644 --- a/source/core/object/attribute_definition.cpp +++ b/source/core/object/attribute_definition.cpp @@ -35,8 +35,9 @@ attribute_definition::attribute_definition( std::string name, const utils::basic : attribute_definition(std::move(name), type, {}, {}, ref_column) { } -attribute_definition::attribute_definition( std::string name, const utils::basic_type type, const attribute_options& options, const std::shared_ptr& obj, const std::shared_ptr& ref_column ) +attribute_definition::attribute_definition(std::string name, const utils::basic_type type, const attribute_options& options, const std::shared_ptr& obj, const std::shared_ptr& ref_column) : name_( std::move( name ) ) +, object_( obj ) , options_( options ) , type_( type ) , reference_column_( ref_column ) { diff --git a/source/core/object/basic_object_info.cpp b/source/core/object/basic_object_info.cpp index 03c7815..601914f 100644 --- a/source/core/object/basic_object_info.cpp +++ b/source/core/object/basic_object_info.cpp @@ -8,9 +8,9 @@ namespace matador::object { basic_object_info::basic_object_info(std::shared_ptr node, utils::identifier &&pk, const std::shared_ptr &pk_column, - object_definition &&definition) + const std::shared_ptr &definition) : node_(std::move(node)) -, definition_(std::move(definition)) +, definition_(definition) , identifier_(std::move(pk)) , pk_column_(pk_column) { } @@ -24,9 +24,9 @@ basic_object_info::basic_object_info(std::shared_ptr node, } basic_object_info::basic_object_info(std::shared_ptr node, - object_definition &&definition) + const std::shared_ptr &definition) : node_(std::move(node)) -, definition_(std::move(definition)) {} +, definition_(definition) {} std::type_index basic_object_info::type_index() const { return node_->type_index(); @@ -36,7 +36,7 @@ std::string basic_object_info::name() const { return node_->name(); } -const object_definition &basic_object_info::definition() const { +std::shared_ptr basic_object_info::definition() const { return definition_; } diff --git a/source/core/object/repository.cpp b/source/core/object/repository.cpp index b4e9ff5..72e1635 100644 --- a/source/core/object/repository.cpp +++ b/source/core/object/repository.cpp @@ -117,25 +117,6 @@ utils::result repository::attach_node(const return utils::ok(node); } -// utils::result schema::attach_node(const std::shared_ptr &node, -// const std::type_index &type_index) { -// if (has_node(node)) { -// return utils::failure(make_error(error_code::NodeAlreadyExists, "Node '" + node->name() + "' already exists.")); -// } -// auto result = find_node(type_index); -// if (!result.is_ok() && result.err().ec() != error_code::NodeNotFound) { -// return result; -// } -// -// insert_node(*result, node); -// -// // Todo: check return value -// nodes_by_name_.insert({node->name(), node})/*.first*/; -// nodes_by_type_.insert({node->type_index(), node}); -// -// return utils::ok(node); -// } - utils::result repository::find_node(const std::string &name) const { // first search in the prototype map const auto i = nodes_by_name_.find(name); diff --git a/source/core/object/repository_node.cpp b/source/core/object/repository_node.cpp index 7d1ad09..1bcef2f 100644 --- a/source/core/object/repository_node.cpp +++ b/source/core/object/repository_node.cpp @@ -4,28 +4,28 @@ #include "matador/object/repository_node.hpp" namespace matador::object { -repository_node::repository_node(object::repository &tree) -: repo_(tree) +repository_node::repository_node(object::repository &repo) +: repo_(repo) , type_index_(typeid(detail::null_type)){ } -repository_node::repository_node(object::repository &tree, const std::type_index& ti) -: repo_(tree) +repository_node::repository_node(object::repository &repo, const std::type_index& ti) +: repo_(repo) , type_index_(ti) { } -repository_node::repository_node(object::repository &tree, std::string name, const std::type_index& ti) -: repo_(tree) +repository_node::repository_node(object::repository &repo, std::string name, const std::type_index& ti) +: repo_(repo) , type_index_(ti) -, first_child_(std::shared_ptr(new repository_node(tree))) -, last_child_(std::shared_ptr(new repository_node(tree))) +, first_child_(std::shared_ptr(new repository_node(repo))) +, last_child_(std::shared_ptr(new repository_node(repo))) , name_(std::move(name)) { first_child_->next_sibling_ = last_child_; last_child_->previous_sibling_ = first_child_; } -std::shared_ptr repository_node::make_null_node(object::repository &tree) { - auto node = std::shared_ptr(new repository_node(tree)); +std::shared_ptr repository_node::make_null_node(object::repository &repo) { + auto node = std::shared_ptr(new repository_node(repo)); node->info_ = std::make_unique(node, std::shared_ptr{}); return node; @@ -104,7 +104,7 @@ utils::result repository_node::make_and return repo.attach_node(node, ""); } -std::shared_ptr repository_node::determine_reference_column(const std::type_index& ti, object_definition& obj, const primary_key_info& pk_info, repository& repo) { +std::shared_ptr repository_node::determine_reference_column(const std::type_index& ti, const std::shared_ptr& obj, const primary_key_info& pk_info, repository& repo) { const auto it = repo.missing_references_.find(ti); if (it == repo.missing_references_.end()) { return std::make_shared(pk_info.pk_column_name, pk_info.type, attribute_options{utils::constraints::FOREIGN_KEY}); @@ -117,7 +117,7 @@ std::shared_ptr repository_node::determine_reference_colum ref_column->change_type(pk_info.type); ref_column->attributes() = utils::constraints::FOREIGN_KEY; - if (obj.name().empty()) { + if (obj->name().empty()) { repo.missing_references_.insert({ti, ref_column}); } diff --git a/source/orm/orm/schema.cpp b/source/orm/orm/schema.cpp index 9506003..b100234 100644 --- a/source/orm/orm/schema.cpp +++ b/source/orm/orm/schema.cpp @@ -57,7 +57,7 @@ matador::utils::result matador::orm::schema::create // std::cout << result.sql << std::endl; for (const auto &node: repo_) { auto ctx = query::query::create() - .table(node->name(), node->info().definition().columns()) + .table(node->name(), node->info().definition()->columns()) .compile(*c); for ( const auto& [sql, command] : ctx.additional_commands ) { diff --git a/source/orm/orm/session.cpp b/source/orm/orm/session.cpp index 4c46dd3..d1d7fa2 100644 --- a/source/orm/orm/session.cpp +++ b/source/orm/orm/session.cpp @@ -52,7 +52,7 @@ utils::result session::create_schema() const { auto c = cache_.pool().acquire(); for (const auto &node: *schema_) { auto ctx = query::query::create() - .table(node->name(), node->info().definition().columns()) + .table(node->name(), node->info().definition()->columns()) .compile(*c); for ( const auto& [sql, command] : ctx.additional_commands ) { diff --git a/source/orm/query/builder.cpp b/source/orm/query/builder.cpp index d2fed9a..818936c 100644 --- a/source/orm/query/builder.cpp +++ b/source/orm/query/builder.cpp @@ -42,8 +42,8 @@ constraint_builder& constraint_builder::references( std::string table, std::stri return *this; } -constraint_builder::operator struct query::constraint() const { - return {constraint_name}; +constraint_builder::operator object::constraint() const { + return object::constraint{constraint_name}; } constraint_builder constraint( std::string name ) { diff --git a/test/orm/sql/ColumnTest.cpp b/test/orm/sql/ColumnTest.cpp index a308246..f9af913 100644 --- a/test/orm/sql/ColumnTest.cpp +++ b/test/orm/sql/ColumnTest.cpp @@ -1,6 +1,7 @@ #include #include "matador/object/attribute_definition.hpp" +#include "matador/object/object_definition.hpp" using namespace matador::object; using namespace matador::utils; @@ -33,7 +34,7 @@ TEST_CASE("Test copy and move column", "[column]") { REQUIRE(c.index() == 2); REQUIRE(c.reference_column()); REQUIRE(c.reference_column()->name() == "author"); - REQUIRE(c.reference_column()->table_name() == "books"); + REQUIRE(c.reference_column()->object()->name() == "books"); REQUIRE(c.type() == basic_type::type_varchar); REQUIRE(c.attributes().size() == 255); @@ -42,7 +43,7 @@ TEST_CASE("Test copy and move column", "[column]") { REQUIRE(c2.index() == 2); REQUIRE(c2.reference_column()); REQUIRE(c2.reference_column()->name() == "author"); - REQUIRE(c2.reference_column()->table_name() == "books"); + REQUIRE(c2.reference_column()->object()->name() == "books"); REQUIRE(c2.type() == basic_type::type_varchar); REQUIRE(c2.attributes().size() == 255); @@ -51,7 +52,7 @@ TEST_CASE("Test copy and move column", "[column]") { REQUIRE(c3.index() == 2); REQUIRE(c3.reference_column()); REQUIRE(c3.reference_column()->name() == "author"); - REQUIRE(c3.reference_column()->table_name() == "books"); + REQUIRE(c3.reference_column()->object()->name() == "books"); REQUIRE(c3.type() == basic_type::type_varchar); REQUIRE(c3.attributes().size() == 255); diff --git a/test/orm/sql/FieldTest.cpp b/test/orm/sql/FieldTest.cpp index cb5ba29..582a91a 100644 --- a/test/orm/sql/FieldTest.cpp +++ b/test/orm/sql/FieldTest.cpp @@ -37,7 +37,7 @@ TEST_CASE("Test field", "[field]") { REQUIRE(bool_val.has_value()); REQUIRE(bool_val.value()); - f = sql::field("name", utils::blob{ 7,8,6,5,4,3 }, sql::field_type::Attribute, 0, 1); + f = sql::field("name", utils::blob{ 7,8,6,5,4,3 }, utils::constraints::NONE, 0, 1); REQUIRE(f.index() == 1); REQUIRE(!f.is_null()); REQUIRE(!f.is_integer()); diff --git a/todo.md b/todo.md index cbd7924..7248b6c 100644 --- a/todo.md +++ b/todo.md @@ -1,5 +1,7 @@ # Todo +- move `object_definition` and `attribute_definition` to `table` and `column` in query + and add `contraint` class - replace mk_column with builder style (see `query/builder.hpp`) - fix corresponding tests - enhance query helper macro to look like the `book` class below @@ -14,6 +16,7 @@ - implement lazy loading - implement polymorphic class hierarchies - finish `schema` and `schema_repository` classes (move add/drop from `session` to `schema`) +- implement a flag class for enumerations ## book class ```cpp