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 {