diff pkg/imports/wg.go @ 3648:0ec5c8ec1e44

Avoid empty validity time ranges An entry which is not valid at any point in time makes no sense. Further, multiple of such entries would violate a UNIQUE constraint. Since an UPDATE now can change validity time ranges, do all the adjustments for that regardles of whether an INSERT or UPDATE happens.
author Tom Gottfried <tom@intevation.de>
date Wed, 12 Jun 2019 18:26:26 +0200
parents 02951a62e8c6
children 29ef6d41e4af
line wrap: on
line diff
--- a/pkg/imports/wg.go	Wed Jun 12 18:21:14 2019 +0200
+++ b/pkg/imports/wg.go	Wed Jun 12 18:26:26 2019 +0200
@@ -79,8 +79,8 @@
     erased = true
   WHERE isrs_astext(location) = $1
     AND NOT erased
-    -- Don't touch old entry if validity did not change: will be updated
-    AND validity <> $2
+    -- Don't touch old entry if new validity contains old: will be updated
+    AND NOT validity <@ $2
   RETURNING 1
 )
 -- Decide whether a new version will be INSERTed
@@ -151,7 +151,8 @@
   geodref = $12,
   date_info = $13,
   source_organization = $14,
-  lastupdate = $15
+  lastupdate = $15,
+  validity = $16
 WHERE location = ($1::char(2), $2::char(3), $3::char(5), $4::char(5), $5::int)
   AND NOT erased
   AND $15 > lastupdate
@@ -375,44 +376,6 @@
 					unchanged++
 					continue
 				}
-				// Move gauge measurements and bottlenecks to new matching
-				// gauge version, if applicable
-				if _, err = tx.StmtContext(ctx, moveGMStmt).ExecContext(ctx,
-					code.String(),
-					&validity,
-				); err != nil {
-					feedback.Warn(handleError(err).Error())
-					if err2 := tx.Rollback(); err2 != nil {
-						return nil, err2
-					}
-					unchanged++
-					continue
-				}
-				if _, err = tx.StmtContext(ctx, moveBNStmt).ExecContext(ctx,
-					code.String(),
-					&validity,
-				); err != nil {
-					feedback.Warn(handleError(err).Error())
-					if err2 := tx.Rollback(); err2 != nil {
-						return nil, err2
-					}
-					unchanged++
-					continue
-				}
-				// Set end of validity of old version to start of new version
-				// in case of overlap
-				if _, err = tx.StmtContext(ctx, fixValidityStmt).ExecContext(
-					ctx,
-					code.String(),
-					&validity,
-				); err != nil {
-					feedback.Warn(handleError(err).Error())
-					if err2 := tx.Rollback(); err2 != nil {
-						return nil, err2
-					}
-					unchanged++
-					continue
-				}
 				feedback.Info("insert new version")
 			case !isNew:
 				// try to update
@@ -432,6 +395,7 @@
 					&dateInfo,
 					source,
 					time.Time(*dr.Lastupdate),
+					&validity,
 				).Scan(&dummy)
 				switch {
 				case err2 == sql.ErrNoRows:
@@ -482,6 +446,46 @@
 				}
 			}
 
+			// Move gauge measurements and bottlenecks to new matching
+			// gauge version, if applicable
+			if _, err = tx.StmtContext(ctx, moveGMStmt).ExecContext(ctx,
+				code.String(),
+				&validity,
+			); err != nil {
+				feedback.Warn(handleError(err).Error())
+				if err2 := tx.Rollback(); err2 != nil {
+					return nil, err2
+				}
+				unchanged++
+				continue
+			}
+			if _, err = tx.StmtContext(ctx, moveBNStmt).ExecContext(ctx,
+				code.String(),
+				&validity,
+			); err != nil {
+				feedback.Warn(handleError(err).Error())
+				if err2 := tx.Rollback(); err2 != nil {
+					return nil, err2
+				}
+				unchanged++
+				continue
+			}
+
+			// Set end of validity of old version to start of new version
+			// in case of overlap
+			if _, err = tx.StmtContext(ctx, fixValidityStmt).ExecContext(
+				ctx,
+				code.String(),
+				&validity,
+			); err != nil {
+				feedback.Warn(handleError(err).Error())
+				if err2 := tx.Rollback(); err2 != nil {
+					return nil, err2
+				}
+				unchanged++
+				continue
+			}
+
 			// "Upsert" reference water levels
 			for _, wl := range []struct {
 				level **erdms.RisreflevelcodeType