-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathdatabase.test.cpp
More file actions
122 lines (96 loc) · 5.44 KB
/
Copy pathdatabase.test.cpp
File metadata and controls
122 lines (96 loc) · 5.44 KB
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
#include "silo/database.h"
#include <filesystem>
#include <fstream>
#include <map>
#include <gtest/gtest.h>
#include "config/source/yaml_file.h"
#include "silo/append/database_inserter.h"
#include "silo/append/ndjson_line_reader.h"
#include "silo/common/phylo_tree.h"
#include "silo/config/preprocessing_config.h"
#include "silo/database_info.h"
#include "silo/initialize/initializer.h"
#include "silo/storage/reference_genomes.h"
using silo::config::PreprocessingConfig;
namespace {
std::shared_ptr<silo::Database> buildTestDatabase() {
const std::filesystem::path input_directory{"./testBaseData/unitTestDummyDataset/"};
auto config = PreprocessingConfig::withDefaults();
config.overwriteFrom(
silo::config::YamlFile::readFile(input_directory / "preprocessing_config.yaml")
.verify(PreprocessingConfig::getConfigSpecification())
);
auto database_config = silo::config::DatabaseConfig::getValidatedConfigFromFile(
input_directory / "database_config.yaml"
);
const auto reference_genomes =
silo::ReferenceGenomes::readFromFile(config.initialization_files.getReferenceGenomeFilename()
);
std::map<std::filesystem::path, silo::common::LineageTreeAndIdMap> lineage_trees;
for (const auto& filename : config.initialization_files.getLineageDefinitionFilenames()) {
lineage_trees[filename] =
silo::common::LineageTreeAndIdMap::fromLineageDefinitionFilePath(filename);
}
silo::common::PhyloTree phylo_tree_file;
auto opt_path = config.initialization_files.getPhyloTreeFilename();
if (opt_path.has_value()) {
phylo_tree_file = silo::common::PhyloTree::fromFile(opt_path.value());
}
auto database = std::make_shared<silo::Database>(
silo::Database{silo::initialize::Initializer::createSchemaFromConfigFiles(
std::move(database_config),
reference_genomes,
lineage_trees,
phylo_tree_file,
/*without_unaligned_sequences=*/false
)}
);
std::ifstream input(input_directory / "input.ndjson");
auto input_data_stream = silo::append::NdjsonLineReader{input};
silo::append::appendDataToDatabase(*database, input_data_stream);
return database;
}
} // namespace
TEST(DatabaseTest, shouldSaveAndReloadDatabaseWithoutErrors) {
auto first_database = buildTestDatabase();
const std::filesystem::path directory = "testBaseData/siloSerializedState";
const silo::DataVersion::Timestamp data_version_timestamp =
first_database->getDataVersionTimestamp();
first_database->saveDatabaseState(directory);
silo::SiloDataSource data_source =
silo::SiloDataSource::checkValidDataSource(directory / data_version_timestamp.value);
auto database = silo::Database::loadDatabaseState(data_source);
const auto database_info = database.getDatabaseInfo();
EXPECT_EQ(database_info.sequence_count, 5);
EXPECT_GT(database_info.vertical_bitmaps_size, 0);
EXPECT_GT(database_info.horizontal_bitmaps_size, 0);
EXPECT_EQ(database_info.number_of_partitions, 1);
// If the serialization version changes, comment out the next line to build a new database for
// the next test. Then add the produced directory to Git and remove the old serialized state.
// Also bump CURRENT_SILO_SERIALIZATION_VERSION in src/silo/common/data_version.h
std::filesystem::remove_all(data_source.path);
}
// NOLINTNEXTLINE(readability-function-cognitive-complexity)
TEST(DatabaseTest, shouldReturnCorrectDatabaseInfoAfterAppendingNewSequences) {
// If this load fails, the serialization version likely needs to be increased
auto database = silo::Database::loadDatabaseState(
silo::SiloDirectory{"testBaseData/siloSerializedState"}.getMostRecentDataDirectory().value()
);
const auto database_info = database.getDatabaseInfo();
auto data_version = database.getDataVersionTimestamp();
EXPECT_EQ(database_info.sequence_count, 5);
EXPECT_GT(database_info.vertical_bitmaps_size, 0);
EXPECT_EQ(database_info.horizontal_bitmaps_size, 9);
std::string more_data =
R"(
{"primaryKey": "key6", "pango_lineage": "XBB", "date": "2021-03-19", "region": "Europe", "country": "Switzerland", "division": "Solothurn", "unsorted_date": "2021-02-10", "age": 54, "qc_value": 0.94, "test_boolean_column": true, "float_value": null, "main": {"sequence": "ACGTACGT", "insertions": []}, "testSecondSequence": {"sequence": "ACGT", "insertions": []}, "unaligned_main": "ACGTACGT", "unaligned_testSecondSequence": "ACGT", "E": {"sequence": "MYSF*", "insertions": ["214:EPE"]}, "M": {"sequence": "XXXX*", "insertions": []}}
{"primaryKey": "key7", "pango_lineage": "B", "date": "2021-03-21", "region": "Europe", "country": "Switzerland", "division": "Basel", "unsorted_date": null, "age": null, "qc_value": 0.94, "test_boolean_column": true, "float_value": null, "main": {"sequence": "AAAAAAAA", "insertions": []}, "testSecondSequence": {"sequence": "ACAT", "insertions": []}, "unaligned_main": "AAAAAAAA", "unaligned_testSecondSequence": "ACAT", "E": {"sequence": "MYSF*", "insertions": ["214:EPE"]}, "M": {"sequence": "XXXX*", "insertions": []}}
)";
std::stringstream more_data_stream{more_data};
silo::append::NdjsonLineReader reader(more_data_stream);
silo::append::appendDataToDatabase(database, reader);
const auto database_info_after_append = database.getDatabaseInfo();
auto data_version_after_append = database.getDataVersionTimestamp();
EXPECT_EQ(database_info_after_append.sequence_count, 7);
EXPECT_GT(data_version_after_append, data_version);
}