comparison schema/updates/1469/aggregate-gm-logs.sql @ 5538:ff95d3603e4d aggregate-gm-import-logging

WIP: More aggregation.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 25 Oct 2021 23:05:45 +0200
parents dc2000b807bd
children 4d815f295e57
comparison
equal deleted inserted replaced
5537:2e5e51288a6c 5538:ff95d3603e4d
6 WHERE im.kind = 'gm' 6 WHERE im.kind = 'gm'
7 ORDER BY lo.import_id, lo.time; 7 ORDER BY lo.import_id, lo.time;
8 last_id integer; 8 last_id integer;
9 last_time timestamp with time zone; 9 last_time timestamp with time zone;
10 curr_gid text; 10 curr_gid text;
11 gauge text; 11 value text;
12 joined text; 12 joined text;
13 num integer; 13 num integer;
14 BEGIN 14 BEGIN
15 15
16 CREATE TEMP TABLE filtered_logs ( 16 CREATE TEMP TABLE filtered_logs (
83 last_id, last_time, 'warn'::log_type, 83 last_id, last_time, 'warn'::log_type,
84 'Ignored measurements with value -99999: ' || joined); 84 'Ignored measurements with value -99999: ' || joined);
85 END IF; 85 END IF;
86 86
87 87
88 -- TODO: ""Missing mandatory values: " 88 -- TODO: ""Missing mandatory values: "
89 -- TODO: "Cannot convert units: " 89 -- TODO: "Cannot convert units: "
90 -- TODO: "Ignored measure codes:" 90
91 -- ignored measure codes
92 SELECT INTO joined string_agg(
93 gid || ' ('
94 || array_to_string(ARRAY(SELECT DISTINCT unnest(ign_meas_codes)), '; ')
95 || ')', ', ')
96 FROM agg_tracker
97 WHERE ign_meas_codes IS NOT NULL;
98
99 IF joined IS NOT NULL THEN
100 INSERT INTO filtered_logs VALUES (
101 last_id, last_time, 'warn'::log_type,
102 'Ignored measure codes: ' || joined);
103 END IF;
91 104
92 -- predictions 105 -- predictions
93 SELECT INTO joined string_agg( 106 SELECT INTO joined string_agg(
94 gid || ' (' || predictions || ')', ', ') 107 gid || ' (' || predictions || ')', ', ')
95 FROM agg_tracker 108 FROM agg_tracker
133 line.msg from '^Found measurements/predictions for (....................)$'); 146 line.msg from '^Found measurements/predictions for (....................)$');
134 147
135 ELSIF line.msg ~ '^Inserted \d+ measurements for ....................$' THEN 148 ELSIF line.msg ~ '^Inserted \d+ measurements for ....................$' THEN
136 num := substring( 149 num := substring(
137 line.msg from '^Inserted (\d+)')::integer; 150 line.msg from '^Inserted (\d+)')::integer;
138 gauge := substring( 151 value := substring(
139 line.msg from '^Inserted \d+ measurements for (....................)$'); 152 line.msg from '^Inserted \d+ measurements for (....................)$');
140 153
141 INSERT INTO agg_tracker (gid, measurements) VALUES (gauge, num) 154 INSERT INTO agg_tracker (gid, measurements) VALUES (value, num)
142 ON CONFLICT (gid) 155 ON CONFLICT (gid)
143 DO UPDATE SET measurements = EXCLUDED.measurements + num; 156 DO UPDATE SET measurements = EXCLUDED.measurements + num;
144 157
145 ELSIF line.msg ~ '^Ignored \d+ measurements with value -99999$' THEN 158 ELSIF line.msg ~ '^Ignored \d+ measurements with value -99999$' THEN
146 num := substring( 159 num := substring(
151 DO UPDATE SET bad_values = EXCLUDED.bad_values + num; 164 DO UPDATE SET bad_values = EXCLUDED.bad_values + num;
152 165
153 ELSIF line.msg ~ '^Inserted \d+ predictions for ....................$' THEN 166 ELSIF line.msg ~ '^Inserted \d+ predictions for ....................$' THEN
154 num := substring( 167 num := substring(
155 line.msg from '^Inserted (\d+)')::integer; 168 line.msg from '^Inserted (\d+)')::integer;
156 gauge := substring( 169 value := substring(
157 line.msg from '^Inserted \d+ predictions for (....................)$'); 170 line.msg from '^Inserted \d+ predictions for (....................)$');
158 171
159 INSERT INTO agg_tracker (gid, predictions) VALUES (gauge, num) 172 INSERT INTO agg_tracker (gid, predictions) VALUES (value, num)
160 ON CONFLICT (gid) 173 ON CONFLICT (gid)
161 DO UPDATE SET predictions = EXCLUDED.predictions + num; 174 DO UPDATE SET predictions = EXCLUDED.predictions + num;
162 175
163 ELSIF line.msg ~ '^''Reference_code'' not specified. Assuming ''ZPG''$' THEN 176 ELSIF line.msg ~ '^''Reference_code'' not specified. Assuming ''ZPG''$' THEN
164 177
165 INSERT INTO agg_tracker (gid, assume_zpg) VALUES (gauge, true) 178 INSERT INTO agg_tracker (gid, assume_zpg) VALUES (curr_gid, true)
166 ON CONFLICT (gid) 179 ON CONFLICT (gid)
167 DO UPDATE SET assume_zpg = true; 180 DO UPDATE SET assume_zpg = true;
168 181
169 ELSIF line.msg ~ '^Cannot find gauge "...................." for import$' THEN 182 ELSIF line.msg ~ '^Cannot find gauge "...................." for import$' THEN
170 gauge := substring( 183 value := substring(
171 line.msg from '^Cannot find gauge "(....................)" for import$'); 184 line.msg from '^Cannot find gauge "(....................)" for import$');
172 185
173 INSERT INTO agg_tracker (gid, unknown) VALUES (gauge, true) 186 INSERT INTO agg_tracker (gid, unknown) VALUES (value, true)
174 ON CONFLICT (gid) 187 ON CONFLICT (gid)
175 DO UPDATE SET unknown = true; 188 DO UPDATE SET unknown = true;
176 189
177 ELSIF line.msg ~ '^''Unit'' not specified. Assuming ''cm''$' THEN 190 ELSIF line.msg ~ '^''Unit'' not specified. Assuming ''cm''$' THEN
178 191
179 INSERT INTO agg_tracker (gid, assume_cm) VALUES (gauge, 1) 192 INSERT INTO agg_tracker (gid, assume_cm) VALUES (curr_gid, 1)
180 ON CONFLICT (gid) 193 ON CONFLICT (gid)
181 DO UPDATE SET assume_cm = EXCLUDED.assume_cm + 1; 194 DO UPDATE SET assume_cm = EXCLUDED.assume_cm + 1;
195
196 ELSIF line.msg ~ '^Ignored message with measure_code .+' THEN
197 value := substring(
198 line.msg from '^Ignored message with measure_code (.+)$');
199
200 INSERT INTO agg_tracker (gid, ign_meas_codes) VALUES (curr_gid, array[value])
201 ON CONFLICT (gid)
202 DO UPDATE SET ign_meas_codes =
203 array_cat(agg_tracker.ign_meas_codes, EXCLUDED.ign_meas_codes);
182 204
183 ELSIF line.msg ~ '^Importing gauge measurements took ' THEN 205 ELSIF line.msg ~ '^Importing gauge measurements took ' THEN
184 206
185 -- TODO: Flush aggregation because its likely the last entry. 207 -- TODO: Flush aggregation because its likely the last entry.
186 ELSE 208 ELSE
187 -- TODO: Handle 'Missing mandatory value at %s. Ignored (bad service)' 209 -- TODO: Handle 'Missing mandatory value at %s. Ignored (bad service)'
188 -- TODO: Handle 'Ignored message with measure_code %s'
189 -- TODO: Handle "unknown unit '%s'" 210 -- TODO: Handle "unknown unit '%s'"
190 -- Not handled, copy through .. 211 -- Not handled, copy through ..
191 INSERT INTO filtered_logs VALUES (line.import_id, line.time, line.kind, line.msg); 212 INSERT INTO filtered_logs VALUES (line.import_id, line.time, line.kind, line.msg);
192 213
193 END IF; 214 END IF;