comparison pkg/controllers/gauges.go @ 2803:46a9a7c1281f

Added GET /api/data/year-waterlevels/{gauge}/{year}
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 25 Mar 2019 18:37:13 +0100
parents db1052bc162a
children c6374c520228
comparison
equal deleted inserted replaced
2801:054f5d61452d 2803:46a9a7c1281f
80 $3::char(5), 80 $3::char(5),
81 $4::char(5), 81 $4::char(5),
82 $5::int 82 $5::int
83 ) 83 )
84 ` 84 `
85 selectYearWaterlevelsMeasuredSQL = `
86 SELECT
87 measure_date,
88 water_level
89 FROM waterway.gauge_measurements
90 WHERE
91 NOT predicted
92 AND fk_gauge_id = (
93 $1::char(2),
94 $2::char(3),
95 $3::char(5),
96 $4::char(5),
97 $5::int
98 )
99 AND extract(year from measure_date) = $6
100 ORDER BY measure_date
101 `
102
85 selectWaterlevelsMeasuredSQL = ` 103 selectWaterlevelsMeasuredSQL = `
86 SELECT 104 SELECT
87 measure_date, 105 measure_date,
88 water_level 106 water_level
89 FROM waterway.gauge_measurements 107 FROM waterway.gauge_measurements
119 return "t" 137 return "t"
120 } 138 }
121 return "f" 139 return "f"
122 } 140 }
123 141
142 func yearWaterlevels(rw http.ResponseWriter, req *http.Request) {
143
144 gauge := mux.Vars(req)["gauge"]
145
146 isrs, err := models.IsrsFromString(gauge)
147 if err != nil {
148 http.Error(
149 rw, fmt.Sprintf("error: Invalid ISRS code: %v", err),
150 http.StatusBadRequest)
151 return
152 }
153
154 year, _ := strconv.ParseInt(mux.Vars(req)["year"], 10, 64)
155
156 conn := middleware.GetDBConn(req)
157
158 ctx := req.Context()
159
160 rows, err := conn.QueryContext(
161 ctx,
162 selectYearWaterlevelsMeasuredSQL,
163 isrs.CountryCode,
164 isrs.LoCode,
165 isrs.FairwaySection,
166 isrs.Orc,
167 isrs.Hectometre,
168 year,
169 )
170 if err != nil {
171 http.Error(
172 rw, fmt.Sprintf("error: %v", err),
173 http.StatusInternalServerError)
174 return
175 }
176 defer rows.Close()
177
178 var values []float64
179
180 lastDay, lastMonth := -1, -1
181
182 write := func() error {
183 var err error
184 if len(values) > 0 {
185 mean := stat.Mean(values, nil)
186 _, err = fmt.Fprintf(
187 rw, "%02d-%02d,%s\n", lastDay, lastMonth,
188 float64format(mean))
189 values = values[:0]
190 }
191 return err
192 }
193
194 for rows.Next() {
195 var when time.Time
196 var value float64
197 if err := rows.Scan(&when, &value); err != nil {
198 log.Printf("error: %v", err)
199 // Too late for an HTTP error code.
200 return
201 }
202 day, month := when.Day(), int(when.Month())
203 if day != lastDay || month != lastMonth {
204 if err := write(); err != nil {
205 log.Printf("error: %v", err)
206 // Too late for an HTTP error code.
207 return
208 }
209 lastDay, lastMonth = day, month
210 }
211 values = append(values, value)
212 }
213
214 if err := rows.Err(); err != nil {
215 log.Printf("error: %v", err)
216 // Too late for an HTTP error code.
217 return
218 }
219
220 if err := write(); err != nil {
221 log.Printf("error: %v", err)
222 // Too late for an HTTP error code.
223 }
224 }
225
124 func longtermWaterlevels(rw http.ResponseWriter, req *http.Request) { 226 func longtermWaterlevels(rw http.ResponseWriter, req *http.Request) {
125 227
126 gauge := mux.Vars(req)["gauge"] 228 gauge := mux.Vars(req)["gauge"]
127 229
128 isrs, err := models.IsrsFromString(gauge) 230 isrs, err := models.IsrsFromString(gauge)