104 lines
3.8 KiB
C++
104 lines
3.8 KiB
C++
#ifndef MATADOR_BASIC_SCHEMA_HPP
|
|
#define MATADOR_BASIC_SCHEMA_HPP
|
|
|
|
#include "matador/object/repository.hpp"
|
|
|
|
#include "matador/query/abstract_pk_generator.hpp"
|
|
#include "matador/query/table.hpp"
|
|
|
|
#include "matador/sql/internal/collection_resolver_producer.hpp"
|
|
#include "matador/sql/internal/object_resolver_producer.hpp"
|
|
#include "matador/sql/producer_resolver_factory.hpp"
|
|
|
|
#include <memory>
|
|
#include <typeindex>
|
|
#include <unordered_map>
|
|
|
|
namespace matador::query {
|
|
class schema_node final {
|
|
public:
|
|
schema_node(class table tab, std::unique_ptr<abstract_pk_generator> &&pk_generator, const object::repository_node& node);
|
|
|
|
[[nodiscard]] const std::string& name() const;
|
|
[[nodiscard]] const class table& table() const;
|
|
[[nodiscard]] abstract_pk_generator& pk_generator() const;
|
|
[[nodiscard]] const object::repository_node& node() const;
|
|
|
|
private:
|
|
class table table_;
|
|
utils::generator_type generator_type_{};
|
|
std::unique_ptr<abstract_pk_generator> pk_generator_;
|
|
const object::repository_node& node_;
|
|
};
|
|
|
|
class primary_key_generator_finder final {
|
|
public:
|
|
template< typename Type >
|
|
utils::generator_type find(const object::object_info<Type>& info) {
|
|
generator_type_ = utils::generator_type::Manual;
|
|
|
|
access::process(*this, info.prototype());
|
|
|
|
return generator_type_;
|
|
}
|
|
template<class V>
|
|
void on_primary_key(const char * /*id*/, V &/*pk*/, const utils::primary_key_attribute &attr = utils::default_pk_attributes) {
|
|
generator_type_ = attr.generator();
|
|
}
|
|
static void on_revision(const char * /*id*/, uint64_t & /*rev*/) {}
|
|
template<typename T>
|
|
static void on_attribute(const char * /*id*/, T &, const utils::field_attributes & = utils::null_attributes) {}
|
|
template<class P>
|
|
static void on_belongs_to(const char * /*id*/, P &, const utils::foreign_attributes & ) {}
|
|
template<class P>
|
|
static void on_has_one(const char * /*id*/, P &, const utils::foreign_attributes & ) {}
|
|
template<class C>
|
|
static void on_has_many(const char * /*id*/, C &, const char * /*join_column*/, const utils::foreign_attributes & ) {}
|
|
template<class C>
|
|
static void on_has_many_to_many(const char * /*id*/, C &, const char * /*join_column*/, const char * /*inverse_join_column*/, const utils::foreign_attributes & ) {}
|
|
template<class C>
|
|
static void on_has_many_to_many(const char * /*id*/, C &, const utils::foreign_attributes & ) {}
|
|
|
|
private:
|
|
utils::generator_type generator_type_{};
|
|
};
|
|
|
|
class basic_schema {
|
|
public:
|
|
using schema_node_map = std::unordered_map<std::type_index, schema_node>;
|
|
using iterator = std::unordered_map<std::type_index, schema_node>::iterator;
|
|
using const_iterator = std::unordered_map<std::type_index, schema_node>::const_iterator;
|
|
|
|
basic_schema();
|
|
explicit basic_schema(const std::string &name);
|
|
|
|
iterator begin();
|
|
iterator end();
|
|
[[nodiscard]] const_iterator begin() const;
|
|
[[nodiscard]] const_iterator end() const;
|
|
|
|
[[nodiscard]] size_t size() const;
|
|
[[nodiscard]] bool empty() const;
|
|
|
|
iterator find(const std::type_index& ti);
|
|
iterator find(const std::string& name);
|
|
|
|
[[nodiscard]] const_iterator find(const std::type_index& ti) const;
|
|
[[nodiscard]] const_iterator find(const std::string& name) const;
|
|
|
|
[[nodiscard]] bool contains(const std::type_index &index) const;
|
|
|
|
void initialize_executor(sql::executor &exec) const;
|
|
|
|
protected:
|
|
template<typename Type>
|
|
friend class schema_observer;
|
|
friend class producer_creator;
|
|
|
|
object::repository repo_;
|
|
std::unordered_map<std::type_index, schema_node> schema_nodes_;
|
|
std::unordered_map<std::type_index, std::unique_ptr<sql::object_resolver_producer>> resolver_producers_;
|
|
std::unordered_map<object::collection_composite_key, std::unique_ptr<sql::collection_resolver_producer>, object::collection_composite_key_hash> collection_resolver_producers_;
|
|
};
|
|
}
|
|
#endif //MATADOR_BASIC_SCHEMA_HPP
|