Update entrances when entrance nodes are updated

This commit is contained in:
Emily Love Watson
2025-08-20 14:59:25 -05:00
parent 823ad5d279
commit e916d27b7c
10 changed files with 232 additions and 21 deletions

View File

@@ -365,3 +365,35 @@ BEGIN
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION place_after_insert()
RETURNS TRIGGER
AS $$
BEGIN
{% if debug %}
RAISE WARNING 'place_after_insert: % % % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type,st_area(NEW.geometry);
{% endif %}
IF NEW.class IN ('routing:entrance', 'entrance') THEN
PERFORM place_update_entrances_for_node(NEW.osm_id);
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION place_after_delete()
RETURNS TRIGGER
AS $$
BEGIN
{% if debug %}
RAISE WARNING 'place_after_delete: % % % % %',OLD.osm_type,OLD.osm_id,OLD.class,OLD.type,st_area(OLD.geometry);
{% endif %}
IF OLD.class IN ('routing:entrance', 'entrance') THEN
PERFORM place_update_entrances_for_node(OLD.osm_id);
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;

View File

@@ -883,16 +883,7 @@ BEGIN
-- Record the entrance node locations
IF NEW.osm_type = 'W' and (NEW.rank_search > 27 or NEW.class IN ('landuse', 'leisure')) THEN
SELECT jsonb_agg(jsonb_build_object('osm_id', osm_id, 'type', type, 'lat', ST_Y(geometry), 'lon', ST_X(geometry), 'extratags', extratags))
FROM place
WHERE osm_id IN (SELECT unnest(nodes) FROM planet_osm_ways WHERE id=NEW.osm_id) AND class IN ('routing:entrance', 'entrance')
INTO entrances;
IF entrances IS NOT NULL THEN
INSERT INTO place_entrance (place_id, entrances)
SELECT NEW.place_id, entrances
ON CONFLICT (place_id) DO UPDATE
SET entrances = excluded.entrances;
END IF;
PERFORM place_update_entrances(NEW.place_id, NEW.osm_id);
END IF;
-- recalculate country and partition

View File

@@ -623,3 +623,46 @@ BEGIN
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION place_update_entrances_for_node(osmid BIGINT)
RETURNS INTEGER
AS $$
DECLARE
entrance_way RECORD;
BEGIN
FOR entrance_way IN
SELECT osm_id, place_id FROM planet_osm_ways JOIN placex ON placex.osm_id = planet_osm_ways.id WHERE osmid=ANY(nodes)
LOOP
PERFORM place_update_entrances(entrance_way.place_id, entrance_way.osm_id);
END LOOP;
RETURN NULL;
END;
$$
LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION place_update_entrances(placeid BIGINT, osmid BIGINT)
RETURNS INTEGER
AS $$
DECLARE
entrances JSONB;
BEGIN
SELECT jsonb_agg(jsonb_build_object('osm_id', osm_id, 'type', type, 'lat', ST_Y(geometry), 'lon', ST_X(geometry), 'extratags', extratags))
FROM place
WHERE osm_id IN (SELECT unnest(nodes) FROM planet_osm_ways WHERE id=osmid) AND class IN ('routing:entrance', 'entrance')
INTO entrances;
IF entrances IS NOT NULL THEN
INSERT INTO place_entrance (place_id, entrances)
SELECT placeid, entrances
ON CONFLICT (place_id) DO UPDATE
SET entrances = excluded.entrances;
ELSE
DELETE FROM place_entrance WHERE place_id=placeid;
END IF;
RETURN NULL;
END;
$$
LANGUAGE plpgsql;

View File

@@ -24,6 +24,10 @@ CREATE TRIGGER place_before_delete BEFORE DELETE ON place
FOR EACH ROW EXECUTE PROCEDURE place_delete();
CREATE TRIGGER place_before_insert BEFORE INSERT ON place
FOR EACH ROW EXECUTE PROCEDURE place_insert();
CREATE TRIGGER place_after_insert AFTER INSERT ON place
FOR EACH ROW EXECUTE PROCEDURE place_after_insert();
CREATE TRIGGER place_after_delete AFTER DELETE ON place
FOR EACH ROW EXECUTE PROCEDURE place_after_delete();
CREATE TRIGGER location_postcode_before_update BEFORE UPDATE ON location_postcode
FOR EACH ROW EXECUTE PROCEDURE postcode_update();