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