Skip to content

Commit ed0bf5b

Browse files
authored
Merge pull request #907 from lonvia/simplify-output-pgsql-members
Some cleanup for output-pgsql members
2 parents 42eae3c + bee043b commit ed0bf5b

11 files changed

+95
-88
lines changed

output-multi.cpp

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,20 @@
1313

1414
output_multi_t::output_multi_t(std::string const &name,
1515
std::shared_ptr<geometry_processor> processor_,
16-
export_list const &export_list_,
16+
export_list const &export_list,
1717
std::shared_ptr<middle_query_t> const &mid,
1818
options_t const &options)
1919
: output_t(mid, options),
20-
m_tagtransform(tagtransform_t::make_tagtransform(&m_options)),
21-
m_export_list(new export_list(export_list_)), m_processor(processor_),
22-
m_proj(m_options.projection),
20+
m_tagtransform(tagtransform_t::make_tagtransform(&m_options, export_list)),
21+
m_processor(processor_), m_proj(m_options.projection),
2322
// TODO: we could in fact have something that is interested in nodes and
2423
// ways..
2524
m_osm_type(m_processor->interests(geometry_processor::interest_node)
2625
? osmium::item_type::node
2726
: osmium::item_type::way),
2827
m_table(new table_t(
2928
m_options.database_options.conninfo(), name, m_processor->column_type(),
30-
m_export_list->normal_columns(m_osm_type), m_options.hstore_columns,
29+
export_list.normal_columns(m_osm_type), m_options.hstore_columns,
3130
m_processor->srid(), m_options.append, m_options.slim, m_options.droptemp,
3231
m_options.hstore_mode, m_options.enable_hstore_index,
3332
m_options.tblsmain_data, m_options.tblsmain_index)),
@@ -36,15 +35,14 @@ output_multi_t::output_multi_t(std::string const &name,
3635
m_options.projection),
3736
buffer(1024, osmium::memory::Buffer::auto_grow::yes),
3837
m_builder(m_options.projection, m_options.enable_multi),
39-
m_way_area(m_export_list->has_column(m_osm_type, "way_area"))
38+
m_way_area(export_list.has_column(m_osm_type, "way_area"))
4039
{
4140
}
4241

4342
output_multi_t::output_multi_t(output_multi_t const *other,
4443
std::shared_ptr<middle_query_t> const &mid)
4544
: output_t(mid, other->m_options),
46-
m_tagtransform(tagtransform_t::make_tagtransform(&m_options)),
47-
m_export_list(new export_list(*other->m_export_list)),
45+
m_tagtransform(other->m_tagtransform->clone()),
4846
m_processor(other->m_processor), m_proj(other->m_proj),
4947
m_osm_type(other->m_osm_type), m_table(new table_t(*other->m_table)),
5048
// NOTE: we need to know which ways were used by relations so each thread
@@ -284,8 +282,7 @@ int output_multi_t::process_node(osmium::Node const &node)
284282
{
285283
// check if we are keeping this node
286284
taglist_t outtags;
287-
auto filter = m_tagtransform->filter_tags(node, 0, 0, *m_export_list.get(),
288-
outtags, true);
285+
auto filter = m_tagtransform->filter_tags(node, 0, 0, outtags, true);
289286
if (!filter) {
290287
// grab its geom
291288
auto geom = m_processor->process_node(node.location(), &m_builder);
@@ -312,8 +309,8 @@ int output_multi_t::reprocess_way(osmium::Way *way, bool exists)
312309

313310
//check if we are keeping this way
314311
taglist_t outtags;
315-
unsigned int filter = m_tagtransform->filter_tags(
316-
*way, 0, 0, *m_export_list.get(), outtags, true);
312+
unsigned int filter =
313+
m_tagtransform->filter_tags(*way, 0, 0, outtags, true);
317314
if (!filter) {
318315
m_mid->nodes_get_list(&(way->nodes()));
319316
auto geom = m_processor->process_way(*way, &m_builder);
@@ -327,7 +324,7 @@ int output_multi_t::reprocess_way(osmium::Way *way, bool exists)
327324
int output_multi_t::process_way(osmium::Way *way) {
328325
//check if we are keeping this way
329326
taglist_t outtags;
330-
auto filter = m_tagtransform->filter_tags(*way, 0, 0, *m_export_list.get(), outtags, true);
327+
auto filter = m_tagtransform->filter_tags(*way, 0, 0, outtags, true);
331328
if (!filter) {
332329
//get the geom from the middle
333330
if (m_mid->nodes_get_list(&(way->nodes())) < 1)
@@ -358,8 +355,7 @@ int output_multi_t::process_relation(osmium::Relation const &rel, bool exists)
358355

359356
//does this relation have anything interesting to us
360357
taglist_t rel_outtags;
361-
auto filter = m_tagtransform->filter_tags(rel, 0, 0, *m_export_list.get(),
362-
rel_outtags, true);
358+
auto filter = m_tagtransform->filter_tags(rel, 0, 0, rel_outtags, true);
363359
if (!filter) {
364360
//TODO: move this into geometry processor, figure a way to come back for tag transform
365361
//grab ways/nodes of the members in the relation, bail if none were used
@@ -377,8 +373,7 @@ int output_multi_t::process_relation(osmium::Relation const &rel, bool exists)
377373
taglist_t outtags;
378374
filter = m_tagtransform->filter_rel_member_tags(
379375
rel_outtags, m_relation_helper.data, m_relation_helper.roles,
380-
&make_boundary, &make_polygon, &roads, *m_export_list.get(),
381-
outtags, true);
376+
&make_boundary, &make_polygon, &roads, outtags, true);
382377
if (!filter)
383378
{
384379
m_relation_helper.add_way_locations(m_mid.get());

output-multi.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class output_multi_t : public output_t
3131
public:
3232
output_multi_t(std::string const &name,
3333
std::shared_ptr<geometry_processor> processor_,
34-
export_list const &export_list_,
34+
export_list const &export_list,
3535
std::shared_ptr<middle_query_t> const &mid,
3636
options_t const &options);
3737
virtual ~output_multi_t();
@@ -78,7 +78,6 @@ class output_multi_t : public output_t
7878
taglist_t &tags);
7979

8080
std::unique_ptr<tagtransform_t> m_tagtransform;
81-
std::unique_ptr<export_list> m_export_list;
8281
std::shared_ptr<geometry_processor> m_processor;
8382
std::shared_ptr<reprojection> m_proj;
8483
osmium::item_type const m_osm_type;

output-pgsql.cpp

Lines changed: 20 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,7 @@ int output_pgsql_t::pending_way(osmid_t id, int exists) {
163163
int polygon;
164164
int roads;
165165
auto &way = buffer.get<osmium::Way>(0);
166-
if (!m_tagtransform->filter_tags(way, &polygon, &roads,
167-
*m_export_list.get(), outtags)) {
166+
if (!m_tagtransform->filter_tags(way, &polygon, &roads, outtags)) {
168167
auto nnodes = m_mid->nodes_get_list(&(way.nodes()));
169168
if (nnodes > 1) {
170169
pgsql_out_way(way, &outtags, polygon, roads);
@@ -243,7 +242,7 @@ void output_pgsql_t::stop(osmium::thread::Pool *pool)
243242
{
244243
// attempt to stop tables in parallel
245244
for (auto &t : m_tables) {
246-
pool->submit(std::bind(&table_t::stop, t));
245+
pool->submit(std::bind(&table_t::stop, t.get()));
247246
}
248247

249248
if (m_options.expire_tiles_zoom_min > 0) {
@@ -255,8 +254,7 @@ void output_pgsql_t::stop(osmium::thread::Pool *pool)
255254
int output_pgsql_t::node_add(osmium::Node const &node)
256255
{
257256
taglist_t outtags;
258-
if (m_tagtransform->filter_tags(node, nullptr, nullptr,
259-
*m_export_list.get(), outtags))
257+
if (m_tagtransform->filter_tags(node, nullptr, nullptr, outtags))
260258
return 1;
261259

262260
auto wkb = m_builder.get_wkb_node(node.location());
@@ -273,8 +271,7 @@ int output_pgsql_t::way_add(osmium::Way *way)
273271
taglist_t outtags;
274272

275273
/* Check whether the way is: (1) Exportable, (2) Maybe a polygon */
276-
auto filter = m_tagtransform->filter_tags(*way, &polygon, &roads,
277-
*m_export_list.get(), outtags);
274+
auto filter = m_tagtransform->filter_tags(*way, &polygon, &roads, outtags);
278275

279276
if (!filter) {
280277
/* Get actual node data and generate output */
@@ -291,8 +288,7 @@ int output_pgsql_t::way_add(osmium::Way *way)
291288
int output_pgsql_t::pgsql_process_relation(osmium::Relation const &rel)
292289
{
293290
taglist_t prefiltered_tags;
294-
if (m_tagtransform->filter_tags(rel, nullptr, nullptr, *m_export_list.get(),
295-
prefiltered_tags)) {
291+
if (m_tagtransform->filter_tags(rel, nullptr, nullptr, prefiltered_tags)) {
296292
return 1;
297293
}
298294

@@ -318,9 +314,9 @@ int output_pgsql_t::pgsql_process_relation(osmium::Relation const &rel)
318314

319315
// If it's a route relation make_boundary and make_polygon will be false
320316
// otherwise one or the other will be true.
321-
if (m_tagtransform->filter_rel_member_tags(
322-
prefiltered_tags, buffer, xrole, &make_boundary, &make_polygon,
323-
&roads, *m_export_list.get(), outtags)) {
317+
if (m_tagtransform->filter_rel_member_tags(prefiltered_tags, buffer, xrole,
318+
&make_boundary, &make_polygon,
319+
&roads, outtags)) {
324320
return 0;
325321
}
326322

@@ -492,10 +488,9 @@ int output_pgsql_t::relation_modify(osmium::Relation const &rel)
492488

493489
int output_pgsql_t::start()
494490
{
495-
for(std::vector<std::shared_ptr<table_t> >::iterator table = m_tables.begin(); table != m_tables.end(); ++table)
496-
{
491+
for (auto &t : m_tables) {
497492
//setup the table in postgres
498-
table->get()->start();
493+
t->start();
499494
}
500495

501496
return 0;
@@ -515,27 +510,18 @@ output_pgsql_t::output_pgsql_t(std::shared_ptr<middle_query_t> const &mid,
515510
buffer(32768, osmium::memory::Buffer::auto_grow::yes),
516511
rels_buffer(1024, osmium::memory::Buffer::auto_grow::yes)
517512
{
518-
m_export_list.reset(new export_list());
513+
export_list exlist;
519514

520-
m_enable_way_area = read_style_file( m_options.style, m_export_list.get() );
515+
m_enable_way_area = read_style_file(m_options.style, &exlist);
521516

522-
try {
523-
m_tagtransform = tagtransform_t::make_tagtransform(&m_options);
524-
}
525-
catch(const std::runtime_error& e) {
526-
fprintf(stderr, "%s\n", e.what());
527-
fprintf(stderr, "Error: Failed to initialise tag processing.\n");
528-
util::exit_nicely();
529-
}
517+
m_tagtransform = tagtransform_t::make_tagtransform(&m_options, exlist);
530518

531519
//for each table
532-
m_tables.reserve(t_MAX);
533520
for (int i = 0; i < t_MAX; i++) {
534521

535522
//figure out the columns this table needs
536-
columns_t columns = m_export_list->normal_columns((i == t_point)
537-
? osmium::item_type::node
538-
: osmium::item_type::way);
523+
columns_t columns = exlist.normal_columns(
524+
(i == t_point) ? osmium::item_type::node : osmium::item_type::way);
539525

540526
//figure out what name we are using for this and what type
541527
std::string name = m_options.prefix;
@@ -566,21 +552,20 @@ output_pgsql_t::output_pgsql_t(std::shared_ptr<middle_query_t> const &mid,
566552
//tremble in awe of this massive constructor! seriously we are trying to avoid passing an
567553
//options object because we want to make use of the table_t in output_mutli_t which could
568554
//have a different tablespace/hstores/etc per table
569-
m_tables.push_back(std::shared_ptr<table_t>(new table_t(
555+
m_tables[i].reset(new table_t(
570556
m_options.database_options.conninfo(), name, type, columns,
571557
m_options.hstore_columns, m_options.projection->target_srs(),
572558
m_options.append, m_options.slim, m_options.droptemp,
573559
m_options.hstore_mode, m_options.enable_hstore_index,
574-
m_options.tblsmain_data, m_options.tblsmain_index)));
560+
m_options.tblsmain_data, m_options.tblsmain_index));
575561
}
576562
}
577563

578564
output_pgsql_t::output_pgsql_t(output_pgsql_t const *other,
579565
std::shared_ptr<middle_query_t> const &mid)
580566
: output_t(mid, other->m_options),
581-
m_tagtransform(tagtransform_t::make_tagtransform(&m_options)),
567+
m_tagtransform(other->m_tagtransform->clone()),
582568
m_enable_way_area(other->m_enable_way_area),
583-
m_export_list(new export_list(*other->m_export_list)),
584569
m_builder(m_options.projection, other->m_options.enable_multi),
585570
expire(m_options.expire_tiles_zoom, m_options.expire_tiles_max_bbox,
586571
m_options.projection),
@@ -590,9 +575,9 @@ output_pgsql_t::output_pgsql_t(output_pgsql_t const *other,
590575
buffer(1024, osmium::memory::Buffer::auto_grow::yes),
591576
rels_buffer(1024, osmium::memory::Buffer::auto_grow::yes)
592577
{
593-
for (auto const &t : other->m_tables) {
578+
for (size_t i = 0; i < t_MAX; ++i) {
594579
//copy constructor will just connect to the already there table
595-
m_tables.push_back(std::shared_ptr<table_t>(new table_t(*t.get())));
580+
m_tables[i].reset(new table_t(*(other->m_tables[i].get())));
596581
}
597582
}
598583

output-pgsql.hpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
#include "table.hpp"
1414
#include "tagtransform.hpp"
1515

16-
#include <vector>
16+
#include <array>
1717
#include <memory>
1818

1919
class output_pgsql_t : public output_t {
@@ -71,9 +71,7 @@ class output_pgsql_t : public output_t {
7171
//enable output of a generated way_area tag to either hstore or its own column
7272
int m_enable_way_area;
7373

74-
std::vector<std::shared_ptr<table_t> > m_tables;
75-
76-
std::unique_ptr<export_list> m_export_list;
74+
std::array<std::unique_ptr<table_t>, t_MAX> m_tables;
7775

7876
geom::osmium_builder_t m_builder;
7977
expire_tiles expire;

tagtransform-c.cpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,18 @@ void add_z_order(taglist_t &tags, int *roads)
7979

8080
} // anonymous namespace
8181

82-
c_tagtransform_t::c_tagtransform_t(options_t const *options)
83-
: m_options(options)
82+
c_tagtransform_t::c_tagtransform_t(options_t const *options,
83+
export_list const &exlist)
84+
: m_options(options), m_export_list(exlist)
8485
{
8586
}
8687

88+
std::unique_ptr<tagtransform_t> c_tagtransform_t::clone() const
89+
{
90+
return std::unique_ptr<tagtransform_t>(
91+
new c_tagtransform_t(m_options, m_export_list));
92+
}
93+
8794
bool c_tagtransform_t::check_key(std::vector<taginfo> const &infos,
8895
char const *k, bool *filter, int *flags,
8996
bool strict)
@@ -134,8 +141,7 @@ bool c_tagtransform_t::check_key(std::vector<taginfo> const &infos,
134141
}
135142

136143
bool c_tagtransform_t::filter_tags(osmium::OSMObject const &o, int *polygon,
137-
int *roads, export_list const &exlist,
138-
taglist_t &out_tags, bool strict)
144+
int *roads, taglist_t &out_tags, bool strict)
139145
{
140146
//assume we dont like this set of tags
141147
bool filter = true;
@@ -147,7 +153,7 @@ bool c_tagtransform_t::filter_tags(osmium::OSMObject const &o, int *polygon,
147153
if (o.type() == osmium::item_type::relation) {
148154
export_type = osmium::item_type::way;
149155
}
150-
const std::vector<taginfo> &infos = exlist.get(export_type);
156+
const std::vector<taginfo> &infos = m_export_list.get(export_type);
151157

152158
/* We used to only go far enough to determine if it's a polygon or not,
153159
but now we go through and filter stuff we don't need
@@ -205,8 +211,8 @@ bool c_tagtransform_t::filter_tags(osmium::OSMObject const &o, int *polygon,
205211

206212
bool c_tagtransform_t::filter_rel_member_tags(
207213
taglist_t const &rel_tags, osmium::memory::Buffer const &,
208-
rolelist_t const &, int *make_boundary, int *make_polygon, int *roads,
209-
export_list const &, taglist_t &out_tags, bool allow_typeless)
214+
rolelist_t const &, int *make_boundary, int *make_polygon,
215+
int *roads, taglist_t &out_tags, bool allow_typeless)
210216
{
211217
//if it has a relation figure out what kind it is
212218
const std::string *type = rel_tags.get("type");

tagtransform-c.hpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,26 @@
77
class c_tagtransform_t : public tagtransform_t
88
{
99
public:
10-
c_tagtransform_t(options_t const *options);
10+
c_tagtransform_t(options_t const *options, export_list const &exlist);
11+
12+
std::unique_ptr<tagtransform_t> clone() const override;
1113

1214
bool filter_tags(osmium::OSMObject const &o, int *polygon, int *roads,
13-
export_list const &exlist, taglist_t &out_tags,
14-
bool strict = false) override;
15+
taglist_t &out_tags, bool strict = false) override;
1516

1617
bool filter_rel_member_tags(taglist_t const &rel_tags,
1718
osmium::memory::Buffer const &members,
1819
rolelist_t const &member_roles,
1920
int *make_boundary, int *make_polygon,
20-
int *roads, export_list const &exlist,
21-
taglist_t &out_tags,
21+
int *roads, taglist_t &out_tags,
2222
bool allow_typeless = false) override;
2323

2424
private:
2525
bool check_key(std::vector<taginfo> const &infos, char const *k,
2626
bool *filter, int *flags, bool strict);
2727

2828
options_t const *m_options;
29+
export_list m_export_list;
2930
};
3031

3132
#endif // TAGTRANSFORM_C_H

0 commit comments

Comments
 (0)