comparison pkg/controllers/importqueue.go @ 2682:9a493d27bf3f import-overview-rework

Added /api/imports?count=true to only count the results.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Fri, 15 Mar 2019 12:29:12 +0100
parents 097b4b964ed9
children 0f467af6bf5c
comparison
equal deleted inserted replaced
2681:097b4b964ed9 2682:9a493d27bf3f
37 WITH warned AS ( 37 WITH warned AS (
38 SELECT distinct(import_id) AS id 38 SELECT distinct(import_id) AS id
39 FROM import.import_logs 39 FROM import.import_logs
40 WHERE kind = 'warn'::log_type 40 WHERE kind = 'warn'::log_type
41 )` 41 )`
42 selectImportsCountSQL = warningSQLPrefix + `
43 SELECT count(*)
44 FROM import.imports
45 WHERE
46 `
42 selectImportsSQL = warningSQLPrefix + ` 47 selectImportsSQL = warningSQLPrefix + `
43 SELECT 48 SELECT
44 imports.id AS id, 49 imports.id AS id,
45 state::varchar, 50 state::varchar,
46 enqueued, 51 enqueued,
157 a = new(filterBuilder) 162 a = new(filterBuilder)
158 b = new(filterBuilder) 163 b = new(filterBuilder)
159 164
160 var noBefore, noAfter bool 165 var noBefore, noAfter bool
161 166
162 l.stmt.WriteString(selectImportsSQL) 167 var counting bool
168
169 switch count := strings.ToLower(req.FormValue("count")); count {
170 case "1", "t", "true":
171 counting = true
172 l.stmt.WriteString(selectImportsCountSQL)
173 default:
174 l.stmt.WriteString(selectImportsSQL)
175 }
163 a.stmt.WriteString(selectAfterSQL) 176 a.stmt.WriteString(selectAfterSQL)
164 b.stmt.WriteString(selectBeforeSQL) 177 b.stmt.WriteString(selectBeforeSQL)
165 178
166 cond := func(format string, v ...interface{}) { 179 cond := func(format string, v ...interface{}) {
167 l.cond(format, v...) 180 l.cond(format, v...)
226 } 239 }
227 if !a.hasCond { 240 if !a.hasCond {
228 a.stmt.WriteString(" TRUE ") 241 a.stmt.WriteString(" TRUE ")
229 } 242 }
230 243
231 l.stmt.WriteString(" ORDER BY enqueued DESC ") 244 if !counting {
232 a.stmt.WriteString(" ORDER BY enqueued LIMIT 1") 245 l.stmt.WriteString(" ORDER BY enqueued DESC ")
233 b.stmt.WriteString(" ORDER BY enqueued LIMIT 1") 246 a.stmt.WriteString(" ORDER BY enqueued LIMIT 1")
247 b.stmt.WriteString(" ORDER BY enqueued LIMIT 1")
248 }
234 249
235 if noBefore { 250 if noBefore {
236 b = nil 251 b = nil
237 } 252 }
238 if noAfter { 253 if noAfter {
266 if list, before, after, err = buildFilters(req); err != nil { 281 if list, before, after, err = buildFilters(req); err != nil {
267 return 282 return
268 } 283 }
269 284
270 ctx := req.Context() 285 ctx := req.Context()
286
287 // Fast path for counting
288
289 switch count := strings.ToLower(req.FormValue("count")); count {
290 case "1", "t", "true":
291 var count int64
292 err = conn.QueryRowContext(ctx, list.stmt.String(), list.args...).Scan(&count)
293 switch {
294 case err == sql.ErrNoRows:
295 count, err = 0, nil
296 case err != nil:
297 return
298 }
299 jr = JSONResult{Result: count}
300 return
301 }
302
303 // Generate the list
271 304
272 var rows *sql.Rows 305 var rows *sql.Rows
273 if rows, err = conn.QueryContext(ctx, list.stmt.String(), list.args...); err != nil { 306 if rows, err = conn.QueryContext(ctx, list.stmt.String(), list.args...); err != nil {
274 return 307 return
275 } 308 }