Mercurial > gemma
comparison pkg/imports/bn.go @ 3698:063a1883b5cb
Detect and handle unchanged BN during import.
author | Sascha Wilde <wilde@intevation.de> |
---|---|
date | Wed, 19 Jun 2019 11:20:47 +0200 |
parents | c9e1848a516a |
children | b07511ff859e |
comparison
equal
deleted
inserted
replaced
3697:9ef98342ffe7 | 3698:063a1883b5cb |
---|---|
102 date_info = EXCLUDED.date_info, | 102 date_info = EXCLUDED.date_info, |
103 source_organization = EXCLUDED.source_organization | 103 source_organization = EXCLUDED.source_organization |
104 RETURNING id | 104 RETURNING id |
105 ` | 105 ` |
106 | 106 |
107 findExactMatchBottleneckSQL = ` | |
108 WITH | |
109 bounds (b) AS (VALUES (isrs_fromText($6)), (isrs_fromText($7))), | |
110 r AS (SELECT isrsrange( | |
111 (SELECT b FROM bounds ORDER BY b USING <~ FETCH FIRST ROW ONLY), | |
112 (SELECT b FROM bounds ORDER BY b USING >~ FETCH FIRST ROW ONLY)) AS r) | |
113 SELECT id FROM waterway.bottlenecks | |
114 WHERE ( | |
115 bottleneck_id, | |
116 validity, | |
117 gauge_location, | |
118 gauge_validity, | |
119 objnam, | |
120 nobjnm, | |
121 stretch, | |
122 area, | |
123 rb, | |
124 lb, | |
125 responsible_country, | |
126 revisiting_time, | |
127 limiting, | |
128 date_info, | |
129 source_organization, | |
130 staging_done | |
131 ) = ( SELECT | |
132 $1, | |
133 validity * $2, -- intersections with gauge validity ranges | |
134 location, | |
135 validity, | |
136 $4, | |
137 $5, | |
138 (SELECT r FROM r), | |
139 ISRSrange_area( | |
140 ISRSrange_axis((SELECT r FROM r), | |
141 $15), | |
142 (SELECT ST_Collect(CAST(area AS geometry)) | |
143 FROM waterway.waterway_area)), | |
144 $8, | |
145 $9, | |
146 $10, | |
147 $11::smallint, | |
148 $12, | |
149 $13::timestamptz, | |
150 $14, | |
151 true | |
152 FROM waterway.gauges | |
153 WHERE location = isrs_fromText($3) AND validity && $2 | |
154 ) | |
155 ` | |
156 | |
107 // Alignment with gauge validity might have generated new entries | 157 // Alignment with gauge validity might have generated new entries |
108 // for the same time range. Thus, remove the old ones | 158 // for the same time range. Thus, remove the old ones |
109 deleteObsoleteBNSQL = ` | 159 deleteObsoleteBNSQL = ` |
110 DELETE FROM waterway.bottlenecks | 160 DELETE FROM waterway.bottlenecks |
111 WHERE bottleneck_id = $1 AND validity <@ $2 AND id <> ALL($3) | 161 WHERE bottleneck_id = $1 AND validity <@ $2 AND id <> ALL($3) |
234 return nil, err | 284 return nil, err |
235 } | 285 } |
236 | 286 |
237 feedback.Info("Found %d bottlenecks for import", len(bns)) | 287 feedback.Info("Found %d bottlenecks for import", len(bns)) |
238 | 288 |
239 var insertStmt, deleteObsoleteBNStmt, fixValidityStmt, | 289 var insertStmt, findExactMatchingBNStmt, deleteObsoleteBNStmt, |
240 deleteMaterialStmt, insertMaterialStmt, trackStmt *sql.Stmt | 290 fixValidityStmt, deleteMaterialStmt, insertMaterialStmt, |
291 trackStmt *sql.Stmt | |
241 | 292 |
242 for _, x := range []struct { | 293 for _, x := range []struct { |
243 sql string | 294 sql string |
244 stmt **sql.Stmt | 295 stmt **sql.Stmt |
245 }{ | 296 }{ |
246 {insertBottleneckSQL, &insertStmt}, | 297 {insertBottleneckSQL, &insertStmt}, |
298 {findExactMatchBottleneckSQL, &findExactMatchingBNStmt}, | |
247 {deleteObsoleteBNSQL, &deleteObsoleteBNStmt}, | 299 {deleteObsoleteBNSQL, &deleteObsoleteBNStmt}, |
248 {fixBNValiditySQL, &fixValidityStmt}, | 300 {fixBNValiditySQL, &fixValidityStmt}, |
249 {deleteBottleneckMaterialSQL, &deleteMaterialStmt}, | 301 {deleteBottleneckMaterialSQL, &deleteMaterialStmt}, |
250 {insertBottleneckMaterialSQL, &insertMaterialStmt}, | 302 {insertBottleneckMaterialSQL, &insertMaterialStmt}, |
251 {trackImportSQL, &trackStmt}, | 303 {trackImportSQL, &trackStmt}, |
262 feedback.Info("Tolerance used to snap waterway axis: %g", tolerance) | 314 feedback.Info("Tolerance used to snap waterway axis: %g", tolerance) |
263 | 315 |
264 for _, bn := range bns { | 316 for _, bn := range bns { |
265 if err := storeBottleneck( | 317 if err := storeBottleneck( |
266 ctx, importID, conn, feedback, bn, &nids, tolerance, | 318 ctx, importID, conn, feedback, bn, &nids, tolerance, |
267 insertStmt, deleteObsoleteBNStmt, fixValidityStmt, | 319 insertStmt, findExactMatchingBNStmt, deleteObsoleteBNStmt, |
268 deleteMaterialStmt, insertMaterialStmt, trackStmt); err != nil { | 320 fixValidityStmt, deleteMaterialStmt, insertMaterialStmt, |
321 trackStmt); err != nil { | |
269 return nil, err | 322 return nil, err |
270 } | 323 } |
271 } | 324 } |
272 if len(nids) == 0 { | 325 if len(nids) == 0 { |
273 return nil, UnchangedError("No new bottlenecks inserted") | 326 return nil, UnchangedError("No new bottlenecks inserted") |
289 conn *sql.Conn, | 342 conn *sql.Conn, |
290 feedback Feedback, | 343 feedback Feedback, |
291 bn *ifbn.BottleNeckType, | 344 bn *ifbn.BottleNeckType, |
292 nids *[]string, | 345 nids *[]string, |
293 tolerance float64, | 346 tolerance float64, |
294 insertStmt, deleteObsoleteBNStmt, fixValidityStmt, | 347 insertStmt, findExactMatchingBNStmt, deleteObsoleteBNStmt, |
295 deleteMaterialStmt, insertMaterialStmt, trackStmt *sql.Stmt, | 348 fixValidityStmt, deleteMaterialStmt, insertMaterialStmt, |
349 trackStmt *sql.Stmt, | |
296 ) error { | 350 ) error { |
297 feedback.Info("Processing %s (%s)", bn.OBJNAM, bn.Bottleneck_id) | 351 feedback.Info("Processing %s (%s)", bn.OBJNAM, bn.Bottleneck_id) |
298 | 352 |
299 var tfrom, tto pgtype.Timestamptz | 353 var tfrom, tto pgtype.Timestamptz |
300 var uBound pgtype.BoundType | 354 var uBound pgtype.BoundType |
387 materials = append(materials, string(*material)) | 441 materials = append(materials, string(*material)) |
388 } | 442 } |
389 } | 443 } |
390 } | 444 } |
391 | 445 |
446 // Check if an bottleneck identical to the one we would insert already | |
447 // exists: | |
448 bns, err := findExactMatchingBNStmt.QueryContext(ctx, | |
449 bn.Bottleneck_id, | |
450 &validity, | |
451 bn.Fk_g_fid, | |
452 bn.OBJNAM, | |
453 bn.NOBJNM, | |
454 bn.From_ISRS, bn.To_ISRS, | |
455 rb, | |
456 lb, | |
457 country, | |
458 revisitingTime, | |
459 limiting, | |
460 bn.Date_Info, | |
461 bn.Source, | |
462 tolerance, | |
463 ) | |
464 | |
465 if err != nil { | |
466 return err | |
467 } | |
468 defer bns.Close() | |
469 if bns.Next() { | |
470 feedback.Info("unchanged") | |
471 return nil | |
472 } | |
473 | |
392 tx, err := conn.BeginTx(ctx, nil) | 474 tx, err := conn.BeginTx(ctx, nil) |
393 if err != nil { | 475 if err != nil { |
394 return err | 476 return err |
395 } | 477 } |
396 defer tx.Rollback() | 478 defer tx.Rollback() |
397 | 479 |
398 var bnIds []int64 | 480 var bnIds []int64 |
399 bns, err := tx.StmtContext(ctx, insertStmt).QueryContext(ctx, | 481 bns, err = tx.StmtContext(ctx, insertStmt).QueryContext(ctx, |
400 bn.Bottleneck_id, | 482 bn.Bottleneck_id, |
401 &validity, | 483 &validity, |
402 bn.Fk_g_fid, | 484 bn.Fk_g_fid, |
403 bn.OBJNAM, | 485 bn.OBJNAM, |
404 bn.NOBJNM, | 486 bn.NOBJNM, |