changeset 5031:8c590ef35280

Improve feedback if geometry cannot be stored This is also a backout of rev. 36a3dce20232
author Tom Gottfried <tom@intevation.de>
date Wed, 18 Mar 2020 19:19:09 +0100
parents 737d7859dd86
children afc242588642
files pkg/imports/fd.go pkg/pgxutils/errors.go schema/gemma.sql schema/updates/1429/01.disallow_empty_fairway_dimensions.sql schema/version.sql
diffstat 5 files changed, 21 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/imports/fd.go	Wed Mar 18 18:42:30 2020 +0100
+++ b/pkg/imports/fd.go	Wed Mar 18 19:19:09 2020 +0100
@@ -158,8 +158,7 @@
   min_depth,
   date_info,
   source_organization)
-SELECT dmp.geom, $3, $4, $5, $6, $7, $8
-  FROM ST_GeomFromWKB($1, $2::integer) AS new_fd (new_fd),
+SELECT
     ST_Multi(ST_CollectionExtract(ST_MakeValid(ST_Transform(
       CASE WHEN pg_has_role('sys_admin', 'MEMBER')
         THEN new_fd
@@ -167,8 +166,12 @@
             (SELECT ST_Buffer(a, -0.0001) FROM resp),
             ST_MakeValid(ST_Transform(new_fd, (SELECT ST_SRID(a) FROM resp))))
         END,
-      4326)), 3)) AS dmp (geom)
-  WHERE NOT ST_IsEmpty(dmp.geom)
+      4326)), 3)),
+    $3, $4, $5, $6, $7, $8
+  FROM ST_GeomFromWKB($1, $2::integer) AS new_fd (new_fd)
+  WHERE pg_has_role('sys_admin', 'MEMBER')
+    OR ST_Intersects((SELECT a FROM resp),
+      ST_MakeValid(ST_Transform(new_fd, (SELECT ST_SRID(a) FROM resp))))
 RETURNING id,
   ST_X(ST_Centroid(area::geometry)),
   ST_Y(ST_Centroid(area::geometry))
@@ -340,9 +343,7 @@
 	}
 
 	if outside > 0 {
-		feedback.Info(
-			"Features outside responsibility area or no valid polygon: %d",
-			outside)
+		feedback.Info("Features outside responsibility area: %d", outside)
 	}
 
 	if features == 0 {
--- a/pkg/pgxutils/errors.go	Wed Mar 18 18:42:30 2020 +0100
+++ b/pkg/pgxutils/errors.go	Wed Mar 18 19:19:09 2020 +0100
@@ -158,6 +158,12 @@
 					c = http.StatusConflict
 					return
 				}
+			case "fairway_dimensions":
+				switch err.ConstraintName {
+				case "fairway_dimensions_area_check":
+					m = "Geometry could not be stored as valid, non-empty polygon"
+					return
+				}
 			}
 		case "internal":
 			switch err.TableName {
--- a/schema/gemma.sql	Wed Mar 18 18:42:30 2020 +0100
+++ b/schema/gemma.sql	Wed Mar 18 19:19:09 2020 +0100
@@ -708,7 +708,8 @@
     CREATE TABLE fairway_dimensions (
         id int PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
         area geography(MULTIPOLYGON, 4326) NOT NULL
-            CHECK(ST_IsValid(CAST(area AS geometry))),
+            CHECK(ST_IsValid(CAST(area AS geometry))
+                AND NOT ST_IsEmpty(CAST(area AS geometry))),
         level_of_service smallint NOT NULL REFERENCES levels_of_service,
         min_width smallint NOT NULL,
         max_width smallint NOT NULL,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/schema/updates/1429/01.disallow_empty_fairway_dimensions.sql	Wed Mar 18 19:19:09 2020 +0100
@@ -0,0 +1,4 @@
+ALTER TABLE waterway.fairway_dimensions
+    DROP CONSTRAINT fairway_dimensions_area_check,
+    ADD CHECK(ST_IsValid(CAST(area AS geometry))
+        AND NOT ST_IsEmpty(CAST(area AS geometry)))
--- a/schema/version.sql	Wed Mar 18 18:42:30 2020 +0100
+++ b/schema/version.sql	Wed Mar 18 19:19:09 2020 +0100
@@ -1,1 +1,1 @@
-INSERT INTO gemma_schema_version(version) VALUES (1428);
+INSERT INTO gemma_schema_version(version) VALUES (1429);