changeset 4964:58dc06e91c39 fairway-marks-import

Follow-up of rev. 1b309a8e7673 for BOYLAT
author Tom Gottfried <tom@intevation.de>
date Fri, 28 Feb 2020 13:43:52 +0100
parents 1e47ba2a58f2
children be713316b47a
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/1407/01.distinguish_boylat_hydro_ienc.sql
diffstat 7 files changed, 171 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/client/src/components/importconfiguration/types/Fairwaymarks.vue	Fri Feb 28 12:01:03 2020 +0100
+++ b/client/src/components/importconfiguration/types/Fairwaymarks.vue	Fri Feb 28 13:43:52 2020 +0100
@@ -129,7 +129,8 @@
     bcnlat_ienc: "Beacon, lateral (IENC feature)",
     BOYCAR: "Buoy, cardinal (MARITIME/Hydro feature)",
     BOYISD: "Buoy, isolated danger (MARITIME/Hydro feature)",
-    BOYLAT: "Buoy, lateral (MARITIME/Hydro feature)",
+    BOYLAT_hydro: "Buoy, lateral (MARITIME/Hydro feature)",
+    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)",
--- a/client/src/store/importschedule.js	Fri Feb 28 12:01:03 2020 +0100
+++ b/client/src/store/importschedule.js	Fri Feb 28 13:43:52 2020 +0100
@@ -66,7 +66,8 @@
   fm_bcnlat_ienc: "bcnlat_ienc",
   fm_boycar: "BOYCAR",
   fm_boyisd: "BOYISD",
-  fm_boylat: "BOYLAT",
+  fm_boylat_hydro: "BOYLAT_hydro",
+  fm_boylat_ienc: "boylat_ienc",
   fm_boysaw: "BOYSAW",
   fm_boyspp: "BOYSPP",
   fm_daymar: "DAYMAR",
--- a/pkg/controllers/routes.go	Fri Feb 28 12:01:03 2020 +0100
+++ b/pkg/controllers/routes.go	Fri Feb 28 13:43:52 2020 +0100
@@ -246,7 +246,8 @@
 		"fm_bcnlat_hydro",
 		"fm_bcnlat_ienc",
 		"fm_boycar",
-		"fm_boylat",
+		"fm_boylat_hydro",
+		"fm_boylat_ienc",
 		"fm_boysaw",
 		"fm_boyspp",
 		"fm_daymar",
--- a/pkg/imports/fm.go	Fri Feb 28 12:01:03 2020 +0100
+++ b/pkg/imports/fm.go	Fri Feb 28 13:43:52 2020 +0100
@@ -61,14 +61,22 @@
 
 	boylatProperties struct {
 		fairwayMarksProperties
-		Colour      *string `json:"hydro_colour"`
-		Colpat      *string `json:"hydro_colpat"`
-		Conrad      *int    `json:"hydro_conrad"`
-		HydroMarsys *int64  `json:"hydro_marsys,omitempty"`
-		IENCMarsys  *int64  `json:"ienc_marsys,omitempty"`
-		Boyshp      *int    `json:"hydro_boyshp"`
-		HydroCatlam *int64  `json:"hydro_catlam,omitempty"`
-		IENCCatlam  *int64  `json:"ienc_catlam,omitempty"`
+		Colour *string `json:"hydro_colour"`
+		Colpat *string `json:"hydro_colpat"`
+		Conrad *int    `json:"hydro_conrad"`
+		Boyshp *int    `json:"hydro_boyshp"`
+	}
+
+	boylatHydroProperties struct {
+		boylatProperties
+		Marsys *int64 `json:"hydro_marsys"`
+		Catlam *int64 `json:"hydro_catlam"`
+	}
+
+	boylatIencProperties struct {
+		boylatProperties
+		Marsys *int64 `json:"ienc_marsys"`
+		Catlam *int64 `json:"ienc_catlam"`
 	}
 
 	boycarProperties struct {
@@ -165,7 +173,8 @@
 const (
 	BCNLATHYDROJobKind JobKind = "fm_bcnlat_hydro"
 	BCNLATIENCJobKind  JobKind = "fm_bcnlat_ienc"
-	BOYLATJobKind      JobKind = "fm_boylat"
+	BOYLATHYDROJobKind JobKind = "fm_boylat_hydro"
+	BOYLATIENCJobKind  JobKind = "fm_boylat_ienc"
 	BOYCARJobKind      JobKind = "fm_boycar"
 	BOYSAWJobKind      JobKind = "fm_boysaw"
 	BOYSPPJobKind      JobKind = "fm_boyspp"
@@ -208,19 +217,35 @@
 			),
 		})
 
-	RegisterJobCreator(BOYLATJobKind,
+	RegisterJobCreator(BOYLATHYDROJobKind,
 		&PointWFSJobCreator{
-			description: "fairway marks boylat",
-			depends:     [2][]string{{"fairway_marks_boylat"}, {}},
+			description: "fairway marks boylat (HYDRO)",
+			depends:     [2][]string{{"fairway_marks_boylat_hydro"}, {}},
 			newConsumer: newSQLConsumer(
 				prepareStmnts(
-					createInsertFMSQL("boylat",
+					createInsertFMSQL("boylat_hydro",
 						"colour", "colpat", "conrad",
 						"marsys", "boyshp", "catlam"),
 				),
-				consumeBOYLAT,
-				createInvalidation("boylat"),
-				func() interface{} { return new(boylatProperties) },
+				consumeBOYLATHydro,
+				createInvalidation("boylat_hydro"),
+				func() interface{} { return new(boylatHydroProperties) },
+			),
+		})
+
+	RegisterJobCreator(BOYLATIENCJobKind,
+		&PointWFSJobCreator{
+			description: "fairway marks boylat (IENC)",
+			depends:     [2][]string{{"fairway_marks_boylat_ienc"}, {}},
+			newConsumer: newSQLConsumer(
+				prepareStmnts(
+					createInsertFMSQL("boylat_ienc",
+						"colour", "colpat", "conrad",
+						"marsys", "boyshp", "catlam"),
+				),
+				consumeBOYLATIenc,
+				createInvalidation("boylat_ienc"),
+				func() interface{} { return new(boylatIencProperties) },
 			),
 		})
 
@@ -616,16 +641,13 @@
 	return nil
 }
 
-func consumeBOYLAT(
+func consumeBOYLATHydro(
 	spc *SQLPointConsumer,
 	points pointSlice,
 	properties interface{},
 	epsg int,
 ) error {
-	props := properties.(*boylatProperties)
-
-	marsys := coalesceInt64(props.HydroMarsys, props.IENCMarsys)
-	catlam := coalesceInt64(props.HydroCatlam, props.IENCCatlam)
+	props := properties.(*boylatHydroProperties)
 
 	var fmid int64
 	err := spc.savepoint(func() error {
@@ -649,9 +671,55 @@
 			props.Colour,
 			props.Colpat,
 			props.Conrad,
-			marsys,
+			props.Marsys,
 			props.Boyshp,
-			catlam,
+			props.Catlam,
+		).Scan(&fmid)
+	})
+	switch {
+	case err == sql.ErrNoRows:
+		return ErrFeatureDuplicated
+		// ignore -> filtered by responsibility_areas
+	case err != nil:
+		spc.feedback.Error(pgxutils.ReadableError{Err: err}.Error())
+		return ErrFeatureIgnored
+	}
+	return nil
+}
+
+func consumeBOYLATIenc(
+	spc *SQLPointConsumer,
+	points pointSlice,
+	properties interface{},
+	epsg int,
+) error {
+	props := properties.(*boylatIencProperties)
+
+	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.Conrad,
+			props.Marsys,
+			props.Boyshp,
+			props.Catlam,
 		).Scan(&fmid)
 	})
 	switch {
--- a/pkg/imports/modelconvert.go	Fri Feb 28 12:01:03 2020 +0100
+++ b/pkg/imports/modelconvert.go	Fri Feb 28 13:43:52 2020 +0100
@@ -30,7 +30,8 @@
 	BCNLATHYDROJobKind: func() interface{} { return FindJobCreator(BCNLATHYDROJobKind).Create() },
 	BCNLATIENCJobKind:  func() interface{} { return FindJobCreator(BCNLATIENCJobKind).Create() },
 	BOYCARJobKind:      func() interface{} { return FindJobCreator(BOYCARJobKind).Create() },
-	BOYLATJobKind:      func() interface{} { return FindJobCreator(BOYLATJobKind).Create() },
+	BOYLATHYDROJobKind: func() interface{} { return FindJobCreator(BOYLATHYDROJobKind).Create() },
+	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() },
--- a/schema/gemma.sql	Fri Feb 28 12:01:03 2020 +0100
+++ b/schema/gemma.sql	Fri Feb 28 13:43:52 2020 +0100
@@ -943,7 +943,6 @@
 
     -- Additional attributes for IENC feature BOYLAT
     CREATE TABLE fairway_marks_boylat (
-        id int PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
         colour varchar,
         colpat varchar,
         conrad int,
@@ -951,15 +950,33 @@
         boyshp int,
         catlam int
     ) INHERITS (fairway_marks)
+
+    CREATE TABLE fairway_marks_boylat_hydro (
+        id int PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
+    ) INHERITS (fairway_marks_boylat)
     -- Prevent identical entries using composite type comparison
     -- (i.e. considering two NULL values in a field equal):
-    CREATE UNIQUE INDEX fairway_marks_boylat_distinct_rows
-        ON fairway_marks_boylat
+    CREATE UNIQUE INDEX fairway_marks_boylat_hydro_distinct_rows
+        ON fairway_marks_boylat_hydro
         ((CAST((validity, last_found, geom,
                 datsta, datend, persta, perend, objnam, nobjnm, inform, ninfom,
                 scamin, picrep, txtdsc, sordat, sorind,
-                0, colour, colpat, conrad, marsys, boyshp, catlam
-            ) AS fairway_marks_boylat)
+                colour, colpat, conrad, marsys, boyshp, catlam, 0
+            ) AS fairway_marks_boylat_hydro)
+        ))
+
+    CREATE TABLE fairway_marks_boylat_ienc (
+        id int PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
+    ) INHERITS (fairway_marks_boylat)
+    -- Prevent identical entries using composite type comparison
+    -- (i.e. considering two NULL values in a field equal):
+    CREATE UNIQUE INDEX fairway_marks_boylat_ienc_distinct_rows
+        ON fairway_marks_boylat_ienc
+        ((CAST((validity, last_found, geom,
+                datsta, datend, persta, perend, objnam, nobjnm, inform, ninfom,
+                scamin, picrep, txtdsc, sordat, sorind,
+                colour, colpat, conrad, marsys, boyshp, catlam, 0
+            ) AS fairway_marks_boylat_ienc)
         ))
 
     -- Additional attributes for IENC feature BOYSAW
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/schema/updates/1407/01.distinguish_boylat_hydro_ienc.sql	Fri Feb 28 13:43:52 2020 +0100
@@ -0,0 +1,50 @@
+CREATE TABLE waterway.fairway_marks_boylat_new (
+    colour varchar,
+    colpat varchar,
+    conrad int,
+    marsys int,
+    boyshp int,
+    catlam int
+) INHERITS (waterway.fairway_marks);
+
+CREATE TABLE waterway.fairway_marks_boylat_hydro (
+    id int PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
+) INHERITS (waterway.fairway_marks_boylat_new);
+CREATE UNIQUE INDEX fairway_marks_boylat_hydro_distinct_rows
+    ON waterway.fairway_marks_boylat_hydro
+    ((CAST((validity, last_found, geom,
+            datsta, datend, persta, perend, objnam, nobjnm, inform, ninfom,
+            scamin, picrep, txtdsc, sordat, sorind,
+            colour, colpat, conrad, marsys, boyshp, catlam, 0
+        ) AS waterway.fairway_marks_boylat_hydro)
+    ));
+
+CREATE TABLE waterway.fairway_marks_boylat_ienc (
+    id int PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
+) INHERITS (waterway.fairway_marks_boylat_new);
+CREATE UNIQUE INDEX fairway_marks_boylat_ienc_distinct_rows
+    ON waterway.fairway_marks_boylat_ienc
+    ((CAST((validity, last_found, geom,
+            datsta, datend, persta, perend, objnam, nobjnm, inform, ninfom,
+            scamin, picrep, txtdsc, sordat, sorind,
+            colour, colpat, conrad, marsys, boyshp, catlam, 0
+        ) AS waterway.fairway_marks_boylat_ienc)
+    ));
+
+-- Assume all features are IENC features, since there are currently only
+-- very few features in the data source for HYDRO features
+INSERT INTO waterway.fairway_marks_boylat_ienc
+    OVERRIDING USER VALUE
+    SELECT validity, last_found, geom,
+            datsta, datend, persta, perend, objnam, nobjnm, inform, ninfom,
+            scamin, picrep, txtdsc, sordat, sorind,
+            colour, colpat, conrad, marsys, boyshp, catlam, id
+        FROM waterway.fairway_marks_boylat;
+
+-- Finally
+DROP TABLE waterway.fairway_marks_boylat;
+ALTER TABLE waterway.fairway_marks_boylat_new RENAME TO fairway_marks_boylat;
+
+GRANT SELECT on ALL tables in schema waterway TO waterway_user;
+GRANT INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA waterway
+    TO waterway_admin;