Mercurial > gemma
diff pkg/controllers/gauges.go @ 3194:eeff2cc4ff9d
controllers: re-factored the SQL filter to a tree like structure to be of more general use.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Wed, 08 May 2019 13:11:30 +0200 |
parents | 54a3e40cfbed |
children | 9e087a495f41 |
line wrap: on
line diff
--- a/pkg/controllers/gauges.go Wed May 08 12:45:21 2019 +0200 +++ b/pkg/controllers/gauges.go Wed May 08 13:11:30 2019 +0200 @@ -628,32 +628,29 @@ return } - var fb filterBuilder - fb.stmt.WriteString(selectWaterlevelsSQL) - - fb.and( - " fk_gauge_id = ($%d::char(2), $%d::char(3), $%d::char(5), $%d::char(5), $%d::int) ", - isrs.CountryCode, - isrs.LoCode, - isrs.FairwaySection, - isrs.Orc, - isrs.Hectometre, - ) - - fb.and( - `(NOT predicted - OR ( - date_issue = ( - SELECT max(date_issue) FROM waterway.gauge_measurements - WHERE fk_gauge_id = ($%d::char(2), $%d::char(3), $%d::char(5), $%d::char(5), $%d::int) - ) - ))`, - isrs.CountryCode, - isrs.LoCode, - isrs.FairwaySection, - isrs.Orc, - isrs.Hectometre, - ) + filters := filterAnd{ + buildFilterTerm( + "fk_gauge_id = ($%d::char(2), $%d::char(3), $%d::char(5), $%d::char(5), $%d::int)", + isrs.CountryCode, + isrs.LoCode, + isrs.FairwaySection, + isrs.Orc, + isrs.Hectometre, + ), + &filterOr{ + &filterNot{&filterTerm{format: "predicted"}}, + buildFilterTerm( + `date_issue = ( + SELECT max(date_issue) FROM waterway.gauge_measurements + WHERE fk_gauge_id = ($%d::char(2), $%d::char(3), $%d::char(5), $%d::char(5), $%d::int)`, + isrs.CountryCode, + isrs.LoCode, + isrs.FairwaySection, + isrs.Orc, + isrs.Hectometre, + ), + }, + } if from := req.FormValue("from"); from != "" { fromTime, err := time.Parse(models.ImportTimeFormat, from) @@ -663,7 +660,7 @@ http.StatusBadRequest) return } - fb.and("measure_date >= $%d", fromTime) + filters = append(filters, buildFilterTerm("measure_date >= $%d", fromTime)) } if to := req.FormValue("to"); to != "" { @@ -674,14 +671,20 @@ http.StatusBadRequest) return } - fb.and("measure_date <= $%d", toTime) + filters = append(filters, buildFilterTerm("measure_date <= $%d", toTime)) } + var stmt strings.Builder + var args []interface{} + + stmt.WriteString(selectWaterlevelsSQL) + filters.serialize(&stmt, &args) + conn := middleware.GetDBConn(req) ctx := req.Context() - rows, err := conn.QueryContext(ctx, fb.stmt.String(), fb.args...) + rows, err := conn.QueryContext(ctx, stmt.String(), args...) if err != nil { http.Error( rw, fmt.Sprintf("error: %v", err),