added join_column_index and inverse_join_column_index to object and table classes
This commit is contained in:
@@ -34,6 +34,7 @@ public:
|
||||
[[nodiscard]] const std::string& name() const;
|
||||
void name(const std::string& n);
|
||||
[[nodiscard]] std::string full_name() const;
|
||||
[[nodiscard]] size_t index() const;
|
||||
[[nodiscard]] const utils::field_attributes& attributes() const;
|
||||
[[nodiscard]] utils::field_attributes& attributes();
|
||||
[[nodiscard]] bool is_nullable() const;
|
||||
@@ -68,6 +69,7 @@ private:
|
||||
friend class object_generator;
|
||||
|
||||
std::string name_;
|
||||
size_t index_{0};
|
||||
std::weak_ptr<object> owner_;
|
||||
utils::basic_type type_{utils::basic_type::Null};
|
||||
utils::field_attributes options_{};
|
||||
|
||||
@@ -27,12 +27,12 @@ public:
|
||||
[[nodiscard]] std::type_index type_index() const;
|
||||
[[nodiscard]] std::string name() const;
|
||||
[[nodiscard]] std::shared_ptr<class object> object() const;
|
||||
[[nodiscard]] const std::list<attribute>& attributes() const;
|
||||
[[nodiscard]] const std::list<class restriction>& constraints() const;
|
||||
[[nodiscard]] const std::vector<attribute>& attributes() const;
|
||||
[[nodiscard]] const std::vector<restriction>& constraints() const;
|
||||
|
||||
[[nodiscard]] bool has_primary_key() const;
|
||||
[[nodiscard]] const utils::identifier& primary_key() const;
|
||||
[[nodiscard]] attribute* primary_key_attribute() const;
|
||||
[[nodiscard]] const attribute* primary_key_attribute() const;
|
||||
|
||||
void update_name(const std::string& name) const;
|
||||
|
||||
|
||||
@@ -95,7 +95,7 @@ public:
|
||||
return basic_info(std::type_index(typeid(Type)));
|
||||
}
|
||||
|
||||
[[nodiscard]] utils::result<attribute*, utils::error> primary_key_attribute(const std::type_index &ti) const;
|
||||
[[nodiscard]] utils::result<const attribute*, utils::error> primary_key_attribute(const std::type_index &ti) const;
|
||||
|
||||
void dump(std::ostream &os) const;
|
||||
static void dump(std::ostream &os, const repository_node& node);
|
||||
|
||||
@@ -17,21 +17,25 @@ public:
|
||||
|
||||
static const attribute& create_attribute(std::string name, const std::shared_ptr<object>& obj);
|
||||
|
||||
[[nodiscard]] attribute* primary_key_attribute() const;
|
||||
[[nodiscard]] const attribute* primary_key_attribute() const;
|
||||
[[nodiscard]] const utils::identifier& primary_key() const;
|
||||
[[nodiscard]] bool has_primary_key() const;
|
||||
|
||||
[[nodiscard]] bool is_relation_object() const;
|
||||
[[nodiscard]] const attribute* join_attribute() const;
|
||||
[[nodiscard]] const attribute* inverse_join_attribute() const;
|
||||
|
||||
[[nodiscard]] const std::string& name() const;
|
||||
|
||||
void update_name(const std::string& name);
|
||||
|
||||
[[nodiscard]] bool has_attributes() const;
|
||||
[[nodiscard]] size_t attribute_count() const;
|
||||
[[nodiscard]] const std::list<attribute>& attributes() const;
|
||||
[[nodiscard]] const std::vector<attribute>& attributes() const;
|
||||
|
||||
[[nodiscard]] bool has_constraints() const;
|
||||
[[nodiscard]] size_t constraint_count() const;
|
||||
[[nodiscard]] const std::list<restriction>& constraints() const;
|
||||
[[nodiscard]] const std::vector<restriction>& constraints() const;
|
||||
|
||||
friend std::ostream& operator<<(std::ostream& os, const object& obj);
|
||||
|
||||
@@ -40,10 +44,13 @@ private:
|
||||
friend class object_generator;
|
||||
|
||||
std::string name_;
|
||||
attribute* pk_attribute_{nullptr};
|
||||
int pk_column_index_{-1};
|
||||
int join_column_index_{-1};
|
||||
int inverse_join_column_index_{-1};
|
||||
|
||||
utils::identifier pk_identifier_;
|
||||
std::list<attribute> attributes_;
|
||||
std::list<restriction> constraints_;
|
||||
std::vector<attribute> attributes_;
|
||||
std::vector<restriction> constraints_;
|
||||
};
|
||||
}
|
||||
#endif //MATADOR_OBJECT_HPP
|
||||
@@ -58,7 +58,11 @@ public:
|
||||
}
|
||||
|
||||
template < class Type >
|
||||
static std::shared_ptr<object> generate(std::unique_ptr<Type>&& t, basic_repository &repo, const std::string &name) {
|
||||
static std::shared_ptr<object> generate(std::unique_ptr<Type>&& t,
|
||||
basic_repository &repo,
|
||||
const std::string &name,
|
||||
const std::string &join_column = "",
|
||||
const std::string &inverse_join_column = "") {
|
||||
const std::type_index ti(typeid(Type));
|
||||
if (repo.has_object_for_type(ti)) {
|
||||
auto obj = repo.object_for_type(ti);
|
||||
@@ -71,6 +75,9 @@ public:
|
||||
std::ignore = repo.provide_object_in_advance(ti, obj);
|
||||
object_generator gen(repo, obj);
|
||||
access::process(gen, *t);
|
||||
if (!join_column.empty() && !inverse_join_column.empty()) {
|
||||
gen.prepare_relation_table(join_column, inverse_join_column);
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
@@ -111,6 +118,7 @@ private:
|
||||
template<typename ValueType>
|
||||
attribute &emplace_attribute(const char *id, const utils::field_attributes& attr, null_option_type null_option) {
|
||||
auto &ref = object_->attributes_.emplace_back(id, utils::data_type_traits<ValueType>::type(attr.size()), attr, null_option);
|
||||
ref.index_ = object_->attributes_.size() - 1;
|
||||
ref.owner_ = object_;
|
||||
return ref;
|
||||
}
|
||||
@@ -120,9 +128,10 @@ private:
|
||||
void create_fk_constraint(const std::string& name) const;
|
||||
void create_unique_constraint(const std::string& name) const;
|
||||
|
||||
[[nodiscard]] std::list<attribute>::iterator find_attribute_by_name(const std::string &name) const;
|
||||
[[nodiscard]] std::vector<attribute>::iterator find_attribute_by_name(const std::string &name) const;
|
||||
|
||||
void prepare_primary_key(attribute &ref, utils::identifier &&pk) const;
|
||||
void prepare_primary_key(const attribute &ref, utils::identifier &&pk) const;
|
||||
void prepare_relation_table(const std::string &join_column, const std::string &inverse_join_column) const;
|
||||
|
||||
template<typename Type>
|
||||
[[nodiscard]] std::shared_ptr<object> fk_object() const;
|
||||
@@ -135,7 +144,7 @@ private:
|
||||
|
||||
template<typename ValueType>
|
||||
void object_generator::on_primary_key(const char *id, ValueType &x, const utils::primary_key_attribute& attr) {
|
||||
utils::constraints cs = utils::constraints::PrimaryKey;
|
||||
auto cs = utils::constraints::PrimaryKey;
|
||||
if (attr.generator() == utils::generator_type::Identity) {
|
||||
cs |= utils::constraints::Identity;
|
||||
}
|
||||
|
||||
@@ -367,7 +367,12 @@ void relation_completer<Type, Observers...>::attach_relation_node(const std::str
|
||||
|
||||
auto observers = internal::observer_list_copy_creator<Type, relation_value_type, Observers...>::copy_create(observers_);
|
||||
|
||||
auto node = repository_node::make_node<relation_value_type>(repo_, name, std::move(creator), std::move(observers));
|
||||
auto node = repository_node::make_relation_node<relation_value_type>(repo_,
|
||||
name,
|
||||
join_column,
|
||||
inverse_join_column,
|
||||
std::move(creator),
|
||||
std::move(observers));
|
||||
auto result = repo_.attach_node(node.release(), "");
|
||||
if (!result) {
|
||||
// Todo: throw internal error
|
||||
|
||||
@@ -23,6 +23,13 @@ public:
|
||||
const std::string& name,
|
||||
creator_func<Type> creator,
|
||||
std::vector<std::unique_ptr<observer<Type>>>&& observers);
|
||||
template < typename Type, template<typename> typename... Observers >
|
||||
static std::unique_ptr<repository_node> make_relation_node(basic_repository& repo,
|
||||
const std::string& name,
|
||||
const std::string& join_column,
|
||||
const std::string& inverse_join_column,
|
||||
creator_func<Type> creator,
|
||||
std::vector<std::unique_ptr<observer<Type>>>&& observers);
|
||||
|
||||
explicit repository_node(basic_repository& repo);
|
||||
repository_node(const repository_node& other) = delete;
|
||||
@@ -101,5 +108,28 @@ std::unique_ptr<repository_node> repository_node::make_node(basic_repository &re
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
template<typename Type, template <typename> class ... Observers>
|
||||
std::unique_ptr<repository_node> repository_node::make_relation_node(basic_repository &repo,
|
||||
const std::string &name,
|
||||
const std::string &join_column,
|
||||
const std::string &inverse_join_column,
|
||||
creator_func<Type> creator,
|
||||
std::vector<std::unique_ptr<observer<Type>>> &&observers) {
|
||||
const std::type_index ti(typeid(Type));
|
||||
auto node = std::unique_ptr<repository_node>(new repository_node(repo, name, ti));
|
||||
|
||||
internal::observer_list_creator<Type, Observers...>::create_missing(observers);
|
||||
|
||||
auto obj = object_generator::generate<Type>(creator(), repo, name, join_column, inverse_join_column);
|
||||
node->info_.reset(std::make_unique<object_info<Type>>(
|
||||
*node,
|
||||
obj,
|
||||
std::move(observers),
|
||||
std::forward<creator_func<Type>>(creator)
|
||||
).release());
|
||||
|
||||
return node;
|
||||
}
|
||||
}
|
||||
#endif //REPOSITORY_NODE_HPP
|
||||
|
||||
Reference in New Issue
Block a user