-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathdatabase_config.h
126 lines (100 loc) · 3.65 KB
/
database_config.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#pragma once
#include <filesystem>
#include <functional>
#include <optional>
#include <string>
#include <string_view>
#include <vector>
#include <fmt/format.h>
#include <yaml-cpp/yaml.h>
namespace silo::config {
enum class ValueType { STRING, DATE, BOOL, INT, FLOAT };
enum class ColumnType { STRING, INDEXED_STRING, DATE, BOOL, INT, FLOAT };
ValueType toDatabaseValueType(std::string_view type);
class DatabaseMetadata {
public:
std::string name;
ValueType type;
bool generate_index;
bool generate_lineage_index;
[[nodiscard]] ColumnType getColumnType() const;
};
class DatabaseSchema {
public:
std::string instance_name;
std::vector<DatabaseMetadata> metadata;
std::string primary_key;
std::optional<std::string> date_to_sort_by;
std::optional<std::string> partition_by;
};
class DatabaseConfig {
friend struct YAML::as_if<DatabaseConfig, void>;
DatabaseConfig() = default;
public:
DatabaseConfig(const DatabaseConfig&) = default;
DatabaseConfig(DatabaseConfig&&) = default;
DatabaseConfig& operator=(const DatabaseConfig&) = default;
DatabaseConfig& operator=(DatabaseConfig&&) = default;
std::optional<std::string> default_nucleotide_sequence;
std::optional<std::string> default_amino_acid_sequence;
DatabaseSchema schema;
[[nodiscard]] std::optional<DatabaseMetadata> getMetadata(const std::string& name) const;
void writeConfig(const std::filesystem::path& config_path) const;
static DatabaseConfig getValidatedConfig(const std::string& config_yaml);
static DatabaseConfig getValidatedConfigFromFile(const std::filesystem::path& config_path);
static void validateConfig(const DatabaseConfig& config);
};
} // namespace silo::config
namespace YAML {
template <>
struct convert<silo::config::DatabaseConfig> {
static bool decode(const Node& node, silo::config::DatabaseConfig& config);
static Node encode(const silo::config::DatabaseConfig& config);
};
template <>
struct convert<silo::config::DatabaseSchema> {
static bool decode(const Node& node, silo::config::DatabaseSchema& schema);
static Node encode(const silo::config::DatabaseSchema& schema);
};
template <>
struct convert<silo::config::DatabaseMetadata> {
static bool decode(const Node& node, silo::config::DatabaseMetadata& metadata);
static Node encode(const silo::config::DatabaseMetadata& metadata);
};
} // namespace YAML
template <>
class [[maybe_unused]] fmt::formatter<silo::config::DatabaseConfig> : fmt::formatter<std::string> {
public:
constexpr auto parse(format_parse_context& ctx) { return ctx.begin(); }
[[maybe_unused]] static auto format(
const silo::config::DatabaseConfig& database_config,
fmt::format_context& ctx
) -> decltype(ctx.out());
};
template <>
class [[maybe_unused]] fmt::formatter<silo::config::DatabaseSchema> {
public:
constexpr auto parse(format_parse_context& ctx) { return ctx.begin(); }
[[maybe_unused]] static auto format(
const silo::config::DatabaseSchema& database_schema,
fmt::format_context& ctx
) -> decltype(ctx.out());
};
template <>
class [[maybe_unused]] fmt::formatter<silo::config::DatabaseMetadata> {
public:
constexpr auto parse(format_parse_context& ctx) { return ctx.begin(); }
[[maybe_unused]] static auto format(
const silo::config::DatabaseMetadata& database_metadata,
format_context& ctx
) -> decltype(ctx.out());
};
template <>
class [[maybe_unused]] fmt::formatter<silo::config::ValueType> {
public:
constexpr auto parse(format_parse_context& ctx) { return ctx.begin(); }
[[maybe_unused]] static auto format(
const silo::config::ValueType& value_type,
format_context& ctx
) -> decltype(ctx.out());
};