func windHandler(w http.ResponseWriter, r *http.Request, db *data.Database) { t, _ := computeTime(r.FormValue("time")) var queries []map[string]string err := json.Unmarshal([]byte(r.FormValue("query")), &queries) if err != nil { jww.ERROR.Println(err) return } var result struct { Data [][]float64 Label []string } result.Data = make([][]float64, len(queries)) result.Label = make([]string, len(queries)) rxp := regexp.MustCompile(`\[([^]]*)\]`) for index, querymap := range queries { result.Label[index] = querymap["label"] result.Data[index] = make([]float64, 32) id := "%" if _, ok := querymap["id"]; ok { id = querymap["id"] } datatype := "%" if _, ok := querymap["type"]; ok { datatype = querymap["type"] } if _, ok := querymap["label"]; ok { result.Label[index] = querymap["label"] } else { result.Label[index] = "Unknown" } cols := rxp.FindStringSubmatch(datatype) var col string if len(cols) > 1 { col = cols[1] } else { col = "avg" } key := rxp.ReplaceAllString(datatype, "") for row := range db.QueryWind(t, key, col, id, 0) { speed := units.NewSpeedMetersPerSecond(row.Value) result.Data[index][int(row.Dir)], err = speed.Get(viper.GetStringMapString("units")["WindSpeed"]) if err != nil { jww.ERROR.Println(err) return } } } json.NewEncoder(w).Encode(result) }