existing RECORD;
existingplacex RECORD;
existingline BIGINT[];
- result BOOLEAN;
+ interpol RECORD;
BEGIN
{% if debug %}
RAISE WARNING 'place_insert: % % % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type,st_area(NEW.geometry);
IF NEW.class='place' and NEW.type='houses'
and NEW.osm_type='W' and ST_GeometryType(NEW.geometry) = 'ST_LineString'
THEN
- -- Get the existing entry from the interpolation table.
- SELECT array_agg(place_id) INTO existingline
- FROM location_property_osmline WHERE osm_id = NEW.osm_id;
-
- IF existingline IS NULL or array_length(existingline, 1) = 0 THEN
- INSERT INTO location_property_osmline (osm_id, address, linegeo)
- VALUES (NEW.osm_id, NEW.address, NEW.geometry);
- ELSE
- -- Update the interpolation table:
- -- The first entry gets the original data, all other entries
- -- are removed and will be recreated on indexing.
- -- (An interpolation can be split up, if it has more than 2 address nodes)
- UPDATE location_property_osmline
- SET address = NEW.address,
- linegeo = NEW.geometry,
- startnumber = null,
- indexed_status = 1
- WHERE place_id = existingline[1];
- IF array_length(existingline, 1) > 1 THEN
- DELETE FROM location_property_osmline
- WHERE place_id = any(existingline[2:]);
- END IF;
- END IF;
+ PERFORM reinsert_interpolation(NEW.osm_id, NEW.address, NEW.geometry);
-- Now invalidate all address nodes on the line.
-- They get their parent from the interpolation.
RETURN null;
END IF;
+ -- If an address node is part of a interpolation line and changes or is
+ -- newly inserted (happens when the node already existed but now gets address
+ -- information), then mark the interpolation 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 coalesce(existing.address, ''::hstore) != coalesce(NEW.address, ''::hstore)
+ THEN
+ FOR interpol IN
+ SELECT DISTINCT osm_id, address, geometry FROM place, planet_osm_ways w
+ WHERE NEW.geometry && place.geometry
+ and place.osm_type = 'W'
+ and exists (SELECT * FROM location_property_osmline
+ WHERE osm_id = place.osm_id
+ and indexed_status in (0, 2))
+ and w.id = place.osm_id and NEW.osm_id = any (w.nodes)
+ LOOP
+ PERFORM reinsert_interpolation(interpol.osm_id, interpol.address,
+ interpol.geometry);
+ END LOOP;
+ END IF;
+
-- Get the existing placex entry.
SELECT * INTO existingplacex
FROM placex
geometry = NEW.geometry
WHERE place_id = existingplacex.place_id;
- -- If an address node which is part of a interpolation line changes
- -- 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 coalesce(existing.address, ''::hstore) != coalesce(NEW.address, ''::hstore)
- THEN
- result:= osmline_reinsert(NEW.osm_id, NEW.geometry);
- END IF;
-
-- Invalidate linked places: they potentially get a new name and addresses.
IF existingplacex.linked_place_id is not NULL THEN
UPDATE placex x