Files
osm2pgsql/tests/data/test_output_flex_node.lua
Jochen Topf 8d1a55e5e6 Fix problem in slim mode with two-state processing of nodes
In two-stage processing when getting nodes from the middle we are
running the same SQL query as when getting the node locations. But that
doesn't work. We need more information, the tags (and possibly the
attributes). This fixes this by running a different prepared query in
this case.

Fixes #2298
2025-01-28 17:59:11 +01:00

87 lines
2.2 KiB
Lua

local tables = {}
tables.t1 = osm2pgsql.define_node_table('osm2pgsql_test_t1', {
{ column = 'tags', type = 'hstore' },
{ column = 'geom', type = 'point', not_null = true },
})
tables.t2 = osm2pgsql.define_node_table('osm2pgsql_test_t2', {
{ column = 'tags', type = 'hstore' },
{ column = 'rel_ids', type = 'text' },
{ column = 'geom', type = 'point', not_null = true },
})
tables.tboth = osm2pgsql.define_node_table('osm2pgsql_test_tboth', {
{ column = 'tags', type = 'hstore' },
{ column = 'rel_ids', type = 'text' },
{ column = 'geom', type = 'point', not_null = true },
})
local n2r = {}
local function get_ids(data)
if data then
local ids = {}
for rel_id, _ in pairs(data) do
ids[#ids + 1] = rel_id
end
table.sort(ids)
return '{' .. table.concat(ids, ',') .. '}'
end
end
function osm2pgsql.process_node(object)
if object.tags.t1 then
tables.t1:insert{
tags = object.tags,
geom = object:as_point()
}
end
if osm2pgsql.stage == 2 and object.tags.t2 then
local ids = get_ids(n2r[object.id])
if ids then
tables.t2:insert{
rel_ids = ids,
geom = object:as_point()
}
end
end
if object.tags.tboth then
local ids = get_ids(n2r[object.id])
tables.tboth:insert{
tags = object.tags,
rel_ids = ids,
geom = object:as_point()
}
end
end
local function node_member_ids(relation)
local ids = {}
for _, member in ipairs(relation.members) do
if member.type == 'n' and member.role == 'mark' then
ids[#ids + 1] = member.ref
end
end
return ids
end
function osm2pgsql.select_relation_members(relation)
return { nodes = node_member_ids(relation) }
end
function osm2pgsql.process_relation(object)
for _, member in ipairs(object.members) do
if member.type == 'n' and member.role == 'mark' then
if not n2r[member.ref] then
n2r[member.ref] = {}
end
n2r[member.ref][object.id] = true
end
end
end