comparison pkg/imports/bn.go @ 3656:2a079d0a71c1

Ensure sounding results are associated to matching bottleneck version
author Tom Gottfried <tom@intevation.de>
date Thu, 13 Jun 2019 19:13:42 +0200
parents 0ec5c8ec1e44
children 29ef6d41e4af
comparison
equal deleted inserted replaced
3649:fb8a53c7c6d3 3656:2a079d0a71c1
105 $13, 105 $13,
106 $14 106 $14
107 ) 107 )
108 RETURNING id` 108 RETURNING id`
109 109
110 moveSRSQL = `
111 UPDATE waterway.sounding_results
112 -- Associate measurements to matching bottleneck version
113 SET bottleneck_validity = $2
114 WHERE bottleneck_id = $1
115 AND CAST(date_info AS timestamptz) <@ CAST($2 AS tstzrange)
116 `
117
110 fixBNValiditySQL = ` 118 fixBNValiditySQL = `
111 UPDATE waterway.bottlenecks SET 119 UPDATE waterway.bottlenecks SET
112 -- Set enddate of old entry to new startdate in case of overlap: 120 -- Set enddate of old entry to new startdate in case of overlap:
113 validity = validity - $2 121 validity = validity - $2
114 WHERE bottleneck_id = $1 122 WHERE bottleneck_id = $1
263 return nil, err 271 return nil, err
264 } 272 }
265 273
266 feedback.Info("Found %d bottlenecks for import", len(bns)) 274 feedback.Info("Found %d bottlenecks for import", len(bns))
267 275
268 var hasStmt, insertStmt, fixValidityStmt, updateStmt, 276 var hasStmt, insertStmt, moveSRStmt, fixValidityStmt, updateStmt,
269 deleteMaterialStmt, insertMaterialStmt, trackStmt *sql.Stmt 277 deleteMaterialStmt, insertMaterialStmt, trackStmt *sql.Stmt
270 278
271 for _, x := range []struct { 279 for _, x := range []struct {
272 sql string 280 sql string
273 stmt **sql.Stmt 281 stmt **sql.Stmt
274 }{ 282 }{
275 {hasBottleneckSQL, &hasStmt}, 283 {hasBottleneckSQL, &hasStmt},
276 {insertBottleneckSQL, &insertStmt}, 284 {insertBottleneckSQL, &insertStmt},
285 {moveSRSQL, &moveSRStmt},
277 {fixBNValiditySQL, &fixValidityStmt}, 286 {fixBNValiditySQL, &fixValidityStmt},
278 {updateBottleneckSQL, &updateStmt}, 287 {updateBottleneckSQL, &updateStmt},
279 {deleteBottleneckMaterialSQL, &deleteMaterialStmt}, 288 {deleteBottleneckMaterialSQL, &deleteMaterialStmt},
280 {insertBottleneckMaterialSQL, &insertMaterialStmt}, 289 {insertBottleneckMaterialSQL, &insertMaterialStmt},
281 {trackImportSQL, &trackStmt}, 290 {trackImportSQL, &trackStmt},
292 feedback.Info("Tolerance used to snap waterway axis: %g", tolerance) 301 feedback.Info("Tolerance used to snap waterway axis: %g", tolerance)
293 302
294 for _, bn := range bns { 303 for _, bn := range bns {
295 if err := storeBottleneck( 304 if err := storeBottleneck(
296 ctx, importID, conn, feedback, bn, &nids, tolerance, 305 ctx, importID, conn, feedback, bn, &nids, tolerance,
297 hasStmt, insertStmt, fixValidityStmt, updateStmt, 306 hasStmt, insertStmt, moveSRStmt, fixValidityStmt, updateStmt,
298 deleteMaterialStmt, insertMaterialStmt, trackStmt); err != nil { 307 deleteMaterialStmt, insertMaterialStmt, trackStmt); err != nil {
299 return nil, err 308 return nil, err
300 } 309 }
301 } 310 }
302 if len(nids) == 0 { 311 if len(nids) == 0 {
319 conn *sql.Conn, 328 conn *sql.Conn,
320 feedback Feedback, 329 feedback Feedback,
321 bn *ifbn.BottleNeckType, 330 bn *ifbn.BottleNeckType,
322 nids *[]string, 331 nids *[]string,
323 tolerance float64, 332 tolerance float64,
324 hasStmt, insertStmt, fixValidityStmt, updateStmt, 333 hasStmt, insertStmt, moveSRStmt, fixValidityStmt, updateStmt,
325 deleteMaterialStmt, insertMaterialStmt, trackStmt *sql.Stmt, 334 deleteMaterialStmt, insertMaterialStmt, trackStmt *sql.Stmt,
326 ) error { 335 ) error {
327 feedback.Info("Processing %s (%s)", bn.OBJNAM, bn.Bottleneck_id) 336 feedback.Info("Processing %s (%s)", bn.OBJNAM, bn.Bottleneck_id)
328 337
329 if bn.AdditionalData == nil || bn.AdditionalData.KeyValuePair == nil { 338 if bn.AdditionalData == nil || bn.AdditionalData.KeyValuePair == nil {
501 return err 510 return err
502 } 511 }
503 } 512 }
504 } 513 }
505 514
515 // Move sounding results to new matching bottleneck version, if applicable
516 if _, err = tx.StmtContext(ctx, moveSRStmt).ExecContext(ctx,
517 bn.Bottleneck_id,
518 &validity,
519 ); err != nil {
520 feedback.Warn(handleError(err).Error())
521 if err2 := tx.Rollback(); err2 != nil {
522 return err2
523 }
524 return nil
525 }
526
506 // Set end of validity of old version to start of new version 527 // Set end of validity of old version to start of new version
507 // in case of overlap 528 // in case of overlap
508 if _, err = tx.StmtContext(ctx, fixValidityStmt).ExecContext(ctx, 529 if _, err = tx.StmtContext(ctx, fixValidityStmt).ExecContext(ctx,
509 bn.Bottleneck_id, 530 bn.Bottleneck_id,
510 validity, 531 validity,