diff --git a/layers/park/update_park_polygon.sql b/layers/park/update_park_polygon.sql index 69492692..3e9a2425 100644 --- a/layers/park/update_park_polygon.sql +++ b/layers/park/update_park_polygon.sql @@ -46,6 +46,8 @@ DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen_z7; DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen_z6; DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen_z5; DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen_z4; +DROP TRIGGER IF EXISTS tigger_flag ON osm_park_polygon; +DROP TRIGGER IF EXISTS tigger_refresh ON park_polygon.updates; -- etldoc: osm_park_polygon -> osm_park_polygon -- etldoc: osm_park_polygon_gen_z13 -> osm_park_polygon_gen_z13 @@ -119,6 +121,42 @@ CREATE INDEX IF NOT EXISTS osm_park_polygon_gen_z5_point_geom_idx ON osm_park_po CREATE INDEX IF NOT EXISTS osm_park_polygon_gen_z4_polygon_geom_idx ON osm_park_polygon_gen_z4 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_park_polygon_dissolve_z4_polygon_geom_idx ON osm_park_polygon_dissolve_z4 USING gist (geometry); +CREATE SCHEMA IF NOT EXISTS park_polygon; + +CREATE TABLE IF NOT EXISTS park_polygon.updates +( + id serial PRIMARY KEY, + t text, + UNIQUE (t) +); + +CREATE OR REPLACE FUNCTION park_polygon.flag() RETURNS trigger AS +$$ +BEGIN + INSERT INTO park_polygon.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING; + RETURN NULL; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION park_polygon.refresh() RETURNS trigger AS +$$ +DECLARE + t TIMESTAMP WITH TIME ZONE := clock_timestamp(); +BEGIN + RAISE LOG 'Refresh park_polygon'; + + -- Analyze tracking and source tables before performing update + ANALYZE osm_park_polygon_gen_z4; + REFRESH MATERIALIZED VIEW osm_park_polygon_dissolve_z4; + + -- noinspection SqlWithoutWhere + DELETE FROM park_polygon.updates; + + RAISE LOG 'Refresh park_polygon done in %', age(clock_timestamp(), t); + RETURN NULL; +END; +$$ LANGUAGE plpgsql; + CREATE OR REPLACE FUNCTION update_osm_park_polygon_row() RETURNS trigger AS @@ -206,3 +244,15 @@ CREATE TRIGGER update_row FOR EACH ROW EXECUTE PROCEDURE update_osm_park_dissolved_polygon_row(); +CREATE TRIGGER trigger_flag + AFTER INSERT OR UPDATE OR DELETE + ON osm_park_polygon_gen_z4 + FOR EACH STATEMENT +EXECUTE PROCEDURE park_polygon.flag(); + +CREATE CONSTRAINT TRIGGER trigger_refresh + AFTER INSERT + ON park_polygon.updates + INITIALLY DEFERRED + FOR EACH ROW +EXECUTE PROCEDURE park_polygon.refresh();