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