changeset 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 aa199f280f64
children 776e34886471
files pkg/imports/isr.go
diffstat 1 files changed, 61 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/imports/isr.go	Sun Jul 11 16:24:20 2021 +0200
+++ b/pkg/imports/isr.go	Mon Jul 12 02:31:30 2021 +0200
@@ -155,11 +155,17 @@
 		return nil, err
 	}
 
+	isrs, err := newISRStmts(ctx, conn)
+	if err != nil {
+		return nil, err
+	}
+	defer isrs.close()
+
 	for i := range bns {
 		start := time.Now()
 		feedback.Info("Processing bottleneck '%s' ...", bns[i].bn)
 		err := isr.processBottleneck(
-			ctx, conn,
+			ctx, conn, isrs,
 			heights,
 			&bns[i],
 		)
@@ -172,9 +178,53 @@
 	return nil, nil
 }
 
+type isrStmts struct {
+	insertAreas         *sql.Stmt
+	deleteAreas         *sql.Stmt
+	fetchMarkingPoints  *sql.Stmt
+	deleteMarkingPoints *sql.Stmt
+	insertMarkingPoints *sql.Stmt
+}
+
+func newISRStmts(ctx context.Context, conn *sql.Conn) (*isrStmts, error) {
+	var isrs isrStmts
+	for _, x := range []struct {
+		stmt  **sql.Stmt
+		query string
+	}{
+		{&isrs.insertAreas, insertIsoAreasSQL},
+		{&isrs.deleteAreas, deleteIsoAreasSQL},
+		{&isrs.fetchMarkingPoints, fetchMarkingPointsSQL},
+		{&isrs.deleteMarkingPoints, deleteMarkingPointsSQL},
+		{&isrs.insertMarkingPoints, insertMarkingPointsSQL},
+	} {
+		var err error
+		if *x.stmt, err = conn.PrepareContext(ctx, x.query); err != nil {
+			isrs.close()
+			return nil, err
+		}
+	}
+	return &isrs, nil
+}
+
+func (isrs *isrStmts) close() {
+	for _, x := range []**sql.Stmt{
+		&isrs.insertAreas,
+		&isrs.deleteAreas,
+		&isrs.fetchMarkingPoints,
+		&isrs.deleteMarkingPoints,
+		&isrs.insertMarkingPoints,
+	} {
+		if *x != nil {
+			(*x).Close()
+		}
+	}
+}
+
 func (isr *IsoRefresh) processBottleneck(
 	ctx context.Context,
 	conn *sql.Conn,
+	isrs *isrStmts,
 	heights mesh.ClassBreaks,
 	bn *bottleneckSoundingResults,
 ) error {
@@ -186,29 +236,13 @@
 	defer tx.Rollback()
 
 	var (
-		insertAreasStmt,
-		deleteAreasStmt,
-		fetchMarkingPointsStmt,
-		deleteMarkingPointsStmt,
-		insertMarkingPointsStmt *sql.Stmt
+		insertAreas         = tx.StmtContext(ctx, isrs.insertAreas)
+		deleteAreas         = tx.StmtContext(ctx, isrs.deleteAreas)
+		fetchMarkingPoints  = tx.StmtContext(ctx, isrs.fetchMarkingPoints)
+		deleteMarkingPoints = tx.StmtContext(ctx, isrs.deleteMarkingPoints)
+		insertMarkingPoints = tx.StmtContext(ctx, isrs.insertMarkingPoints)
 	)
 
-	for _, x := range []struct {
-		stmt  **sql.Stmt
-		query string
-	}{
-		{&insertAreasStmt, insertIsoAreasSQL},
-		{&deleteAreasStmt, deleteIsoAreasSQL},
-		{&fetchMarkingPointsStmt, fetchMarkingPointsSQL},
-		{&deleteMarkingPointsStmt, deleteMarkingPointsSQL},
-		{&insertMarkingPointsStmt, insertMarkingPointsSQL},
-	} {
-		if *x.stmt, err = tx.PrepareContext(ctx, x.query); err != nil {
-			return err
-		}
-		defer (*x.stmt).Close()
-	}
-
 	// For all sounding results in bottleneck.
 	for _, sr := range bn.srs {
 		switch sr.surveyType {
@@ -219,7 +253,7 @@
 			var points mesh.MultiPointZ
 
 			if err := func() error {
-				rows, err := fetchMarkingPointsStmt.QueryContext(ctx, sr.id)
+				rows, err := fetchMarkingPoints.QueryContext(ctx, sr.id)
 				if err != nil {
 					return err
 				}
@@ -242,7 +276,7 @@
 			}
 
 			// Delete old points
-			if _, err := deleteMarkingPointsStmt.ExecContext(ctx, sr.id); err != nil {
+			if _, err := deleteMarkingPoints.ExecContext(ctx, sr.id); err != nil {
 				return err
 			}
 
@@ -255,7 +289,7 @@
 				if len(class) == 0 {
 					continue
 				}
-				if _, err := insertMarkingPointsStmt.ExecContext(
+				if _, err := insertMarkingPoints.ExecContext(
 					ctx, sr.id, heights[i], 4326, class.AsWKB(),
 				); err != nil {
 					return err
@@ -270,7 +304,7 @@
 			hs := heights.ExtrapolateClassBreaks(tree.Min().Z, tree.Max().Z).Dedup()
 
 			// Delete the old iso areas.
-			if _, err := deleteAreasStmt.ExecContext(ctx, sr); err != nil {
+			if _, err := deleteAreas.ExecContext(ctx, sr); err != nil {
 				return err
 			}
 
@@ -290,7 +324,7 @@
 				if len(a) == 0 {
 					continue
 				}
-				if _, err := insertAreasStmt.ExecContext(
+				if _, err := insertAreas.ExecContext(
 					ctx,
 					sr, hs[i], tree.EPSG(),
 					a.AsWKB(),