changeset 2149:ed0ee54fc49e

Extend /surveys endpoint to include waterlevel_value * Change SQL to use the same strategy as used in schema/gemma.sql for bottlenecks_geoserver to determine the waterlevel_value. * Extend go controler to deal with the situation where the value is not there. This is still suboptimal as this creates a json object for the NullInt64 value.
author Bernhard Reiter <bernhard@intevation.de>
date Fri, 08 Feb 2019 11:26:05 +0100
parents 4057a1f15174
children d639b721c7be
files pkg/controllers/surveys.go pkg/models/surveys.go
diffstat 2 files changed, 33 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/controllers/surveys.go	Fri Feb 08 11:03:12 2019 +0100
+++ b/pkg/controllers/surveys.go	Fri Feb 08 11:26:05 2019 +0100
@@ -24,18 +24,32 @@
 )
 
 const (
+	// Use the same logic as in schema/gemma.sql to find out
+	// which is the reference gauge and which from its values is meant.
+	// The LEFT for the JOIN is necessary because we still want to list
+	// the surveys even if the corresponding value cannot be found because the
+	// depth_reference and reference_water_level strings do not match.
+	//
+	// As this information could be vary from survey entry to survey,
+	// in theory even for the same bottleneck
+	// it seems to be the right place to return it from the /surveys endpoint.
 	listSurveysSQL = `
 SELECT
   s.bottleneck_id,
   s.date_info::text,
   s.depth_reference,
-  bg.objname AS gauge_objname
+  bg.objname AS gauge_objname,
+  r.value AS waterlevel_value
 FROM
-  ( SELECT * FROM waterway.bottlenecks AS b, waterway.gauges AS g
-    WHERE b.fk_g_fid = g.location
-  ) AS bg
-  JOIN waterway.sounding_results AS s
-ON bg.id = s.bottleneck_id
+  (
+	( SELECT * FROM waterway.bottlenecks AS b, waterway.gauges AS g
+		WHERE b.fk_g_fid = g.location
+	) AS bg
+	JOIN waterway.sounding_results AS s
+	ON bg.id = s.bottleneck_id
+  )
+LEFT JOIN waterway.gauges_reference_water_levels AS r
+ON s.depth_reference = r.reference_water_level AND bg.location = r.gauge_id
 WHERE bg.objnam=$1`
 )
 
@@ -57,6 +71,9 @@
 
 	surveys := []models.Survey{}
 
+	// as we do not use the values here, we could simply the code here
+	// to work without an explicit mdels/surverys.go
+	// (like done in controllers/search.go)
 	for rows.Next() {
 		var survey models.Survey
 		if err = rows.Scan(
@@ -64,6 +81,7 @@
 			&survey.DateInfo,
 			&survey.DepthReference,
 			&survey.ReferenceGauge,
+			&survey.WaterLevelValue,
 		); err != nil {
 			return
 		}
--- a/pkg/models/surveys.go	Fri Feb 08 11:03:12 2019 +0100
+++ b/pkg/models/surveys.go	Fri Feb 08 11:26:05 2019 +0100
@@ -13,11 +13,16 @@
 
 package models
 
+import (
+	"database/sql"
+)
+
 type (
 	Survey struct {
-		BottleneckID   string `json:"bottleneck_id"`
-		DateInfo       string `json:"date_info"`
-		DepthReference string `json:"depth_reference"`
-		ReferenceGauge string `json:"gauge_objname"`
+		BottleneckID    string        `json:"bottleneck_id"`
+		DateInfo        string        `json:"date_info"`
+		DepthReference  string        `json:"depth_reference"`
+		ReferenceGauge  string        `json:"gauge_objname"`
+		WaterLevelValue sql.NullInt64 `json:"waterlevel_value"`
 	}
 )