Mercurial > gemma
comparison pkg/controllers/fwa.go @ 5197:c352dbbf2778 new-fwa
Started with loading limiting factors and validities.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Thu, 07 May 2020 17:50:29 +0200 |
parents | 5bc8daa986d9 |
children | 5001582f2ee1 |
comparison
equal
deleted
inserted
replaced
5196:5bc8daa986d9 | 5197:c352dbbf2778 |
---|---|
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de> | 12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de> |
13 | 13 |
14 package controllers | 14 package controllers |
15 | 15 |
16 import ( | 16 import ( |
17 "context" | |
18 "database/sql" | |
17 "log" | 19 "log" |
18 "net/http" | 20 "net/http" |
19 "time" | 21 "time" |
20 | 22 |
23 "github.com/gorilla/mux" | |
24 | |
21 "gemma.intevation.de/gemma/pkg/common" | 25 "gemma.intevation.de/gemma/pkg/common" |
22 "github.com/gorilla/mux" | 26 "gemma.intevation.de/gemma/pkg/middleware" |
23 ) | 27 ) |
28 | |
29 const ( | |
30 selectBottlenecksLimitingSQL = ` | |
31 SELECT | |
32 lower(validity), | |
33 upper(validity), | |
34 limiting | |
35 FROM | |
36 waterway.bottlenecks | |
37 WHERE | |
38 bottleneck_id = $1 AND | |
39 validity && tstzrange($2, $3)` | |
40 ) | |
41 | |
42 type ( | |
43 limitingValidity struct { | |
44 limiting string | |
45 lower time.Time | |
46 upper time.Time | |
47 } | |
48 | |
49 limitingValidities []limitingValidity | |
50 ) | |
51 | |
52 func (lv *limitingValidity) intersects(from, to time.Time) bool { | |
53 return !(to.Before(lv.lower) || from.After(lv.upper)) | |
54 } | |
55 | |
56 func (lvs limitingValidities) find() func(from, to time.Time) *limitingValidity { | |
57 | |
58 var last *limitingValidity | |
59 | |
60 return func(from, to time.Time) *limitingValidity { | |
61 if last != nil && last.intersects(from, to) { | |
62 return last | |
63 } | |
64 for i := range lvs { | |
65 if lv := &lvs[i]; lv.intersects(from, to) { | |
66 last = lv | |
67 return lv | |
68 } | |
69 } | |
70 return nil | |
71 } | |
72 } | |
73 | |
74 func loadLimitingValidities( | |
75 ctx context.Context, | |
76 conn *sql.Conn, | |
77 bottleneckID string, | |
78 from, to time.Time, | |
79 ) (limitingValidities, error) { | |
80 | |
81 var lvs limitingValidities | |
82 | |
83 rows, err := conn.QueryContext( | |
84 ctx, | |
85 selectLimitingSQL, | |
86 from, to) | |
87 | |
88 if err != nil { | |
89 return nil, err | |
90 } | |
91 defer rows.Close() | |
92 | |
93 for rows.Next() { | |
94 var lv limitingValidity | |
95 if err := rows.Scan( | |
96 &lv.limiting, | |
97 &lv.lower, | |
98 &lv.upper, | |
99 ); err != nil { | |
100 return nil, err | |
101 } | |
102 lv.lower = lv.lower.UTC() | |
103 lv.upper = lv.upper.UTC() | |
104 lvs = append(lvs, lv) | |
105 } | |
106 | |
107 return lvs, rows.Err() | |
108 } | |
24 | 109 |
25 func fairwayAvailability(rw http.ResponseWriter, req *http.Request) { | 110 func fairwayAvailability(rw http.ResponseWriter, req *http.Request) { |
26 | 111 |
27 vars := mux.Vars(req) | 112 vars := mux.Vars(req) |
28 | 113 |
29 switch vars["kind"] { | 114 switch vars["kind"] { |
30 case "bottleneck": | 115 case "bottleneck": |
31 fairwayAvailabilityBottleneck(rw, req) | 116 fairwayAvailabilityBottleneck(rw, req) |
32 case "stretch": | 117 case "stretch": // TODO: Implement me! |
33 case "section": | 118 case "section": // TODO: Implement me! |
34 default: | 119 default: |
35 http.Error(rw, "Invalid kind type.", http.StatusBadRequest) | 120 http.Error(rw, "Invalid kind type.", http.StatusBadRequest) |
36 return | 121 return |
37 } | 122 } |
38 | |
39 // TODO: Implement me! | |
40 } | 123 } |
41 | 124 |
42 func parseFromTo( | 125 func parseFromTo( |
43 rw http.ResponseWriter, | 126 rw http.ResponseWriter, |
44 req *http.Request, | 127 req *http.Request, |
75 los, ok := parseFormInt(rw, req, "los", 1) | 158 los, ok := parseFormInt(rw, req, "los", 1) |
76 if !ok { | 159 if !ok { |
77 return | 160 return |
78 } | 161 } |
79 | 162 |
163 ctx := req.Context() | |
164 conn := middleware.GetDBConn(req) | |
165 | |
166 lvs, err := loadLimitingValidities( | |
167 ctx, | |
168 conn, | |
169 bottleneckID, | |
170 from, to) | |
171 if err != nil { | |
172 log.Printf("error: %v\n", err) | |
173 http.Error(rw, "Loading validities failed", http.StatusInternalServerError) | |
174 return | |
175 } | |
176 | |
80 // TODO: Implement me! | 177 // TODO: Implement me! |
81 _ = from | |
82 _ = to | |
83 _ = los | 178 _ = los |
179 _ = lvs | |
84 } | 180 } |