Skip to content

Commit 36b4fb8

Browse files
committed
Make sure not to process relations twice in append mode
In append mode relations could be processed twice if they are in the input and also the parent of a node or way in the input. With this change we are removing all ids of changed relations from the list of pending relations before processing them. Fixes #423.
1 parent fa8336d commit 36b4fb8

File tree

3 files changed

+35
-1
lines changed

3 files changed

+35
-1
lines changed

src/dependency-manager.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ void full_dependency_manager_t::way_changed(osmid_t id)
2323
m_changed_ways.set(id);
2424
}
2525

26+
void full_dependency_manager_t::relation_changed(osmid_t id)
27+
{
28+
m_changed_relations.set(id);
29+
}
30+
2631
void full_dependency_manager_t::after_nodes()
2732
{
2833
if (m_changed_nodes.empty()) {
@@ -76,6 +81,16 @@ void full_dependency_manager_t::after_ways()
7681
}
7782
}
7883

84+
void full_dependency_manager_t::after_relations()
85+
{
86+
// Remove ids from changed relations in the input data from
87+
// m_rels_pending_tracker, because they have already been processed.
88+
m_rels_pending_tracker =
89+
set_diff(m_rels_pending_tracker, m_changed_relations);
90+
91+
m_changed_relations.clear();
92+
}
93+
7994
void full_dependency_manager_t::mark_parent_relations_as_pending(
8095
osmium::index::IdSetSmall<osmid_t> const &way_ids)
8196
{

src/dependency-manager.hpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,11 @@ class dependency_manager_t
5252
*/
5353
virtual void way_changed(osmid_t) {}
5454

55+
virtual void relation_changed(osmid_t) {}
56+
5557
virtual void after_nodes() {}
5658
virtual void after_ways() {}
59+
virtual void after_relations() {}
5760

5861
virtual void mark_parent_relations_as_pending(
5962
osmium::index::IdSetSmall<osmid_t> const & /*way_ids*/)
@@ -102,9 +105,11 @@ class full_dependency_manager_t : public dependency_manager_t
102105

103106
void node_changed(osmid_t id) override;
104107
void way_changed(osmid_t id) override;
108+
void relation_changed(osmid_t id) override;
105109

106110
void after_nodes() override;
107111
void after_ways() override;
112+
void after_relations() override;
108113

109114
void mark_parent_relations_as_pending(
110115
osmium::index::IdSetSmall<osmid_t> const &ids) override;
@@ -145,6 +150,13 @@ class full_dependency_manager_t : public dependency_manager_t
145150
*/
146151
osmium::index::IdSetSmall<osmid_t> m_changed_ways;
147152

153+
/**
154+
* In append mode all new and changed relations will be added to this.
155+
* This is then used to remove already processed relations from the
156+
* pending list.
157+
*/
158+
osmium::index::IdSetSmall<osmid_t> m_changed_relations;
159+
148160
osmium::index::IdSetSmall<osmid_t> m_ways_pending_tracker;
149161
osmium::index::IdSetSmall<osmid_t> m_rels_pending_tracker;
150162
};

src/osmdata.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,12 +141,19 @@ void osmdata_t::relation(osmium::Relation const &rel)
141141
} else {
142142
m_output->relation_delete(rel.id());
143143
}
144+
m_dependency_manager->relation_changed(rel.id());
144145
} else if (has_tags_or_attrs) {
145146
m_output->relation_add(rel);
146147
}
147148
}
148149

149-
void osmdata_t::after_relations() { m_mid->after_relations(); }
150+
void osmdata_t::after_relations()
151+
{
152+
m_mid->after_relations();
153+
if (m_append) {
154+
m_dependency_manager->after_relations();
155+
}
156+
}
150157

151158
void osmdata_t::start() const
152159
{

0 commit comments

Comments
 (0)