Mercurial > gemma
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 } |