[Tile-serving] [osm2pgsql-dev/osm2pgsql] Add callbacks for delete actions (PR #2344)
Jochen Topf
notifications at github.com
Tue Jun 10 09:56:43 UTC 2025
@joto requested changes on this pull request.
> @@ -458,6 +470,8 @@ 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;
+
Should be initialized with the other members above.
> +
+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);
+ select_relation_members();
Deleted relations have no members, so there is no way of selecting any of them for two-stage processing. So this line can be removed.
> @@ -1084,6 +1084,38 @@ 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;
You are reusing an existing context. This is fine, but the comments in `src/output-flex.hpp` for the `calling_context` enum referring to the `process_*` callbacks should be changed, too. (We probably already should have changed them when we added the untagged callbacks.)
> + std::array<char, 2> tmp{"x"};
+ tmp[0] = osmium::item_type_to_char(member.type());
+ luaX_add_table_str(lua_state, "type", tmp.data());
+ luaX_add_table_int(lua_state, "ref", member.ref());
+ luaX_add_table_str(lua_state, "role", member.role());
+ });
+ }
+
+ lua_pushliteral(lua_state, "tags");
+ lua_createtable(lua_state, 0, (int)object.tags().size());
+ for (auto const &tag : object.tags()) {
+ luaX_add_table_str(lua_state, tag.key(), tag.value());
+ }
+ lua_rawset(lua_state, -3);
+
+ // Set the metatable of this object
It is weird that the process callbacks get a "real Lua object", and the delete callbacks only get a "Lua table" as parameter. This might have all sorts of consequences later, no sure. It definitely prevents us from ever calling methods on deleted OSM objects.
> @@ -0,0 +1,112 @@
+Feature: Test for delete callbacks
+
+ Background:
+ Given the input file 'liechtenstein-2013-08-03.osm.pbf'
+ And the lua style
+ """
+ change = osm2pgsql.define_table{
Use `local`
> @@ -0,0 +1,112 @@
+Feature: Test for delete callbacks
+
+ Background:
+ Given the input file 'liechtenstein-2013-08-03.osm.pbf'
+ And the lua style
+ """
+ change = osm2pgsql.define_table{
+ name = 'change',
+ ids = {type = 'any', id_column = 'osm_id', type_column = 'osm_type'},
+ columns = {
+ { column = 'extra', sql_type = 'int' }
+ }}
+
+ function process(object)
Confusing that this function is called `process` like the process callbacks. Also should be `local`.
> @@ -0,0 +1,112 @@
+Feature: Test for delete callbacks
+
+ Background:
+ Given the input file 'liechtenstein-2013-08-03.osm.pbf'
+ And the lua style
+ """
+ change = osm2pgsql.define_table{
+ name = 'change',
+ ids = {type = 'any', id_column = 'osm_id', type_column = 'osm_type'},
+ columns = {
+ { column = 'extra', sql_type = 'int' }
`type = 'int'` should work fine.
> + """
+ When running osm2pgsql flex with parameters
+ | --slim |
+
+ Then table change contains exactly
+ | osm_type | osm_id |
+
+ Given the input file '008-ch.osc.gz'
+
+ Scenario: Delete callbacks are called
+ When running osm2pgsql flex with parameters
+ | --slim | -a |
+
+ Then SELECT osm_type, count(*), sum(extra) FROM change GROUP BY osm_type
+ | osm_type | count | sum |
+ | N | 16773 | 16779|
*mode superpicky on* Spaces at the end missing in this and following lines.
> + | --slim | -a |
+
+ Then SELECT osm_type, count(*), sum(osm_id) FROM change GROUP BY osm_type
+ | osm_type | count | sum |
+ | N | 16773 | 37856781001834 |
+ | W | 4 | 350933407 |
+ | R | 1 | 2871571 |
+
+ Scenario: No object payload is available
+ Given the lua style
+ """
+ change = osm2pgsql.define_table{
+ name = 'change',
+ ids = {type = 'any', id_column = 'osm_id', type_column = 'osm_type'},
+ columns = {
+ { column = 'extra', sql_type = 'int' }
see above
--
Reply to this email directly or view it on GitHub:
https://github.com/osm2pgsql-dev/osm2pgsql/pull/2344#pullrequestreview-2912611398
You are receiving this because you are subscribed to this thread.
Message ID: <osm2pgsql-dev/osm2pgsql/pull/2344/review/2912611398 at github.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openstreetmap.org/pipermail/tile-serving/attachments/20250610/374848bf/attachment.htm>
More information about the Tile-serving
mailing list