From 98b93df83d35f9062c85a5c93692206dfcbfa92d Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Fri, 7 Feb 2014 23:37:54 +0100 Subject: [PATCH] recreate place objects when admin_level changes Also added a sanity check to ensure that accidental removal of admin_level tags on large areas doesn't cause huge reindexing load. That can be disabled by setting CONST_Limit_Reindexing to false. --- settings/settings.php | 1 + sql/functions.sql | 17 ++++++++++++++--- utils/setup.php | 1 + 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/settings/settings.php b/settings/settings.php index 27b3446b..fd50a6f0 100644 --- a/settings/settings.php +++ b/settings/settings.php @@ -6,6 +6,7 @@ @define('CONST_Debug', false); @define('CONST_Database_DSN', 'pgsql://@/nominatim'); // ://:@:/ @define('CONST_Max_Word_Frequency', '50000'); + @define('CONST_Limit_Reindexing', true); // Software versions @define('CONST_Postgresql_Version', '9.1'); // values: 8.3, 8.4, 9.0, 9.1, 9.2 diff --git a/sql/functions.sql b/sql/functions.sql index f219e70e..49a6e972 100644 --- a/sql/functions.sql +++ b/sql/functions.sql @@ -1953,7 +1953,7 @@ BEGIN -- mark everything linked to this place for re-indexing --DEBUG: RAISE WARNING 'placex_delete:03 % %',OLD.osm_type,OLD.osm_id; UPDATE placex set indexed_status = 2 from place_addressline where address_place_id = OLD.place_id - and placex.place_id = place_addressline.place_id and indexed_status = 0; + and placex.place_id = place_addressline.place_id and indexed_status = 0 and place_addressline.isaddress; --DEBUG: RAISE WARNING 'placex_delete:04 % %',OLD.osm_type,OLD.osm_id; DELETE FROM place_addressline where address_place_id = OLD.place_id; @@ -2090,8 +2090,19 @@ BEGIN DELETE from import_polygon_error where osm_type = NEW.osm_type and osm_id = NEW.osm_id; DELETE from import_polygon_delete where osm_type = NEW.osm_type and osm_id = NEW.osm_id; - -- To paraphrase, if there isn't an existing item, OR if the admin level has changed, OR if it is a major change in geometry - IF existingplacex.osm_type IS NULL THEN + -- To paraphrase, if there isn't an existing item, OR if the admin level has changed + IF existingplacex.osm_type IS NULL OR + coalesce(existingplacex.admin_level, 15) != coalesce(NEW.admin_level, 15) + THEN + + IF existingplacex.osm_type IS NOT NULL THEN + -- sanity check: ignore admin_level changes on places with too many active children + -- or we end up reindexing entire countries because somebody accidentally deleted admin_level + --LIMIT INDEXING: SELECT count(*) FROM (SELECT 'a' FROM placex , place_addressline where address_place_id = existingplacex.place_id and placex.place_id = place_addressline.place_id and indexed_status = 0 and place_addressline.isaddress LIMIT 100001) sub INTO i; + --LIMIT INDEXING: IF i > 100000 THEN + --LIMIT INDEXING: RETURN null; + --LIMIT INDEXING: END IF; + END IF; IF existing.osm_type IS NOT NULL THEN -- pathological case caused by the triggerless copy into place during initial import diff --git a/utils/setup.php b/utils/setup.php index 99d9e526..d9c761b2 100755 --- a/utils/setup.php +++ b/utils/setup.php @@ -197,6 +197,7 @@ $sTemplate = str_replace('{modulepath}', CONST_BasePath.'/module', $sTemplate); if ($aCMDResult['enable-diff-updates']) $sTemplate = str_replace('RETURN NEW; -- @DIFFUPDATES@', '--', $sTemplate); if ($aCMDResult['enable-debug-statements']) $sTemplate = str_replace('--DEBUG:', '', $sTemplate); + if (CONST_Limit_Reindexing) $sTemplate = str_replace('--LIMIT INDEXING:', '', $sTemplate); pgsqlRunScript($sTemplate); } -- 2.39.5