comparison 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
comparison
equal deleted inserted replaced
3647:123b9341408e 3648:0ec5c8ec1e44
77 WITH upd AS ( 77 WITH upd AS (
78 UPDATE waterway.gauges SET 78 UPDATE waterway.gauges SET
79 erased = true 79 erased = true
80 WHERE isrs_astext(location) = $1 80 WHERE isrs_astext(location) = $1
81 AND NOT erased 81 AND NOT erased
82 -- Don't touch old entry if validity did not change: will be updated 82 -- Don't touch old entry if new validity contains old: will be updated
83 AND validity <> $2 83 AND NOT validity <@ $2
84 RETURNING 1 84 RETURNING 1
85 ) 85 )
86 -- Decide whether a new version will be INSERTed 86 -- Decide whether a new version will be INSERTed
87 SELECT EXISTS(SELECT 1 FROM upd) 87 SELECT EXISTS(SELECT 1 FROM upd)
88 OR NOT EXISTS(SELECT 1 FROM waterway.gauges WHERE isrs_astext(location) = $1) 88 OR NOT EXISTS(SELECT 1 FROM waterway.gauges WHERE isrs_astext(location) = $1)
149 applicability_to_km = $10, 149 applicability_to_km = $10,
150 zero_point = $11, 150 zero_point = $11,
151 geodref = $12, 151 geodref = $12,
152 date_info = $13, 152 date_info = $13,
153 source_organization = $14, 153 source_organization = $14,
154 lastupdate = $15 154 lastupdate = $15,
155 validity = $16
155 WHERE location = ($1::char(2), $2::char(3), $3::char(5), $4::char(5), $5::int) 156 WHERE location = ($1::char(2), $2::char(3), $3::char(5), $4::char(5), $5::int)
156 AND NOT erased 157 AND NOT erased
157 AND $15 > lastupdate 158 AND $15 > lastupdate
158 RETURNING 1 159 RETURNING 1
159 ` 160 `
373 return nil, err2 374 return nil, err2
374 } 375 }
375 unchanged++ 376 unchanged++
376 continue 377 continue
377 } 378 }
378 // Move gauge measurements and bottlenecks to new matching
379 // gauge version, if applicable
380 if _, err = tx.StmtContext(ctx, moveGMStmt).ExecContext(ctx,
381 code.String(),
382 &validity,
383 ); err != nil {
384 feedback.Warn(handleError(err).Error())
385 if err2 := tx.Rollback(); err2 != nil {
386 return nil, err2
387 }
388 unchanged++
389 continue
390 }
391 if _, err = tx.StmtContext(ctx, moveBNStmt).ExecContext(ctx,
392 code.String(),
393 &validity,
394 ); err != nil {
395 feedback.Warn(handleError(err).Error())
396 if err2 := tx.Rollback(); err2 != nil {
397 return nil, err2
398 }
399 unchanged++
400 continue
401 }
402 // Set end of validity of old version to start of new version
403 // in case of overlap
404 if _, err = tx.StmtContext(ctx, fixValidityStmt).ExecContext(
405 ctx,
406 code.String(),
407 &validity,
408 ); err != nil {
409 feedback.Warn(handleError(err).Error())
410 if err2 := tx.Rollback(); err2 != nil {
411 return nil, err2
412 }
413 unchanged++
414 continue
415 }
416 feedback.Info("insert new version") 379 feedback.Info("insert new version")
417 case !isNew: 380 case !isNew:
418 // try to update 381 // try to update
419 var dummy int 382 var dummy int
420 err2 := tx.StmtContext(ctx, updateStmt).QueryRowContext(ctx, 383 err2 := tx.StmtContext(ctx, updateStmt).QueryRowContext(ctx,
430 dr.Zeropoint, 393 dr.Zeropoint,
431 geodref, 394 geodref,
432 &dateInfo, 395 &dateInfo,
433 source, 396 source,
434 time.Time(*dr.Lastupdate), 397 time.Time(*dr.Lastupdate),
398 &validity,
435 ).Scan(&dummy) 399 ).Scan(&dummy)
436 switch { 400 switch {
437 case err2 == sql.ErrNoRows: 401 case err2 == sql.ErrNoRows:
438 feedback.Info("unchanged") 402 feedback.Info("unchanged")
439 if err3 := tx.Rollback(); err3 != nil { 403 if err3 := tx.Rollback(); err3 != nil {
480 if err := rwls.Err(); err != nil { 444 if err := rwls.Err(); err != nil {
481 return nil, err 445 return nil, err
482 } 446 }
483 } 447 }
484 448
449 // Move gauge measurements and bottlenecks to new matching
450 // gauge version, if applicable
451 if _, err = tx.StmtContext(ctx, moveGMStmt).ExecContext(ctx,
452 code.String(),
453 &validity,
454 ); err != nil {
455 feedback.Warn(handleError(err).Error())
456 if err2 := tx.Rollback(); err2 != nil {
457 return nil, err2
458 }
459 unchanged++
460 continue
461 }
462 if _, err = tx.StmtContext(ctx, moveBNStmt).ExecContext(ctx,
463 code.String(),
464 &validity,
465 ); err != nil {
466 feedback.Warn(handleError(err).Error())
467 if err2 := tx.Rollback(); err2 != nil {
468 return nil, err2
469 }
470 unchanged++
471 continue
472 }
473
474 // Set end of validity of old version to start of new version
475 // in case of overlap
476 if _, err = tx.StmtContext(ctx, fixValidityStmt).ExecContext(
477 ctx,
478 code.String(),
479 &validity,
480 ); err != nil {
481 feedback.Warn(handleError(err).Error())
482 if err2 := tx.Rollback(); err2 != nil {
483 return nil, err2
484 }
485 unchanged++
486 continue
487 }
488
485 // "Upsert" reference water levels 489 // "Upsert" reference water levels
486 for _, wl := range []struct { 490 for _, wl := range []struct {
487 level **erdms.RisreflevelcodeType 491 level **erdms.RisreflevelcodeType
488 value **erdms.RisreflevelvalueType 492 value **erdms.RisreflevelvalueType
489 }{ 493 }{