]> git.openstreetmap.org Git - nominatim.git/commitdiff
Merge remote-tracking branch 'upstream/master'
authorSarah Hoffmann <lonvia@denofr.de>
Wed, 3 Jul 2019 21:18:35 +0000 (23:18 +0200)
committerSarah Hoffmann <lonvia@denofr.de>
Wed, 3 Jul 2019 21:18:35 +0000 (23:18 +0200)
1  2 
sql/functions.sql

diff --combined sql/functions.sql
index 97f78d2432bab2db25b1699c8bb3bd930c7417b7,9ff9c415922a47066676f5e0d9e957e7c63ff59c..c97d11da33473976d7489e5999db7f45d47cfda8
@@@ -768,6 -768,28 +768,28 @@@ END
  $$
  LANGUAGE plpgsql;
  
+ CREATE OR REPLACE FUNCTION osmline_reinsert(node_id BIGINT, geom GEOMETRY)
+   RETURNS BOOLEAN
+   AS $$
+ DECLARE
+   existingline RECORD;
+ BEGIN
+    SELECT w.id FROM planet_osm_ways w, location_property_osmline p
+      WHERE p.linegeo && geom and p.osm_id = w.id and p.indexed_status = 0
+            and node_id = any(w.nodes) INTO existingline;
+    IF existingline.id is not NULL THEN
+        DELETE FROM location_property_osmline WHERE osm_id = existingline.id;
+        INSERT INTO location_property_osmline (osm_id, address, linegeo)
+          SELECT osm_id, address, geometry FROM place
+            WHERE osm_type = 'W' and osm_id = existingline.id;
+    END IF;
+    RETURN true;
+ END;
+ $$
+ LANGUAGE plpgsql;
  
  CREATE OR REPLACE FUNCTION osmline_insert() RETURNS TRIGGER
    AS $$
@@@ -908,7 -930,10 +930,10 @@@ BEGI
  
    RETURN NEW; -- %DIFFUPDATES% The following is not needed until doing diff updates, and slows the main index process down
  
-   IF NEW.rank_address > 0 THEN
+   IF NEW.osm_type = 'N' and NEW.rank_search > 28 THEN
+       -- might be part of an interpolation
+       result := osmline_reinsert(NEW.osm_id, NEW.geometry);
+   ELSEIF NEW.rank_address > 0 THEN
      IF (ST_GeometryType(NEW.geometry) in ('ST_Polygon','ST_MultiPolygon') AND ST_IsValid(NEW.geometry)) THEN
        -- Performance: We just can't handle re-indexing for country level changes
        IF st_area(NEW.geometry) < 1 THEN
@@@ -1230,6 -1255,8 +1255,8 @@@ BEGI
    END IF;
  
    --DEBUG: RAISE WARNING 'Copy over address tags';
+   -- housenumber is a computed field, so start with an empty value
+   NEW.housenumber := NULL;
    IF NEW.address is not NULL THEN
        IF NEW.address ? 'conscriptionnumber' THEN
          i := getorcreate_housenumber_id(make_standard_name(NEW.address->'conscriptionnumber'));
@@@ -2198,12 -2225,13 +2225,13 @@@ BEGI
          indexed_status = 2,
          geometry = NEW.geometry
          where place_id = existingplacex.place_id;
        -- if a node(=>house), which is part of a interpolation line, changes (e.g. the street attribute) => mark this line for reparenting 
        -- (already here, because interpolation lines are reindexed before nodes, so in the second call it would be too late)
-       IF NEW.osm_type='N' and NEW.class='place' and NEW.type='house' THEN
-           -- Is this node part of an interpolation line? search for it in location_property_osmline and mark the interpolation line for reparenting
-           update location_property_osmline p set indexed_status = 2 from planet_osm_ways w where p.linegeo && NEW.geometry and p.osm_id = w.id and NEW.osm_id = any(w.nodes);
+       IF NEW.osm_type='N'
+          and (coalesce(existing.address, ''::hstore) != coalesce(NEW.address, ''::hstore)
+              or existing.geometry::text != NEW.geometry::text)
+       THEN
+           result:= osmline_reinsert(NEW.osm_id, NEW.geometry);
        END IF;
  
        -- linked places should get potential new naming and addresses
@@@ -2421,7 -2449,7 +2449,7 @@@ BEGI
      SELECT placex.place_id, osm_type, osm_id, name,
             CASE WHEN extratags ? 'place' THEN 'place' ELSE class END as class,
             CASE WHEN extratags ? 'place' THEN extratags->'place' ELSE type END as type,
 -           admin_level, fromarea, isaddress,
 +           admin_level, fromarea, isaddress and linked_place_id is NULL as isaddress,
             CASE WHEN rank_address = 11 THEN 5 ELSE rank_address END as rank_address,
             distance, country_code, postcode
        FROM place_addressline join placex on (address_place_id = placex.place_id)