From 1512c29881c7a9e367dc93e4a6228af507dd6b23 Mon Sep 17 00:00:00 2001 From: Joel Schmid Date: Fri, 26 Nov 2021 18:03:51 +0100 Subject: [PATCH] possibility for weather-query of multiple sensors + fix wrong flux-query --- api/rest-api.go | 6 ++++-- storage/influxdb-storage.go | 18 +++++++++++++++--- storage/weather-query.go | 6 +++--- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/api/rest-api.go b/api/rest-api.go index 41eb886..9958211 100644 --- a/api/rest-api.go +++ b/api/rest-api.go @@ -120,13 +120,15 @@ func (api *weatherRestApi) getWeatherDataHandler(w http.ResponseWriter, r *http. vars := mux.Vars(r) id := vars["id"] - query, err := storage.ParseFromUrlQuery(r.URL.Query()) + query, err := storage.ParseWeatherQuery(r.URL.Query()) if err != nil { http.Error(w, "", http.StatusBadRequest) return } - query.SensorId, err = uuid.Parse(id) + sensorid, err := uuid.Parse(id) + query.SensorIds = append(query.SensorIds, sensorid) + if err != nil { http.Error(w, "", http.StatusBadRequest) return diff --git a/storage/influxdb-storage.go b/storage/influxdb-storage.go index 4b9780e..9bbb68d 100644 --- a/storage/influxdb-storage.go +++ b/storage/influxdb-storage.go @@ -61,6 +61,7 @@ func (storage *influxStorage) GetData(query *WeatherQuery) ([]*WeatherData, erro func (storage *influxStorage) createFluxQuery(query *WeatherQuery) string { fields := "" concat := "" + sensorIds := "" for sensorValueType, value := range query.Values { if value { @@ -68,14 +69,25 @@ func (storage *influxStorage) createFluxQuery(query *WeatherQuery) string { concat = "or" } } + concat = "" + for _, id := range query.SensorIds { + sensorIds = fmt.Sprintf("%v %v r[\"sensorId\"] == \"%v\"", sensorIds, concat, id) + concat = "or" + } fromTemplate := fmt.Sprintf("from(bucket:\"%v\")", storage.config.Bucket) rangeTemplate := fmt.Sprintf("|> range(start: %v, stop: %v)", query.Start.Format(time.RFC3339), query.End.Format(time.RFC3339)) measurementTemplate := fmt.Sprintf("|> filter(fn: (r) => r[\"_measurement\"] == \"%v\")", storage.measurement) - sensorIdsTemplate := fmt.Sprintf("|> filter(fn: (r) => r[\"sensorId\"] == \"%v\")", query.SensorId) - fields = fmt.Sprintf("|> filter(fn: (r) => %v )", strings.Trim(fields, " ")) + sensorIdsTemplate := "" + if len(sensorIds) > 0 { + sensorIdsTemplate = fmt.Sprintf("|> filter(fn: (r) => %v )", strings.Trim(sensorIds, " ")) + } + fieldsTemplate := "" + if len(fields) > 0 { + fieldsTemplate = fmt.Sprintf("|> filter(fn: (r) => %v )", strings.Trim(fields, " ")) + } - fluxQuery := fmt.Sprintf("%v \n %v \n %v \n %v \n %v", fromTemplate, rangeTemplate, measurementTemplate, sensorIdsTemplate, fields) + fluxQuery := fmt.Sprintf("%v \n %v \n %v \n %v \n %v", fromTemplate, rangeTemplate, measurementTemplate, sensorIdsTemplate, fieldsTemplate) return fluxQuery } diff --git a/storage/weather-query.go b/storage/weather-query.go index 0210f1e..8cba9f3 100644 --- a/storage/weather-query.go +++ b/storage/weather-query.go @@ -12,7 +12,7 @@ import ( type WeatherQuery struct { Start time.Time End time.Time - SensorId uuid.UUID + SensorIds []uuid.UUID MaxDataPoints int Values map[SensorValueType]bool } @@ -28,13 +28,13 @@ func NewWeatherQuery() *WeatherQuery { func (query *WeatherQuery) Init() { query.Start = time.Now().Add(-1 * time.Hour * 24 * 14) query.End = time.Now() - query.SensorId = uuid.Nil + query.SensorIds = make([]uuid.UUID, 0) for _, sensorValueType := range GetSensorValueTypes() { query.Values[sensorValueType] = true } } -func ParseFromUrlQuery(query url.Values) (*WeatherQuery, error) { +func ParseWeatherQuery(query url.Values) (*WeatherQuery, error) { result := NewWeatherQuery() result.Init()