Skip to content

Commit 06e44fa

Browse files
authored
Merge pull request #1371 from joto/refactor-middle
Refactor middle
2 parents e1e538d + ce26cc1 commit 06e44fa

18 files changed

+435
-416
lines changed

src/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ set(osm2pgsql_lib_SOURCES
88
geometry-processor.cpp
99
input.cpp
1010
logging.cpp
11+
middle.cpp
1112
middle-pgsql.cpp
1213
middle-ram.cpp
1314
node-persistent-cache.cpp

src/flex-table.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ void table_connection_t::stop(bool updateable, bool append)
256256
}
257257

258258
log_info("Analyzing table '{}'...", table().name());
259-
m_db_connection->exec("ANALYZE " + table().full_name());
259+
analyze_table(*m_db_connection, table().schema(), table().name());
260260

261261
log_info("All postprocessing on table '{}' done in {}.", table().name(),
262262
util::human_readable_duration(timer.stop()));

src/input.cpp

Lines changed: 55 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -204,24 +204,59 @@ prepare_input_files(std::vector<std::string> const &input_files,
204204
return files;
205205
}
206206

207-
static void apply(osmium::OSMObject &object, osmdata_t &osmdata,
208-
progress_display_t &progress)
207+
class input_context_t
209208
{
210-
static osmium::item_type last_type = osmium::item_type::node;
211-
212-
if (last_type != object.type()) {
213-
if (last_type == osmium::item_type::node) {
214-
osmdata.after_nodes();
215-
progress.start_way_counter();
216-
} else if (last_type == osmium::item_type::way) {
217-
osmdata.after_ways();
218-
progress.start_relation_counter();
209+
public:
210+
input_context_t(osmdata_t &osmdata, progress_display_t &progress,
211+
bool append)
212+
: m_osmdata(osmdata), m_progress(progress), m_append(append)
213+
{}
214+
215+
void apply(osmium::OSMObject &object)
216+
{
217+
if (!m_append && object.deleted()) {
218+
throw std::runtime_error{"Input file contains deleted objects but "
219+
"you are not in append mode."};
219220
}
220-
last_type = object.type();
221+
222+
if (m_last_type != object.type()) {
223+
if (m_last_type == osmium::item_type::node) {
224+
m_osmdata.after_nodes();
225+
m_progress.start_way_counter();
226+
}
227+
if (object.type() == osmium::item_type::relation) {
228+
m_osmdata.after_ways();
229+
m_progress.start_relation_counter();
230+
}
231+
m_last_type = object.type();
232+
}
233+
234+
osmium::apply_item(object, m_osmdata, m_progress);
221235
}
222236

223-
osmium::apply_item(object, osmdata, progress);
224-
}
237+
void eof()
238+
{
239+
switch (m_last_type) {
240+
case osmium::item_type::node:
241+
m_osmdata.after_nodes();
242+
// fallthrough
243+
case osmium::item_type::way:
244+
m_osmdata.after_ways();
245+
break;
246+
default:
247+
break;
248+
}
249+
250+
m_osmdata.after_relations();
251+
m_progress.print_summary();
252+
}
253+
254+
private:
255+
osmdata_t &m_osmdata;
256+
progress_display_t &m_progress;
257+
osmium::item_type m_last_type = osmium::item_type::node;
258+
bool m_append;
259+
}; // class input_context_t
225260

226261
static void process_single_file(osmium::io::File const &file,
227262
osmdata_t &osmdata,
@@ -230,17 +265,14 @@ static void process_single_file(osmium::io::File const &file,
230265
osmium::io::Reader reader{file};
231266
type_id_version last{osmium::item_type::node, 0, 0};
232267

268+
input_context_t ctx{osmdata, progress, append};
233269
while (osmium::memory::Buffer buffer = reader.read()) {
234270
for (auto &object : buffer.select<osmium::OSMObject>()) {
235271
last = check_input(last, object);
236-
if (!append && object.deleted()) {
237-
throw std::runtime_error{
238-
"Input file contains deleted objects but "
239-
"you are not in append mode."};
240-
}
241-
apply(object, osmdata, progress);
272+
ctx.apply(object);
242273
}
243274
}
275+
ctx.eof();
244276

245277
reader.close();
246278
}
@@ -262,23 +294,20 @@ static void process_multiple_files(std::vector<osmium::io::File> const &files,
262294
}
263295
}
264296

297+
input_context_t ctx{osmdata, progress, append};
265298
while (!queue.empty()) {
266299
auto element = queue.top();
267300
queue.pop();
268301
if (queue.empty() || element != queue.top()) {
269-
if (!append && element.object().deleted()) {
270-
throw std::runtime_error{
271-
"Input file contains deleted objects but "
272-
"you are not in append mode."};
273-
}
274-
apply(element.object(), osmdata, progress);
302+
ctx.apply(element.object());
275303
}
276304

277305
auto *source = element.data_source();
278306
if (source->next()) {
279307
queue.emplace(source->get(), source);
280308
}
281309
}
310+
ctx.eof();
282311

283312
for (auto &data_source : data_sources) {
284313
data_source.close();
@@ -295,7 +324,4 @@ void process_files(std::vector<osmium::io::File> const &files,
295324
} else {
296325
process_multiple_files(files, osmdata, progress, append);
297326
}
298-
299-
osmdata.after_relations();
300-
progress.print_summary();
301327
}

src/middle-pgsql.cpp

Lines changed: 57 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "node-ram-cache.hpp"
2727
#include "options.hpp"
2828
#include "osmtypes.hpp"
29+
#include "pgsql-helper.hpp"
2930
#include "util.hpp"
3031

3132
/**
@@ -314,6 +315,40 @@ std::size_t middle_query_pgsql_t::get_way_node_locations_db(
314315
return count;
315316
}
316317

318+
void middle_pgsql_t::node(osmium::Node const &node)
319+
{
320+
if (node.deleted()) {
321+
node_delete(node.id());
322+
} else {
323+
if (m_options->append) {
324+
node_delete(node.id());
325+
}
326+
node_set(node);
327+
}
328+
}
329+
330+
void middle_pgsql_t::way(osmium::Way const &way) {
331+
if (way.deleted()) {
332+
way_delete(way.id());
333+
} else {
334+
if (m_options->append) {
335+
way_delete(way.id());
336+
}
337+
way_set(way);
338+
}
339+
}
340+
341+
void middle_pgsql_t::relation(osmium::Relation const &relation) {
342+
if (relation.deleted()) {
343+
relation_delete(relation.id());
344+
} else {
345+
if (m_options->append) {
346+
relation_delete(relation.id());
347+
}
348+
relation_set(relation);
349+
}
350+
}
351+
317352
void middle_pgsql_t::node_set(osmium::Node const &node)
318353
{
319354
m_cache->set(node.id(), node.location());
@@ -567,13 +602,32 @@ void middle_pgsql_t::relation_delete(osmid_t osm_id)
567602
m_db_copy.delete_object(osm_id);
568603
}
569604

570-
void middle_pgsql_t::analyze()
605+
void middle_pgsql_t::after_nodes()
571606
{
572-
for (auto const &table : m_tables) {
573-
m_db_connection.exec("ANALYZE {}"_format(table.name()));
607+
m_db_copy.sync();
608+
if (m_options->flat_node_file.empty()) {
609+
auto const &table = m_tables[NODE_TABLE];
610+
analyze_table(m_db_connection, table.schema(), table.name());
574611
}
575612
}
576613

614+
void middle_pgsql_t::after_ways()
615+
{
616+
m_db_copy.sync();
617+
auto const &table = m_tables[WAY_TABLE];
618+
analyze_table(m_db_connection, table.schema(), table.name());
619+
}
620+
621+
void middle_pgsql_t::after_relations()
622+
{
623+
m_db_copy.sync();
624+
auto const &table = m_tables[REL_TABLE];
625+
analyze_table(m_db_connection, table.schema(), table.name());
626+
627+
// release the copy thread and its database connection
628+
m_copy_thread->finish();
629+
}
630+
577631
middle_query_pgsql_t::middle_query_pgsql_t(
578632
std::string const &conninfo, std::shared_ptr<node_ram_cache> const &cache,
579633
std::shared_ptr<node_persistent_cache> const &persistent_cache)
@@ -611,15 +665,6 @@ void middle_pgsql_t::start()
611665
}
612666
}
613667

614-
void middle_pgsql_t::commit()
615-
{
616-
m_db_copy.sync();
617-
// release the copy thread and its query connection
618-
m_copy_thread->finish();
619-
}
620-
621-
void middle_pgsql_t::flush() { m_db_copy.sync(); }
622-
623668
void middle_pgsql_t::stop(thread_pool_t &pool)
624669
{
625670
m_cache.reset();

src/middle-pgsql.hpp

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -54,25 +54,20 @@ struct table_sql {
5454
char const *create_fw_dep_indexes = "";
5555
};
5656

57-
struct middle_pgsql_t : public slim_middle_t
57+
struct middle_pgsql_t : public middle_t
5858
{
5959
explicit middle_pgsql_t(options_t const *options);
6060

6161
void start() override;
6262
void stop(thread_pool_t &pool) override;
63-
void analyze() override;
64-
void commit() override;
6563

66-
void node_set(osmium::Node const &node) override;
67-
void node_delete(osmid_t id) override;
64+
void node(osmium::Node const &node) override;
65+
void way(osmium::Way const &way) override;
66+
void relation(osmium::Relation const &rel) override;
6867

69-
void way_set(osmium::Way const &way) override;
70-
void way_delete(osmid_t id) override;
71-
72-
void relation_set(osmium::Relation const &rel) override;
73-
void relation_delete(osmid_t id) override;
74-
75-
void flush() override;
68+
void after_nodes() override;
69+
void after_ways() override;
70+
void after_relations() override;
7671

7772
idlist_t get_ways_by_node(osmid_t osm_id) override;
7873
idlist_t get_rels_by_node(osmid_t osm_id) override;
@@ -122,6 +117,15 @@ struct middle_pgsql_t : public slim_middle_t
122117
NUM_TABLES
123118
};
124119

120+
void node_set(osmium::Node const &node);
121+
void node_delete(osmid_t id);
122+
123+
void way_set(osmium::Way const &way);
124+
void way_delete(osmid_t id);
125+
126+
void relation_set(osmium::Relation const &rel);
127+
void relation_delete(osmid_t id);
128+
125129
void buffer_store_tags(osmium::OSMObject const &obj, bool attrs);
126130

127131
idlist_t get_ids(const char* stmt, osmid_t osm_id);

src/middle-ram.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,21 @@
3030
*
3131
*/
3232

33-
void middle_ram_t::node_set(osmium::Node const &node)
33+
void middle_ram_t::node(osmium::Node const &node)
3434
{
35+
assert(node.visible());
3536
m_cache->set(node.id(), node.location());
3637
}
3738

38-
void middle_ram_t::way_set(osmium::Way const &way)
39+
void middle_ram_t::way(osmium::Way const &way)
3940
{
41+
assert(way.visible());
4042
m_ways.set(way.id(), new ramWay{way, m_extra_attributes});
4143
}
4244

43-
void middle_ram_t::relation_set(osmium::Relation const &rel)
45+
void middle_ram_t::relation(osmium::Relation const &rel)
4446
{
47+
assert(rel.visible());
4548
m_rels.set(rel.id(), new ramRel{rel, m_extra_attributes});
4649
}
4750

src/middle-ram.hpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -96,22 +96,19 @@ struct middle_ram_t : public middle_t, public middle_query_t
9696

9797
void start() override {}
9898
void stop(thread_pool_t &pool) override;
99-
void analyze() override {}
100-
void commit() override {}
10199

102-
void node_set(osmium::Node const &node) override;
100+
void node(osmium::Node const &node) override;
101+
void way(osmium::Way const &way) override;
102+
void relation(osmium::Relation const &rel) override;
103+
103104
size_t nodes_get_list(osmium::WayNodeList *nodes) const override;
104105

105-
void way_set(osmium::Way const &way) override;
106106
bool way_get(osmid_t id, osmium::memory::Buffer &buffer) const override;
107107
size_t rel_way_members_get(osmium::Relation const &rel, rolelist_t *roles,
108108
osmium::memory::Buffer &buffer) const override;
109109

110110
bool relation_get(osmid_t id,
111111
osmium::memory::Buffer &buffer) const override;
112-
void relation_set(osmium::Relation const &rel) override;
113-
114-
void flush() override {}
115112

116113
std::shared_ptr<middle_query_t> get_query_instance() override;
117114

src/middle.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
2+
#include "middle-pgsql.hpp"
3+
#include "middle-ram.hpp"
4+
#include "middle.hpp"
5+
#include "options.hpp"
6+
7+
std::shared_ptr<middle_t> create_middle(options_t const &options)
8+
{
9+
if (options.slim) {
10+
return std::make_shared<middle_pgsql_t>(&options);
11+
}
12+
13+
return std::make_shared<middle_ram_t>(&options);
14+
}
15+

0 commit comments

Comments
 (0)