Mercurial > gemma
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;