changeset 3008:f394e828a6d2

Separate view definitions for GeoServer from general schema definition That way OR REPLACE can be used which makes development on the views a lot easier, since the views can be altered without having to set up a completely new database each time.
author Tom Gottfried <tom@intevation.de>
date Thu, 11 Apr 2019 12:01:27 +0200
parents 792d4476d5d5
children ddc4d54b8331
files schema/gemma.sql schema/geoserver_views.sql schema/install-db.sh
diffstat 3 files changed, 145 insertions(+), 144 deletions(-) [+]
line wrap: on
line diff
--- a/schema/gemma.sql	Thu Apr 11 11:55:17 2019 +0200
+++ b/schema/gemma.sql	Thu Apr 11 12:01:27 2019 +0200
@@ -295,28 +295,6 @@
         value int NOT NULL
     )
 
-    CREATE VIEW gauges_geoserver AS
-    SELECT
-        g.location,
-        isrs_asText(g.location) AS isrs_code,
-        g.objname,
-        g.geom,
-        g.applicability_from_km,
-        g.applicability_to_km,
-        g.validity,
-        g.zero_point,
-        g.geodref,
-        g.date_info,
-        g.source_organization,
-        json_strip_nulls(json_object_agg(coalesce(r.depth_reference,'empty'),
-                                                  r.value))
-            AS reference_water_levels
-    FROM gauges g LEFT JOIN LATERAL (
-            SELECT gauge_id, depth_reference, value
-            FROM gauges_reference_water_levels
-            ) r ON r.gauge_id = g.location
-    GROUP BY g.location
-
     CREATE TABLE gauge_measurements (
         id int PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
         fk_gauge_id isrs NOT NULL REFERENCES gauges,
@@ -387,27 +365,6 @@
         related_enc varchar(12)
     )
 
-    -- A table to help geoserver serve the distance marks as WFS 1.1.0.
-    -- At least geoserver-2.13.2 does not serve type geography correctly
-    -- and does not serve the location_code as isrs type
-    CREATE VIEW distance_marks_geoserver AS
-        SELECT location_code,
-               isrs_asText(location_code) AS location,
-               geom::Geometry(POINT, 4326),
-               related_enc,
-               (location_code).hectometre
-            FROM distance_marks_virtual
-
-    CREATE VIEW distance_marks_ashore_geoserver AS
-        SELECT id,
-               country,
-               geom::Geometry(POINT, 4326),
-               related_enc,
-               hectom,
-               catdis,
-               position_code
-            FROM distance_marks
-
     -- We need to configure primary keys for the views used by
     -- geoserver for wfs, otherwise it will generate ids on the fly,
     -- which will change for the same feature...
@@ -438,6 +395,9 @@
         staging_done boolean NOT NULL DEFAULT false,
         UNIQUE(name, staging_done)
     )
+    CREATE TRIGGER stretches_date_info
+        BEFORE UPDATE ON stretches
+        FOR EACH ROW EXECUTE PROCEDURE update_date_info()
 
     CREATE TABLE stretch_countries (
         stretches_id int NOT NULL REFERENCES stretches(id)
@@ -446,28 +406,6 @@
         UNIQUE(stretches_id, country_code)
     )
 
-    -- Published view for GeoServer
-    CREATE VIEW stretches_geoserver AS SELECT
-        id,
-        name,
-        (stretch).lower::varchar as lower,
-        (stretch).upper::varchar as upper,
-        area::Geometry(MULTIPOLYGON, 4326),
-        objnam,
-        nobjnam,
-        date_info,
-        source_organization,
-        (SELECT string_agg(country_code, ', ')
-            FROM stretch_countries
-            WHERE stretches_id = id) AS countries,
-        staging_done
-    FROM stretches
-
-
-    CREATE TRIGGER sections_stretches_date_info
-        BEFORE UPDATE ON stretches
-        FOR EACH ROW EXECUTE PROCEDURE update_date_info()
-
     CREATE TABLE waterway_profiles (
         id int PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
         location isrs NOT NULL REFERENCES distance_marks_virtual,
@@ -578,17 +516,6 @@
             -- CHECK(ST_IsSimple(CAST(lines AS geometry))),
         PRIMARY KEY (sounding_result_id, height)
     )
-    -- A view to help geoserver serve contour lines.
-    -- At least geoserver-2.13.2 does not serve type geography correctly
-    CREATE VIEW sounding_results_contour_lines_geoserver AS
-        SELECT bottleneck_id,
-                date_info,
-                height,
-                CAST(lines AS geometry(multilinestring, 4326)) AS lines
-            FROM sounding_results_contour_lines cl
-                JOIN sounding_results sr
-                    ON sr.id = cl.sounding_result_id
-
     --
     -- Fairway availability
     --
@@ -647,60 +574,6 @@
         CHECK(measure_type = 'minimum guaranteed'
             OR value_lifetime IS NOT NULL)
     )
-
-    CREATE VIEW bottleneck_overview AS
-    SELECT
-      objnam AS name,
-      ST_Centroid(area)::Geometry(POINT, 4326) AS point,
-      (lower(stretch)).hectometre AS from,
-      (upper(stretch)).hectometre AS to,
-      sr.current::text,
-      responsible_country
-    FROM bottlenecks bn LEFT JOIN (
-      SELECT bottleneck_id, max(date_info) AS current FROM sounding_results
-      GROUP BY bottleneck_id) sr ON sr.bottleneck_id = bn.id
-    ORDER BY objnam
-
-    -- Published view for GeoServer
-    CREATE VIEW bottlenecks_geoserver AS
-    WITH
-    fairway_availability_latest AS (
-        SELECT DISTINCT ON (bottleneck_id) bottleneck_id, date_info, critical
-            FROM fairway_availability
-            ORDER BY bottleneck_id, date_info DESC),
-    waterlevel_latest AS (
-        SELECT DISTINCT ON (fk_gauge_id) fk_gauge_id, water_level
-            FROM gauge_measurements
-            WHERE is_waterlevel AND NOT predicted
-            ORDER BY fk_gauge_id, measure_date DESC)
-    SELECT
-        b.id,
-        b.bottleneck_id,
-        b.objnam,
-        b.nobjnm,
-        b.stretch,
-        b.area,
-        b.rb,
-        b.lb,
-        b.responsible_country,
-        b.revisiting_time,
-        b.limiting,
-        b.date_info,
-        b.source_organization,
-        g.location AS gauge_isrs_code,
-        g.objname AS gauge_objname,
-        json_strip_nulls(json_object_agg(coalesce(r.depth_reference,'empty'),
-                                                  r.value))
-            AS reference_water_levels,
-        fal.date_info AS fa_date_info,
-        fal.critical AS fa_critical,
-        wl.water_level AS gm_waterlevel
-    FROM bottlenecks b
-        LEFT JOIN gauges g ON b.fk_g_fid = g.location
-        LEFT JOIN gauges_reference_water_levels r ON g.location = r.gauge_id
-        LEFT JOIN fairway_availability_latest fal ON b.id = fal.bottleneck_id
-        LEFT JOIN waterlevel_latest wl ON b.fk_g_fid = wl.fk_gauge_id
-    GROUP BY b.id, g.location, fal.date_info, fal.critical, wl.water_level
 ;
 
 -- Configure primary keys for geoserver views
@@ -832,18 +705,4 @@
     )
 ;
 
-CREATE VIEW waterway.sounding_differences AS SELECT
-    sd.id           AS id,
-    bn.objnam       AS objnam,
-    srm.date_info   AS minuend,
-    srs.date_info   AS subtrahend,
-    sdcl.height     AS height,
-    CAST(sdcl.lines AS geometry(multilinestring, 4326)) AS lines
-FROM
-    caching.sounding_differences sd JOIN
-    caching.sounding_differences_contour_lines sdcl ON sd.id = sdcl.sounding_differences_id JOIN
-    waterway.sounding_results srm ON sd.minuend    = srm.id JOIN
-    waterway.sounding_results srs ON sd.subtrahend = srs.id JOIN
-    waterway.bottlenecks bn ON srm.bottleneck_id = bn.id;
-
 COMMIT;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/schema/geoserver_views.sql	Thu Apr 11 12:01:27 2019 +0200
@@ -0,0 +1,141 @@
+CREATE OR REPLACE VIEW waterway.gauges_geoserver AS
+    SELECT
+        g.location,
+        isrs_asText(g.location) AS isrs_code,
+        g.objname,
+        g.geom,
+        g.applicability_from_km,
+        g.applicability_to_km,
+        g.validity,
+        g.zero_point,
+        g.geodref,
+        g.date_info,
+        g.source_organization,
+        json_strip_nulls(json_object_agg(coalesce(r.depth_reference,'empty'),
+                                                  r.value))
+            AS reference_water_levels
+    FROM waterway.gauges g LEFT JOIN LATERAL (
+            SELECT gauge_id, depth_reference, value
+            FROM waterway.gauges_reference_water_levels
+            ) r ON r.gauge_id = g.location
+    GROUP BY g.location;
+
+CREATE OR REPLACE VIEW waterway.distance_marks_geoserver AS
+    SELECT location_code,
+       isrs_asText(location_code) AS location,
+       geom::Geometry(POINT, 4326),
+       related_enc,
+       (location_code).hectometre
+    FROM waterway.distance_marks_virtual;
+
+CREATE OR REPLACE VIEW waterway.distance_marks_ashore_geoserver AS
+    SELECT id,
+       country,
+       geom::Geometry(POINT, 4326),
+       related_enc,
+       hectom,
+       catdis,
+       position_code
+    FROM waterway.distance_marks;
+
+CREATE OR REPLACE VIEW waterway.bottlenecks_geoserver AS
+    WITH
+    fairway_availability_latest AS (
+        SELECT DISTINCT ON (bottleneck_id) bottleneck_id, date_info, critical
+            FROM waterway.fairway_availability
+            ORDER BY bottleneck_id, date_info DESC),
+    waterlevel_latest AS (
+        SELECT DISTINCT ON (fk_gauge_id) fk_gauge_id, water_level
+            FROM waterway.gauge_measurements
+            WHERE is_waterlevel AND NOT predicted
+            ORDER BY fk_gauge_id, measure_date DESC)
+    SELECT
+        b.id,
+        b.bottleneck_id,
+        b.objnam,
+        b.nobjnm,
+        b.stretch,
+        b.area,
+        b.rb,
+        b.lb,
+        b.responsible_country,
+        b.revisiting_time,
+        b.limiting,
+        b.date_info,
+        b.source_organization,
+        g.location AS gauge_isrs_code,
+        g.objname AS gauge_objname,
+        json_strip_nulls(json_object_agg(coalesce(r.depth_reference,'empty'),
+                                                  r.value))
+            AS reference_water_levels,
+        fal.date_info AS fa_date_info,
+        fal.critical AS fa_critical,
+        wl.water_level AS gm_waterlevel
+    FROM waterway.bottlenecks b
+        LEFT JOIN waterway.gauges g
+            ON b.fk_g_fid = g.location
+        LEFT JOIN waterway.gauges_reference_water_levels r
+            ON g.location = r.gauge_id
+        LEFT JOIN fairway_availability_latest fal
+            ON b.id = fal.bottleneck_id
+        LEFT JOIN waterlevel_latest wl
+            ON b.fk_g_fid = wl.fk_gauge_id
+    GROUP BY b.id, g.location, fal.date_info, fal.critical, wl.water_level;
+
+CREATE OR REPLACE VIEW waterway.stretches_geoserver AS
+    SELECT
+        id,
+        name,
+        (stretch).lower::varchar as lower,
+        (stretch).upper::varchar as upper,
+        area::Geometry(MULTIPOLYGON, 4326),
+        objnam,
+        nobjnam,
+        date_info,
+        source_organization,
+        (SELECT string_agg(country_code, ', ')
+            FROM waterway.stretch_countries
+            WHERE stretches_id = id) AS countries,
+        staging_done
+    FROM waterway.stretches;
+
+CREATE OR REPLACE VIEW waterway.sounding_results_contour_lines_geoserver AS
+    SELECT bottleneck_id,
+        date_info,
+        height,
+        CAST(lines AS geometry(multilinestring, 4326)) AS lines
+    FROM waterway.sounding_results_contour_lines cl
+        JOIN waterway.sounding_results sr ON sr.id = cl.sounding_result_id;
+
+CREATE OR REPLACE VIEW waterway.bottleneck_overview AS
+    SELECT
+        objnam AS name,
+        ST_Centroid(area)::Geometry(POINT, 4326) AS point,
+        (lower(stretch)).hectometre AS from,
+        (upper(stretch)).hectometre AS to,
+        sr.current::text,
+        responsible_country
+    FROM waterway.bottlenecks bn LEFT JOIN (
+        SELECT bottleneck_id, max(date_info) AS current
+            FROM waterway.sounding_results
+            GROUP BY bottleneck_id) sr ON sr.bottleneck_id = bn.id
+    ORDER BY objnam;
+
+CREATE OR REPLACE VIEW waterway.sounding_differences AS
+    SELECT
+        sd.id           AS id,
+        bn.objnam       AS objnam,
+        srm.date_info   AS minuend,
+        srs.date_info   AS subtrahend,
+        sdcl.height     AS height,
+        CAST(sdcl.lines AS geometry(multilinestring, 4326)) AS lines
+    FROM
+        caching.sounding_differences sd
+            JOIN caching.sounding_differences_contour_lines sdcl
+                ON sd.id = sdcl.sounding_differences_id
+            JOIN waterway.sounding_results srm
+                ON sd.minuend = srm.id
+            JOIN waterway.sounding_results srs
+                ON sd.subtrahend = srs.id
+            JOIN waterway.bottlenecks bn
+                ON srm.bottleneck_id = bn.id;
--- a/schema/install-db.sh	Thu Apr 11 11:55:17 2019 +0200
+++ b/schema/install-db.sh	Thu Apr 11 12:01:27 2019 +0200
@@ -132,6 +132,7 @@
        -f "$BASEDIR/manage_users.sql" \
        -f "$BASEDIR/auth.sql" \
        -f "$BASEDIR/isrs_functions.sql" \
+       -f "$BASEDIR/geoserver_views.sql" \
        -f "$BASEDIR/default_sysconfig.sql"