changeset 4970:5890e62e6d52 fairway-marks-import

Simplified storing of fm types to database.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Fri, 28 Feb 2020 18:24:36 +0100
parents 5621586e7a54
children de190de05f67
files go.mod go.sum pkg/imports/fm.go
diffstat 3 files changed, 39 insertions(+), 595 deletions(-) [+]
line wrap: on
line diff
--- a/go.mod	Fri Feb 28 17:55:55 2020 +0100
+++ b/go.mod	Fri Feb 28 18:24:36 2020 +0100
@@ -5,6 +5,7 @@
 require (
 	github.com/cockroachdb/apd v1.1.0 // indirect
 	github.com/etcd-io/bbolt v1.3.3
+	github.com/fatih/structs v1.1.0
 	github.com/fogleman/contourmap v0.0.0-20190814184649-9f61d36c4199
 	github.com/gofrs/uuid v3.2.0+incompatible // indirect
 	github.com/gorilla/mux v1.7.3
--- a/go.sum	Fri Feb 28 17:55:55 2020 +0100
+++ b/go.sum	Fri Feb 28 18:24:36 2020 +0100
@@ -26,6 +26,8 @@
 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 github.com/etcd-io/bbolt v1.3.3 h1:gSJmxrs37LgTqR/oyJBWok6k6SvXEUerFTbltIhXkBM=
 github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw=
+github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
+github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
 github.com/fogleman/contourmap v0.0.0-20190814184649-9f61d36c4199 h1:kufr0u0RIG5ACpjFsPRbbuHa0FhMWsS3tnSFZ2hf07s=
 github.com/fogleman/contourmap v0.0.0-20190814184649-9f61d36c4199/go.mod h1:mqaaaP4j7nTF8T/hx5OCljA7BYWHmrH2uh+Q023OchE=
 github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
--- a/pkg/imports/fm.go	Fri Feb 28 17:55:55 2020 +0100
+++ b/pkg/imports/fm.go	Fri Feb 28 18:24:36 2020 +0100
@@ -20,6 +20,7 @@
 	"strings"
 
 	"gemma.intevation.de/gemma/pkg/pgxutils"
+	"github.com/fatih/structs"
 )
 
 type (
@@ -174,6 +175,18 @@
 	}
 )
 
+func (props *bcnlatIencProperties) attrib() *string {
+	return props.Dirimp
+}
+
+func (props *daymarIencProperties) attrib() *string {
+	return props.Dirimp
+}
+
+func (props *notmrkProperties) attrib() *string {
+	return props.Dirimp
+}
+
 const (
 	BCNLATHYDROJobKind JobKind = "fm_bcnlat_hydro"
 	BCNLATIENCJobKind  JobKind = "fm_bcnlat_ienc"
@@ -200,7 +213,7 @@
 					createInsertFMSQL("bcnlat_hydro",
 						"colour", "colpat", "condtn", "bcnshp", "catlam"),
 				),
-				consumeBCNLATHydro,
+				consume,
 				createInvalidation("bcnlat_hydro"),
 				func() interface{} { return new(bcnlatHydroProperties) },
 			),
@@ -216,7 +229,7 @@
 						"colour", "colpat", "condtn", "bcnshp", "catlam"),
 					insertBcnlatDirimpSQL,
 				),
-				consumeBCNLATIenc,
+				consume,
 				createInvalidation("bcnlat_ienc"),
 				func() interface{} { return new(bcnlatIencProperties) },
 			),
@@ -232,7 +245,7 @@
 						"colour", "colpat", "conrad",
 						"marsys", "boyshp", "catlam"),
 				),
-				consumeBOYLATHydro,
+				consume,
 				createInvalidation("boylat_hydro"),
 				func() interface{} { return new(boylatHydroProperties) },
 			),
@@ -248,7 +261,7 @@
 						"colour", "colpat", "conrad",
 						"marsys", "boyshp", "catlam"),
 				),
-				consumeBOYLATIenc,
+				consume,
 				createInvalidation("boylat_ienc"),
 				func() interface{} { return new(boylatIencProperties) },
 			),
@@ -264,7 +277,7 @@
 						"colour", "colpat", "conrad",
 						"marsys", "boyshp", "catcam"),
 				),
-				consumeBOYCAR,
+				consume,
 				createInvalidation("boycar"),
 				func() interface{} { return new(boycarProperties) },
 			),
@@ -279,7 +292,7 @@
 					createInsertFMSQL("boysaw",
 						"colour", "colpat", "conrad", "marsys", "boyshp"),
 				),
-				consumeBOYSAW,
+				consume,
 				createInvalidation("boysaw"),
 				func() interface{} { return new(boysawProperties) },
 			),
@@ -295,7 +308,7 @@
 						"colour", "colpat", "conrad",
 						"marsys", "boyshp", "catspm"),
 				),
-				consumeBOYSPP,
+				consume,
 				createInvalidation("boyspp"),
 				func() interface{} { return new(boysppProperties) },
 			),
@@ -310,7 +323,7 @@
 					createInsertFMSQL("daymar_hydro",
 						"colour", "colpat", "condtn", "topshp"),
 				),
-				consumeDAYMARHydro,
+				consume,
 				createInvalidation("daymar_hydro"),
 				func() interface{} { return new(daymarHydroProperties) },
 			),
@@ -326,7 +339,7 @@
 						"colour", "colpat", "condtn", "topshp", "orient"),
 					insertDaymarDirimpSQL,
 				),
-				consumeDAYMARIenc,
+				consume,
 				createInvalidation("daymar_ienc"),
 				func() interface{} { return new(daymarIencProperties) },
 			),
@@ -345,7 +358,7 @@
 						"sectr2", "siggrp", "sigper",
 						"sigseq", "status"),
 				),
-				consumeLIGHTS,
+				consume,
 				createInvalidation("lights"),
 				func() interface{} { return new(lightsProperties) },
 			),
@@ -364,7 +377,7 @@
 						"disbk2", "fnctnm", "bnkwtw"),
 					insertNotmrkDirimpSQL,
 				),
-				consumeNOTMRK,
+				consume,
 				createInvalidation("notmark"),
 				func() interface{} { return new(notmrkProperties) },
 			),
@@ -379,7 +392,7 @@
 					createInsertFMSQL("rtpbcn",
 						"condtn", "siggrp", "catrtb", "radwal"),
 				),
-				consumeRTPBCN,
+				consume,
 				createInvalidation("rtpbcn"),
 				func() interface{} { return new(rtpbcnProperties) },
 			),
@@ -394,7 +407,7 @@
 					createInsertFMSQL("topmar",
 						"colour", "colpat", "condtn", "topshp"),
 				),
-				consumeTOPMAR,
+				consume,
 				createInvalidation("topmar"),
 				func() interface{} { return new(topmarProperties) },
 			),
@@ -548,38 +561,22 @@
 	}
 }
 
-func consumeBCNLATHydro(
+func consume(
 	spc *SQLPointConsumer,
 	points pointSlice,
 	properties interface{},
 	epsg int,
 ) error {
-	props := properties.(*bcnlatHydroProperties)
-
 	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.Bcnshp,
-			props.Catlam,
+			append(
+				[]interface{}{
+					points.asWKB(),
+					epsg,
+				},
+				structs.Values(properties)...)...,
 		).Scan(&fmid)
 	})
 	switch {
@@ -589,566 +586,10 @@
 	case err != nil:
 		spc.feedback.Error(pgxutils.ReadableError{Err: err}.Error())
 		return ErrFeatureIgnored
-	}
-	return nil
-}
-
-func consumeBCNLATIenc(
-	spc *SQLPointConsumer,
-	points pointSlice,
-	properties interface{},
-	epsg int,
-) error {
-	props := properties.(*bcnlatIencProperties)
-
-	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.Bcnshp,
-			props.Catlam,
-		).Scan(&fmid)
-	})
-	switch {
-	case err == sql.ErrNoRows:
-		return ErrFeatureDuplicated
-		// ignore -> filtered by responsibility area or a duplicate
-		// TODO: handle eventual changes to dirimp
-	case err != nil:
-		spc.feedback.Error(pgxutils.ReadableError{Err: err}.Error())
-		return ErrFeatureIgnored
 	default:
-		storeAttribs(spc, fmid, props.Dirimp)
-	}
-	return nil
-}
-
-func consumeBOYLATHydro(
-	spc *SQLPointConsumer,
-	points pointSlice,
-	properties interface{},
-	epsg int,
-) error {
-	props := properties.(*boylatHydroProperties)
-
-	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 {
-	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 {
-	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 consumeBOYCAR(
-	spc *SQLPointConsumer,
-	points pointSlice,
-	properties interface{},
-	epsg int,
-) error {
-	props := properties.(*boycarProperties)
-	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.Catcam,
-		).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 consumeBOYSAW(
-	spc *SQLPointConsumer,
-	points pointSlice,
-	properties interface{},
-	epsg int,
-) error {
-	props := properties.(*boysawProperties)
-	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,
-		).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 consumeBOYSPP(
-	spc *SQLPointConsumer,
-	points pointSlice,
-	properties interface{},
-	epsg int,
-) error {
-	props := properties.(*boysppProperties)
-	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.Catspm,
-		).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
+		if attr, ok := properties.(interface{ attrib() *string }); ok {
+			storeAttribs(spc, fmid, attr.attrib())
+		}
 	}
 	return nil
 }
-
-func consumeDAYMARHydro(
-	spc *SQLPointConsumer,
-	points pointSlice,
-	properties interface{},
-	epsg int,
-) error {
-	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 {
-		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,
-			props.Orient,
-		).Scan(&fmid)
-	})
-	switch {
-	case err == sql.ErrNoRows:
-		return ErrFeatureDuplicated
-		// ignore -> filtered by responsibility area or a duplicate
-		// TODO: handle eventual changes to dirimp
-	case err != nil:
-		spc.feedback.Error(pgxutils.ReadableError{Err: err}.Error())
-		return ErrFeatureIgnored
-	default:
-		storeAttribs(spc, fmid, props.Dirimp)
-	}
-	return nil
-}
-
-func consumeLIGHTS(
-	spc *SQLPointConsumer,
-	points pointSlice,
-	properties interface{},
-	epsg int,
-) error {
-	props := properties.(*lightsProperties)
-
-	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.Condtn,
-			props.Orient,
-			props.Catlit,
-			props.Exclit,
-			props.Litchr,
-			props.Litvis,
-			props.Mltylt,
-			props.Sectr1,
-			props.Sectr2,
-			props.Siggrp,
-			props.Sigper,
-			props.Sigseq,
-			props.Status,
-		).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 consumeNOTMRK(
-	spc *SQLPointConsumer,
-	points pointSlice,
-	properties interface{},
-	epsg int,
-) error {
-	props := properties.(*notmrkProperties)
-	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.Condtn,
-			props.Marsys,
-			props.Orient,
-			props.Status,
-			props.Addmrk,
-			props.Catnmk,
-			props.Disipd,
-			props.Disipu,
-			props.Disbk1,
-			props.Disbk2,
-			props.Fnctnm,
-			props.Bnkwtw,
-		).Scan(&fmid)
-	})
-	switch {
-	case err == sql.ErrNoRows:
-		return ErrFeatureDuplicated
-		// ignore -> filtered by responsibility area or a duplicate
-		// TODO: handle eventual changes to dirimp
-	case err != nil:
-		spc.feedback.Error(pgxutils.ReadableError{Err: err}.Error())
-		return ErrFeatureIgnored
-	default:
-		storeAttribs(spc, fmid, props.Dirimp)
-	}
-	return nil
-}
-
-func consumeRTPBCN(
-	spc *SQLPointConsumer,
-	points pointSlice,
-	properties interface{},
-	epsg int,
-) error {
-	props := properties.(*rtpbcnProperties)
-	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.Condtn,
-			props.Siggrp,
-			props.Catrtb,
-			props.Radwal,
-		).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 consumeTOPMAR(
-	spc *SQLPointConsumer,
-	points pointSlice,
-	properties interface{},
-	epsg int,
-) error {
-	props := properties.(*topmarProperties)
-	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
-}