From be47cd2549da482f3a408307eee8bfe7967cff25 Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Tue, 9 Jul 2019 20:47:25 +0200 Subject: [PATCH 1/2] remove country from place_addressline The country information can be determined sufficiently from the country code. We only loose the specific OSM object behind the address. Also streamlines the location_area_country table. --- sql/functions.sql | 4 ++-- sql/partition-functions.src.sql | 14 ++++++-------- sql/partition-tables.src.sql | 3 --- sql/tables.sql | 9 +++++++++ 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/sql/functions.sql b/sql/functions.sql index 9ff9c415..bad4b17c 100644 --- a/sql/functions.sql +++ b/sql/functions.sql @@ -547,7 +547,7 @@ BEGIN -- RAISE WARNING 'get_country_code, start: %', ST_AsText(place_centre); -- Try for a OSM polygon - FOR nearcountry IN select country_code from location_area_country where country_code is not null and not isguess and st_covers(geometry, place_centre) limit 1 + FOR nearcountry IN select country_code from location_area_country where country_code is not null and st_covers(geometry, place_centre) limit 1 LOOP RETURN nearcountry.country_code; END LOOP; @@ -1824,7 +1824,7 @@ BEGIN -- RAISE WARNING '% isaddress: %', location.place_id, location_isaddress; -- Add it to the list of search terms - IF NOT %REVERSE-ONLY% AND location.rank_search > 4 THEN + IF NOT %REVERSE-ONLY% THEN nameaddress_vector := array_merge(nameaddress_vector, location.keywords::integer[]); END IF; INSERT INTO place_addressline (place_id, address_place_id, fromarea, isaddress, distance, cached_rank_address) diff --git a/sql/partition-functions.src.sql b/sql/partition-functions.src.sql index 3959661e..20f71584 100644 --- a/sql/partition-functions.src.sql +++ b/sql/partition-functions.src.sql @@ -6,11 +6,9 @@ BEGIN -- start IF in_partition = -partition- THEN FOR r IN - SELECT place_id, keywords, rank_address, rank_search, min(ST_Distance(feature, centroid)) as distance, isguess, postcode, centroid FROM ( - SELECT * FROM location_area_large_-partition- WHERE ST_Intersects(geometry, feature) and rank_search < maxrank - UNION ALL - SELECT * FROM location_area_country WHERE ST_Intersects(geometry, feature) and rank_search < maxrank - ) as location_area + SELECT place_id, keywords, rank_address, rank_search, min(ST_Distance(feature, centroid)) as distance, isguess, postcode, centroid + FROM location_area_large_-partition- + WHERE ST_Intersects(geometry, feature) and rank_search < maxrank GROUP BY place_id, keywords, rank_address, rank_search, isguess, postcode, centroid ORDER BY rank_address, isin_tokens && keywords desc, isguess asc, ST_Distance(feature, centroid) * @@ -64,9 +62,9 @@ BEGIN RETURN TRUE; END IF; - IF in_rank_search <= 4 THEN - INSERT INTO location_area_country (partition, place_id, country_code, keywords, rank_search, rank_address, isguess, centroid, geometry) - values (in_partition, in_place_id, in_country_code, in_keywords, in_rank_search, in_rank_address, in_estimate, in_centroid, in_geometry); + IF in_rank_search <= 4 and not in_estimate THEN + INSERT INTO location_area_country (place_id, country_code, geometry) + values (in_place_id, in_country_code, in_geometry); RETURN TRUE; END IF; diff --git a/sql/partition-tables.src.sql b/sql/partition-tables.src.sql index 20dafcd7..f651e7ac 100644 --- a/sql/partition-tables.src.sql +++ b/sql/partition-tables.src.sql @@ -35,9 +35,6 @@ CREATE TABLE search_name_blank ( ); -CREATE TABLE location_area_country () INHERITS (location_area_large) {ts:address-data}; -CREATE INDEX idx_location_area_country_geometry ON location_area_country USING GIST (geometry) {ts:address-index}; - -- start CREATE TABLE location_area_large_-partition- () INHERITS (location_area_large) {ts:address-data}; CREATE INDEX idx_location_area_large_-partition-_place_id ON location_area_large_-partition- USING BTREE (place_id) {ts:address-index}; diff --git a/sql/tables.sql b/sql/tables.sql index 949dc6ff..e2960aea 100644 --- a/sql/tables.sql +++ b/sql/tables.sql @@ -69,6 +69,15 @@ CREATE TABLE location_area ( CREATE TABLE location_area_large () INHERITS (location_area); +DROP TABLE IF EXISTS location_area_country; +CREATE TABLE location_area_country ( + place_id BIGINT, + country_code varchar(2), + geometry GEOMETRY(Geometry, 4326) + ) {ts:address-data}; +CREATE INDEX idx_location_area_country_geometry ON location_area_country USING GIST (geometry) {ts:address-index}; + + drop table IF EXISTS location_property CASCADE; CREATE TABLE location_property ( place_id BIGINT, From 927b4c928e4e54fd185c08b9c8b486340a085122 Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Wed, 10 Jul 2019 22:51:15 +0200 Subject: [PATCH 2/2] add migration hints for country table --- docs/admin/Migration.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/admin/Migration.md b/docs/admin/Migration.md index ebad9c48..c5a05d9a 100644 --- a/docs/admin/Migration.md +++ b/docs/admin/Migration.md @@ -6,6 +6,22 @@ to newer versions of Nominatim. SQL statements should be executed from the PostgreSQL commandline. Execute `psql nominatim` to enter command line mode. +## 3.3.0 -> master + +### Reorganisation of location_area_country table + +The table `location_area_country` has been optimized. You need to switch to the +new format when you run updates. While updates are disabled, run the following +SQL commands: + +```sql +CREATE TABLE location_area_country_new AS + SELECT place_id, country_code, geometry FROM location_area_country; +DROP TABLE location_area_country; +ALTER TABLE location_area_country_new RENAME TO location_area_country; +CREATE INDEX idx_location_area_country_geometry ON location_area_country USING GIST (geometry); +CREATE INDEX idx_location_area_country_place_id ON location_area_country USING BTREE (place_id); +``` ## 3.2.0 -> 3.3.0