changeset 4967:3f704ebad0c5 fairway-marks-import

Follow-up of rev. 1b309a8e7673 for DAYMAR
author Tom Gottfried <tom@intevation.de>
date Fri, 28 Feb 2020 16:18:44 +0100
parents 3530d91c3da3
children 1ba11ade2cf3
files client/src/components/importconfiguration/types/Fairwaymarks.vue client/src/store/importschedule.js pkg/controllers/routes.go pkg/imports/fm.go pkg/imports/modelconvert.go schema/gemma.sql schema/updates/1408/01.distinguish_daymar_hydro_ienc.sql schema/version.sql
diffstat 8 files changed, 184 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/client/src/components/importconfiguration/types/Fairwaymarks.vue	Fri Feb 28 13:51:55 2020 +0100
+++ b/client/src/components/importconfiguration/types/Fairwaymarks.vue	Fri Feb 28 16:18:44 2020 +0100
@@ -133,7 +133,8 @@
     BOYLAT_ienc: "Buoy, lateral (IENC feature)",
     BOYSAW: "Buoy, safe water (MARITIME/Hydro feature)",
     BOYSPP: "Buoy, special purpose/general (MARITIME/Hydro feature)",
-    DAYMAR: "Daymark (MARITIME/Hydro feature)",
+    DAYMAR_hydro: "Daymark (MARITIME/Hydro feature)",
+    DAYMAR_ienc: "Daymark (IENC feature)",
     LIGHTS: "Light (MARITIME/Hydro feature)",
     RTPBCN: "Radar transponder beacon (MARITIME/Hydro feature)",
     TOPMAR: "Topmark (MARITIME/Hydro feature)",
--- a/client/src/store/importschedule.js	Fri Feb 28 13:51:55 2020 +0100
+++ b/client/src/store/importschedule.js	Fri Feb 28 16:18:44 2020 +0100
@@ -70,7 +70,8 @@
   fm_boylat_ienc: "boylat_ienc",
   fm_boysaw: "BOYSAW",
   fm_boyspp: "BOYSPP",
-  fm_daymar: "DAYMAR",
+  fm_daymar_hydro: "DAYMAR_hydro",
+  fm_daymar_ienc: "daymar_ienc",
   fm_lights: "LIGHTS",
   fm_rtpbcn: "RTPBCN",
   fm_topmar: "TOPMAR",
--- a/pkg/controllers/routes.go	Fri Feb 28 13:51:55 2020 +0100
+++ b/pkg/controllers/routes.go	Fri Feb 28 16:18:44 2020 +0100
@@ -250,7 +250,8 @@
 		"fm_boylat_ienc",
 		"fm_boysaw",
 		"fm_boyspp",
-		"fm_daymar",
+		"fm_daymar_hydro",
+		"fm_daymar_ienc",
 		"fm_lights",
 		"fm_rtpbcn",
 		"fm_topmar",
--- a/pkg/imports/fm.go	Fri Feb 28 13:51:55 2020 +0100
+++ b/pkg/imports/fm.go	Fri Feb 28 16:18:44 2020 +0100
@@ -108,14 +108,18 @@
 		Catspm *string `json:"hydro_catspm"`
 	}
 
-	daymarProperties struct {
+	daymarHydroProperties struct {
 		fairwayMarksProperties
-		Colour *string  `json:"hydro_colour"`
-		Colpat *string  `json:"hydro_colpat"`
-		Condtn *int     `json:"hydro_condtn"`
-		Dirimp *string  `json:"ienc_dirimp,omitempty"`
-		Topshp *int     `json:"hydro_topshp"`
-		Orient *float64 `json:"hydro_orient,omitempty"`
+		Colour *string `json:"hydro_colour"`
+		Colpat *string `json:"hydro_colpat"`
+		Condtn *int    `json:"hydro_condtn"`
+		Topshp *int    `json:"hydro_topshp"`
+	}
+
+	daymarIencProperties struct {
+		daymarHydroProperties
+		Dirimp *string  `json:"ienc_dirimp"`
+		Orient *float64 `json:"hydro_orient"`
 	}
 
 	lightsProperties struct {
@@ -178,7 +182,8 @@
 	BOYCARJobKind      JobKind = "fm_boycar"
 	BOYSAWJobKind      JobKind = "fm_boysaw"
 	BOYSPPJobKind      JobKind = "fm_boyspp"
-	DAYMARJobKind      JobKind = "fm_daymar"
+	DAYMARHYDROJobKind JobKind = "fm_daymar_hydro"
+	DAYMARIENCJobKind  JobKind = "fm_daymar_ienc"
 	LIGHTSJobKind      JobKind = "fm_lights"
 	NOTMRKJobKind      JobKind = "fm_notmrk"
 	RTPBCNJobKind      JobKind = "fm_rtpbcn"
@@ -296,19 +301,34 @@
 			),
 		})
 
-	RegisterJobCreator(DAYMARJobKind,
+	RegisterJobCreator(DAYMARHYDROJobKind,
 		&PointWFSJobCreator{
-			description: "fairway marks daymar",
-			depends:     [2][]string{{"fairway_marks_daymar"}, {}},
+			description: "fairway marks daymar (HYDRO)",
+			depends:     [2][]string{{"fairway_marks_daymar_hydro"}, {}},
 			newConsumer: newSQLConsumer(
 				prepareStmnts(
-					createInsertFMSQL("daymar",
+					createInsertFMSQL("daymar_hydro",
+						"colour", "colpat", "condtn", "topshp"),
+				),
+				consumeDAYMARHydro,
+				createInvalidation("daymar_hydro"),
+				func() interface{} { return new(daymarHydroProperties) },
+			),
+		})
+
+	RegisterJobCreator(DAYMARIENCJobKind,
+		&PointWFSJobCreator{
+			description: "fairway marks daymar (IENC)",
+			depends:     [2][]string{{"fairway_marks_daymar_ienc"}, {}},
+			newConsumer: newSQLConsumer(
+				prepareStmnts(
+					createInsertFMSQL("daymar_ienc",
 						"colour", "colpat", "condtn", "topshp", "orient"),
 					insertDaymarDirimpSQL,
 				),
-				consumeDAYMAR,
-				createInvalidation("daymar"),
-				func() interface{} { return new(daymarProperties) },
+				consumeDAYMARIenc,
+				createInvalidation("daymar_ienc"),
+				func() interface{} { return new(daymarIencProperties) },
 			),
 		})
 
@@ -867,13 +887,57 @@
 	return nil
 }
 
-func consumeDAYMAR(
+func consumeDAYMARHydro(
 	spc *SQLPointConsumer,
 	points pointSlice,
 	properties interface{},
 	epsg int,
 ) error {
-	props := properties.(*daymarProperties)
+	props := properties.(*daymarHydroProperties)
+
+	var fmid int64
+	err := spc.savepoint(func() error {
+		return spc.stmts[0].QueryRowContext(
+			spc.ctx,
+			points.asWKB(),
+			epsg,
+			props.Datsta,
+			props.Datend,
+			props.Persta,
+			props.Perend,
+			props.Objnam,
+			props.Nobjnm,
+			props.Inform,
+			props.Ninfom,
+			props.Scamin,
+			props.Picrep,
+			props.Txtdsc,
+			props.Sordat,
+			props.Sorind,
+			props.Colour,
+			props.Colpat,
+			props.Condtn,
+			props.Topshp,
+		).Scan(&fmid)
+	})
+	switch {
+	case err == sql.ErrNoRows:
+		return ErrFeatureDuplicated
+		// ignore -> filtered by responsibility area or a duplicate
+	case err != nil:
+		spc.feedback.Error(pgxutils.ReadableError{Err: err}.Error())
+		return ErrFeatureIgnored
+	}
+	return nil
+}
+
+func consumeDAYMARIenc(
+	spc *SQLPointConsumer,
+	points pointSlice,
+	properties interface{},
+	epsg int,
+) error {
+	props := properties.(*daymarIencProperties)
 
 	var fmid int64
 	err := spc.savepoint(func() error {
--- a/pkg/imports/modelconvert.go	Fri Feb 28 13:51:55 2020 +0100
+++ b/pkg/imports/modelconvert.go	Fri Feb 28 16:18:44 2020 +0100
@@ -34,7 +34,8 @@
 	BOYLATIENCJobKind:  func() interface{} { return FindJobCreator(BOYLATIENCJobKind).Create() },
 	BOYSAWJobKind:      func() interface{} { return FindJobCreator(BOYSAWJobKind).Create() },
 	BOYSPPJobKind:      func() interface{} { return FindJobCreator(BOYSPPJobKind).Create() },
-	DAYMARJobKind:      func() interface{} { return FindJobCreator(DAYMARJobKind).Create() },
+	DAYMARHYDROJobKind: func() interface{} { return FindJobCreator(DAYMARHYDROJobKind).Create() },
+	DAYMARIENCJobKind:  func() interface{} { return FindJobCreator(DAYMARIENCJobKind).Create() },
 	LIGHTSJobKind:      func() interface{} { return FindJobCreator(LIGHTSJobKind).Create() },
 	RTPBCNJobKind:      func() interface{} { return FindJobCreator(RTPBCNJobKind).Create() },
 	TOPMARJobKind:      func() interface{} { return FindJobCreator(TOPMARJobKind).Create() },
--- a/schema/gemma.sql	Fri Feb 28 13:51:55 2020 +0100
+++ b/schema/gemma.sql	Fri Feb 28 16:18:44 2020 +0100
@@ -1022,26 +1022,43 @@
 
     -- Additional attributes for IENC features DAYMAR/daymar
     CREATE TABLE fairway_marks_daymar (
-        id int PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
         colour varchar,
         colpat varchar,
         condtn int,
-        topshp int,
-        orient double precision
+        topshp int
     ) INHERITS (fairway_marks)
+
+    CREATE TABLE fairway_marks_daymar_hydro (
+        id int PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
+    ) INHERITS (fairway_marks_daymar)
     -- Prevent identical entries using composite type comparison
     -- (i.e. considering two NULL values in a field equal):
-    CREATE UNIQUE INDEX fairway_marks_daymar_distinct_rows
-        ON fairway_marks_daymar
+    CREATE UNIQUE INDEX fairway_marks_daymar_hydro_distinct_rows
+        ON fairway_marks_daymar_hydro
         ((CAST((validity, last_found, geom,
                 datsta, datend, persta, perend, objnam, nobjnm, inform, ninfom,
                 scamin, picrep, txtdsc, sordat, sorind,
-                0, colour, colpat, condtn, topshp, orient
-            ) AS fairway_marks_daymar)
+                colour, colpat, condtn, topshp, 0
+            ) AS fairway_marks_daymar_hydro)
+        ))
+
+    CREATE TABLE fairway_marks_daymar_ienc (
+        orient double precision,
+        id int PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
+    ) INHERITS (fairway_marks_daymar)
+    -- Prevent identical entries using composite type comparison
+    -- (i.e. considering two NULL values in a field equal):
+    CREATE UNIQUE INDEX fairway_marks_daymar_ienc_distinct_rows
+        ON fairway_marks_daymar_ienc
+        ((CAST((validity, last_found, geom,
+                datsta, datend, persta, perend, objnam, nobjnm, inform, ninfom,
+                scamin, picrep, txtdsc, sordat, sorind,
+                colour, colpat, condtn, topshp, orient, 0
+            ) AS fairway_marks_daymar_ienc)
         ))
 
     CREATE TABLE fairway_marks_daymar_dirimps (
-        fm_daymar_id int REFERENCES fairway_marks_daymar,
+        fm_daymar_id int REFERENCES fairway_marks_daymar_ienc,
         dirimp smallint REFERENCES dirimps,
         PRIMARY KEY (fm_daymar_id, dirimp)
     )
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/schema/updates/1408/01.distinguish_daymar_hydro_ienc.sql	Fri Feb 28 16:18:44 2020 +0100
@@ -0,0 +1,69 @@
+CREATE TABLE waterway.fairway_marks_daymar_new (
+    colour varchar,
+    colpat varchar,
+    condtn int,
+    topshp int
+) INHERITS (waterway.fairway_marks);
+
+CREATE TABLE waterway.fairway_marks_daymar_hydro (
+    id int PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
+) INHERITS (waterway.fairway_marks_daymar_new);
+CREATE UNIQUE INDEX fairway_marks_daymar_hydro_distinct_rows
+    ON waterway.fairway_marks_daymar_hydro
+    ((CAST((validity, last_found, geom,
+            datsta, datend, persta, perend, objnam, nobjnm, inform, ninfom,
+            scamin, picrep, txtdsc, sordat, sorind,
+            colour, colpat, condtn, topshp, 0
+        ) AS waterway.fairway_marks_daymar_hydro)
+    ));
+
+CREATE TABLE waterway.fairway_marks_daymar_ienc (
+    orient double precision,
+    id int PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
+) INHERITS (waterway.fairway_marks_daymar_new);
+CREATE UNIQUE INDEX fairway_marks_daymar_ienc_distinct_rows
+    ON waterway.fairway_marks_daymar_ienc
+    ((CAST((validity, last_found, geom,
+            datsta, datend, persta, perend, objnam, nobjnm, inform, ninfom,
+            scamin, picrep, txtdsc, sordat, sorind,
+            colour, colpat, condtn, topshp, orient, 0
+        ) AS waterway.fairway_marks_daymar_ienc)
+    ));
+
+-- Assume all features not being definitely IENC features are HYDRO features
+INSERT INTO waterway.fairway_marks_daymar_hydro
+    OVERRIDING USER VALUE
+    SELECT validity, last_found, geom,
+            datsta, datend, persta, perend, objnam, nobjnm, inform, ninfom,
+            scamin, picrep, txtdsc, sordat, sorind,
+            colour, colpat, condtn, topshp, id
+        FROM waterway.fairway_marks_daymar
+        WHERE orient IS NULL AND id NOT IN(
+            SELECT fm_daymar_id FROM waterway.fairway_marks_daymar_dirimps);
+
+INSERT INTO waterway.fairway_marks_daymar_ienc
+    SELECT validity, last_found, geom,
+            datsta, datend, persta, perend, objnam, nobjnm, inform, ninfom,
+            scamin, picrep, txtdsc, sordat, sorind,
+            colour, colpat, condtn, topshp, orient, id
+        FROM waterway.fairway_marks_daymar
+        WHERE orient IS NOT NULL OR id IN(
+            SELECT fm_daymar_id FROM waterway.fairway_marks_daymar_dirimps);
+SELECT setval(
+        pg_get_serial_sequence('waterway.fairway_marks_daymar_ienc', 'id'),
+        max(id))
+    FROM waterway.fairway_marks_daymar_ienc;
+
+-- Let foreign key constraint point to new table
+ALTER TABLE waterway.fairway_marks_daymar_dirimps
+    DROP CONSTRAINT fairway_marks_daymar_dirimps_fm_daymar_id_fkey,
+    ADD FOREIGN KEY (fm_daymar_id)
+        REFERENCES waterway.fairway_marks_daymar_ienc;
+
+-- Finally
+DROP TABLE waterway.fairway_marks_daymar;
+ALTER TABLE waterway.fairway_marks_daymar_new RENAME TO fairway_marks_daymar;
+
+GRANT SELECT on ALL tables in schema waterway TO waterway_user;
+GRANT INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA waterway
+    TO waterway_admin;
--- a/schema/version.sql	Fri Feb 28 13:51:55 2020 +0100
+++ b/schema/version.sql	Fri Feb 28 16:18:44 2020 +0100
@@ -1,1 +1,1 @@
-INSERT INTO gemma_schema_version(version) VALUES (1407);
+INSERT INTO gemma_schema_version(version) VALUES (1408);