-- Get the existing place_id
select * from placex where osm_type = NEW.osm_type and osm_id = NEW.osm_id and class = NEW.class and type = NEW.type INTO existingplacex;
- -- Pure postcodes are never queried from placex so we don't add them.
- -- location_postcodes is filled from the place table directly.
- IF NEW.class = 'place' AND NEW.type = 'postcode' THEN
- -- Remove old placex entry if the type changed to postcode.
- IF existingplacex.type IS NOT NULL AND existingplacex.type != 'postcode' THEN
- DELETE FROM placex where osm_type = NEW.osm_type and osm_id = NEW.osm_id;
- END IF;
- RETURN NEW;
- END IF;
-
-- Handle a place changing type by removing the old data
-- My generated 'place' types are causing havok because they overlap with real keys
-- TODO: move them to their own special purpose key/class to avoid collisions
DELETE FROM place where osm_type = NEW.osm_type and osm_id = NEW.osm_id and class = NEW.class;
END IF;
+ -- Pure postcodes are never queried from placex so we don't add them.
+ -- location_postcodes is filled from the place table directly.
+ IF NEW.class = 'place' AND NEW.type = 'postcode' THEN
+ -- Remove old placex entry.
+ DELETE FROM placex where osm_type = NEW.osm_type and osm_id = NEW.osm_id;
+
+ IF existing.osm_type IS NOT NULL THEN
+ IF coalesce(existing.address, ''::hstore) != coalesce(NEW.address, ''::hstore)
+ OR existing.geometry::text != NEW.geometry::text
+ THEN
+
+ update place set address = NEW.address, geometry = NEW.geometry
+ where osm_type = NEW.osm_type and osm_id = NEW.osm_id and class = NEW.class and type = NEW.type;
+ END IF;
+
+ RETURN NULL;
+ END IF;
+
+ RETURN NEW;
+ END IF;
+
{% if debug %}RAISE WARNING 'Existing: %',existing.osm_id;{% endif %}
{% if debug %}RAISE WARNING 'Existing PlaceX: %',existingplacex.place_id;{% endif %}
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 x.class = p.class;
END IF;
+ IF coalesce(existing.name::text, '') != coalesce(NEW.name::text, '')
+ THEN
+ IF existingplacex.rank_address between 26 and 27 THEN
+ -- When streets change their name, this may have an effect on POI objects
+ -- with addr:street tags.
+ UPDATE placex SET indexed_status = 2
+ WHERE indexed_status = 0 and address ? 'street'
+ and parent_place_id = existingplacex.place_id;
+ UPDATE placex SET indexed_status = 2
+ WHERE indexed_status = 0 and rank_search = 30 and address ? 'street'
+ and ST_DWithin(NEW.geometry, geometry, 0.002);
+ ELSEIF existingplacex.rank_address between 16 and 25 THEN
+ -- When places change their name, this may have an effect on POI objects
+ -- with addr:place tags.
+ UPDATE placex SET indexed_status = 2
+ WHERE indexed_status = 0 and address ? 'place' and rank_search = 30
+ and parent_place_id = existingplacex.place_id;
+ -- No update of surrounding objects, potentially too expensive.
+ END IF;
+ END IF;
END IF;
-- Abort the add (we modified the existing place instead)