Skip to content

Commit 4858961

Browse files
authored
Merge pull request #1468 from joto/refactor-members-get
Remove role list parameter from rel_way_members_get()
2 parents db36f4c + 09c68ce commit 4858961

File tree

9 files changed

+41
-21
lines changed

9 files changed

+41
-21
lines changed

src/middle-pgsql.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,6 @@ bool middle_query_pgsql_t::way_get(osmid_t id,
428428

429429
size_t
430430
middle_query_pgsql_t::rel_way_members_get(osmium::Relation const &rel,
431-
rolelist_t *roles,
432431
osmium::memory::Buffer *buffer) const
433432
{
434433
assert(buffer);
@@ -466,9 +465,6 @@ middle_query_pgsql_t::rel_way_members_get(osmium::Relation const &rel,
466465
}
467466

468467
buffer->commit();
469-
if (roles) {
470-
roles->emplace_back(m.role());
471-
}
472468
++outres;
473469
break;
474470
}

src/middle-pgsql.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class middle_query_pgsql_t : public middle_query_t
4141

4242
bool way_get(osmid_t id, osmium::memory::Buffer *buffer) const override;
4343

44-
size_t rel_way_members_get(osmium::Relation const &rel, rolelist_t *roles,
44+
size_t rel_way_members_get(osmium::Relation const &rel,
4545
osmium::memory::Buffer *buffer) const override;
4646

4747
bool relation_get(osmid_t id,

src/middle-ram.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,6 @@ get_delta_encoded_way_nodes_list(std::string const &data, std::size_t offset,
236236

237237
std::size_t
238238
middle_ram_t::rel_way_members_get(osmium::Relation const &rel,
239-
rolelist_t *roles,
240239
osmium::memory::Buffer *buffer) const
241240
{
242241
assert(buffer);
@@ -263,9 +262,6 @@ middle_ram_t::rel_way_members_get(osmium::Relation const &rel,
263262
if (offset != ordered_index_t::not_found_value()) {
264263
buffer->add_item(m_object_buffer.get<osmium::Way>(offset));
265264
buffer->commit();
266-
if (roles) {
267-
roles->emplace_back(member.role());
268-
}
269265
++count;
270266
}
271267
} else if (m_store_options.way_nodes) {

src/middle-ram.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class middle_ram_t : public middle_t, public middle_query_t
5959
bool way_get(osmid_t id, osmium::memory::Buffer *buffer) const override;
6060

6161
std::size_t
62-
rel_way_members_get(osmium::Relation const &rel, rolelist_t *roles,
62+
rel_way_members_get(osmium::Relation const &rel,
6363
osmium::memory::Buffer *buffer) const override;
6464

6565
bool relation_get(osmid_t id,

src/middle.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,10 @@ struct middle_query_t : std::enable_shared_from_this<middle_query_t>
5252
* the given osmium buffer.
5353
*
5454
* \param rel Relation to get the members for.
55-
* \param[out] roles Roles for the ways that where retrived.
5655
* \param[out] buffer Buffer where to store the members in.
5756
*/
5857
virtual size_t
59-
rel_way_members_get(osmium::Relation const &rel, rolelist_t *roles,
58+
rel_way_members_get(osmium::Relation const &rel,
6059
osmium::memory::Buffer *buffer) const = 0;
6160

6261
/**

src/output-flex.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,8 +1004,7 @@ output_flex_t::run_transform(geom::osmium_builder_t *builder,
10041004
osmium::Relation const &relation)
10051005
{
10061006
m_buffer.clear();
1007-
auto const num_ways =
1008-
m_mid->rel_way_members_get(relation, nullptr, &m_buffer);
1007+
auto const num_ways = m_mid->rel_way_members_get(relation, &m_buffer);
10091008

10101009
if (num_ways == 0) {
10111010
return {};

src/output-gazetteer.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,7 @@ bool output_gazetteer_t::process_relation(osmium::Relation const &rel)
190190

191191
/* get the boundary path (ways) */
192192
m_osmium_buffer.clear();
193-
auto const num_ways =
194-
m_mid->rel_way_members_get(rel, nullptr, &m_osmium_buffer);
193+
auto const num_ways = m_mid->rel_way_members_get(rel, &m_osmium_buffer);
195194

196195
if (num_ways == 0) {
197196
return false;

src/output-pgsql.cpp

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,35 @@ void output_pgsql_t::way_add(osmium::Way *way)
165165
}
166166
}
167167

168+
// The roles of all available member ways of a relation are available in the
169+
// Lua "filter_tags_relation_member" callback function. This function extracts
170+
// the roles from all ways in the buffer and returns the list.
171+
static rolelist_t get_rolelist(osmium::Relation const &rel,
172+
osmium::memory::Buffer const &buffer)
173+
{
174+
rolelist_t roles;
175+
176+
auto it = buffer.select<osmium::Way>().cbegin();
177+
auto const end = buffer.select<osmium::Way>().cend();
178+
179+
if (it == end) {
180+
return roles;
181+
}
182+
183+
for (auto const &member : rel.members()) {
184+
if (member.type() == osmium::item_type::way &&
185+
member.ref() == it->id()) {
186+
roles.emplace_back(member.role());
187+
++it;
188+
if (it == end) {
189+
break;
190+
}
191+
}
192+
}
193+
194+
return roles;
195+
}
196+
168197
/* This is the workhorse of pgsql_add_relation, split out because it is used as the callback for iterate relations */
169198
void output_pgsql_t::pgsql_process_relation(osmium::Relation const &rel)
170199
{
@@ -174,8 +203,7 @@ void output_pgsql_t::pgsql_process_relation(osmium::Relation const &rel)
174203
}
175204

176205
buffer.clear();
177-
rolelist_t xrole;
178-
auto num_ways = m_mid->rel_way_members_get(rel, &xrole, &buffer);
206+
auto const num_ways = m_mid->rel_way_members_get(rel, &buffer);
179207

180208
if (num_ways == 0) {
181209
return;
@@ -186,6 +214,11 @@ void output_pgsql_t::pgsql_process_relation(osmium::Relation const &rel)
186214
bool make_boundary = false;
187215
taglist_t outtags;
188216

217+
rolelist_t xrole;
218+
if (!m_options.tag_transform_script.empty()) {
219+
xrole = get_rolelist(rel, buffer);
220+
}
221+
189222
// If it's a route relation make_boundary and make_polygon will be false
190223
// otherwise one or the other will be true.
191224
if (m_tagtransform->filter_rel_member_tags(prefiltered_tags, buffer, xrole,

tests/test-middle.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,9 +235,7 @@ TEMPLATE_TEST_CASE("middle import", "", options_slim_default,
235235
CHECK(orig_crc().checksum() == crc().checksum());
236236

237237
// retrive the supporting ways
238-
rolelist_t roles;
239-
REQUIRE(mid_q->rel_way_members_get(rel, &roles, &outbuf) == 3);
240-
REQUIRE(roles.size() == 3);
238+
REQUIRE(mid_q->rel_way_members_get(rel, &outbuf) == 3);
241239

242240
for (auto &w : outbuf.select<osmium::Way>()) {
243241
REQUIRE(w.id() >= 10);

0 commit comments

Comments
 (0)