Skip to content

Commit fb6bd80

Browse files
authored
Merge pull request #1996 from joto/single-query-dependencies
Middle: Get dependencies with single queries
2 parents e9c075a + 36b4fb8 commit fb6bd80

File tree

9 files changed

+330
-114
lines changed

9 files changed

+330
-114
lines changed

src/dependency-manager.cpp

Lines changed: 71 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,89 @@
1515

1616
void full_dependency_manager_t::node_changed(osmid_t id)
1717
{
18-
for (auto const way_id : m_object_store->get_ways_by_node(id)) {
19-
way_changed(way_id);
20-
m_ways_pending_tracker.set(way_id);
18+
m_changed_nodes.set(id);
19+
}
20+
21+
void full_dependency_manager_t::way_changed(osmid_t id)
22+
{
23+
m_changed_ways.set(id);
24+
}
25+
26+
void full_dependency_manager_t::relation_changed(osmid_t id)
27+
{
28+
m_changed_relations.set(id);
29+
}
30+
31+
void full_dependency_manager_t::after_nodes()
32+
{
33+
if (m_changed_nodes.empty()) {
34+
return;
2135
}
2236

23-
for (auto const rel_id : m_object_store->get_rels_by_node(id)) {
24-
m_rels_pending_tracker.set(rel_id);
37+
m_object_store->get_node_parents(m_changed_nodes, &m_ways_pending_tracker,
38+
&m_rels_pending_tracker);
39+
m_changed_nodes.clear();
40+
}
41+
42+
static osmium::index::IdSetSmall<osmid_t>
43+
set_diff(osmium::index::IdSetSmall<osmid_t> const &set,
44+
osmium::index::IdSetSmall<osmid_t> const &to_be_removed)
45+
{
46+
osmium::index::IdSetSmall<osmid_t> new_set;
47+
48+
for (auto const id : set) {
49+
if (!to_be_removed.get_binary_search(id)) {
50+
new_set.set(id);
51+
}
2552
}
53+
54+
return new_set;
2655
}
2756

28-
void full_dependency_manager_t::way_changed(osmid_t id)
57+
void full_dependency_manager_t::after_ways()
2958
{
30-
if (m_ways_pending_tracker.get(id)) {
59+
if (!m_changed_ways.empty()) {
60+
if (!m_ways_pending_tracker.empty()) {
61+
// Remove ids from changed ways in the input data from
62+
// m_ways_pending_tracker, because they have already been processed.
63+
m_ways_pending_tracker =
64+
set_diff(m_ways_pending_tracker, m_changed_ways);
65+
66+
// Add the list of pending way ids to the list of changed ways,
67+
// because we need the parents for them, too.
68+
m_changed_ways.merge_sorted(m_ways_pending_tracker);
69+
}
70+
71+
m_object_store->get_way_parents(m_changed_ways,
72+
&m_rels_pending_tracker);
73+
74+
m_changed_ways.clear();
3175
return;
3276
}
3377

34-
for (auto const rel_id : m_object_store->get_rels_by_way(id)) {
35-
m_rels_pending_tracker.set(rel_id);
78+
if (!m_ways_pending_tracker.empty()) {
79+
m_object_store->get_way_parents(m_ways_pending_tracker,
80+
&m_rels_pending_tracker);
3681
}
3782
}
3883

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+
94+
void full_dependency_manager_t::mark_parent_relations_as_pending(
95+
osmium::index::IdSetSmall<osmid_t> const &way_ids)
96+
{
97+
assert(m_rels_pending_tracker.empty());
98+
m_object_store->get_way_parents(way_ids, &m_rels_pending_tracker);
99+
}
100+
39101
bool full_dependency_manager_t::has_pending() const noexcept
40102
{
41103
return !m_ways_pending_tracker.empty() || !m_rels_pending_tracker.empty();

src/dependency-manager.hpp

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

55+
virtual void relation_changed(osmid_t) {}
56+
57+
virtual void after_nodes() {}
58+
virtual void after_ways() {}
59+
virtual void after_relations() {}
60+
61+
virtual void mark_parent_relations_as_pending(
62+
osmium::index::IdSetSmall<osmid_t> const & /*way_ids*/)
63+
{
64+
}
65+
5566
/// Are there pending objects that need to be processed?
5667
virtual bool has_pending() const noexcept { return false; }
5768

@@ -94,6 +105,14 @@ class full_dependency_manager_t : public dependency_manager_t
94105

95106
void node_changed(osmid_t id) override;
96107
void way_changed(osmid_t id) override;
108+
void relation_changed(osmid_t id) override;
109+
110+
void after_nodes() override;
111+
void after_ways() override;
112+
void after_relations() override;
113+
114+
void mark_parent_relations_as_pending(
115+
osmium::index::IdSetSmall<osmid_t> const &ids) override;
97116

98117
bool has_pending() const noexcept override;
99118

@@ -112,6 +131,32 @@ class full_dependency_manager_t : public dependency_manager_t
112131

113132
std::shared_ptr<middle_t> m_object_store;
114133

134+
/**
135+
* In append mode all new and changed nodes will be added to this. After
136+
* all nodes are read this is used to figure out which parent ways and
137+
* relations reference these nodes. Deleted nodes are not stored in here,
138+
* because all ways and relations that referenced deleted nodes must be in
139+
* the change file, too, and so we don't have to find out which ones they
140+
* are.
141+
*/
142+
osmium::index::IdSetSmall<osmid_t> m_changed_nodes;
143+
144+
/**
145+
* In append mode all new and changed ways will be added to this. After
146+
* all ways are read this is used to figure out which parent relations
147+
* reference these ways. Deleted ways are not stored in here, because all
148+
* relations that referenced deleted ways must be in the change file, too,
149+
* and so we don't have to find out which ones they are.
150+
*/
151+
osmium::index::IdSetSmall<osmid_t> m_changed_ways;
152+
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+
115160
osmium::index::IdSetSmall<osmid_t> m_ways_pending_tracker;
116161
osmium::index::IdSetSmall<osmid_t> m_rels_pending_tracker;
117162
};

0 commit comments

Comments
 (0)