Mercurial > gemma
comparison pkg/imports/isr.go @ 5431:fc79622783a7 marking-single-beam
ISR job: Moved statement preparations out out bottleneck processing.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 12 Jul 2021 02:31:30 +0200 |
parents | b8d5f1cd15fb |
children | a65b0891e8fd |
comparison
equal
deleted
inserted
replaced
5430:aa199f280f64 | 5431:fc79622783a7 |
---|---|
153 bns, err := fetchBottleneckResults(ctx, conn) | 153 bns, err := fetchBottleneckResults(ctx, conn) |
154 if err != nil { | 154 if err != nil { |
155 return nil, err | 155 return nil, err |
156 } | 156 } |
157 | 157 |
158 isrs, err := newISRStmts(ctx, conn) | |
159 if err != nil { | |
160 return nil, err | |
161 } | |
162 defer isrs.close() | |
163 | |
158 for i := range bns { | 164 for i := range bns { |
159 start := time.Now() | 165 start := time.Now() |
160 feedback.Info("Processing bottleneck '%s' ...", bns[i].bn) | 166 feedback.Info("Processing bottleneck '%s' ...", bns[i].bn) |
161 err := isr.processBottleneck( | 167 err := isr.processBottleneck( |
162 ctx, conn, | 168 ctx, conn, isrs, |
163 heights, | 169 heights, |
164 &bns[i], | 170 &bns[i], |
165 ) | 171 ) |
166 feedback.Info("Processing took %v.", time.Since(start)) | 172 feedback.Info("Processing took %v.", time.Since(start)) |
167 if err != nil { | 173 if err != nil { |
170 } | 176 } |
171 | 177 |
172 return nil, nil | 178 return nil, nil |
173 } | 179 } |
174 | 180 |
181 type isrStmts struct { | |
182 insertAreas *sql.Stmt | |
183 deleteAreas *sql.Stmt | |
184 fetchMarkingPoints *sql.Stmt | |
185 deleteMarkingPoints *sql.Stmt | |
186 insertMarkingPoints *sql.Stmt | |
187 } | |
188 | |
189 func newISRStmts(ctx context.Context, conn *sql.Conn) (*isrStmts, error) { | |
190 var isrs isrStmts | |
191 for _, x := range []struct { | |
192 stmt **sql.Stmt | |
193 query string | |
194 }{ | |
195 {&isrs.insertAreas, insertIsoAreasSQL}, | |
196 {&isrs.deleteAreas, deleteIsoAreasSQL}, | |
197 {&isrs.fetchMarkingPoints, fetchMarkingPointsSQL}, | |
198 {&isrs.deleteMarkingPoints, deleteMarkingPointsSQL}, | |
199 {&isrs.insertMarkingPoints, insertMarkingPointsSQL}, | |
200 } { | |
201 var err error | |
202 if *x.stmt, err = conn.PrepareContext(ctx, x.query); err != nil { | |
203 isrs.close() | |
204 return nil, err | |
205 } | |
206 } | |
207 return &isrs, nil | |
208 } | |
209 | |
210 func (isrs *isrStmts) close() { | |
211 for _, x := range []**sql.Stmt{ | |
212 &isrs.insertAreas, | |
213 &isrs.deleteAreas, | |
214 &isrs.fetchMarkingPoints, | |
215 &isrs.deleteMarkingPoints, | |
216 &isrs.insertMarkingPoints, | |
217 } { | |
218 if *x != nil { | |
219 (*x).Close() | |
220 } | |
221 } | |
222 } | |
223 | |
175 func (isr *IsoRefresh) processBottleneck( | 224 func (isr *IsoRefresh) processBottleneck( |
176 ctx context.Context, | 225 ctx context.Context, |
177 conn *sql.Conn, | 226 conn *sql.Conn, |
227 isrs *isrStmts, | |
178 heights mesh.ClassBreaks, | 228 heights mesh.ClassBreaks, |
179 bn *bottleneckSoundingResults, | 229 bn *bottleneckSoundingResults, |
180 ) error { | 230 ) error { |
181 // Do one transaction per bottleneck. | 231 // Do one transaction per bottleneck. |
182 tx, err := conn.BeginTx(ctx, nil) | 232 tx, err := conn.BeginTx(ctx, nil) |
184 return nil | 234 return nil |
185 } | 235 } |
186 defer tx.Rollback() | 236 defer tx.Rollback() |
187 | 237 |
188 var ( | 238 var ( |
189 insertAreasStmt, | 239 insertAreas = tx.StmtContext(ctx, isrs.insertAreas) |
190 deleteAreasStmt, | 240 deleteAreas = tx.StmtContext(ctx, isrs.deleteAreas) |
191 fetchMarkingPointsStmt, | 241 fetchMarkingPoints = tx.StmtContext(ctx, isrs.fetchMarkingPoints) |
192 deleteMarkingPointsStmt, | 242 deleteMarkingPoints = tx.StmtContext(ctx, isrs.deleteMarkingPoints) |
193 insertMarkingPointsStmt *sql.Stmt | 243 insertMarkingPoints = tx.StmtContext(ctx, isrs.insertMarkingPoints) |
194 ) | 244 ) |
195 | |
196 for _, x := range []struct { | |
197 stmt **sql.Stmt | |
198 query string | |
199 }{ | |
200 {&insertAreasStmt, insertIsoAreasSQL}, | |
201 {&deleteAreasStmt, deleteIsoAreasSQL}, | |
202 {&fetchMarkingPointsStmt, fetchMarkingPointsSQL}, | |
203 {&deleteMarkingPointsStmt, deleteMarkingPointsSQL}, | |
204 {&insertMarkingPointsStmt, insertMarkingPointsSQL}, | |
205 } { | |
206 if *x.stmt, err = tx.PrepareContext(ctx, x.query); err != nil { | |
207 return err | |
208 } | |
209 defer (*x.stmt).Close() | |
210 } | |
211 | 245 |
212 // For all sounding results in bottleneck. | 246 // For all sounding results in bottleneck. |
213 for _, sr := range bn.srs { | 247 for _, sr := range bn.srs { |
214 switch sr.surveyType { | 248 switch sr.surveyType { |
215 case models.SurveyTypeMarking: | 249 case models.SurveyTypeMarking: |
217 // Read all points back in. | 251 // Read all points back in. |
218 | 252 |
219 var points mesh.MultiPointZ | 253 var points mesh.MultiPointZ |
220 | 254 |
221 if err := func() error { | 255 if err := func() error { |
222 rows, err := fetchMarkingPointsStmt.QueryContext(ctx, sr.id) | 256 rows, err := fetchMarkingPoints.QueryContext(ctx, sr.id) |
223 if err != nil { | 257 if err != nil { |
224 return err | 258 return err |
225 } | 259 } |
226 defer rows.Close() | 260 defer rows.Close() |
227 | 261 |
240 }(); err != nil { | 274 }(); err != nil { |
241 return err | 275 return err |
242 } | 276 } |
243 | 277 |
244 // Delete old points | 278 // Delete old points |
245 if _, err := deleteMarkingPointsStmt.ExecContext(ctx, sr.id); err != nil { | 279 if _, err := deleteMarkingPoints.ExecContext(ctx, sr.id); err != nil { |
246 return err | 280 return err |
247 } | 281 } |
248 | 282 |
249 // Re-classify points. | 283 // Re-classify points. |
250 classes := heights.Classify(points) | 284 classes := heights.Classify(points) |
253 for i, class := range classes { | 287 for i, class := range classes { |
254 // Ignore empty classes | 288 // Ignore empty classes |
255 if len(class) == 0 { | 289 if len(class) == 0 { |
256 continue | 290 continue |
257 } | 291 } |
258 if _, err := insertMarkingPointsStmt.ExecContext( | 292 if _, err := insertMarkingPoints.ExecContext( |
259 ctx, sr.id, heights[i], 4326, class.AsWKB(), | 293 ctx, sr.id, heights[i], 4326, class.AsWKB(), |
260 ); err != nil { | 294 ); err != nil { |
261 return err | 295 return err |
262 } | 296 } |
263 } | 297 } |
268 return err | 302 return err |
269 } | 303 } |
270 hs := heights.ExtrapolateClassBreaks(tree.Min().Z, tree.Max().Z).Dedup() | 304 hs := heights.ExtrapolateClassBreaks(tree.Min().Z, tree.Max().Z).Dedup() |
271 | 305 |
272 // Delete the old iso areas. | 306 // Delete the old iso areas. |
273 if _, err := deleteAreasStmt.ExecContext(ctx, sr); err != nil { | 307 if _, err := deleteAreas.ExecContext(ctx, sr); err != nil { |
274 return err | 308 return err |
275 } | 309 } |
276 | 310 |
277 // Calculate and store the iso areas. | 311 // Calculate and store the iso areas. |
278 box := mesh.Box2D{ | 312 box := mesh.Box2D{ |
288 | 322 |
289 for i, a := range areas { | 323 for i, a := range areas { |
290 if len(a) == 0 { | 324 if len(a) == 0 { |
291 continue | 325 continue |
292 } | 326 } |
293 if _, err := insertAreasStmt.ExecContext( | 327 if _, err := insertAreas.ExecContext( |
294 ctx, | 328 ctx, |
295 sr, hs[i], tree.EPSG(), | 329 sr, hs[i], tree.EPSG(), |
296 a.AsWKB(), | 330 a.AsWKB(), |
297 contourTolerance, | 331 contourTolerance, |
298 ); err != nil { | 332 ); err != nil { |