annotate pkg/controllers/fwa.go @ 5490:5f47eeea988d logging

Use own logging package.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 20 Sep 2021 17:45:39 +0200
parents d71ebe576c76
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5184
445daeefca7b Added controller stub for new fairway availability.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1 // This is Free Software under GNU Affero General Public License v >= 3.0
445daeefca7b Added controller stub for new fairway availability.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
2 // without warranty, see README.md and license for details.
445daeefca7b Added controller stub for new fairway availability.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
3 //
445daeefca7b Added controller stub for new fairway availability.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
4 // SPDX-License-Identifier: AGPL-3.0-or-later
445daeefca7b Added controller stub for new fairway availability.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
5 // License-Filename: LICENSES/AGPL-3.0.txt
445daeefca7b Added controller stub for new fairway availability.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
6 //
445daeefca7b Added controller stub for new fairway availability.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
7 // Copyright (C) 2018, 2019, 2020 by via donau
445daeefca7b Added controller stub for new fairway availability.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
8 // – Österreichische Wasserstraßen-Gesellschaft mbH
445daeefca7b Added controller stub for new fairway availability.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
9 // Software engineering by Intevation GmbH
445daeefca7b Added controller stub for new fairway availability.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10 //
445daeefca7b Added controller stub for new fairway availability.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11 // Author(s):
445daeefca7b Added controller stub for new fairway availability.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de>
445daeefca7b Added controller stub for new fairway availability.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
13
445daeefca7b Added controller stub for new fairway availability.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14 package controllers
445daeefca7b Added controller stub for new fairway availability.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15
445daeefca7b Added controller stub for new fairway availability.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16 import (
5197
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
17 "context"
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
18 "database/sql"
5221
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
19 "encoding/csv"
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
20 "fmt"
5184
445daeefca7b Added controller stub for new fairway availability.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
21 "net/http"
5203
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
22 "sort"
5204
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
23 "strconv"
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
24 "strings"
5196
5bc8daa986d9 More code movement.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5195
diff changeset
25 "time"
5184
445daeefca7b Added controller stub for new fairway availability.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
26
5197
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
27 "github.com/gorilla/mux"
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
28
5196
5bc8daa986d9 More code movement.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5195
diff changeset
29 "gemma.intevation.de/gemma/pkg/common"
5490
5f47eeea988d Use own logging package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5474
diff changeset
30 "gemma.intevation.de/gemma/pkg/log"
5197
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
31 "gemma.intevation.de/gemma/pkg/middleware"
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
32 )
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
33
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
34 const (
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
35 selectBottlenecksLimitingSQL = `
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
36 SELECT
5233
d6374435111a Fixed order of parameters in SQL result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5232
diff changeset
37 lower(validity),
d6374435111a Fixed order of parameters in SQL result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5232
diff changeset
38 upper(validity),
5197
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
39 limiting
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
40 FROM
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
41 waterway.bottlenecks
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
42 WHERE
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
43 bottleneck_id = $1 AND
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
44 validity && tstzrange($2, $3)`
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
45
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
46 selectSymbolBottlenecksSQL = `
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
47 SELECT
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
48 distinct(b.bottleneck_id)
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
49 FROM
5246
6cbfa3c3803d stretches und sections are in different schemata.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5245
diff changeset
50 %s s, waterway.bottlenecks b
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
51 WHERE
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
52 ST_Intersects(b.area, s.area)
5250
13e1767b63a1 Reverted: 8c44b518141a, which didn't fix anything.
Sascha Wilde <wilde@intevation.de>
parents: 5248
diff changeset
53 AND s.name = $1
13e1767b63a1 Reverted: 8c44b518141a, which didn't fix anything.
Sascha Wilde <wilde@intevation.de>
parents: 5248
diff changeset
54 AND b.validity && tstzrange($2, $3)`
5200
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
55
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
56 selectLDCsSQL = `
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
57 SELECT
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
58 lower(grwl.validity),
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
59 upper(grwl.validity),
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
60 grwl.value
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
61 FROM
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
62 waterway.gauges_reference_water_levels grwl
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
63 JOIN waterway.bottlenecks bns
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
64 ON grwl.location = bns.gauge_location
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
65 WHERE
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
66 grwl.depth_reference like 'LDC%'
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
67 AND bns.bottleneck_id = $1
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
68 AND grwl.validity && tstzrange($2, $3)`
5202
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
69
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
70 selectMeasurementsSQL = `
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
71 WITH data AS (
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
72 SELECT
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
73 efa.measure_date,
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
74 efa.available_depth_value,
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
75 efa.available_width_value,
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
76 efa.water_level_value
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
77 FROM waterway.effective_fairway_availability efa
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
78 JOIN waterway.fairway_availability fa
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
79 ON efa.fairway_availability_id = fa.id
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
80 JOIN waterway.bottlenecks bn
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
81 ON fa.bottleneck_id = bn.bottleneck_id
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
82 WHERE
5255
256ebbeb1252 Fix FWA performance: match bottleneck validity with measure date.
wilde@azure1.rgb.intevation.de
parents: 5253
diff changeset
83 bn.validity @> efa.measure_date AND
5202
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
84 bn.bottleneck_id = $1 AND
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
85 efa.level_of_service = $2 AND
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
86 efa.measure_type = 'Measured' AND
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
87 (efa.available_depth_value IS NOT NULL OR
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
88 efa.available_width_value IS NOT NULL) AND
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
89 efa.water_level_value IS NOT NULL
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
90 ),
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
91 before AS (
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
92 SELECT * FROM data WHERE measure_date < $3
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
93 ORDER BY measure_date DESC LIMIT 1
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
94 ),
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
95 inside AS (
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
96 SELECT * FROM data WHERE measure_date BETWEEN $3 AND $4
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
97 ),
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
98 after AS (
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
99 SELECT * FROM data WHERE measure_date > $4
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
100 ORDER BY measure_date LIMIT 1
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
101 )
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
102 SELECT * FROM before
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
103 UNION ALL
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
104 SELECT * FROM inside
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
105 UNION ALL
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
106 SELECT * FROM after
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
107 ORDER BY measure_date`
5197
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
108 )
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
109
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
110 type (
5200
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
111 timeRange struct {
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
112 lower time.Time
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
113 upper time.Time
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
114 }
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
115
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
116 ldc struct {
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
117 timeRange
5203
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
118 value []float64
5200
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
119 }
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
120
5203
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
121 ldcs []*ldc
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
122
5210
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
123 limitingFactor int
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
124
5197
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
125 limitingValidity struct {
5200
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
126 timeRange
5210
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
127 limiting limitingFactor
5203
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
128 ldcs ldcs
5197
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
129 }
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
130
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
131 limitingValidities []limitingValidity
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
132
5202
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
133 availMeasurement struct {
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
134 when time.Time
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
135 depth int16
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
136 width int16
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
137 value int16
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
138 }
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
139
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
140 availMeasurements []availMeasurement
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
141
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
142 bottleneck struct {
5202
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
143 id string
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
144 validities limitingValidities
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
145 measurements availMeasurements
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
146 }
5204
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
147
5210
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
148 bottlenecks []bottleneck
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
149
5204
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
150 fwaMode int
5184
445daeefca7b Added controller stub for new fairway availability.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
151 )
445daeefca7b Added controller stub for new fairway availability.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
152
5204
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
153 const (
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
154 fwaMonthly fwaMode = iota
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
155 fwaQuarterly
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
156 fwaYearly
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
157 )
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
158
5210
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
159 const (
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
160 limitingDepth limitingFactor = iota
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
161 limitingWidth
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
162 )
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
163
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
164 var limitingAccess = [...]func(*availMeasurement) float64{
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
165 limitingDepth: (*availMeasurement).getDepth,
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
166 limitingWidth: (*availMeasurement).getWidth,
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
167 }
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
168
5204
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
169 // afdRefs are the typical available fairway depth reference values.
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
170 var afdRefs = []float64{
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
171 230,
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
172 250,
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
173 }
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
174
5203
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
175 func (ls ldcs) find(from, to time.Time) *ldc {
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
176 for _, l := range ls {
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
177 if l.intersects(from, to) {
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
178 return l
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
179 }
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
180 }
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
181 return nil
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
182 }
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
183
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
184 func fairwayAvailability(rw http.ResponseWriter, req *http.Request) {
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
185
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
186 from, to, ok := parseFromTo(rw, req)
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
187 if !ok {
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
188 return
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
189 }
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
190
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
191 vars := mux.Vars(req)
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
192 name := vars["name"]
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
193 if name == "" {
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
194 http.Error(rw, "missing 'name' parameter.", http.StatusBadRequest)
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
195 return
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
196 }
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
197
5226
755d54cd7fd0 Use LOS 3 as a default.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5225
diff changeset
198 los, ok := parseFormInt(rw, req, "los", 3)
5202
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
199 if !ok {
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
200 return
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
201 }
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
202
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
203 ctx := req.Context()
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
204 conn := middleware.GetDBConn(req)
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
205
5251
1fce0fd81f46 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5250
diff changeset
206 var bns bottlenecks
1fce0fd81f46 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5250
diff changeset
207 var err error
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
208
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
209 switch vars["kind"] {
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
210 case "bottleneck":
5251
1fce0fd81f46 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5250
diff changeset
211 bns = bottlenecks{{id: name}}
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
212 case "stretch":
5251
1fce0fd81f46 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5250
diff changeset
213 bns, err = loadSymbolBottlenecks(ctx, conn, "users.stretches", name, from, to)
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
214 case "section":
5251
1fce0fd81f46 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5250
diff changeset
215 bns, err = loadSymbolBottlenecks(ctx, conn, "waterway.sections", name, from, to)
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
216 default:
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
217 http.Error(rw, "Invalid kind type.", http.StatusBadRequest)
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
218 return
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
219 }
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
220
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
221 if err != nil {
5490
5f47eeea988d Use own logging package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5474
diff changeset
222 log.Errorf("%v\n", err)
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
223 http.Error(rw, "cannot extract bottlenecks", http.StatusBadRequest)
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
224 return
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
225 }
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
226
5211
8d582b5ff71e Some checks to prevent trivial errors.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5210
diff changeset
227 // If there are no bottlenecks there is nothing to do.
5251
1fce0fd81f46 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5250
diff changeset
228 if len(bns) == 0 {
5211
8d582b5ff71e Some checks to prevent trivial errors.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5210
diff changeset
229 http.Error(rw, "No bottlenecks found.", http.StatusNotFound)
8d582b5ff71e Some checks to prevent trivial errors.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5210
diff changeset
230 return
8d582b5ff71e Some checks to prevent trivial errors.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5210
diff changeset
231 }
8d582b5ff71e Some checks to prevent trivial errors.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5210
diff changeset
232
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
233 // load validities and limiting factors
5251
1fce0fd81f46 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5250
diff changeset
234 for i := range bns {
1fce0fd81f46 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5250
diff changeset
235 if err := bns[i].loadLimitingValidities(ctx, conn, from, to); err != nil {
5490
5f47eeea988d Use own logging package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5474
diff changeset
236 log.Errorf("%v\n", err)
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
237 http.Error(rw, "cannot load validities", http.StatusInternalServerError)
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
238 return
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
239 }
5200
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
240 // load LCDs
5251
1fce0fd81f46 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5250
diff changeset
241 if err := bns[i].loadLDCs(ctx, conn, from, to); err != nil {
5490
5f47eeea988d Use own logging package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5474
diff changeset
242 log.Errorf("%v\n", err)
5200
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
243 http.Error(rw, "cannot load LDCs", http.StatusInternalServerError)
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
244 return
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
245 }
5202
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
246 // load values
5251
1fce0fd81f46 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5250
diff changeset
247 if err := bns[i].loadValues(ctx, conn, from, to, los); err != nil {
5490
5f47eeea988d Use own logging package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5474
diff changeset
248 log.Errorf("%v\n", err)
5230
40c9acd114cd Added missing parameter to SQL query.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5228
diff changeset
249 http.Error(rw, "cannot load values", http.StatusInternalServerError)
5202
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
250 return
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
251 }
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
252 }
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
253
5210
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
254 // separate breaks for depth and width
5474
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
255 breaks, ok := parseBreaks(rw, req, "breaks", afdRefs)
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
256 if !ok {
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
257 return
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
258 }
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
259 depthBreaks, ok := parseBreaks(rw, req, "depthbreaks", breaks)
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
260 if !ok {
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
261 return
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
262 }
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
263 widthBreaks, ok := parseBreaks(rw, req, "widthbreaks", breaks)
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
264 if !ok {
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
265 return
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
266 }
5214
ebcf33d79d2e Use breaks to classfify.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5213
diff changeset
267
5474
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
268 chooseBreaks := [...][]float64{
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
269 limitingDepth: depthBreaks,
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
270 limitingWidth: widthBreaks,
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
271 }
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
272
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
273 useDepth := bns.hasLimiting(limitingDepth, from, to)
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
274 useWidth := bns.hasLimiting(limitingWidth, from, to)
5210
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
275
5212
6c316a4d3386 Pull breaks from the request parameters.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5211
diff changeset
276 if useDepth && useWidth && len(widthBreaks) != len(depthBreaks) {
5211
8d582b5ff71e Some checks to prevent trivial errors.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5210
diff changeset
277 http.Error(
8d582b5ff71e Some checks to prevent trivial errors.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5210
diff changeset
278 rw,
8d582b5ff71e Some checks to prevent trivial errors.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5210
diff changeset
279 fmt.Sprintf("class breaks lengths differ: %d != %d",
5212
6c316a4d3386 Pull breaks from the request parameters.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5211
diff changeset
280 len(widthBreaks), len(depthBreaks)),
5211
8d582b5ff71e Some checks to prevent trivial errors.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5210
diff changeset
281 http.StatusBadRequest,
8d582b5ff71e Some checks to prevent trivial errors.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5210
diff changeset
282 )
8d582b5ff71e Some checks to prevent trivial errors.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5210
diff changeset
283 return
8d582b5ff71e Some checks to prevent trivial errors.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5210
diff changeset
284 }
8d582b5ff71e Some checks to prevent trivial errors.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5210
diff changeset
285
5221
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
286 availability := vars["type"] == "availability"
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
287
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
288 var record []string
5242
98ad96446d37 Switched availability and fairway depths modes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5239
diff changeset
289 if !availability {
5221
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
290 // in days
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
291 record = makeHeader(useDepth && useWidth, 1, breaks, 'd')
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
292 } else {
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
293 // percentage
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
294 record = makeHeader(useDepth && useWidth, 3, breaks, '%')
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
295 }
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
296
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
297 rw.Header().Add("Content-Type", "text/csv")
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
298
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
299 out := csv.NewWriter(rw)
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
300
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
301 if err := out.Write(record); err != nil {
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
302 // Too late for HTTP status message.
5490
5f47eeea988d Use own logging package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5474
diff changeset
303 log.Errorf("%v\n", err)
5221
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
304 return
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
305 }
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
306
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
307 for i := range record[1:] {
5244
8f9cd1df5028 Fixed a copy-by-value problem.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5243
diff changeset
308 record[i+1] = "0"
5221
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
309 }
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
310
5203
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
311 // For every day on every bottleneck we need to find out if this day is valid.
5251
1fce0fd81f46 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5250
diff changeset
312 validities := make([]func(time.Time, time.Time) *limitingValidity, len(bns))
1fce0fd81f46 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5250
diff changeset
313 for i := range bns {
1fce0fd81f46 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5250
diff changeset
314 validities[i] = bns[i].validities.find()
5203
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
315 }
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
316
5227
fa55f403985b Added a comment about the mode.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5226
diff changeset
317 // Mode reflects if we use monthly, quarterly od yearly intervals.
5208
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
318 mode := parseFWAMode(req.FormValue("mode"))
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
319
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
320 label, finish := interval(mode, from)
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
321
5236
b47a041e03c4 Fill classification columns in CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5234
diff changeset
322 var (
b47a041e03c4 Fill classification columns in CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5234
diff changeset
323 totalDays, overLDCDays int
b47a041e03c4 Fill classification columns in CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5234
diff changeset
324 missingLDCs = make([]int, len(validities))
5244
8f9cd1df5028 Fixed a copy-by-value problem.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5243
diff changeset
325 counters = make([]int, len(breaks)+1)
5236
b47a041e03c4 Fill classification columns in CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5234
diff changeset
326 )
5216
91feaf7ac486 Started to accumulate time segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5215
diff changeset
327
5243
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
328 var current, next time.Time
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
329
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
330 write := func() error {
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
331 record[0] = label(current)
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
332
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
333 if !availability {
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
334 record[1] = strconv.Itoa(totalDays - overLDCDays)
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
335 record[2] = strconv.Itoa(overLDCDays)
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
336 for i, c := range counters {
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
337 record[3+i] = strconv.Itoa(c)
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
338 }
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
339 } else {
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
340 overPerc := float64(overLDCDays) * 100 / float64(totalDays)
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
341 record[1] = fmt.Sprintf("%.3f", 100-overPerc)
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
342 record[2] = fmt.Sprintf("%.3f", overPerc)
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
343 for i, c := range counters {
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
344 perc := float64(c) * 100 / float64(totalDays)
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
345 record[3+i] = fmt.Sprintf("%.3f", perc)
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
346 }
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
347 }
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
348
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
349 return out.Write(record)
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
350 }
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
351
5253
878d52d95e37 Early calcultion stop to prevent classification in the future.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5252
diff changeset
352 // Stop yesterday
5296
b3b990811f2c Moved Dusk and Dawn functions to common time functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5258
diff changeset
353 end := common.MinTime(common.Dusk(time.Now()).Add(-time.Nanosecond), to)
5253
878d52d95e37 Early calcultion stop to prevent classification in the future.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5252
diff changeset
354
5203
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
355 // We step through the time in steps of one day.
5253
878d52d95e37 Early calcultion stop to prevent classification in the future.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5252
diff changeset
356 for current = from; current.Before(end); {
5203
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
357
5243
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
358 next = current.AddDate(0, 0, 1)
5203
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
359
5228
f3a88039d822 Renamed variable shipable to overLDC to remove implicit semantics.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5227
diff changeset
360 // Assume that a bottleneck is over LDC.
f3a88039d822 Renamed variable shipable to overLDC to remove implicit semantics.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5227
diff changeset
361 overLDC := true
5252
aebe1a12e8b9 If looking at sections/stretches the bottleneck with the lowest class determines the class of the whole construct.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5251
diff changeset
362 lowest := len(counters) - 1
5203
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
363
5244
8f9cd1df5028 Fixed a copy-by-value problem.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5243
diff changeset
364 var hasValid bool
8f9cd1df5028 Fixed a copy-by-value problem.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5243
diff changeset
365
5216
91feaf7ac486 Started to accumulate time segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5215
diff changeset
366 // check all bottlenecks
5203
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
367 for i, validity := range validities {
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
368
5216
91feaf7ac486 Started to accumulate time segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5215
diff changeset
369 // Check if bottleneck is available for this day.
91feaf7ac486 Started to accumulate time segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5215
diff changeset
370 vs := validity(current, next)
91feaf7ac486 Started to accumulate time segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5215
diff changeset
371 if vs == nil {
91feaf7ac486 Started to accumulate time segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5215
diff changeset
372 continue
91feaf7ac486 Started to accumulate time segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5215
diff changeset
373 }
5203
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
374
5216
91feaf7ac486 Started to accumulate time segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5215
diff changeset
375 // Let's see if we have a LDC for this day.
91feaf7ac486 Started to accumulate time segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5215
diff changeset
376 ldc := vs.ldcs.find(current, next)
91feaf7ac486 Started to accumulate time segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5215
diff changeset
377 if ldc == nil {
5217
70d83b7d36ef Track the number days LDCs are not available at bottlenecks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5216
diff changeset
378 missingLDCs[i]++
5216
91feaf7ac486 Started to accumulate time segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5215
diff changeset
379 continue
91feaf7ac486 Started to accumulate time segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5215
diff changeset
380 }
5203
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
381
5244
8f9cd1df5028 Fixed a copy-by-value problem.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5243
diff changeset
382 hasValid = true
8f9cd1df5028 Fixed a copy-by-value problem.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5243
diff changeset
383
5228
f3a88039d822 Renamed variable shipable to overLDC to remove implicit semantics.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5227
diff changeset
384 if overLDC { // If its already not shipable we need no further tests.
5251
1fce0fd81f46 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5250
diff changeset
385 result := bns[i].measurements.classify(
5214
ebcf33d79d2e Use breaks to classfify.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5213
diff changeset
386 current, next,
5216
91feaf7ac486 Started to accumulate time segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5215
diff changeset
387 ldc.value,
91feaf7ac486 Started to accumulate time segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5215
diff changeset
388 (*availMeasurement).getValue)
5214
ebcf33d79d2e Use breaks to classfify.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5213
diff changeset
389
5258
b373213d8e7c Assume that the decision if a day is below LDC is only possible if there are values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5256
diff changeset
390 if (result[0] != 0 || result[1] != 0) && result[1] < 12*time.Hour {
5228
f3a88039d822 Renamed variable shipable to overLDC to remove implicit semantics.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5227
diff changeset
391 overLDC = false
5216
91feaf7ac486 Started to accumulate time segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5215
diff changeset
392 }
91feaf7ac486 Started to accumulate time segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5215
diff changeset
393 }
5214
ebcf33d79d2e Use breaks to classfify.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5213
diff changeset
394
5474
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
395 classes := bns[i].measurements.classify(
5216
91feaf7ac486 Started to accumulate time segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5215
diff changeset
396 current, next,
91feaf7ac486 Started to accumulate time segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5215
diff changeset
397 chooseBreaks[vs.limiting],
5474
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
398 limitingAccess[vs.limiting])
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
399
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
400 if min := minClass(classes, 12*time.Hour); min < lowest {
5252
aebe1a12e8b9 If looking at sections/stretches the bottleneck with the lowest class determines the class of the whole construct.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5251
diff changeset
401 lowest = min
5236
b47a041e03c4 Fill classification columns in CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5234
diff changeset
402 }
5203
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
403 }
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
404
5244
8f9cd1df5028 Fixed a copy-by-value problem.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5243
diff changeset
405 if hasValid {
8f9cd1df5028 Fixed a copy-by-value problem.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5243
diff changeset
406 if overLDC {
8f9cd1df5028 Fixed a copy-by-value problem.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5243
diff changeset
407 overLDCDays++
8f9cd1df5028 Fixed a copy-by-value problem.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5243
diff changeset
408 }
5252
aebe1a12e8b9 If looking at sections/stretches the bottleneck with the lowest class determines the class of the whole construct.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5251
diff changeset
409 counters[lowest]++
5245
9dd1ae697f93 If not valid assume all is in best conditions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5244
diff changeset
410 } else { // assume that all is in best conditions
9dd1ae697f93 If not valid assume all is in best conditions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5244
diff changeset
411 overLDCDays++
9dd1ae697f93 If not valid assume all is in best conditions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5244
diff changeset
412 counters[len(counters)-1]++
5236
b47a041e03c4 Fill classification columns in CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5234
diff changeset
413 }
5245
9dd1ae697f93 If not valid assume all is in best conditions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5244
diff changeset
414
5224
fc999a902d87 Write LCD columns.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5223
diff changeset
415 totalDays++
5208
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
416
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
417 if finish(next) {
5243
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
418 if err := write(); err != nil {
5239
158a26bcb2af Write the data out!
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5236
diff changeset
419 // Too late for HTTP status message.
5490
5f47eeea988d Use own logging package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5474
diff changeset
420 log.Errorf("%v\n", err)
5239
158a26bcb2af Write the data out!
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5236
diff changeset
421 return
158a26bcb2af Write the data out!
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5236
diff changeset
422 }
158a26bcb2af Write the data out!
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5236
diff changeset
423
5208
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
424 // Reset counters
5228
f3a88039d822 Renamed variable shipable to overLDC to remove implicit semantics.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5227
diff changeset
425 overLDCDays, totalDays = 0, 0
5236
b47a041e03c4 Fill classification columns in CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5234
diff changeset
426 for i := range counters {
b47a041e03c4 Fill classification columns in CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5234
diff changeset
427 counters[i] = 0
b47a041e03c4 Fill classification columns in CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5234
diff changeset
428 }
5208
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
429 }
5203
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
430
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
431 current = next
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
432 }
5217
70d83b7d36ef Track the number days LDCs are not available at bottlenecks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5216
diff changeset
433
5243
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
434 // Write rest if last period was not finished.
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
435 if totalDays > 0 {
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
436 if err := write(); err != nil {
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
437 // Too late for HTTP status message.
5490
5f47eeea988d Use own logging package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5474
diff changeset
438 log.Errorf("%v\n", err)
5243
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
439 return
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
440 }
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
441 }
0ab809236eb5 Write rest if lasteval period was not complete.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5242
diff changeset
442
5256
ed62f138528a Log days of missing LDCs per bottleneck.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5255
diff changeset
443 for i, days := range missingLDCs {
ed62f138528a Log days of missing LDCs per bottleneck.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5255
diff changeset
444 if missingLDCs[i] > 0 {
5490
5f47eeea988d Use own logging package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5474
diff changeset
445 log.Warnf("warn: Missing LDCs for %s on %d days.\n",
5256
ed62f138528a Log days of missing LDCs per bottleneck.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5255
diff changeset
446 bns[i].id, days)
ed62f138528a Log days of missing LDCs per bottleneck.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5255
diff changeset
447 }
ed62f138528a Log days of missing LDCs per bottleneck.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5255
diff changeset
448 }
5221
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
449
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
450 out.Flush()
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
451 if err := out.Error(); err != nil {
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
452 // Too late for HTTP status message.
5490
5f47eeea988d Use own logging package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5474
diff changeset
453 log.Errorf("%v\n", err)
5221
6794e85dc2dd Write headers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5220
diff changeset
454 }
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
455 }
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
456
5236
b47a041e03c4 Fill classification columns in CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5234
diff changeset
457 func minClass(classes []time.Duration, threshold time.Duration) int {
b47a041e03c4 Fill classification columns in CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5234
diff changeset
458 var sum time.Duration
b47a041e03c4 Fill classification columns in CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5234
diff changeset
459 for i, v := range classes {
b47a041e03c4 Fill classification columns in CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5234
diff changeset
460 if sum += v; sum >= threshold {
b47a041e03c4 Fill classification columns in CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5234
diff changeset
461 return i
5225
c5599966befe find minima of each class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5224
diff changeset
462 }
c5599966befe find minima of each class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5224
diff changeset
463 }
5252
aebe1a12e8b9 If looking at sections/stretches the bottleneck with the lowest class determines the class of the whole construct.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5251
diff changeset
464 return len(classes) - 1
5225
c5599966befe find minima of each class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5224
diff changeset
465 }
c5599966befe find minima of each class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5224
diff changeset
466
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
467 func parseFromTo(
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
468 rw http.ResponseWriter,
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
469 req *http.Request,
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
470 ) (time.Time, time.Time, bool) {
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
471 from, ok := parseFormTime(rw, req, "from", time.Now().AddDate(-1, 0, 0))
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
472 if !ok {
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
473 return time.Time{}, time.Time{}, false
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
474 }
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
475
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
476 to, ok := parseFormTime(rw, req, "to", from.AddDate(1, 0, 0))
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
477 if !ok {
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
478 return time.Time{}, time.Time{}, false
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
479 }
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
480
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
481 from, to = common.OrderTime(from, to)
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
482 // Operate on daily basis so go to full days.
5296
b3b990811f2c Moved Dusk and Dawn functions to common time functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5258
diff changeset
483 return common.Dusk(from), common.Dawn(to), true
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
484 }
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
485
5204
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
486 func parseFWAMode(mode string) fwaMode {
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
487 switch strings.ToLower(mode) {
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
488 case "monthly":
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
489 return fwaMonthly
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
490 case "quarterly":
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
491 return fwaQuarterly
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
492 case "yearly":
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
493 return fwaYearly
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
494 default:
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
495 return fwaMonthly
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
496 }
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
497 }
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
498
5474
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
499 func breaksToReferenceValue(breaks string) ([]float64, error) {
5204
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
500 parts := strings.Split(breaks, ",")
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
501 var values []float64
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
502
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
503 for _, part := range parts {
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
504 part = strings.TrimSpace(part)
5474
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
505 v, err := strconv.ParseFloat(part, 64)
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
506 if err != nil {
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
507 return nil, err
5204
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
508 }
5474
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
509 values = append(values, v)
5204
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
510 }
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
511
5474
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
512 return common.DedupFloat64s(values), nil
5204
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
513 }
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
514
5474
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
515 func parseBreaks(
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
516 rw http.ResponseWriter, req *http.Request,
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
517 parameter string,
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
518 defaults []float64,
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
519 ) ([]float64, bool) {
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
520
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
521 breaks := strings.TrimSpace(req.FormValue(parameter))
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
522 if breaks == "" {
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
523 return defaults, true
5204
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
524 }
5474
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
525
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
526 defaults, err := breaksToReferenceValue(breaks)
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
527 if err != nil {
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
528 msg := fmt.Sprintf("Parameter '%s' is invalid: %s.", parameter, err)
5490
5f47eeea988d Use own logging package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5474
diff changeset
529 log.Errorf("%s\n", msg)
5474
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
530 http.Error(rw, msg, http.StatusBadRequest)
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
531 return nil, false
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
532 }
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
533
d71ebe576c76 FWA: Check if breaks are valid parameters. Send BadRequest back if they are not.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5296
diff changeset
534 return defaults, true
5204
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
535 }
7ca9e6c9a203 Introduced type for mode (monthly, quarterly, yearly).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5203
diff changeset
536
5200
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
537 func (tr *timeRange) intersects(from, to time.Time) bool {
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
538 return !(to.Before(tr.lower) || from.After(tr.upper))
5197
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
539 }
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
540
5201
40daecc6f552 Made timeranges all UTC.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5200
diff changeset
541 func (tr *timeRange) toUTC() {
40daecc6f552 Made timeranges all UTC.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5200
diff changeset
542 tr.lower = tr.lower.UTC()
40daecc6f552 Made timeranges all UTC.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5200
diff changeset
543 tr.upper = tr.upper.UTC()
40daecc6f552 Made timeranges all UTC.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5200
diff changeset
544 }
40daecc6f552 Made timeranges all UTC.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5200
diff changeset
545
5197
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
546 func (lvs limitingValidities) find() func(from, to time.Time) *limitingValidity {
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
547
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
548 var last *limitingValidity
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
549
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
550 return func(from, to time.Time) *limitingValidity {
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
551 if last != nil && last.intersects(from, to) {
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
552 return last
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
553 }
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
554 for i := range lvs {
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
555 if lv := &lvs[i]; lv.intersects(from, to) {
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
556 last = lv
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
557 return lv
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
558 }
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
559 }
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
560 return nil
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
561 }
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
562 }
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
563
5210
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
564 func (lvs limitingValidities) hasLimiting(limiting limitingFactor, from, to time.Time) bool {
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
565 for i := range lvs {
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
566 if lvs[i].limiting == limiting && lvs[i].intersects(from, to) {
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
567 return true
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
568 }
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
569 }
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
570 return false
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
571 }
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
572
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
573 func (bns bottlenecks) hasLimiting(limiting limitingFactor, from, to time.Time) bool {
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
574 for i := range bns {
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
575 if bns[i].validities.hasLimiting(limiting, from, to) {
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
576 return true
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
577 }
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
578 }
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
579 return false
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
580 }
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
581
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
582 func parseLimitingFactor(limiting string) limitingFactor {
5203
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
583 switch limiting {
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
584 case "depth":
5210
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
585 return limitingDepth
5203
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
586 case "width":
5210
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
587 return limitingWidth
5203
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
588 default:
5490
5f47eeea988d Use own logging package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5474
diff changeset
589 log.Warnf("unknown limitation '%s'. default to 'depth'\n", limiting)
5210
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
590 return limitingDepth
5203
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
591 }
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
592 }
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
593
5197
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
594 func loadLimitingValidities(
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
595 ctx context.Context,
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
596 conn *sql.Conn,
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
597 bottleneckID string,
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
598 from, to time.Time,
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
599 ) (limitingValidities, error) {
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
600
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
601 var lvs limitingValidities
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
602
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
603 rows, err := conn.QueryContext(
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
604 ctx,
5223
d4e4f7232513 Removed old bottlenecks controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5221
diff changeset
605 selectBottlenecksLimitingSQL,
5230
40c9acd114cd Added missing parameter to SQL query.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5228
diff changeset
606 bottleneckID,
5197
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
607 from, to)
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
608
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
609 if err != nil {
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
610 return nil, err
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
611 }
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
612 defer rows.Close()
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
613
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
614 for rows.Next() {
5231
225b2d0a1824 Validities may have an NULL upper bound.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5230
diff changeset
615 var (
225b2d0a1824 Validities may have an NULL upper bound.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5230
diff changeset
616 lv limitingValidity
225b2d0a1824 Validities may have an NULL upper bound.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5230
diff changeset
617 limiting string
225b2d0a1824 Validities may have an NULL upper bound.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5230
diff changeset
618 upper sql.NullTime
225b2d0a1824 Validities may have an NULL upper bound.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5230
diff changeset
619 )
5197
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
620 if err := rows.Scan(
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
621 &lv.lower,
5231
225b2d0a1824 Validities may have an NULL upper bound.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5230
diff changeset
622 &upper,
5233
d6374435111a Fixed order of parameters in SQL result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5232
diff changeset
623 &limiting,
5197
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
624 ); err != nil {
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
625 return nil, err
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
626 }
5231
225b2d0a1824 Validities may have an NULL upper bound.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5230
diff changeset
627 if upper.Valid {
225b2d0a1824 Validities may have an NULL upper bound.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5230
diff changeset
628 lv.upper = upper.Time
225b2d0a1824 Validities may have an NULL upper bound.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5230
diff changeset
629 } else {
225b2d0a1824 Validities may have an NULL upper bound.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5230
diff changeset
630 lv.upper = to.Add(24 * time.Hour)
225b2d0a1824 Validities may have an NULL upper bound.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5230
diff changeset
631 }
5201
40daecc6f552 Made timeranges all UTC.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5200
diff changeset
632 lv.toUTC()
5210
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
633 lv.limiting = parseLimitingFactor(limiting)
5197
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
634 lvs = append(lvs, lv)
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
635 }
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
636
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
637 return lvs, rows.Err()
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
638 }
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
639
5251
1fce0fd81f46 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5250
diff changeset
640 func loadSymbolBottlenecks(
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
641 ctx context.Context,
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
642 conn *sql.Conn,
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
643 what, name string,
5250
13e1767b63a1 Reverted: 8c44b518141a, which didn't fix anything.
Sascha Wilde <wilde@intevation.de>
parents: 5248
diff changeset
644 from, to time.Time,
5210
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
645 ) (bottlenecks, error) {
5184
445daeefca7b Added controller stub for new fairway availability.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
646
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
647 rows, err := conn.QueryContext(
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
648 ctx,
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
649 fmt.Sprintf(selectSymbolBottlenecksSQL, what),
5250
13e1767b63a1 Reverted: 8c44b518141a, which didn't fix anything.
Sascha Wilde <wilde@intevation.de>
parents: 5248
diff changeset
650 name,
13e1767b63a1 Reverted: 8c44b518141a, which didn't fix anything.
Sascha Wilde <wilde@intevation.de>
parents: 5248
diff changeset
651 from, to)
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
652 if err != nil {
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
653 return nil, err
5184
445daeefca7b Added controller stub for new fairway availability.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
654 }
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
655 defer rows.Close()
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
656
5210
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
657 var bns bottlenecks
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
658
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
659 for rows.Next() {
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
660 var b bottleneck
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
661 if err := rows.Scan(&b.id); err != nil {
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
662 return nil, err
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
663 }
5210
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
664 bns = append(bns, b)
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
665 }
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
666
5210
da6eb8073f77 Introduce separate breaks from depths and widths.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5209
diff changeset
667 return bns, rows.Err()
5184
445daeefca7b Added controller stub for new fairway availability.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
668 }
5195
d6710d29516b Started to move code around.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5184
diff changeset
669
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
670 func (bn *bottleneck) loadLimitingValidities(
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
671 ctx context.Context,
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
672 conn *sql.Conn,
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
673 from, to time.Time,
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
674 ) error {
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
675 vs, err := loadLimitingValidities(
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
676 ctx,
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
677 conn,
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
678 bn.id,
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
679 from, to)
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
680 if err == nil {
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
681 bn.validities = vs
5197
c352dbbf2778 Started with loading limiting factors and validities.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5196
diff changeset
682 }
5199
5001582f2ee1 Prepare to treat stretches and sections, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5197
diff changeset
683 return err
5195
d6710d29516b Started to move code around.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5184
diff changeset
684 }
5200
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
685
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
686 func (bn *bottleneck) loadLDCs(
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
687 ctx context.Context,
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
688 conn *sql.Conn,
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
689 from, to time.Time,
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
690 ) error {
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
691 rows, err := conn.QueryContext(
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
692 ctx, selectLDCsSQL,
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
693 bn.id,
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
694 from, to)
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
695 if err != nil {
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
696 return err
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
697 }
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
698 defer rows.Close()
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
699 for rows.Next() {
5203
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
700 l := ldc{value: []float64{0}}
5231
225b2d0a1824 Validities may have an NULL upper bound.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5230
diff changeset
701 var upper sql.NullTime
225b2d0a1824 Validities may have an NULL upper bound.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5230
diff changeset
702 if err := rows.Scan(&l.lower, &upper, &l.value[0]); err != nil {
5200
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
703 return err
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
704 }
5231
225b2d0a1824 Validities may have an NULL upper bound.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5230
diff changeset
705 if upper.Valid {
225b2d0a1824 Validities may have an NULL upper bound.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5230
diff changeset
706 l.upper = upper.Time
225b2d0a1824 Validities may have an NULL upper bound.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5230
diff changeset
707 } else {
225b2d0a1824 Validities may have an NULL upper bound.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5230
diff changeset
708 l.upper = to.Add(24 * time.Hour)
225b2d0a1824 Validities may have an NULL upper bound.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5230
diff changeset
709 }
5201
40daecc6f552 Made timeranges all UTC.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5200
diff changeset
710 l.toUTC()
5200
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
711 for i := range bn.validities {
5244
8f9cd1df5028 Fixed a copy-by-value problem.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5243
diff changeset
712 vs := &bn.validities[i]
8f9cd1df5028 Fixed a copy-by-value problem.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5243
diff changeset
713
5200
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
714 if vs.intersects(l.lower, l.upper) {
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
715 vs.ldcs = append(vs.ldcs, &l)
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
716 }
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
717 }
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
718 }
5202
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
719 return rows.Err()
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
720 }
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
721
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
722 func (bn *bottleneck) loadValues(
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
723 ctx context.Context,
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
724 conn *sql.Conn,
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
725 from, to time.Time,
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
726 los int,
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
727 ) error {
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
728 rows, err := conn.QueryContext(
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
729 ctx, selectMeasurementsSQL,
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
730 bn.id,
5234
30a55f46996f Another swapped sql parameter.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5233
diff changeset
731 los,
30a55f46996f Another swapped sql parameter.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5233
diff changeset
732 from, to)
5202
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
733 if err != nil {
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
734 return err
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
735 }
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
736 defer rows.Close()
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
737
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
738 var ms availMeasurements
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
739
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
740 for rows.Next() {
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
741 var m availMeasurement
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
742 if err := rows.Scan(
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
743 &m.when,
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
744 &m.depth,
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
745 &m.width,
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
746 &m.value,
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
747 ); err != nil {
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
748 return err
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
749 }
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
750 m.when = m.when.UTC()
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
751 ms = append(ms, m)
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
752 }
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
753 if err := rows.Err(); err != nil {
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
754 return err
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
755 }
fbc79c8459b4 Load water values, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5201
diff changeset
756 bn.measurements = ms
5200
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
757 return nil
5572da077c89 Load LDCs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5199
diff changeset
758 }
5203
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
759
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
760 func (measurement *availMeasurement) getDepth() float64 {
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
761 return float64(measurement.depth)
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
762 }
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
763
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
764 func (measurement *availMeasurement) getValue() float64 {
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
765 return float64(measurement.value)
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
766 }
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
767
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
768 func (measurement *availMeasurement) getWidth() float64 {
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
769 return float64(measurement.width)
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
770 }
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
771
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
772 func (measurements availMeasurements) classify(
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
773 from, to time.Time,
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
774 breaks []float64,
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
775 access func(*availMeasurement) float64,
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
776 ) []time.Duration {
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
777
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
778 if len(breaks) == 0 {
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
779 return []time.Duration{}
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
780 }
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
781
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
782 result := make([]time.Duration, len(breaks)+1)
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
783 classes := make([]float64, len(breaks)+2)
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
784 values := make([]time.Time, len(classes))
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
785
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
786 // Add sentinels
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
787 classes[0] = breaks[0] - 9999
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
788 classes[len(classes)-1] = breaks[len(breaks)-1] + 9999
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
789 for i := range breaks {
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
790 classes[i+1] = breaks[i]
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
791 }
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
792
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
793 idx := sort.Search(len(measurements), func(i int) bool {
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
794 // All values before from can be ignored.
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
795 return !measurements[i].when.Before(from)
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
796 })
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
797
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
798 if idx >= len(measurements) {
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
799 return result
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
800 }
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
801
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
802 // Be safe for interpolation.
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
803 if idx > 0 {
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
804 idx--
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
805 }
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
806
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
807 measurements = measurements[idx:]
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
808
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
809 for i := 0; i < len(measurements)-1; i++ {
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
810 p1 := &measurements[i]
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
811 p2 := &measurements[i+1]
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
812
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
813 if p1.when.After(to) {
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
814 return result
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
815 }
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
816
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
817 if p2.when.Before(from) {
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
818 continue
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
819 }
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
820
5247
d89f5d75223e Deactivate interpolation stop for gaps longer than 1.5 hours.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5246
diff changeset
821 // TODO: Discuss if we want somethinh like this.
d89f5d75223e Deactivate interpolation stop for gaps longer than 1.5 hours.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5246
diff changeset
822 if false && p2.when.Sub(p1.when).Hours() > 1.5 {
5203
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
823 // Don't interpolate ranges bigger then one and a half hour
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
824 continue
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
825 }
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
826
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
827 lo, hi := common.MaxTime(p1.when, from), common.MinTime(p2.when, to)
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
828
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
829 m1, m2 := access(p1), access(p2)
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
830 if m1 == m2 { // The whole interval is in only one class.
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
831 for j := 0; j < len(classes)-1; j++ {
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
832 if classes[j] <= m1 && m1 <= classes[j+1] {
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
833 result[j] += hi.Sub(lo)
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
834 break
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
835 }
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
836 }
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
837 continue
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
838 }
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
839
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
840 f := common.InterpolateTime(
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
841 p1.when, m1,
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
842 p2.when, m2,
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
843 )
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
844
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
845 for j, c := range classes {
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
846 values[j] = f(c)
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
847 }
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
848
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
849 for j := 0; j < len(values)-1; j++ {
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
850 start, end := common.OrderTime(values[j], values[j+1])
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
851
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
852 if start.After(hi) || end.Before(lo) {
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
853 continue
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
854 }
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
855
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
856 start, end = common.MaxTime(start, lo), common.MinTime(end, hi)
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
857 result[j] += end.Sub(start)
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
858 }
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
859 }
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
860
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
861 return result
355195a90298 Start calculting the navigability. TODO: accumulate and do output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5202
diff changeset
862 }
5208
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
863
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
864 func interval(mode fwaMode, t time.Time) (
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
865 label func(time.Time) string,
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
866 finish func(time.Time) bool,
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
867 ) {
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
868 switch mode {
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
869 case fwaMonthly:
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
870 label, finish = monthLabel, otherMonth(t)
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
871 case fwaQuarterly:
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
872 label, finish = quarterLabel, otherQuarter(t)
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
873 case fwaYearly:
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
874 label, finish = yearLabel, otherYear(t)
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
875 default:
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
876 panic("Unknown mode")
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
877 }
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
878 return
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
879 }
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
880
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
881 func monthLabel(t time.Time) string {
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
882 return fmt.Sprintf("%02d-%d", t.Month(), t.Year())
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
883 }
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
884
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
885 func quarterLabel(t time.Time) string {
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
886 return fmt.Sprintf("Q%d-%d", (int(t.Month())-1)/3+1, t.Year())
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
887 }
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
888
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
889 func yearLabel(t time.Time) string {
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
890 return strconv.Itoa(t.Year())
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
891 }
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
892
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
893 func otherMonth(t time.Time) func(time.Time) bool {
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
894 return func(x time.Time) bool {
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
895 flag := t.Day() == x.Day()
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
896 if flag {
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
897 t = x
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
898 }
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
899 return flag
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
900 }
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
901 }
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
902
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
903 func otherQuarter(t time.Time) func(time.Time) bool {
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
904 return func(x time.Time) bool {
5209
32eb35699bd3 Fixed bug in quarter detection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5208
diff changeset
905 flag := (t.Month()-1)/3 != (x.Month()-1)/3
5208
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
906 if flag {
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
907 t = x
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
908 }
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
909 return flag
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
910 }
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
911 }
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
912
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
913 func otherYear(t time.Time) func(time.Time) bool {
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
914 return func(x time.Time) bool {
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
915 flag := t.Year() != x.Year()
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
916 if flag {
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
917 t = x
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
918 }
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
919 return flag
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
920 }
defca5418446 Define how modes work.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5205
diff changeset
921 }
5220
142ac550bd9a Unify headers for CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5218
diff changeset
922
142ac550bd9a Unify headers for CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5218
diff changeset
923 func makeHeader(flag bool, prec int, breaks []float64, unit rune) []string {
142ac550bd9a Unify headers for CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5218
diff changeset
924 record := make([]string, 1+2+len(breaks)+1)
142ac550bd9a Unify headers for CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5218
diff changeset
925 record[0] = "# time"
142ac550bd9a Unify headers for CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5218
diff changeset
926 record[1] = fmt.Sprintf("# < LDC [%c]", unit)
142ac550bd9a Unify headers for CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5218
diff changeset
927 record[2] = fmt.Sprintf("# >= LDC [%c]", unit)
142ac550bd9a Unify headers for CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5218
diff changeset
928 for i, v := range breaks {
142ac550bd9a Unify headers for CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5218
diff changeset
929 if flag {
142ac550bd9a Unify headers for CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5218
diff changeset
930 if i == 0 {
142ac550bd9a Unify headers for CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5218
diff changeset
931 record[3] = fmt.Sprintf("# < break_1 [%c]", unit)
142ac550bd9a Unify headers for CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5218
diff changeset
932 }
142ac550bd9a Unify headers for CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5218
diff changeset
933 record[i+4] = fmt.Sprintf("# >= break_%d [%c]", i+1, unit)
142ac550bd9a Unify headers for CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5218
diff changeset
934 } else {
142ac550bd9a Unify headers for CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5218
diff changeset
935 if i == 0 {
142ac550bd9a Unify headers for CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5218
diff changeset
936 record[3] = fmt.Sprintf("# < %.*f [%c]", prec, v, unit)
142ac550bd9a Unify headers for CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5218
diff changeset
937 }
142ac550bd9a Unify headers for CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5218
diff changeset
938 record[i+4] = fmt.Sprintf("# >= %.*f [%c]", prec, v, unit)
142ac550bd9a Unify headers for CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5218
diff changeset
939 }
142ac550bd9a Unify headers for CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5218
diff changeset
940 }
142ac550bd9a Unify headers for CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5218
diff changeset
941 return record
142ac550bd9a Unify headers for CSV export.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5218
diff changeset
942 }