diff --git a/include/matador/sql/column_generator.hpp b/include/matador/sql/column_generator.hpp index 287b1e2..4b62609 100644 --- a/include/matador/sql/column_generator.hpp +++ b/include/matador/sql/column_generator.hpp @@ -6,6 +6,7 @@ #include "matador/utils/access.hpp" #include "matador/utils/field_attributes.hpp" +#include "matador/utils/foreign_attributes.hpp" #include #include @@ -37,13 +38,13 @@ public: void on_attribute(const char * /*id*/, Type &/*x*/, const utils::field_attributes &/*attr*/ = utils::null_attributes) {} void on_attribute(const char * /*id*/, char * /*x*/, const utils::field_attributes &/*attr*/ = utils::null_attributes) {} template - void on_belongs_to(const char * /*id*/, Pointer &/*x*/, utils::cascade_type) {} + void on_belongs_to(const char * /*id*/, Pointer &/*x*/, const utils::foreign_attributes &/*attr*/) {} template - void on_has_one(const char * /*id*/, Pointer &/*x*/, utils::cascade_type) {} + void on_has_one(const char * /*id*/, Pointer &/*x*/, const utils::foreign_attributes &/*attr*/) {} template - void on_has_many(const char *, ContainerType &, const char *, const char *, utils::cascade_type) {} + void on_has_many(const char *, ContainerType &, const char *, const char *, const utils::foreign_attributes &/*attr*/) {} template - void on_has_many(const char *, ContainerType &, utils::cascade_type) {} + void on_has_many(const char *, ContainerType &, const utils::foreign_attributes &/*attr*/) {} private: data_type_t type_{}; @@ -79,21 +80,21 @@ public: void on_attribute(const char *id, std::optional &x, const utils::field_attributes &attr = utils::null_attributes); template - void on_belongs_to(const char *id, Pointer &x, utils::cascade_type) + void on_belongs_to(const char *id, Pointer &x, const utils::foreign_attributes &/*attr*/) { const auto [ref_table, ref_column] = determine_foreign_ref(std::type_index(typeid(typename Pointer::value_type))); columns_.push_back(fk_column_generator_.generate(id, *x, ref_table, ref_column)); } template - void on_has_one(const char *id, Pointer &x, utils::cascade_type) + void on_has_one(const char *id, Pointer &x, const utils::foreign_attributes &/*attr*/) { const auto [ref_table, ref_column] = determine_foreign_ref(std::type_index(typeid(typename Pointer::value_type))); columns_.push_back(fk_column_generator_.generate(id, *x, ref_table, ref_column)); } template - void on_has_many(const char *, ContainerType &, const char *, const char *, utils::cascade_type) {} + void on_has_many(const char *, ContainerType &, const char *, const char *, const utils::foreign_attributes &/*attr*/) {} template - void on_has_many(const char *, ContainerType &, utils::cascade_type) {} + void on_has_many(const char *, ContainerType &, const utils::foreign_attributes &/*attr*/) {} private: std::pair determine_foreign_ref(const std::type_index &ti); diff --git a/include/matador/sql/column_name_generator.hpp b/include/matador/sql/column_name_generator.hpp index a36bbcf..54829a1 100644 --- a/include/matador/sql/column_name_generator.hpp +++ b/include/matador/sql/column_name_generator.hpp @@ -3,6 +3,7 @@ #include "matador/utils/access.hpp" #include "matador/utils/field_attributes.hpp" +#include "matador/utils/foreign_attributes.hpp" #include #include @@ -42,19 +43,19 @@ public: } template - void on_belongs_to(const char *id, Pointer &, utils::cascade_type) + void on_belongs_to(const char *id, Pointer &, const utils::foreign_attributes &/*attr*/) { column_names_.emplace_back(id); } template - void on_has_one(const char *id, Pointer &, utils::cascade_type) + void on_has_one(const char *id, Pointer &, const utils::foreign_attributes &/*attr*/) { column_names_.emplace_back(id); } template - void on_has_many(const char *, ContainerType &, const char *, const char *, utils::cascade_type) {} + void on_has_many(const char *, ContainerType &, const char *, const char *, const utils::foreign_attributes &/*attr*/) {} template - void on_has_many(const char *, ContainerType &, utils::cascade_type) {} + void on_has_many(const char *, ContainerType &, const utils::foreign_attributes &/*attr*/) {} private: std::vector &column_names_; diff --git a/include/matador/sql/fk_value_extractor.hpp b/include/matador/sql/fk_value_extractor.hpp index 2fee3bf..9184594 100644 --- a/include/matador/sql/fk_value_extractor.hpp +++ b/include/matador/sql/fk_value_extractor.hpp @@ -31,13 +31,13 @@ public: void on_attribute(const char * /*id*/, Type &/*x*/, const utils::field_attributes &/*attr*/ = utils::null_attributes) {} void on_attribute(const char * /*id*/, char * /*x*/, const utils::field_attributes &/*attr*/ = utils::null_attributes) {} template - void on_belongs_to(const char * /*id*/, Pointer &/*x*/, utils::cascade_type) {} + void on_belongs_to(const char * /*id*/, Pointer &/*x*/, const utils::foreign_attributes &/*attr*/) {} template - void on_has_one(const char * /*id*/, Pointer &/*x*/, utils::cascade_type) {} + void on_has_one(const char * /*id*/, Pointer &/*x*/, const utils::foreign_attributes &/*attr*/) {} template - void on_has_many(const char *, ContainerType &, const char *, const char *, utils::cascade_type) {} + void on_has_many(const char *, ContainerType &, const char *, const char *, const utils::foreign_attributes &/*attr*/) {} template - void on_has_many(const char *, ContainerType &, utils::cascade_type) {} + void on_has_many(const char *, ContainerType &, const utils::foreign_attributes &/*attr*/) {} private: diff --git a/include/matador/sql/key_value_generator.hpp b/include/matador/sql/key_value_generator.hpp index 6d1204b..e67dc16 100644 --- a/include/matador/sql/key_value_generator.hpp +++ b/include/matador/sql/key_value_generator.hpp @@ -40,19 +40,19 @@ public: } template class Pointer> - void on_belongs_to(const char *id, Pointer &x, utils::cascade_type) + void on_belongs_to(const char *id, Pointer &x, const utils::foreign_attributes &/*attr*/) { result_.emplace_back(id, fk_value_extractor_.extract(*x)); } template class Pointer> - void on_has_one(const char *id, Pointer &x, utils::cascade_type) + void on_has_one(const char *id, Pointer &x, const utils::foreign_attributes &/*attr*/) { result_.emplace_back(id, fk_value_extractor_.extract(*x)); } template - void on_has_many(const char *, ContainerType &, const char *, const char *, utils::cascade_type) {} + void on_has_many(const char *, ContainerType &, const char *, const char *, const utils::foreign_attributes &/*attr*/) {} template - void on_has_many(const char *, ContainerType &, utils::cascade_type) {} + void on_has_many(const char *, ContainerType &, const utils::foreign_attributes &/*attr*/) {} private: detail::fk_value_extractor fk_value_extractor_; diff --git a/include/matador/sql/query_result_impl.hpp b/include/matador/sql/query_result_impl.hpp index 8a1edb7..c448488 100644 --- a/include/matador/sql/query_result_impl.hpp +++ b/include/matador/sql/query_result_impl.hpp @@ -3,6 +3,7 @@ #include "matador/utils/access.hpp" #include "matador/utils/field_attributes.hpp" +#include "matador/utils/foreign_attributes.hpp" #include "matador/sql/any_type.hpp" #include "matador/sql/query_result_reader.hpp" @@ -35,14 +36,14 @@ public: template < class Type > void on_attribute(const char * /*id*/, Type &/*x*/, const utils::field_attributes &/*attr*/ = utils::null_attributes) {} template < class Pointer > - void on_belongs_to(const char * /*id*/, Pointer &/*x*/, utils::cascade_type) {} + void on_belongs_to(const char * /*id*/, Pointer &/*x*/, const utils::foreign_attributes &/*attr*/) {} template < class Pointer > - void on_has_one(const char * /*id*/, Pointer &/*x*/, utils::cascade_type) {} + void on_has_one(const char * /*id*/, Pointer &/*x*/, const utils::foreign_attributes &/*attr*/) {} template - void on_has_many(const char *, ContainerType &, const char *, const char *, utils::cascade_type) {} + void on_has_many(const char *, ContainerType &, const char *, const char *, const utils::foreign_attributes &/*attr*/) {} template - void on_has_many(const char *, ContainerType &, utils::cascade_type) {} + void on_has_many(const char *, ContainerType &, const utils::foreign_attributes &/*attr*/) {} private: size_t column_index_{}; @@ -74,7 +75,7 @@ public: void on_attribute(const char *id, any_type &value, data_type_t type, const utils::field_attributes &attr = utils::null_attributes); template < class Pointer > - void on_belongs_to(const char * /*id*/, Pointer &x, utils::cascade_type) + void on_belongs_to(const char * /*id*/, Pointer &x, const utils::foreign_attributes &/*attr*/) { if (!x.get()) { x.reset(new typename Pointer::value_type); @@ -82,7 +83,7 @@ public: pk_reader_.read(*x, column_index_++); } template < class Pointer > - void on_has_one(const char * /*id*/, Pointer &x, utils::cascade_type) + void on_has_one(const char * /*id*/, Pointer &x, const utils::foreign_attributes &/*attr*/) { if (!x.get()) { x.reset(new typename Pointer::value_type); @@ -91,9 +92,9 @@ public: } template - void on_has_many(const char *, ContainerType &, const char *, const char *, utils::cascade_type) {} + void on_has_many(const char *, ContainerType &, const char *, const char *, const utils::foreign_attributes &/*attr*/) {} template - void on_has_many(const char *, ContainerType &, utils::cascade_type) {} + void on_has_many(const char *, ContainerType &, const utils::foreign_attributes &/*attr*/) {} template void bind(const Type &) {} diff --git a/include/matador/sql/value_extractor.hpp b/include/matador/sql/value_extractor.hpp index 82db268..206d653 100644 --- a/include/matador/sql/value_extractor.hpp +++ b/include/matador/sql/value_extractor.hpp @@ -4,6 +4,8 @@ #include "matador/sql/fk_value_extractor.hpp" #include "matador/sql/data_type_traits.hpp" +#include "matador/utils/foreign_attributes.hpp" + #include namespace matador::sql { @@ -41,19 +43,19 @@ public: void on_attribute(const char *id, std::string &x, const utils::field_attributes &/*attr*/ = utils::null_attributes); template class Pointer> - void on_belongs_to(const char * /*id*/, Pointer &x, utils::cascade_type) + void on_belongs_to(const char * /*id*/, Pointer &x, const utils::foreign_attributes &/*attr*/) { values_.emplace_back(fk_value_extractor_.extract(*x)); } template class Pointer> - void on_has_one(const char * /*id*/, Pointer &x, utils::cascade_type) + void on_has_one(const char * /*id*/, Pointer &x, const utils::foreign_attributes &/*attr*/) { values_.emplace_back(fk_value_extractor_.extract(*x)); } template - void on_has_many(const char *, ContainerType &, const char *, const char *, utils::cascade_type) {} + void on_has_many(const char *, ContainerType &, const char *, const char *, const utils::foreign_attributes &/*attr*/) {} template - void on_has_many(const char *, ContainerType &, utils::cascade_type) {} + void on_has_many(const char *, ContainerType &, const utils::foreign_attributes &/*attr*/) {} private: template diff --git a/include/matador/utils/access.hpp b/include/matador/utils/access.hpp index 796b72b..7cc3293 100644 --- a/include/matador/utils/access.hpp +++ b/include/matador/utils/access.hpp @@ -1,8 +1,6 @@ #ifndef QUERY_ACCESS_HPP #define QUERY_ACCESS_HPP -#include "matador/utils/cascade_type.hpp" - #include #include @@ -12,6 +10,7 @@ template < class Type, template < class ... > class ContainerType > class container; class field_attributes; +class foreign_attributes; namespace access { @@ -56,23 +55,23 @@ void attribute(Operator &op, const char *id, Type &value) { } template -void has_one(Operator &op, const char *id, Type &value, cascade_type cascade) { - op.on_has_one(id, value, cascade); +void has_one(Operator &op, const char *id, Type &value, const foreign_attributes &attr) { + op.on_has_one(id, value, attr); } template -void belongs_to(Operator &op, const char *id, Type &value, cascade_type cascade) { - op.on_belongs_to(id, value, cascade); +void belongs_to(Operator &op, const char *id, Type &value, const foreign_attributes &attr) { + op.on_belongs_to(id, value, attr); } template class ContainerType> -void has_many(Operator &op, const char *id, container &container, cascade_type cascade) { - op.on_has_many(id, container, cascade); +void has_many(Operator &op, const char *id, container &container, const foreign_attributes &attr) { + op.on_has_many(id, container, attr); } template class ContainerType> -void has_many(Operator &op, const char *id, container &container, const char *left_column, const char *right_column, cascade_type cascade) { - op.on_has_many(id, container, left_column, right_column, cascade); +void has_many(Operator &op, const char *id, container &container, const char *left_column, const char *right_column, const foreign_attributes &attr) { + op.on_has_many(id, container, left_column, right_column, attr); } } diff --git a/include/matador/utils/fetch_type.hpp b/include/matador/utils/fetch_type.hpp new file mode 100644 index 0000000..f97b9a2 --- /dev/null +++ b/include/matador/utils/fetch_type.hpp @@ -0,0 +1,17 @@ +#ifndef QUERY_FETCH_TYPE_HPP +#define QUERY_FETCH_TYPE_HPP + +#include + +/** + * @brief Defines fetch types + * + * Defines fetch types for foreign relations + */ +enum class fetch_type : uint8_t +{ + LAZY, /**< Indicates lazy fetch */ + EAGER /**< Indicates eager fetch */ +}; + +#endif //QUERY_FETCH_TYPE_HPP diff --git a/include/matador/utils/foreign_attributes.hpp b/include/matador/utils/foreign_attributes.hpp new file mode 100644 index 0000000..b779c28 --- /dev/null +++ b/include/matador/utils/foreign_attributes.hpp @@ -0,0 +1,34 @@ +#ifndef QUERY_FOREIGN_ATTRIBUTES_HPP +#define QUERY_FOREIGN_ATTRIBUTES_HPP + +#include "matador/utils/fetch_type.hpp" +#include "matador/utils/cascade_type.hpp" + +namespace matador::utils { + +class foreign_attributes +{ +public: + foreign_attributes() = default; + foreign_attributes(cascade_type cascade); // NOLINT(*-explicit-constructor) + foreign_attributes(fetch_type fetch); // NOLINT(*-explicit-constructor) + foreign_attributes(cascade_type cascade, fetch_type fetch); + foreign_attributes(const foreign_attributes &x) = default; + foreign_attributes& operator=(const foreign_attributes &x) = default; + foreign_attributes(foreign_attributes &&x) = default; + foreign_attributes& operator=(foreign_attributes &&x) = default; + ~foreign_attributes() = default; + + [[nodiscard]] cascade_type cascade() const; + [[nodiscard]] fetch_type fetch() const; + +private: + cascade_type cascade_{cascade_type::NONE}; + fetch_type fetch_{fetch_type::LAZY}; +}; + +const foreign_attributes default_foreign_attributes {}; + +} + +#endif //QUERY_FOREIGN_ATTRIBUTES_HPP diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ebb18aa..ee52564 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -82,7 +82,9 @@ set(UTILS_HEADER ../include/matador/utils/cascade_type.hpp ../include/matador/utils/logger.hpp ../include/matador/utils/enum_mapper.hpp - ../include/matador/utils/types.hpp) + ../include/matador/utils/types.hpp + ../include/matador/utils/foreign_attributes.hpp + ../include/matador/utils/fetch_type.hpp) set(UTILS_SOURCES utils/field_attributes.cpp @@ -92,7 +94,8 @@ set(UTILS_SOURCES utils/os.cpp utils/identifier.cpp sql/value_extractor.cpp - utils/logger.cpp) + utils/logger.cpp + utils/foreign_attributes.cpp) add_library(matador STATIC ${SQL_SOURCES} ${SQL_HEADER} ${UTILS_SOURCES} ${UTILS_HEADER}) target_include_directories(matador PUBLIC ${PROJECT_SOURCE_DIR}/include) diff --git a/src/utils/foreign_attributes.cpp b/src/utils/foreign_attributes.cpp new file mode 100644 index 0000000..d3c7122 --- /dev/null +++ b/src/utils/foreign_attributes.cpp @@ -0,0 +1,22 @@ +#include "matador/utils/foreign_attributes.hpp" + +matador::utils::foreign_attributes::foreign_attributes(matador::utils::cascade_type cascade) +: cascade_(cascade) {} + +matador::utils::foreign_attributes::foreign_attributes(fetch_type fetch) +: fetch_(fetch) {} + +matador::utils::foreign_attributes::foreign_attributes(matador::utils::cascade_type cascade, fetch_type fetch) +: cascade_(cascade) +, fetch_(fetch ) {} + +matador::utils::cascade_type matador::utils::foreign_attributes::cascade() const +{ + return cascade_; +} + +fetch_type matador::utils::foreign_attributes::fetch() const +{ + return fetch_; +} +