Skip to content

Commit 3f8f2ac

Browse files
committed
fix: do not write out column metadata as yaml, which might mess up utf-8
1 parent a6dd168 commit 3f8f2ac

27 files changed

Lines changed: 520 additions & 27792 deletions

endToEndTests/test/lineageDefinition.test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ describe('The /lineageDefinition endpoint', () => {
77
let searchString = `A: \{\}
88
A.1:
99
parents:
10-
- A
10+
- A
1111
A.11:
1212
parents:
13-
- A`;
13+
- A`;
1414
await server
1515
.get('/lineageDefinition/pango_lineage')
1616
.expect(200)

src/silo/api/request_handler_factory.test.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@ namespace {
1515

1616
std::unique_ptr<SiloRequestHandlerFactory> createRequestHandlerWithInitializedDatabase() {
1717
auto handle = std::make_shared<silo::api::ActiveDatabase>();
18-
handle->setActiveDatabase(silo::Database{silo::schema::DatabaseSchema::fromYAML(YAML::Load(R"(
19-
default:
20-
primaryKey: primary_key
21-
columns:
22-
- name: primary_key
23-
type: string
24-
metadata:
25-
dictionary: []
26-
)"))});
18+
silo::schema::TableSchema table_schema;
19+
table_schema.primary_key = {"primary_key", silo::schema::ColumnType::STRING};
20+
table_schema.column_metadata.emplace(
21+
silo::schema::ColumnIdentifier{"primary_key", silo::schema::ColumnType::STRING},
22+
std::make_shared<silo::storage::column::StringColumnMetadata>("primary_key")
23+
);
24+
silo::schema::DatabaseSchema schema;
25+
schema.tables.emplace(silo::schema::TableName::getDefault(), table_schema);
26+
handle->setActiveDatabase(silo::Database(schema));
2727
auto request_handler = std::make_unique<SiloRequestHandlerFactory>(
2828
silo::config::RuntimeConfig::withDefaults(), handle
2929
);

src/silo/common/bidirectional_map.h

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -63,20 +63,10 @@ class BidirectionalMap {
6363
return identifier;
6464
}
6565

66-
static BidirectionalMap fromYAML(const YAML::Node& yaml_node) {
67-
BidirectionalMap result;
68-
for (const auto& value : yaml_node) {
69-
(void)result.getOrCreateId(value.as<V>());
70-
}
71-
return result;
72-
}
73-
74-
YAML::Node toYAML() const {
75-
YAML::Node yaml_node{YAML::NodeType::Sequence};
76-
for (const auto& value : id_to_value) {
77-
yaml_node.push_back(YAML::Node{value});
78-
}
79-
return yaml_node;
66+
template <class Archive>
67+
void serialize(Archive& archive, const uint32_t /* version */) {
68+
archive & id_to_value;
69+
archive & value_to_id;
8070
}
8171
};
8272

src/silo/common/data_version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class DataVersion {
1515
uint32_t value;
1616
};
1717

18-
static constexpr SerializationVersion CURRENT_SILO_SERIALIZATION_VERSION{8};
18+
static constexpr SerializationVersion CURRENT_SILO_SERIALIZATION_VERSION{9};
1919

2020
class Timestamp {
2121
public:

src/silo/common/lineage_tree.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,16 @@ class LineageTreeAndIdMap {
7070
BidirectionalMap<std::string>&& lineage_id_lookup_map,
7171
std::string&& file
7272
);
73+
74+
friend class boost::serialization::access;
75+
template <class Archive>
76+
[[maybe_unused]] void serialize(Archive& archive, const uint32_t /* version */) {
77+
// clang-format off
78+
archive & lineage_tree;
79+
archive & lineage_id_lookup_map;
80+
archive & file;
81+
// clang-format on
82+
}
7383
};
7484

7585
std::optional<std::vector<Idx>> containsCycle(

src/silo/database.cpp

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,15 @@
2222
#include "silo/common/data_version.h"
2323
#include "silo/common/file_to_string.h"
2424
#include "silo/common/format_number.h"
25+
#include "silo/common/lineage_tree.h"
2526
#include "silo/common/nucleotide_symbols.h"
2627
#include "silo/common/panic.h"
2728
#include "silo/common/silo_directory.h"
2829
#include "silo/common/version.h"
2930
#include "silo/database_info.h"
3031
#include "silo/persistence/exception.h"
3132
#include "silo/roaring/roaring_serialize.h"
32-
#include "silo/storage/column/sequence_column.h"
33-
#include "silo/storage/serialize_optional.h"
33+
#include "silo/schema/database_schema.h"
3434
#include "silo/storage/table_partition.h"
3535

3636
namespace silo {
@@ -69,6 +69,9 @@ DatabaseInfo Database::getDatabaseInfo() const {
6969
};
7070
}
7171

72+
const std::string DATABASE_SCHEMA_FILENAME = "database_schema.silo";
73+
const std::string DATA_VERSION_FILENAME = "data_version.silo";
74+
7275
void Database::saveDatabaseState(const std::filesystem::path& save_directory) {
7376
if (getDataVersionTimestamp().value.empty()) {
7477
throw persistence::SaveDatabaseException(
@@ -105,20 +108,15 @@ void Database::saveDatabaseState(const std::filesystem::path& save_directory) {
105108

106109
SPDLOG_INFO("Saving database schema");
107110

108-
auto yaml_string =
109-
YAML::Dump(schema::DatabaseSchema{{{schema::TableName::getDefault(), table->schema}}}.toYAML()
110-
);
111-
const auto database_schema_filename = versioned_save_directory / "database_schema.yaml";
112-
std::ofstream database_schema_file{database_schema_filename};
113-
database_schema_file << yaml_string;
114-
database_schema_file.close();
111+
const auto database_schema_path = versioned_save_directory / DATABASE_SCHEMA_FILENAME;
112+
schema.saveToFile(database_schema_path);
115113

116114
std::string table_name = schema.tables.begin()->first.getName();
117115
SPDLOG_DEBUG("Saving table data");
118116
std::filesystem::create_directory(versioned_save_directory / table_name);
119117
table->saveData(versioned_save_directory / table_name);
120118

121-
data_version_.saveToFile(versioned_save_directory / "data_version.silo");
119+
data_version_.saveToFile(versioned_save_directory / DATA_VERSION_FILENAME);
122120
}
123121

124122
namespace {
@@ -143,26 +141,19 @@ Database Database::loadDatabaseState(const silo::SiloDataSource& silo_data_sourc
143141
SPDLOG_INFO("Loading database from data source: {}", silo_data_source.toDebugString());
144142
const auto save_directory = silo_data_source.path;
145143

146-
const auto database_schema_filename = save_directory / "database_schema.yaml";
147-
auto yaml_string = common::fileToString(database_schema_filename);
148-
if (yaml_string == std::nullopt) {
149-
throw silo::persistence::LoadDatabaseException(
150-
fmt::format("Could not load DatabaseSchema from {}", database_schema_filename)
151-
);
152-
}
153-
YAML::Node yaml_schema = YAML::Load(yaml_string.value());
154-
schema::DatabaseSchema schema = schema::DatabaseSchema::fromYAML(yaml_schema);
144+
const auto database_schema_path = save_directory / DATABASE_SCHEMA_FILENAME;
145+
auto schema = schema::DatabaseSchema::loadFromFile(database_schema_path);
155146

156147
Database database{schema};
157148

158149
std::string table_name = schema.tables.begin()->first.getName();
159150
SPDLOG_DEBUG("Loading data for table ");
160151
database.table->loadData(save_directory / table_name);
161152

162-
database.data_version_ = loadDataVersion(save_directory / "data_version.silo");
153+
database.data_version_ = loadDataVersion(save_directory / DATA_VERSION_FILENAME);
163154

164155
SPDLOG_INFO(
165-
"Finished loading data_version from {}", (save_directory / "data_version.silo").string()
156+
"Finished loading data_version from {}", (save_directory / DATA_VERSION_FILENAME).string()
166157
);
167158
SPDLOG_INFO("Database info after loading: {}", database.getDatabaseInfo());
168159

0 commit comments

Comments
 (0)