X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/200eae3bc0b559e7df7c1d1fb50141830c2f1849..8c14df55a61d71f2476c8a17287e1bd162a5c6a6:/settings/flex-base.lua diff --git a/settings/flex-base.lua b/settings/flex-base.lua index 0e112736..4d960d72 100644 --- a/settings/flex-base.lua +++ b/settings/flex-base.lua @@ -5,12 +5,18 @@ local module = {} local PRE_DELETE = nil local PRE_EXTRAS = nil +local POST_DELETE = nil local MAIN_KEYS = nil local NAMES = nil local ADDRESS_TAGS = nil local SAVE_EXTRA_MAINS = false local POSTCODE_FALLBACK = true +-- tables required for taginfo +module.TAGINFO_MAIN = {keys = {}, delete_tags = {}} +module.TAGINFO_NAME_KEYS = {} +module.TAGINFO_ADDRESS_KEYS = {} + -- The single place table. local place_table = osm2pgsql.define_table{ @@ -25,6 +31,8 @@ local place_table = osm2pgsql.define_table{ { column = 'extratags', type = 'hstore' }, { column = 'geometry', type = 'geometry', projection = 'WGS84', not_null = true }, }, + data_tablespace = os.getenv("NOMINATIM_TABLESPACE_PLACE_DATA"), + index_tablespace = os.getenv("NOMINATIM_TABLESPACE_PLACE_INDEX"), indexes = {} } @@ -223,9 +231,9 @@ function Place:write_row(k, v, save_extra_mains) return 0 end - if save_extra_mains then + if save_extra_mains ~= nil then for extra_k, extra_v in pairs(self.object.tags) do - if extra_k ~= k then + if extra_k ~= k and save_extra_mains(extra_k, extra_v) then self.extratags[extra_k] = extra_v end end @@ -242,8 +250,10 @@ function Place:write_row(k, v, save_extra_mains) } if save_extra_mains then - for k, v in pairs(self.object.tags) do - self.extratags[k] = nil + for tk, tv in pairs(self.object.tags) do + if save_extra_mains(tk, tv) then + self.extratags[tk] = nil + end end end @@ -370,6 +380,17 @@ function module.tag_group(data) end end +-- Returns prefix part of the keys, and reject suffix matching keys +local function process_key(key) + if key:sub(1, 1) == '*' then + return nil + end + if key:sub(#key, #key) == '*' then + return key:sub(1, #key - 2) + end + return key +end + -- Process functions for all data types function module.process_node(object) @@ -437,7 +458,7 @@ function module.process_tags(o) return end - o:clean{delete = POST_DELETE, extra = POST_EXTRAS} + o:clean{delete = POST_DELETE} -- collect main keys for k, v in pairs(o.object.tags) do @@ -463,14 +484,29 @@ function module.set_prefilters(data) PRE_DELETE = module.tag_match{keys = data.delete_keys, tags = data.delete_tags} PRE_EXTRAS = module.tag_match{keys = data.extra_keys, tags = data.extra_tags} + module.TAGINFO_MAIN.delete_tags = data.delete_tags end function module.set_main_tags(data) MAIN_KEYS = data + local keys = {} + for k, _ in pairs(data) do + table.insert(keys, k) + end + module.TAGINFO_MAIN.keys = keys end function module.set_name_tags(data) NAMES = module.tag_group(data) + + for _, lst in pairs(data) do + for _, k in ipairs(lst) do + local key = process_key(k) + if key ~= nil then + module.TAGINFO_NAME_KEYS[key] = true + end + end + end end function module.set_address_tags(data) @@ -478,25 +514,33 @@ function module.set_address_tags(data) POSTCODE_FALLBACK = data.postcode_fallback data.postcode_fallback = nil end - ADDRESS_TAGS = module.tag_group(data) + + for _, lst in pairs(data) do + if lst ~= nil then + for _, k in ipairs(lst) do + local key = process_key(k) + if key ~= nil then + module.TAGINFO_ADDRESS_KEYS[key] = true + end + end + end + end end function module.set_unused_handling(data) if data.extra_keys == nil and data.extra_tags == nil then POST_DELETE = module.tag_match{keys = data.delete_keys, tags = data.delete_tags} - POST_EXTRAS = nil - SAVE_EXTRA_MAINS = true + SAVE_EXTRA_MAINS = function() return true end elseif data.delete_keys == nil and data.delete_tags == nil then POST_DELETE = nil - POST_EXTRAS = module.tag_match{keys = data.extra_keys, tags = data.extra_tags} - SAVE_EXTRA_MAINS = false + SAVE_EXTRA_MAINS = module.tag_match{keys = data.extra_keys, tags = data.extra_tags} else error("unused handler can have only 'extra_keys' or 'delete_keys' set.") end end -function set_relation_types(data) +function module.set_relation_types(data) module.RELATION_TYPES = {} for k, v in data do if v == 'multipolygon' then