annotate pkg/imports/gm.go @ 5520:05db984d3db1

Improve performance of bottleneck area calculation Avoid buffer calculations by replacing them with simple distance comparisons and calculate the boundary of the result geometry only once per iteration. In some edge cases with very large numbers of iterations, this reduced the runtime of a bottleneck import by a factor of more than twenty.
author Tom Gottfried <tom@intevation.de>
date Thu, 21 Oct 2021 19:50:39 +0200
parents 5f47eeea988d
children 133dc5b3076a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
1 // This is Free Software under GNU Affero General Public License v >= 3.0
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
2 // without warranty, see README.md and license for details.
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
3 //
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
4 // SPDX-License-Identifier: AGPL-3.0-or-later
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
5 // License-Filename: LICENSES/AGPL-3.0.txt
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
6 //
3176
1cb6676d1510 Handle failing INSERTs gracefully during gauge measurements import
Tom Gottfried <tom@intevation.de>
parents: 2849
diff changeset
7 // Copyright (C) 2018, 2019 by via donau
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
8 // – Österreichische Wasserstraßen-Gesellschaft mbH
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
9 // Software engineering by Intevation GmbH
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
10 //
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
11 // Author(s):
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
12 // * Raimund Renkert <raimund.renkert@intevation.de>
2245
7d784840a9a7 Uploaded gauge measurements: Initial commit. TODO: Add endpoint.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2244
diff changeset
13 // * Sascha L. Teichmann <sascha.teichmann@intevation.de>
3176
1cb6676d1510 Handle failing INSERTs gracefully during gauge measurements import
Tom Gottfried <tom@intevation.de>
parents: 2849
diff changeset
14 // * Tom Gottfried <tom.gottfried@intevation.de>
1694
4a2fad8f57de Imports: Resolved golint issues unrelated to exported symbols commenting.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 1688
diff changeset
15
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
16 package imports
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
17
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
18 import (
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
19 "context"
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
20 "database/sql"
1772
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
21 "fmt"
3301
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
22 "sort"
1772
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
23 "strings"
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
24 "time"
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
25
5490
5f47eeea988d Use own logging package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5035
diff changeset
26 "github.com/jackc/pgx/pgtype"
5f47eeea988d Use own logging package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5035
diff changeset
27
5f47eeea988d Use own logging package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5035
diff changeset
28 "gemma.intevation.de/gemma/pkg/log"
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
29 "gemma.intevation.de/gemma/pkg/models"
4062
6c760abcff0e Move handling of PostgreSQL errors to own package
Tom Gottfried <tom@intevation.de>
parents: 4058
diff changeset
30 "gemma.intevation.de/gemma/pkg/pgxutils"
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
31 "gemma.intevation.de/gemma/pkg/soap/nts"
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
32 )
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
33
1696
ad5e1cddaa09 Imports: Resolved the remaining golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1694
diff changeset
34 // GaugeMeasurement is an import job to import
ad5e1cddaa09 Imports: Resolved the remaining golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1694
diff changeset
35 // gauges measurement data from a NtS SOAP service.
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
36 type GaugeMeasurement struct {
1696
ad5e1cddaa09 Imports: Resolved the remaining golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1694
diff changeset
37 // URL is the URL of the SOAP service.
ad5e1cddaa09 Imports: Resolved the remaining golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1694
diff changeset
38 URL string `json:"url"`
ad5e1cddaa09 Imports: Resolved the remaining golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1694
diff changeset
39 // Insecure indicates if HTTPS traffic
ad5e1cddaa09 Imports: Resolved the remaining golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1694
diff changeset
40 // should validate certificates or not.
ad5e1cddaa09 Imports: Resolved the remaining golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1694
diff changeset
41 Insecure bool `json:"insecure"`
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
42 }
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
43
4852
046a07a33b19 Fixed the golint issues of the imports package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4848
diff changeset
44 // Description gives a short info about relevant facts of this import.
4798
ca6a5f722471 Added Description method to most imports.
Sascha Wilde <wilde@intevation.de>
parents: 4505
diff changeset
45 func (gm *GaugeMeasurement) Description() (string, error) {
4799
f32d086b5dbf Removed the mechanical touch of the last commit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4798
diff changeset
46 return gm.URL, nil
4798
ca6a5f722471 Added Description method to most imports.
Sascha Wilde <wilde@intevation.de>
parents: 4505
diff changeset
47 }
ca6a5f722471 Added Description method to most imports.
Sascha Wilde <wilde@intevation.de>
parents: 4505
diff changeset
48
1696
ad5e1cddaa09 Imports: Resolved the remaining golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1694
diff changeset
49 // GMJobKind is the import queue type identifier.
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
50 const GMJobKind JobKind = "gm"
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
51
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
52 const (
3301
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
53 listGaugesSQL = `
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
54 SELECT
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
55 (location).country_code,
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
56 (location).locode,
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
57 (location).fairway_section,
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
58 (location).orc,
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
59 (location).hectometre
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
60 FROM waterway.gauges
4158
5466562cca60 Remove utility function with possibly bad performance impact
Tom Gottfried <tom@intevation.de>
parents: 4147
diff changeset
61 WHERE (location).country_code = (
5466562cca60 Remove utility function with possibly bad performance impact
Tom Gottfried <tom@intevation.de>
parents: 4147
diff changeset
62 SELECT country FROM users.list_users WHERE username = current_user)
3301
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
63 OR pg_has_role('sys_admin', 'MEMBER')
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
64 `
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
65
2849
b8972e4671fa Preserve old predictions on raw gauge measurement import.
Sascha Wilde <wilde@intevation.de>
parents: 2245
diff changeset
66 // Note: we do not expect corrections of data through this service. So
3302
ec6163c6687d 'Historicise' gauges on import
Tom Gottfried <tom@intevation.de>
parents: 3301
diff changeset
67 // any constraint conflicts are triggered by redundant data which
2849
b8972e4671fa Preserve old predictions on raw gauge measurement import.
Sascha Wilde <wilde@intevation.de>
parents: 2245
diff changeset
68 // can be dropped.
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
69 insertGMSQL = `
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
70 INSERT INTO waterway.gauge_measurements (
3302
ec6163c6687d 'Historicise' gauges on import
Tom Gottfried <tom@intevation.de>
parents: 3301
diff changeset
71 location,
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
72 measure_date,
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
73 sender,
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
74 language_code,
1766
e51db2a365a2 Insert country code in gm import.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 1761
diff changeset
75 country_code,
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
76 date_issue,
1775
fcb0106ec510 Gauge measurement import: Added reference_code column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1772
diff changeset
77 reference_code,
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
78 water_level,
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
79 date_info,
1780
48791416bea5 (Approved) gauge measurement import: Fixed row level security.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1776
diff changeset
80 source_organization,
48791416bea5 (Approved) gauge measurement import: Fixed row level security.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1776
diff changeset
81 staging_done
3302
ec6163c6687d 'Historicise' gauges on import
Tom Gottfried <tom@intevation.de>
parents: 3301
diff changeset
82 ) VALUES (
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
83 ($1, $2, $3, $4, $5),
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
84 $6,
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
85 $7,
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
86 $8,
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
87 $9,
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
88 $10,
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
89 $11,
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
90 $12,
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
91 $13,
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
92 $14,
3277
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
93 true
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
94 )
2849
b8972e4671fa Preserve old predictions on raw gauge measurement import.
Sascha Wilde <wilde@intevation.de>
parents: 2245
diff changeset
95 ON CONFLICT DO NOTHING
3277
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
96 RETURNING 1
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
97 `
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
98
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
99 insertGPSQL = `
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
100 INSERT INTO waterway.gauge_predictions (
3302
ec6163c6687d 'Historicise' gauges on import
Tom Gottfried <tom@intevation.de>
parents: 3301
diff changeset
101 location,
3277
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
102 measure_date,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
103 sender,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
104 language_code,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
105 country_code,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
106 date_issue,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
107 reference_code,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
108 water_level,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
109 conf_interval,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
110 date_info,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
111 source_organization
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
112 ) VALUES(
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
113 ($1, $2, $3, $4, $5),
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
114 $6,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
115 $7,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
116 $8,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
117 $9,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
118 $10,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
119 $11,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
120 $12,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
121 $13,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
122 $14,
3278
831193935739 Avoid storing of NtS messages other than water level
Tom Gottfried <tom@intevation.de>
parents: 3277
diff changeset
123 $15
3277
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
124 )
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
125 ON CONFLICT DO NOTHING
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
126 RETURNING 1
1978
0a8fa6893181 Import: Upsert gauge measurement data to avoid unique contraint violation.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 1954
diff changeset
127 `
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
128 )
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
129
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
130 type gmJobCreator struct{}
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
131
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
132 func init() {
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
133 RegisterJobCreator(GMJobKind, gmJobCreator{})
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
134 }
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
135
2187
7c83b5277c1c Import queue: Removed boilerplate code to deserialize jobs from JSON by making it part of the import queue.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2168
diff changeset
136 func (gmJobCreator) Description() string { return "gauge measurements" }
1646
a0982c38eac0 Import queue: Implemented email notifications.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1641
diff changeset
137
2187
7c83b5277c1c Import queue: Removed boilerplate code to deserialize jobs from JSON by making it part of the import queue.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2168
diff changeset
138 func (gmJobCreator) Create() Job { return new(GaugeMeasurement) }
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
139
3219
4acbee65275d Import queue: Split locked dependencies in exclusively and multiple uses.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3176
diff changeset
140 func (gmJobCreator) Depends() [2][]string {
4acbee65275d Import queue: Split locked dependencies in exclusively and multiple uses.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3176
diff changeset
141 return [2][]string{
4acbee65275d Import queue: Split locked dependencies in exclusively and multiple uses.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3176
diff changeset
142 {"gauge_measurements"},
4acbee65275d Import queue: Split locked dependencies in exclusively and multiple uses.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3176
diff changeset
143 {"gauges"},
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
144 }
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
145 }
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
146
1754
807569b08513 Import queue: Auto acceptance is now a property of the import kind itself and is not configurable any more.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1696
diff changeset
147 func (gmJobCreator) AutoAccept() bool { return true }
807569b08513 Import queue: Auto acceptance is now a property of the import kind itself and is not configurable any more.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1696
diff changeset
148
5035
56c589f7435d Enhance comments on implementations of StageDone()
Tom Gottfried <tom@intevation.de>
parents: 5034
diff changeset
149 // StageDone is a NOP for gauge measurements imports.
5034
59a99655f34d Added feedback support for StageDone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4852
diff changeset
150 func (gmJobCreator) StageDone(context.Context, *sql.Tx, int64, Feedback) error {
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
151 return nil
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
152 }
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
153
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
154 // CleanUp of a gauge measurement import is a NOP.
1676
4407ecaa2192 Imports: Cosmetics.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1664
diff changeset
155 func (*GaugeMeasurement) CleanUp() error { return nil }
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
156
4845
8c46b845b406 Fix comment
Tom Gottfried <tom@intevation.de>
parents: 4813
diff changeset
157 // Do executes the actual import.
2242
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
158 func (gm *GaugeMeasurement) Do(
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
159 ctx context.Context,
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
160 importID int64,
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
161 conn *sql.Conn,
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
162 feedback Feedback,
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
163 ) (interface{}, error) {
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
164
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
165 fetch := func() ([]*nts.RIS_Message_Type, error) {
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
166 client := nts.NewINtSMessageService(gm.URL, gm.Insecure, nil)
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
167
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
168 mt := nts.Message_type_typeWRM
4504
b7e3d42fd9e7 When fetching gauge measurements look 1day into past and future.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4197
diff changeset
169 now := time.Now()
4505
30c499f996d7 Simplified code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4504
diff changeset
170 dis := []*nts.Date_pair{{
4504
b7e3d42fd9e7 When fetching gauge measurements look 1day into past and future.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4197
diff changeset
171 Date_start: nts.Date{Time: now.AddDate(0, 0, -1)},
b7e3d42fd9e7 When fetching gauge measurements look 1day into past and future.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4197
diff changeset
172 Date_end: nts.Date{Time: now.AddDate(0, 0, +1)},
4505
30c499f996d7 Simplified code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4504
diff changeset
173 }}
2242
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
174
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
175 req := &nts.Get_messages_query{
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
176 Message_type: &mt,
3709
d4a8d084eab4 import: Use dates_issue parameter in gm imports.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 3583
diff changeset
177 Dates_issue: dis,
2242
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
178 }
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
179
3582
317d176ef38c GM import: Try three times when timeouts happen on SOAP service. Increase SOAP timeout to 3 minutes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3580
diff changeset
180 const maxTries = 3
317d176ef38c GM import: Try three times when timeouts happen on SOAP service. Increase SOAP timeout to 3 minutes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3580
diff changeset
181
317d176ef38c GM import: Try three times when timeouts happen on SOAP service. Increase SOAP timeout to 3 minutes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3580
diff changeset
182 tries := 0
317d176ef38c GM import: Try three times when timeouts happen on SOAP service. Increase SOAP timeout to 3 minutes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3580
diff changeset
183
317d176ef38c GM import: Try three times when timeouts happen on SOAP service. Increase SOAP timeout to 3 minutes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3580
diff changeset
184 again:
2242
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
185 resp, err := client.Get_messages(req)
3582
317d176ef38c GM import: Try three times when timeouts happen on SOAP service. Increase SOAP timeout to 3 minutes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3580
diff changeset
186
2242
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
187 if err != nil {
3582
317d176ef38c GM import: Try three times when timeouts happen on SOAP service. Increase SOAP timeout to 3 minutes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3580
diff changeset
188 if t, ok := err.(interface{ Timeout() bool }); ok && t.Timeout() && tries < maxTries {
5490
5f47eeea988d Use own logging package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5035
diff changeset
189 log.Warnln("NtS SOAP request timed out. Trying again.")
3582
317d176ef38c GM import: Try three times when timeouts happen on SOAP service. Increase SOAP timeout to 3 minutes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3580
diff changeset
190 tries++
317d176ef38c GM import: Try three times when timeouts happen on SOAP service. Increase SOAP timeout to 3 minutes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3580
diff changeset
191 goto again
317d176ef38c GM import: Try three times when timeouts happen on SOAP service. Increase SOAP timeout to 3 minutes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3580
diff changeset
192 }
317d176ef38c GM import: Try three times when timeouts happen on SOAP service. Increase SOAP timeout to 3 minutes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3580
diff changeset
193 return nil, fmt.Errorf(
317d176ef38c GM import: Try three times when timeouts happen on SOAP service. Increase SOAP timeout to 3 minutes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3580
diff changeset
194 "Error requesting NtS service: %v", err)
2242
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
195 }
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
196
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
197 result := resp.Result_message
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
198 if result == nil {
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
199 for _, e := range resp.Result_error {
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
200 if e != nil {
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
201 feedback.Error("Error code: %s", *e)
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
202 } else {
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
203 feedback.Error("Unknown error")
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
204 }
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
205 }
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
206 }
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
207 return result, nil
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
208 }
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
209
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
210 return storeGaugeMeasurements(
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
211 ctx,
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
212 importID,
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
213 fetch,
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
214 conn,
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
215 feedback,
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
216 )
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
217 }
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
218
3301
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
219 func loadGauges(ctx context.Context, conn *sql.Conn) ([]string, error) {
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
220
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
221 rows, err := conn.QueryContext(ctx, listGaugesSQL)
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
222 if err != nil {
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
223 return nil, err
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
224 }
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
225 defer rows.Close()
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
226
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
227 var gauges []string
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
228
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
229 for rows.Next() {
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
230 var g models.Isrs
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
231 if err = rows.Scan(
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
232 &g.CountryCode,
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
233 &g.LoCode,
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
234 &g.FairwaySection,
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
235 &g.Orc,
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
236 &g.Hectometre,
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
237 ); err != nil {
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
238 return nil, err
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
239 }
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
240 gauges = append(gauges, g.String())
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
241 }
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
242
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
243 if err = rows.Err(); err != nil {
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
244 return nil, err
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
245 }
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
246
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
247 if len(gauges) == 0 {
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
248 return nil, UnchangedError(
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
249 "No gauges for which measurements can be imported in database")
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
250 }
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
251
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
252 sort.Strings(gauges)
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
253
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
254 return gauges, nil
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
255 }
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
256
2242
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
257 func storeGaugeMeasurements(
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
258 ctx context.Context,
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
259 importID int64,
2242
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
260 fetch func() ([]*nts.RIS_Message_Type, error),
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
261 conn *sql.Conn,
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
262 feedback Feedback,
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
263 ) (interface{}, error) {
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
264
2233
137addc77b1b Gauge measurement imports: Do all database ops in one transaction.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2187
diff changeset
265 start := time.Now()
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
266
3301
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
267 // Get gauges from database, for which user is allowed to import data
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
268 gauges, err := loadGauges(ctx, conn)
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
269 if err != nil {
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
270 return nil, err
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
271 }
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
272
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
273 gids, err := doForGM(ctx, gauges, fetch, conn, feedback)
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
274 if err != nil {
1761
0145537d5474 Gauge measument import: Die with an error if something went wrong.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1754
diff changeset
275 return nil, err
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
276 }
2233
137addc77b1b Gauge measurement imports: Do all database ops in one transaction.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2187
diff changeset
277
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
278 if len(gids) == 0 {
2233
137addc77b1b Gauge measurement imports: Do all database ops in one transaction.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2187
diff changeset
279 return nil, UnchangedError("No new gauge measurements found")
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
280 }
2233
137addc77b1b Gauge measurement imports: Do all database ops in one transaction.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2187
diff changeset
281
137addc77b1b Gauge measurement imports: Do all database ops in one transaction.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2187
diff changeset
282 feedback.Info(
3176
1cb6676d1510 Handle failing INSERTs gracefully during gauge measurements import
Tom Gottfried <tom@intevation.de>
parents: 2849
diff changeset
283 "Importing gauge measurements took %s", time.Since(start))
2233
137addc77b1b Gauge measurement imports: Do all database ops in one transaction.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2187
diff changeset
284
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
285 // TODO: needs to be filled more useful.
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
286 summary := struct {
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
287 GaugeMeasuremets []string `json:"gaugeMeasurements"`
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
288 }{
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
289 GaugeMeasuremets: gids,
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
290 }
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
291 return &summary, err
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
292 }
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
293
1772
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
294 // rescale returns a scaling function to bring the unit all to cm.
3264
9ae43313b463 Handle some possibly missing elements in NtS response
Tom Gottfried <tom@intevation.de>
parents: 3219
diff changeset
295 func rescale(unit string) (func(*float32), error) {
1772
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
296
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
297 var scale float32
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
298
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
299 switch strings.ToLower(unit) {
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
300 case "mm":
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
301 scale = 0.1
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
302 case "cm":
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
303 scale = 1.0
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
304 case "dm":
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
305 scale = 10.0
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
306 case "m":
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
307 scale = 100.0
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
308 case "hm":
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
309 scale = 10000.0
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
310 case "km":
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
311 scale = 100000.0
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
312 default:
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
313 return nil, fmt.Errorf("unknown unit '%s'", unit)
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
314 }
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
315
3264
9ae43313b463 Handle some possibly missing elements in NtS response
Tom Gottfried <tom@intevation.de>
parents: 3219
diff changeset
316 fn := func(x *float32) {
9ae43313b463 Handle some possibly missing elements in NtS response
Tom Gottfried <tom@intevation.de>
parents: 3219
diff changeset
317 if x != nil {
3266
3dee5cf16a58 Cosmetics.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3264
diff changeset
318 *x *= scale
3264
9ae43313b463 Handle some possibly missing elements in NtS response
Tom Gottfried <tom@intevation.de>
parents: 3219
diff changeset
319 }
9ae43313b463 Handle some possibly missing elements in NtS response
Tom Gottfried <tom@intevation.de>
parents: 3219
diff changeset
320 }
1772
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
321 return fn, nil
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
322 }
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
323
2242
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
324 func doForGM(
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
325 ctx context.Context,
3301
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
326 gauges []string,
2242
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
327 fetch func() ([]*nts.RIS_Message_Type, error),
3176
1cb6676d1510 Handle failing INSERTs gracefully during gauge measurements import
Tom Gottfried <tom@intevation.de>
parents: 2849
diff changeset
328 conn *sql.Conn,
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
329 feedback Feedback,
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
330 ) ([]string, error) {
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
331
3277
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
332 insertGPStmt, err := conn.PrepareContext(ctx, insertGPSQL)
2234
9b2f8e94671e Gauge measurement import: Moved preparation of insert statement out of gauge iteration loop.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2233
diff changeset
333 if err != nil {
9b2f8e94671e Gauge measurement import: Moved preparation of insert statement out of gauge iteration loop.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2233
diff changeset
334 return nil, err
9b2f8e94671e Gauge measurement import: Moved preparation of insert statement out of gauge iteration loop.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2233
diff changeset
335 }
3277
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
336 defer insertGPStmt.Close()
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
337
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
338 insertGMStmt, err := conn.PrepareContext(ctx, insertGMSQL)
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
339 if err != nil {
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
340 return nil, err
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
341 }
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
342 defer insertGMStmt.Close()
2234
9b2f8e94671e Gauge measurement import: Moved preparation of insert statement out of gauge iteration loop.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2233
diff changeset
343
3301
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
344 // lookup to see if data can be imported for gauge
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
345 isKnown := func(s string) bool {
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
346 idx := sort.SearchStrings(gauges, s)
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
347 return idx < len(gauges) && gauges[idx] == s
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
348 }
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
349
2242
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
350 result, err := fetch()
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
351 if err != nil {
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
352 return nil, err
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
353 }
1981
e89368aec538 Import: Make one request per gauge for gauge measurement data.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 1978
diff changeset
354
2242
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
355 var gids []string
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
356 for _, msg := range result {
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
357 for _, wrm := range msg.Wrm {
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
358 curr := string(*wrm.Geo_object.Id)
3718
7431c6680b90 import: Trim whitespaces in ISRS code and improved log messsage.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 3709
diff changeset
359 curr = strings.TrimSpace(curr)
2242
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
360 currIsrs, err := models.IsrsFromString(curr)
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
361 if err != nil {
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
362 feedback.Warn("Invalid ISRS code %v", err)
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
363 continue
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
364 }
3277
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
365 feedback.Info("Found measurements/predictions for %s", curr)
3301
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
366 if !isKnown(curr) {
3718
7431c6680b90 import: Trim whitespaces in ISRS code and improved log messsage.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 3709
diff changeset
367 feedback.Warn("Cannot find gauge %q for import", curr)
3301
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
368 continue
6514b943654e Re-enable checking of gauge availability
Tom Gottfried <tom@intevation.de>
parents: 3284
diff changeset
369 }
1981
e89368aec538 Import: Make one request per gauge for gauge measurement data.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 1978
diff changeset
370
2242
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
371 var referenceCode string
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
372 if wrm.Reference_code == nil {
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
373 feedback.Info("'Reference_code' not specified. Assuming 'ZPG'")
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
374 referenceCode = "ZPG"
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
375 } else {
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
376 referenceCode = string(*wrm.Reference_code)
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
377 }
2849
b8972e4671fa Preserve old predictions on raw gauge measurement import.
Sascha Wilde <wilde@intevation.de>
parents: 2245
diff changeset
378
3847
d7b9d5c0ebad gm import: Ignore (and warn for) water levels of -99999.
Sascha Wilde <wilde@intevation.de>
parents: 3723
diff changeset
379 badValue := 0
3277
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
380 newM, newP := 0, 0
2242
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
381 for _, measure := range wrm.Measure {
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
382 var unit string
3723
9759355d7b90 import: Fixed data initialization for database rows.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 3718
diff changeset
383 if *measure.Measure_code != nts.Measure_code_enumWAL {
9759355d7b90 import: Fixed data initialization for database rows.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 3718
diff changeset
384 feedback.Warn("Ignored message with measure_code %s",
9759355d7b90 import: Fixed data initialization for database rows.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 3718
diff changeset
385 *measure.Measure_code)
9759355d7b90 import: Fixed data initialization for database rows.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 3718
diff changeset
386 continue
9759355d7b90 import: Fixed data initialization for database rows.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 3718
diff changeset
387 }
2242
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
388 if measure.Unit == nil {
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
389 feedback.Info("'Unit' not specified. Assuming 'cm'")
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
390 unit = "cm"
1772
70c4dc694d61 Gauge measurement import: Added a rescale function that brings all numerical values into cm.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1766
diff changeset
391 } else {
2242
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
392 unit = string(*measure.Unit)
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
393 }
4813
0644c2b3af54 Check for mandatory measurement value in GM import.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4812
diff changeset
394
0644c2b3af54 Check for mandatory measurement value in GM import.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4812
diff changeset
395 if measure.Value == nil {
0644c2b3af54 Check for mandatory measurement value in GM import.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4812
diff changeset
396 feedback.Warn("Missing mandatory value at %s. Ignored (bad service)",
0644c2b3af54 Check for mandatory measurement value in GM import.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4812
diff changeset
397 measure.Measuredate.Format(time.RFC3339))
0644c2b3af54 Check for mandatory measurement value in GM import.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4812
diff changeset
398 continue
0644c2b3af54 Check for mandatory measurement value in GM import.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4812
diff changeset
399 }
0644c2b3af54 Check for mandatory measurement value in GM import.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4812
diff changeset
400
2242
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
401 convert, err := rescale(unit)
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
402 if err != nil {
4848
8584197232ec Handle unknown units gracefully
Tom Gottfried <tom@intevation.de>
parents: 4845
diff changeset
403 feedback.Error(err.Error())
8584197232ec Handle unknown units gracefully
Tom Gottfried <tom@intevation.de>
parents: 4845
diff changeset
404 continue
2242
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
405 }
3264
9ae43313b463 Handle some possibly missing elements in NtS response
Tom Gottfried <tom@intevation.de>
parents: 3219
diff changeset
406 convert(measure.Value)
9ae43313b463 Handle some possibly missing elements in NtS response
Tom Gottfried <tom@intevation.de>
parents: 3219
diff changeset
407 convert(measure.Value_min)
9ae43313b463 Handle some possibly missing elements in NtS response
Tom Gottfried <tom@intevation.de>
parents: 3219
diff changeset
408 convert(measure.Value_max)
9ae43313b463 Handle some possibly missing elements in NtS response
Tom Gottfried <tom@intevation.de>
parents: 3219
diff changeset
409
3847
d7b9d5c0ebad gm import: Ignore (and warn for) water levels of -99999.
Sascha Wilde <wilde@intevation.de>
parents: 3723
diff changeset
410 // -99999 is used by some gauges to signal an error
4813
0644c2b3af54 Check for mandatory measurement value in GM import.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4812
diff changeset
411 if *measure.Value == -99999 {
3847
d7b9d5c0ebad gm import: Ignore (and warn for) water levels of -99999.
Sascha Wilde <wilde@intevation.de>
parents: 3723
diff changeset
412 badValue++
d7b9d5c0ebad gm import: Ignore (and warn for) water levels of -99999.
Sascha Wilde <wilde@intevation.de>
parents: 3723
diff changeset
413 continue
d7b9d5c0ebad gm import: Ignore (and warn for) water levels of -99999.
Sascha Wilde <wilde@intevation.de>
parents: 3723
diff changeset
414 }
d7b9d5c0ebad gm import: Ignore (and warn for) water levels of -99999.
Sascha Wilde <wilde@intevation.de>
parents: 3723
diff changeset
415
3580
d38b20ccb6f9 GM import: Be more graceful when accepting measure/issue dates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3533
diff changeset
416 var dummy int
3277
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
417 if measure.Predicted {
3723
9759355d7b90 import: Fixed data initialization for database rows.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 3718
diff changeset
418 confInterval := pgtype.Numrange{
9759355d7b90 import: Fixed data initialization for database rows.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 3718
diff changeset
419 Lower: pgtype.Numeric{Status: pgtype.Null},
9759355d7b90 import: Fixed data initialization for database rows.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 3718
diff changeset
420 Upper: pgtype.Numeric{Status: pgtype.Null},
9759355d7b90 import: Fixed data initialization for database rows.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 3718
diff changeset
421 LowerType: pgtype.Inclusive,
9759355d7b90 import: Fixed data initialization for database rows.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 3718
diff changeset
422 UpperType: pgtype.Inclusive,
9759355d7b90 import: Fixed data initialization for database rows.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 3718
diff changeset
423 Status: pgtype.Null,
9759355d7b90 import: Fixed data initialization for database rows.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 3718
diff changeset
424 }
3277
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
425 if measure.Value_min != nil && measure.Value_max != nil {
3723
9759355d7b90 import: Fixed data initialization for database rows.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 3718
diff changeset
426 valueMin := pgtype.Numeric{Status: pgtype.Null}
9759355d7b90 import: Fixed data initialization for database rows.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 3718
diff changeset
427 valueMax := pgtype.Numeric{Status: pgtype.Null}
3277
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
428 valueMin.Set(measure.Value_min)
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
429 valueMax.Set(measure.Value_max)
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
430 confInterval = pgtype.Numrange{
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
431 Lower: valueMin,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
432 Upper: valueMax,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
433 LowerType: pgtype.Inclusive,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
434 UpperType: pgtype.Inclusive,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
435 Status: pgtype.Present,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
436 }
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
437 }
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
438 err = insertGPStmt.QueryRowContext(
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
439 ctx,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
440 currIsrs.CountryCode,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
441 currIsrs.LoCode,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
442 currIsrs.FairwaySection,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
443 currIsrs.Orc,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
444 currIsrs.Hectometre,
3580
d38b20ccb6f9 GM import: Be more graceful when accepting measure/issue dates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3533
diff changeset
445 measure.Measuredate.Time,
3277
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
446 msg.Identification.From,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
447 msg.Identification.Language_code,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
448 msg.Identification.Country_code,
3580
d38b20ccb6f9 GM import: Be more graceful when accepting measure/issue dates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3533
diff changeset
449 msg.Identification.Date_issue.Time,
3277
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
450 referenceCode,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
451 measure.Value,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
452 &confInterval,
3580
d38b20ccb6f9 GM import: Be more graceful when accepting measure/issue dates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3533
diff changeset
453 msg.Identification.Date_issue.Time,
3277
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
454 msg.Identification.Originator,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
455 ).Scan(&dummy)
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
456 switch {
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
457 case err == sql.ErrNoRows:
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
458 // thats expected, nothing to do
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
459 case err != nil:
4197
5d7ce7f926eb Log fatal errors as errors, not warnings, in imports
Tom Gottfried <tom@intevation.de>
parents: 4158
diff changeset
460 feedback.Error(pgxutils.ReadableError{Err: err}.Error())
3277
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
461 default:
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
462 newP++
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
463 }
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
464 } else {
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
465 err = insertGMStmt.QueryRowContext(
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
466 ctx,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
467 currIsrs.CountryCode,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
468 currIsrs.LoCode,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
469 currIsrs.FairwaySection,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
470 currIsrs.Orc,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
471 currIsrs.Hectometre,
3580
d38b20ccb6f9 GM import: Be more graceful when accepting measure/issue dates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3533
diff changeset
472 measure.Measuredate.Time,
3277
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
473 msg.Identification.From,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
474 msg.Identification.Language_code,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
475 msg.Identification.Country_code,
3580
d38b20ccb6f9 GM import: Be more graceful when accepting measure/issue dates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3533
diff changeset
476 msg.Identification.Date_issue.Time,
3277
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
477 referenceCode,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
478 measure.Value,
3580
d38b20ccb6f9 GM import: Be more graceful when accepting measure/issue dates.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3533
diff changeset
479 msg.Identification.Date_issue.Time,
3277
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
480 msg.Identification.Originator,
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
481 ).Scan(&dummy)
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
482 switch {
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
483 case err == sql.ErrNoRows:
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
484 // thats expected, nothing to do
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
485 case err != nil:
4197
5d7ce7f926eb Log fatal errors as errors, not warnings, in imports
Tom Gottfried <tom@intevation.de>
parents: 4158
diff changeset
486 feedback.Error(pgxutils.ReadableError{Err: err}.Error())
3277
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
487 default:
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
488 newM++
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
489 }
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
490 }
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
491 }
3847
d7b9d5c0ebad gm import: Ignore (and warn for) water levels of -99999.
Sascha Wilde <wilde@intevation.de>
parents: 3723
diff changeset
492 if badValue > 0 {
d7b9d5c0ebad gm import: Ignore (and warn for) water levels of -99999.
Sascha Wilde <wilde@intevation.de>
parents: 3723
diff changeset
493 feedback.Warn("Ignored %d measurements with value -99999",
d7b9d5c0ebad gm import: Ignore (and warn for) water levels of -99999.
Sascha Wilde <wilde@intevation.de>
parents: 3723
diff changeset
494 badValue)
d7b9d5c0ebad gm import: Ignore (and warn for) water levels of -99999.
Sascha Wilde <wilde@intevation.de>
parents: 3723
diff changeset
495 }
2242
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
496 feedback.Info("Inserted %d measurements for %s",
3277
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
497 newM, curr)
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
498 feedback.Info("Inserted %d predictions for %s",
232fc90e6ee2 Disentangle gauge measurements and predictions
Tom Gottfried <tom@intevation.de>
parents: 3266
diff changeset
499 newP, curr)
2242
786c3fb7efe1 Gauge measurements import: Re-factored to be re-usable for upcoming uploaded gauge measurements.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2238
diff changeset
500 gids = append(gids, curr)
1637
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
501 }
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
502 }
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
503 return gids, nil
dd31be75ce6d Implemented gauge measurement import.
Raimund Renkert <raimund.renkert@intevation.de>
parents:
diff changeset
504 }