comparison pkg/controllers/importqueue.go @ 3190:54a3e40cfbed

controllers: moved filter builder to a separate file.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Wed, 08 May 2019 10:50:14 +0200
parents 813309225e35
children eeff2cc4ff9d
comparison
equal deleted inserted replaced
3189:6f8fb2053881 3190:54a3e40cfbed
130 return nil 130 return nil
131 } 131 }
132 return &ta 132 return &ta
133 } 133 }
134 134
135 type filterBuilder struct {
136 stmt strings.Builder
137 args []interface{}
138 hasCond bool
139 }
140
141 func (fb *filterBuilder) arg(format string, v ...interface{}) {
142 indices := make([]interface{}, len(v))
143 for i := range indices {
144 indices[i] = len(fb.args) + i + 1
145 }
146 fmt.Fprintf(&fb.stmt, format, indices...)
147 fb.args = append(fb.args, v...)
148 }
149
150 func (fb *filterBuilder) cond(format string, v ...interface{}) {
151 if fb.hasCond {
152 fb.stmt.WriteString(" AND ")
153 } else {
154 fb.hasCond = true
155 }
156 fb.arg(format, v...)
157 }
158
159 func buildFilters(req *http.Request) (l, b, a *filterBuilder, err error) { 135 func buildFilters(req *http.Request) (l, b, a *filterBuilder, err error) {
160 136
161 l = new(filterBuilder) 137 l = new(filterBuilder)
162 a = new(filterBuilder) 138 a = new(filterBuilder)
163 b = new(filterBuilder) 139 b = new(filterBuilder)
175 } 151 }
176 a.stmt.WriteString(selectAfterSQL) 152 a.stmt.WriteString(selectAfterSQL)
177 b.stmt.WriteString(selectBeforeSQL) 153 b.stmt.WriteString(selectBeforeSQL)
178 154
179 cond := func(format string, v ...interface{}) { 155 cond := func(format string, v ...interface{}) {
180 l.cond(format, v...) 156 l.and(format, v...)
181 a.cond(format, v...) 157 a.and(format, v...)
182 b.cond(format, v...) 158 b.and(format, v...)
183 } 159 }
184 160
185 if query := req.FormValue("query"); query != "" { 161 if query := req.FormValue("query"); query != "" {
186 query = "%" + query + "%" 162 query = "%" + query + "%"
187 cond(` (kind ILIKE $%d OR username ILIKE $%d OR signer ILIKE $%d OR `+ 163 cond(` (kind ILIKE $%d OR username ILIKE $%d OR signer ILIKE $%d OR `+
207 if from := req.FormValue("from"); from != "" { 183 if from := req.FormValue("from"); from != "" {
208 var fromTime time.Time 184 var fromTime time.Time
209 if fromTime, err = time.Parse(models.ImportTimeFormat, from); err != nil { 185 if fromTime, err = time.Parse(models.ImportTimeFormat, from); err != nil {
210 return 186 return
211 } 187 }
212 l.cond(" enqueued >= $%d ", fromTime) 188 l.and(" enqueued >= $%d ", fromTime)
213 b.cond(" enqueued < $%d", fromTime) 189 b.and(" enqueued < $%d", fromTime)
214 } else { 190 } else {
215 noBefore = true 191 noBefore = true
216 } 192 }
217 193
218 if to := req.FormValue("to"); to != "" { 194 if to := req.FormValue("to"); to != "" {
219 var toTime time.Time 195 var toTime time.Time
220 if toTime, err = time.Parse(models.ImportTimeFormat, to); err != nil { 196 if toTime, err = time.Parse(models.ImportTimeFormat, to); err != nil {
221 return 197 return
222 } 198 }
223 l.cond(" enqueued <= $%d ", toTime) 199 l.and(" enqueued <= $%d ", toTime)
224 a.cond(" enqueued > $%d", toTime) 200 a.and(" enqueued > $%d", toTime)
225 } else { 201 } else {
226 noAfter = true 202 noAfter = true
227 } 203 }
228 204
229 switch warn := strings.ToLower(req.FormValue("warnings")); warn { 205 switch warn := strings.ToLower(req.FormValue("warnings")); warn {