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 }