From 63985fca1e05dd7f09c3b5b51addf68bd22dd389 Mon Sep 17 00:00:00 2001 From: lukasmartinelli Date: Sat, 8 Oct 2016 21:27:28 +0200 Subject: [PATCH] CTEs always materialise so inline the union zoom level views :warning: --- schema/layers/boundary.sql | 5 ++- schema/layers/building.sql | 9 +++-- schema/layers/country.sql | 5 ++- schema/layers/ice.sql | 5 ++- schema/layers/place.sql | 67 +++++++++++++++++++------------------- schema/layers/road.sql | 2 +- schema/layers/state.sql | 9 +++-- schema/layers/urban.sql | 5 ++- schema/layers/water.sql | 5 ++- 9 files changed, 52 insertions(+), 60 deletions(-) diff --git a/schema/layers/boundary.sql b/schema/layers/boundary.sql index 79102b4..8054667 100644 --- a/schema/layers/boundary.sql +++ b/schema/layers/boundary.sql @@ -88,7 +88,7 @@ CREATE OR REPLACE VIEW boundary_z10 AS ( CREATE OR REPLACE FUNCTION layer_boundary (bbox geometry, zoom_level int) RETURNS TABLE(geom geometry, admin_level int, scalerank int, class text) AS $$ - WITH zoom_levels AS ( + SELECT geom, admin_level, scalerank::int, class FROM ( SELECT * FROM boundary_z0 WHERE zoom_level = 0 UNION ALL SELECT * FROM boundary_z1 WHERE zoom_level BETWEEN 1 AND 2 @@ -118,7 +118,6 @@ RETURNS TABLE(geom geometry, admin_level int, scalerank int, class text) AS $$ UNION ALL SELECT geom, admin_level, scalerank, class FROM boundary_z10 WHERE zoom_level >= 13 - ) - SELECT geom, admin_level, scalerank::int, class FROM zoom_levels + ) AS zoom_levels WHERE geom && bbox; $$ LANGUAGE SQL IMMUTABLE; diff --git a/schema/layers/building.sql b/schema/layers/building.sql index 5f28b29..7f467ea 100644 --- a/schema/layers/building.sql +++ b/schema/layers/building.sql @@ -8,16 +8,15 @@ CREATE OR REPLACE VIEW building_z14 AS ( CREATE OR REPLACE FUNCTION layer_building(bbox geometry, zoom_level int) RETURNS TABLE(geom geometry, osm_id bigint, render_height float) AS $$ - WITH zoom_levels AS ( + SELECT way, osm_id, + least(greatest(3, COALESCE(height, levels*3.66,5)),400)^.7 AS render_height + FROM ( SELECT osm_id, ST_Simplify(way, 10) AS way, height, levels FROM building_z13 WHERE zoom_level = 13 UNION ALL SELECT * FROM building_z14 WHERE zoom_level >= 14 - ) - SELECT way, osm_id, - least(greatest(3, COALESCE(height, levels*3.66,5)),400)^.7 AS render_height - FROM zoom_levels + ) AS zoom_levels WHERE way && bbox ORDER BY render_height, ST_YMin(way) DESC; $$ LANGUAGE SQL IMMUTABLE; diff --git a/schema/layers/country.sql b/schema/layers/country.sql index 04bf46b..a80e503 100644 --- a/schema/layers/country.sql +++ b/schema/layers/country.sql @@ -27,7 +27,7 @@ CREATE OR REPLACE VIEW country_z5 AS ( CREATE OR REPLACE FUNCTION layer_country(bbox geometry, zoom_level int) RETURNS TABLE(geom geometry, name text, abbrev text, postal text, scalerank int, labelrank int) AS $$ - WITH zoom_levels AS ( + SELECT geom, name, abbrev, postal, scalerank::int, labelrank::int FROM ( SELECT * FROM country_z1 WHERE zoom_level = 1 UNION ALL @@ -39,8 +39,7 @@ RETURNS TABLE(geom geometry, name text, abbrev text, postal text, scalerank int, UNION ALL SELECT * FROM country_z5 WHERE zoom_level >= 5 - ) - SELECT geom, name, abbrev, postal, scalerank::int, labelrank::int FROM zoom_levels + ) AS t WHERE geom && bbox ORDER BY scalerank, labelrank, length(name); $$ LANGUAGE SQL IMMUTABLE; diff --git a/schema/layers/ice.sql b/schema/layers/ice.sql index c6e31be..52c1030 100644 --- a/schema/layers/ice.sql +++ b/schema/layers/ice.sql @@ -18,7 +18,7 @@ CREATE OR REPLACE VIEW ice_z5 AS ( CREATE OR REPLACE FUNCTION layer_ice(bbox geometry, zoom_level int) RETURNS TABLE(geom geometry, class text) AS $$ - WITH zoom_levels AS ( + SELECT geom, type::text AS class FROM ( SELECT ST_Simplify(geom, 80000) AS geom, type FROM ice_z0 WHERE zoom_level BETWEEN 0 AND 1 UNION ALL @@ -27,7 +27,6 @@ RETURNS TABLE(geom geometry, class text) AS $$ UNION ALL SELECT * FROM ice_z5 WHERE zoom_level BETWEEN 5 AND 8 - ) - SELECT geom, type::text AS class FROM zoom_levels + ) AS zoom_levels WHERE geom && bbox; $$ LANGUAGE SQL IMMUTABLE; diff --git a/schema/layers/place.sql b/schema/layers/place.sql index 05e0c7e..696d0d5 100644 --- a/schema/layers/place.sql +++ b/schema/layers/place.sql @@ -54,37 +54,7 @@ CREATE OR REPLACE VIEW place_z13 AS ( CREATE OR REPLACE FUNCTION layer_place(bbox geometry, zoom_level int, pixel_width numeric) RETURNS TABLE(geom geometry, name text, class text, rank text, scalerank int) AS $$ - WITH zoom_levels AS ( - SELECT * FROM place_z2 - WHERE zoom_level = 2 - UNION ALL - SELECT * FROM place_z3 - WHERE zoom_level = 3 - UNION ALL - SELECT * FROM place_z4 - WHERE zoom_level = 4 - UNION ALL - SELECT * FROM place_z5 - WHERE zoom_level = 5 - UNION ALL - SELECT * FROM place_z6 - WHERE zoom_level = 6 - UNION ALL - SELECT * FROM place_z7 - WHERE zoom_level = 7 - UNION ALL - SELECT * FROM place_z8 - WHERE zoom_level BETWEEN 8 AND 9 - UNION ALL - SELECT * FROM place_z10 - WHERE zoom_level = 10 - UNION ALL - SELECT * FROM place_z11 - WHERE zoom_level BETWEEN 11 AND 12 - UNION ALL - SELECT * FROM place_z13 - WHERE zoom_level >= 13 - ), ranked_places AS ( + SELECT geom, name, class, rank::text, scalerank FROM ( SELECT geom, name, class, rank, scalerank, row_number() OVER ( PARTITION BY LabelGrid(geom, 150 * pixel_width) @@ -98,10 +68,39 @@ RETURNS TABLE(geom geometry, name text, class text, rank text, scalerank int) AS population DESC NULLS LAST, length(name) DESC ) AS gridrank - FROM zoom_levels + FROM ( + SELECT * FROM place_z2 + WHERE zoom_level = 2 + UNION ALL + SELECT * FROM place_z3 + WHERE zoom_level = 3 + UNION ALL + SELECT * FROM place_z4 + WHERE zoom_level = 4 + UNION ALL + SELECT * FROM place_z5 + WHERE zoom_level = 5 + UNION ALL + SELECT * FROM place_z6 + WHERE zoom_level = 6 + UNION ALL + SELECT * FROM place_z7 + WHERE zoom_level = 7 + UNION ALL + SELECT * FROM place_z8 + WHERE zoom_level BETWEEN 8 AND 9 + UNION ALL + SELECT * FROM place_z10 + WHERE zoom_level = 10 + UNION ALL + SELECT * FROM place_z11 + WHERE zoom_level BETWEEN 11 AND 12 + UNION ALL + SELECT * FROM place_z13 + WHERE zoom_level >= 13 + ) AS zoom_levels WHERE geom && bbox - ) - SELECT geom, name, class, rank::text, scalerank FROM ranked_places + ) AS ranked_places WHERE zoom_level <= 7 OR (zoom_level = 8 AND gridrank <= 4) OR diff --git a/schema/layers/road.sql b/schema/layers/road.sql index 359b47c..9d1711a 100644 --- a/schema/layers/road.sql +++ b/schema/layers/road.sql @@ -124,6 +124,6 @@ RETURNS TABLE(geom geometry, class text) AS $$ SELECT * FROM road_z13 WHERE zoom_level = 13 UNION ALL SELECT * FROM road_z14 WHERE zoom_level >= 14 - ) AS t + ) AS zoom_levels WHERE geom && bbox; $$ LANGUAGE SQL IMMUTABLE; diff --git a/schema/layers/state.sql b/schema/layers/state.sql index 1a973f8..a68f40a 100644 --- a/schema/layers/state.sql +++ b/schema/layers/state.sql @@ -29,16 +29,15 @@ CREATE OR REPLACE VIEW state_z4 AS ( CREATE OR REPLACE FUNCTION layer_state(bbox geometry, zoom_level int) RETURNS TABLE(geom geometry, name text, name_en text, abbrev text, postal text, scalerank int, labelrank int) AS $$ - WITH zoom_levels AS ( + SELECT geom, + COALESCE(name_local, name_en) AS name_local, name_en, + abbrev, postal, scalerank::int, labelrank::int FROM ( SELECT * FROM state_z3 WHERE zoom_level = 3 UNION ALL SELECT * FROM state_z4 WHERE zoom_level >= 4 - ) - SELECT geom, - COALESCE(name_local, name_en) AS name_local, name_en, - abbrev, postal, scalerank::int, labelrank::int FROM zoom_levels + ) AS t WHERE geom && bbox ORDER BY scalerank ASC, labelrank ASC, shape_area DESC; $$ LANGUAGE SQL IMMUTABLE; diff --git a/schema/layers/urban.sql b/schema/layers/urban.sql index 15043d8..24949c0 100644 --- a/schema/layers/urban.sql +++ b/schema/layers/urban.sql @@ -16,7 +16,7 @@ CREATE OR REPLACE VIEW urban_z6 AS ( CREATE OR REPLACE FUNCTION layer_urban(bbox geometry, zoom_level int) RETURNS TABLE(geom geometry, scalerank int) AS $$ - WITH zoom_levels AS ( + SELECT geom, scalerank FROM ( SELECT * FROM urban_z4 WHERE zoom_level = 4 UNION ALL @@ -25,7 +25,6 @@ RETURNS TABLE(geom geometry, scalerank int) AS $$ UNION ALL SELECT * FROM urban_z6 WHERE zoom_level >= 6 AND scalerank-1 <= zoom_level - ) - SELECT geom, scalerank FROM zoom_levels + ) AS zoom_levels WHERE geom && bbox; $$ LANGUAGE SQL IMMUTABLE; diff --git a/schema/layers/water.sql b/schema/layers/water.sql index 94915b1..316d533 100644 --- a/schema/layers/water.sql +++ b/schema/layers/water.sql @@ -104,7 +104,7 @@ CREATE OR REPLACE VIEW water_z14 AS ( CREATE OR REPLACE FUNCTION layer_water (bbox geometry, zoom_level int) RETURNS TABLE(geom geometry) AS $$ - WITH zoom_levels AS ( + SELECT geom FROM ( SELECT * FROM water_z0 WHERE zoom_level = 0 UNION ALL @@ -143,7 +143,6 @@ RETURNS TABLE(geom geometry) AS $$ UNION ALL SELECT * FROM water_z14 WHERE zoom_level >= 14 - ) - SELECT geom FROM zoom_levels + ) AS zoom_levels WHERE geom && bbox; $$ LANGUAGE SQL IMMUTABLE;