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),