Implement non-blocking refresh (#1308)

This PR implements non-blocking updates in the park layer.

The approach was to use the `REFRESH MATERIALIZED VIEW CONCURRENTLY` feature in postgres.  In order to achieve this, a unique index was added on the z4 dissolved park area table.  The `ST_Union` / `ST_Dump` sequence was changed to an explicit cluster DB scan (an equivalent operation) so that a unique osm ID could be generated from each dissolved polygon.

Below is a screen shot from Idaho, USA showing that the dissolved z4 still works as expected.

![image](https://user-images.githubusercontent.com/3254090/142341513-588045f0-7757-4acd-99e5-a50bbe6b0682.png)
pull/1295/head
Brian Sperlongano 2021-11-24 05:17:29 -05:00 zatwierdzone przez GitHub
rodzic cdff735be1
commit 0cff3449b5
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
1 zmienionych plików z 11 dodań i 5 usunięć

Wyświetl plik

@ -23,11 +23,17 @@ ALTER TABLE osm_park_polygon_gen_z5
DROP MATERIALIZED VIEW IF EXISTS osm_park_polygon_dissolve_z4 CASCADE;
CREATE MATERIALIZED VIEW osm_park_polygon_dissolve_z4 AS
(
SELECT
(ST_Dump(
ST_Union(geometry))).geom AS geometry
FROM osm_park_polygon_gen_z4
SELECT min(osm_id) AS osm_id,
ST_Union(geometry) AS geometry
FROM (
SELECT ST_ClusterDBSCAN(geometry, 0, 1) OVER() AS cluster,
osm_id,
geometry
FROM osm_park_polygon_gen_z4
) park_cluster
GROUP BY cluster
);
CREATE UNIQUE INDEX IF NOT EXISTS osm_park_polygon_dissolve_idx ON osm_park_polygon_dissolve_z4 (osm_id);
DROP TRIGGER IF EXISTS update_row ON osm_park_polygon;
DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen_z13;
@ -95,7 +101,7 @@ BEGIN
SET tags = update_tags(tags, geometry),
geometry_point = st_centroid(geometry);
REFRESH MATERIALIZED VIEW osm_park_polygon_dissolve_z4;
REFRESH MATERIALIZED VIEW CONCURRENTLY osm_park_polygon_dissolve_z4;
END;
$$ LANGUAGE plpgsql;