add callbacks for deletion to flex

This commit is contained in:
Sarah Hoffmann
2025-06-05 23:34:13 +02:00
parent 1ee13a96c7
commit 64c2ca9dec
8 changed files with 80 additions and 32 deletions

View File

@ -54,7 +54,7 @@ void osmdata_t::node(osmium::Node const &node)
m_mid->node(node);
if (node.deleted()) {
m_output->node_delete(node.id());
m_output->node_delete(node);
return;
}
@ -94,7 +94,7 @@ void osmdata_t::way(osmium::Way &way)
m_mid->way(way);
if (way.deleted()) {
m_output->way_delete(way.id());
m_output->way_delete(&way);
return;
}
@ -161,7 +161,7 @@ void osmdata_t::relation(osmium::Relation const &rel)
m_mid->relation(rel);
if (rel.deleted()) {
m_output->relation_delete(rel.id());
m_output->relation_delete(rel);
return;
}

View File

@ -1084,6 +1084,37 @@ void output_flex_t::delete_from_tables(osmium::item_type type, osmid_t osm_id)
}
}
void output_flex_t::node_delete(osmium::Node const &node)
{
if (m_delete_node) {
m_context_node = &node;
get_mutex_and_call_lua_function(m_delete_node, node);
m_context_node = nullptr;
}
node_delete(node.id());
}
void output_flex_t::way_delete(osmium::Way *way)
{
if (m_delete_way) {
m_way_cache.init(way);
get_mutex_and_call_lua_function(m_delete_way, m_way_cache.get());
}
way_delete(way->id());
}
void output_flex_t::relation_delete(osmium::Relation const &rel)
{
if (m_delete_relation) {
m_relation_cache.init(rel);
get_mutex_and_call_lua_function(m_delete_relation, rel);
}
relation_delete(rel.id());
}
/* Delete is easy, just remove all traces of this object. We don't need to
* worry about finding objects that depend on it, since the same diff must
* contain the change for that also. */
@ -1146,6 +1177,8 @@ output_flex_t::output_flex_t(output_flex_t const *other,
m_process_untagged_node(other->m_process_untagged_node),
m_process_untagged_way(other->m_process_untagged_way),
m_process_untagged_relation(other->m_process_untagged_relation),
m_delete_node(other->m_delete_node), m_delete_way(other->m_delete_way),
m_delete_relation(other->m_delete_relation),
m_select_relation_members(other->m_select_relation_members),
m_after_nodes(other->m_after_nodes), m_after_ways(other->m_after_ways),
m_after_relations(other->m_after_relations)
@ -1330,6 +1363,13 @@ void output_flex_t::init_lua(std::string const &filename,
prepared_lua_function_t{lua_state(), calling_context::process_relation,
"process_untagged_relation"};
m_delete_node = prepared_lua_function_t{
lua_state(), calling_context::process_node, "delete_node"};
m_delete_way = prepared_lua_function_t{
lua_state(), calling_context::process_way, "delete_way"};
m_delete_relation = prepared_lua_function_t{
lua_state(), calling_context::process_relation, "delete_relation"};
m_select_relation_members = prepared_lua_function_t{
lua_state(), calling_context::select_relation_members,
"select_relation_members", 1};

View File

@ -147,9 +147,9 @@ public:
void way_modify(osmium::Way *way) override;
void relation_modify(osmium::Relation const &rel) override;
void node_delete(osmid_t id) override;
void way_delete(osmid_t id) override;
void relation_delete(osmid_t id) override;
void node_delete(osmium::Node const &node) override;
void way_delete(osmium::Way *way) override;
void relation_delete(osmium::Relation const &rel) override;
void merge_expire_trees(output_t *other) override;
@ -204,6 +204,10 @@ private:
osmium::OSMObject const &
check_and_get_context_object(flex_table_t const &table);
void node_delete(osmid_t id);
void way_delete(osmid_t id);
void relation_delete(osmid_t id);
void delete_from_table(table_connection_t *table_connection,
pg_conn_t const &db_connection,
osmium::item_type type, osmid_t osm_id);
@ -304,6 +308,10 @@ private:
prepared_lua_function_t m_process_untagged_way;
prepared_lua_function_t m_process_untagged_relation;
prepared_lua_function_t m_delete_node;
prepared_lua_function_t m_delete_way;
prepared_lua_function_t m_delete_relation;
prepared_lua_function_t m_select_relation_members;
prepared_lua_function_t m_after_nodes;

View File

@ -50,9 +50,9 @@ public:
void way_modify(osmium::Way * /*way*/) override {}
void relation_modify(osmium::Relation const & /*rel*/) override {}
void node_delete(osmid_t /*id*/) override {}
void way_delete(osmid_t /*id*/) override {}
void relation_delete(osmid_t /*id*/) override {}
void node_delete(osmium::Node const & /*node*/) override {}
void way_delete(osmium::Way * /*way*/) override {}
void relation_delete(osmium::Relation const & /*rel*/) override {}
};
#endif // OSM2PGSQL_OUTPUT_NULL_HPP

View File

@ -349,15 +349,15 @@ void output_pgsql_t::relation_add(osmium::Relation const &rel)
/* Delete is easy, just remove all traces of this object. We don't need to
* worry about finding objects that depend on it, since the same diff must
* contain the change for that also. */
void output_pgsql_t::node_delete(osmid_t osm_id)
void output_pgsql_t::node_delete(osmium::Node const &node)
{
if (m_expire.enabled()) {
auto const results = m_tables[t_point]->get_wkb(osm_id);
auto const results = m_tables[t_point]->get_wkb(node.id());
if (expire_from_result(&m_expire, results, m_expire_config) != 0) {
m_tables[t_point]->delete_row(osm_id);
m_tables[t_point]->delete_row(node.id());
}
} else {
m_tables[t_point]->delete_row(osm_id);
m_tables[t_point]->delete_row(node.id());
}
}
@ -392,9 +392,9 @@ void output_pgsql_t::pgsql_delete_way_from_output(osmid_t osm_id)
delete_from_output_and_expire(osm_id);
}
void output_pgsql_t::way_delete(osmid_t osm_id)
void output_pgsql_t::way_delete(osmium::Way *way)
{
pgsql_delete_way_from_output(osm_id);
pgsql_delete_way_from_output(way->id());
}
/* Relations are identified by using negative IDs */
@ -403,9 +403,9 @@ void output_pgsql_t::pgsql_delete_relation_from_output(osmid_t osm_id)
delete_from_output_and_expire(-osm_id);
}
void output_pgsql_t::relation_delete(osmid_t osm_id)
void output_pgsql_t::relation_delete(osmium::Relation const &rel)
{
pgsql_delete_relation_from_output(osm_id);
pgsql_delete_relation_from_output(rel.id());
}
/* Modify is slightly trickier. The basic idea is we simply delete the
@ -413,19 +413,19 @@ void output_pgsql_t::relation_delete(osmid_t osm_id)
* objects that depend on this one */
void output_pgsql_t::node_modify(osmium::Node const &node)
{
node_delete(node.id());
node_delete(node);
node_add(node);
}
void output_pgsql_t::way_modify(osmium::Way *way)
{
way_delete(way->id());
way_delete(way);
way_add(way);
}
void output_pgsql_t::relation_modify(osmium::Relation const &rel)
{
relation_delete(rel.id());
relation_delete(rel);
relation_add(rel);
}
@ -448,7 +448,9 @@ std::shared_ptr<output_t> output_pgsql_t::clone(
output_pgsql_t::output_pgsql_t(std::shared_ptr<middle_query_t> const &mid,
std::shared_ptr<thread_pool_t> thread_pool,
options_t const &options)
: output_t(mid, std::move(thread_pool), options), m_proj(options.projection),
: output_t(mid, std::move(thread_pool), options),
m_ignore_untagged_objects(!options.extra_attributes),
m_proj(options.projection),
m_expire(options.expire_tiles_zoom, options.projection),
m_buffer(32768, osmium::memory::Buffer::auto_grow::yes),
m_rels_buffer(1024, osmium::memory::Buffer::auto_grow::yes),
@ -470,8 +472,6 @@ output_pgsql_t::output_pgsql_t(std::shared_ptr<middle_query_t> const &mid,
m_enable_way_area = read_style_file(options.style, &exlist);
m_ignore_untagged_objects = !options.extra_attributes;
m_tagtransform = tagtransform_t::make_tagtransform(&options, exlist);
auto copy_thread =

View File

@ -76,9 +76,9 @@ public:
void way_modify(osmium::Way *way) override;
void relation_modify(osmium::Relation const &rel) override;
void node_delete(osmid_t id) override;
void way_delete(osmid_t id) override;
void relation_delete(osmid_t id) override;
void node_delete(osmium::Node const &node) override;
void way_delete(osmium::Way *way) override;
void relation_delete(osmium::Relation const &rel) override;
void merge_expire_trees(output_t *other) override;

View File

@ -98,9 +98,9 @@ public:
virtual void way_modify(osmium::Way *way) = 0;
virtual void relation_modify(osmium::Relation const &rel) = 0;
virtual void node_delete(osmid_t id) = 0;
virtual void way_delete(osmid_t id) = 0;
virtual void relation_delete(osmid_t id) = 0;
virtual void node_delete(osmium::Node const &node) = 0;
virtual void way_delete(osmium::Way *way) = 0;
virtual void relation_delete(osmium::Relation const &rel) = 0;
virtual void merge_expire_trees(output_t * /*other*/) {}

View File

@ -130,11 +130,11 @@ struct counting_output_t : public output_null_t
++relation.modified;
}
void node_delete(osmid_t) override { ++node.deleted; }
void node_delete(osmium::Node const &) override { ++node.deleted; }
void way_delete(osmid_t) override { ++way.deleted; }
void way_delete(osmium::Way *) override { ++way.deleted; }
void relation_delete(osmid_t) override { ++relation.deleted; }
void relation_delete(osmium::Relation const &) override { ++relation.deleted; }
type_stats_t node, way, relation;
uint64_t sum_ids = 0;