]> git.openstreetmap.org Git - nominatim.git/commitdiff
recreate place objects when admin_level changes
authorSarah Hoffmann <lonvia@denofr.de>
Fri, 7 Feb 2014 22:37:54 +0000 (23:37 +0100)
committerSarah Hoffmann <lonvia@denofr.de>
Fri, 7 Feb 2014 22:37:54 +0000 (23:37 +0100)
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
sql/functions.sql
utils/setup.php

index 27b3446b3c9c70e7775055276a2e28225ece8cdb..fd50a6f0a7c96487468cdfe6cac04b92095600cc 100644 (file)
@@ -6,6 +6,7 @@
        @define('CONST_Debug', false);
        @define('CONST_Database_DSN', 'pgsql://@/nominatim'); // <driver>://<username>:<password>@<host>:<port>/<database>
        @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
index f219e70e0fe312f572585079cfc083970fe00d0f..49a6e97288fc0666538e8647fe23dd8162beabb3 100644 (file)
@@ -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
index 99d9e52628527643a332bb42dcfb1d3d9e980bfc..d9c761b276920d2f75f4dbb660b2fb59546d8f23 100755 (executable)
                $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);
        }