Skip to content

Commit bee043b

Browse files
committed
move export_list into c transform
Avoid having to hand in the export list on every filter call.
1 parent b55f768 commit bee043b

11 files changed

+86
-77
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: 13 additions & 26 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);
@@ -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

@@ -514,26 +510,18 @@ output_pgsql_t::output_pgsql_t(std::shared_ptr<middle_query_t> const &mid,
514510
buffer(32768, osmium::memory::Buffer::auto_grow::yes),
515511
rels_buffer(1024, osmium::memory::Buffer::auto_grow::yes)
516512
{
517-
m_export_list.reset(new export_list());
513+
export_list exlist;
518514

519-
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);
520516

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

530519
//for each table
531520
for (int i = 0; i < t_MAX; i++) {
532521

533522
//figure out the columns this table needs
534-
columns_t columns = m_export_list->normal_columns((i == t_point)
535-
? osmium::item_type::node
536-
: osmium::item_type::way);
523+
columns_t columns = exlist.normal_columns(
524+
(i == t_point) ? osmium::item_type::node : osmium::item_type::way);
537525

538526
//figure out what name we are using for this and what type
539527
std::string name = m_options.prefix;
@@ -576,9 +564,8 @@ output_pgsql_t::output_pgsql_t(std::shared_ptr<middle_query_t> const &mid,
576564
output_pgsql_t::output_pgsql_t(output_pgsql_t const *other,
577565
std::shared_ptr<middle_query_t> const &mid)
578566
: output_t(mid, other->m_options),
579-
m_tagtransform(tagtransform_t::make_tagtransform(&m_options)),
567+
m_tagtransform(other->m_tagtransform->clone()),
580568
m_enable_way_area(other->m_enable_way_area),
581-
m_export_list(new export_list(*other->m_export_list)),
582569
m_builder(m_options.projection, other->m_options.enable_multi),
583570
expire(m_options.expire_tiles_zoom, m_options.expire_tiles_max_bbox,
584571
m_options.projection),

output-pgsql.hpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,6 @@ class output_pgsql_t : public output_t {
7373

7474
std::array<std::unique_ptr<table_t>, t_MAX> m_tables;
7575

76-
std::unique_ptr<export_list> m_export_list;
77-
7876
geom::osmium_builder_t m_builder;
7977
expire_tiles expire;
8078

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

tagtransform-lua.cpp

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,24 @@ extern "C" {
99
#include "tagtransform-lua.hpp"
1010

1111
lua_tagtransform_t::lua_tagtransform_t(options_t const *options)
12-
: L(luaL_newstate()), m_node_func(options->tag_transform_node_func.get_value_or(
13-
"filter_tags_node")),
12+
: m_node_func(
13+
options->tag_transform_node_func.get_value_or("filter_tags_node")),
1414
m_way_func(options->tag_transform_way_func.get_value_or("filter_tags_way")),
1515
m_rel_func(
1616
options->tag_transform_rel_func.get_value_or("filter_basic_tags_rel")),
1717
m_rel_mem_func(options->tag_transform_rel_mem_func.get_value_or(
1818
"filter_tags_relation_member")),
19+
m_lua_file(options->tag_transform_script.get()),
1920
m_extra_attributes(options->extra_attributes)
2021
{
22+
open_style();
23+
}
24+
25+
void lua_tagtransform_t::open_style()
26+
{
27+
L = luaL_newstate();
2128
luaL_openlibs(L);
22-
if (luaL_dofile(L, options->tag_transform_script->c_str())) {
29+
if (luaL_dofile(L, m_lua_file.c_str())) {
2330
throw std::runtime_error(
2431
(boost::format("Lua tag transform style error: %1%") %
2532
lua_tostring(L, -1))
@@ -34,6 +41,14 @@ lua_tagtransform_t::lua_tagtransform_t(options_t const *options)
3441

3542
lua_tagtransform_t::~lua_tagtransform_t() { lua_close(L); }
3643

44+
std::unique_ptr<tagtransform_t> lua_tagtransform_t::clone() const
45+
{
46+
auto c = std::unique_ptr<lua_tagtransform_t>(new lua_tagtransform_t(*this));
47+
c->open_style();
48+
49+
return std::unique_ptr<tagtransform_t>(c.release());
50+
}
51+
3752
void lua_tagtransform_t::check_lua_function_exists(const std::string &func_name)
3853
{
3954
lua_getglobal(L, func_name.c_str());
@@ -48,8 +63,7 @@ void lua_tagtransform_t::check_lua_function_exists(const std::string &func_name)
4863
}
4964

5065
bool lua_tagtransform_t::filter_tags(osmium::OSMObject const &o, int *polygon,
51-
int *roads, export_list const &,
52-
taglist_t &out_tags, bool)
66+
int *roads, taglist_t &out_tags, bool)
5367
{
5468
switch (o.type()) {
5569
case osmium::item_type::node:
@@ -141,7 +155,7 @@ bool lua_tagtransform_t::filter_tags(osmium::OSMObject const &o, int *polygon,
141155
bool lua_tagtransform_t::filter_rel_member_tags(
142156
taglist_t const &rel_tags, osmium::memory::Buffer const &members,
143157
rolelist_t const &member_roles, int *make_boundary, int *make_polygon,
144-
int *roads, export_list const &, taglist_t &out_tags, bool)
158+
int *roads, taglist_t &out_tags, bool)
145159
{
146160
size_t num_members = member_roles.size();
147161
lua_getglobal(L, m_rel_mem_func.c_str());

tagtransform-lua.hpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,27 +11,31 @@ extern "C" {
1111

1212
class lua_tagtransform_t : public tagtransform_t
1313
{
14+
lua_tagtransform_t(lua_tagtransform_t const &other) = default;
15+
1416
public:
1517
lua_tagtransform_t(options_t const *options);
1618
~lua_tagtransform_t();
1719

20+
std::unique_ptr<tagtransform_t> clone() const override;
21+
1822
bool filter_tags(osmium::OSMObject const &o, int *polygon, int *roads,
19-
export_list const &exlist, taglist_t &out_tags,
20-
bool strict = false) override;
23+
taglist_t &out_tags, bool strict = false) override;
2124

2225
bool filter_rel_member_tags(taglist_t const &rel_tags,
2326
osmium::memory::Buffer const &members,
2427
rolelist_t const &member_roles,
2528
int *make_boundary, int *make_polygon,
26-
int *roads, export_list const &exlist,
27-
taglist_t &out_tags,
29+
int *roads, taglist_t &out_tags,
2830
bool allow_typeless = false) override;
2931

3032
private:
33+
void open_style();
3134
void check_lua_function_exists(std::string const &func_name);
3235

3336
lua_State *L;
3437
std::string m_node_func, m_way_func, m_rel_func, m_rel_mem_func;
38+
std::string m_lua_file;
3539
bool m_extra_attributes;
3640
};
3741

0 commit comments

Comments
 (0)