comparison pkg/controllers/diff.go @ 2580:5125db802b79

Morphological differences: Check if we already have a diff before we start to calculate it.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 11 Mar 2019 15:58:26 +0100
parents 647a58ee9ae9
children 5c6a7e69b02d
comparison
equal deleted inserted replaced
2579:5295a182b4a4 2580:5125db802b79
26 "gemma.intevation.de/gemma/pkg/common" 26 "gemma.intevation.de/gemma/pkg/common"
27 "gemma.intevation.de/gemma/pkg/models" 27 "gemma.intevation.de/gemma/pkg/models"
28 "gemma.intevation.de/gemma/pkg/octree" 28 "gemma.intevation.de/gemma/pkg/octree"
29 ) 29 )
30 30
31 const (
32 diffIDSQL = `
33 SELECT sd.id FROM
34 caching.sounding_differences sd JOIN
35 waterway.sounding_results srm ON sd.minuend = srm.id JOIN
36 waterway.sounding_results srs ON sd.subtrahend = srs.id JOIN
37 waterway.bottlenecks bns ON srm.bottleneck_id = bns.id
38 WHERE srm.bottleneck_id = srs.bottleneck_id AND
39 bns.objnam = $1 AND
40 srs.date_info = $2::date AND
41 srm.date_info = $3::date AND
42 `
43 )
44
31 // Only allow three diffence calculation at once. 45 // Only allow three diffence calculation at once.
32 // TODO: Make this configurable? 46 // TODO: Make this configurable?
33 var diffCalculationSemaphore = semaphore.NewWeighted(int64(3)) 47 var diffCalculationSemaphore = semaphore.NewWeighted(int64(3))
34 48
35 func diffCalculation( 49 func diffCalculation(
38 conn *sql.Conn, 52 conn *sql.Conn,
39 ) (jr JSONResult, err error) { 53 ) (jr JSONResult, err error) {
40 54
41 start := time.Now() 55 start := time.Now()
42 56
57 dci := input.(models.DiffCalculationInput)
58
43 ctx := req.Context() 59 ctx := req.Context()
60
61 var id int64
62 err = conn.QueryRowContext(
63 ctx,
64 diffIDSQL,
65 dci.Bottleneck,
66 dci.Minuend.Time,
67 dci.Subtrahend.Time,
68 ).Scan(&id)
69
70 switch {
71 case err == sql.ErrNoRows:
72 // We need to calculate it.
73 case err != nil:
74 return
75 default:
76 // We already have this diff
77 jr = JSONResult{
78 Result: map[string]int64{"id": id},
79 }
80 return
81 }
44 82
45 // DoS counter measure. 83 // DoS counter measure.
46 if err = diffCalculationSemaphore.Acquire(ctx, 1); err != nil { 84 if err = diffCalculationSemaphore.Acquire(ctx, 1); err != nil {
47 return 85 return
48 } 86 }
49 defer diffCalculationSemaphore.Release(1) 87 defer diffCalculationSemaphore.Release(1)
50
51 dci := input.(models.DiffCalculationInput)
52 88
53 minuendTree, err := octree.FromCache( 89 minuendTree, err := octree.FromCache(
54 ctx, conn, 90 ctx, conn,
55 dci.Bottleneck, dci.Minuend.Time) 91 dci.Bottleneck, dci.Minuend.Time)
56 92
174 log.Printf("info: min/max: %f %f\n", tree.Min.Z, tree.Max.Z) 210 log.Printf("info: min/max: %f %f\n", tree.Min.Z, tree.Max.Z)
175 211
176 heights := octree.SampleDiffHeights(tree.Min.Z, tree.Max.Z, 0.1) 212 heights := octree.SampleDiffHeights(tree.Min.Z, tree.Max.Z, 0.1)
177 log.Printf("info: num heights: %d\n", len(heights)) 213 log.Printf("info: num heights: %d\n", len(heights))
178 214
215 // XXX: Maybe we should start this transaction earlier!?
216 var tx *sql.Tx
217 if tx, err = conn.BeginTx(ctx, nil); err != nil {
218 return
219 }
220 defer tx.Rollback()
221
179 // TODO: Implement me! 222 // TODO: Implement me!
180 223
181 return 224 return
182 } 225 }