From a07103ca726ae5e88f9fbb18031a18840c2e739d Mon Sep 17 00:00:00 2001 From: Harry Rose Date: Mon, 5 Dec 2016 15:55:14 +0000 Subject: [PATCH 1/2] Add bound parameters map to Query object. Fixes #7687 --- client/v2/client.go | 38 +++++++++++++++++++++++++++++++------ client/v2/client_test.go | 41 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 6 deletions(-) diff --git a/client/v2/client.go b/client/v2/client.go index becafd734d..1a79fce6ec 100644 --- a/client/v2/client.go +++ b/client/v2/client.go @@ -400,9 +400,10 @@ func (c *client) Write(bp BatchPoints) error { // Query defines a query to send to the server type Query struct { - Command string - Database string - Precision string + Command string + Database string + Precision string + Parameters map[string]interface{} } // NewQuery returns a query object @@ -410,9 +411,24 @@ type Query struct { // for the query. func NewQuery(command, database, precision string) Query { return Query{ - Command: command, - Database: database, - Precision: precision, + Command: command, + Database: database, + Precision: precision, + Parameters: make(map[string]interface{}), + } +} + +// NewQueryWithParameters returns a query object +// database and precision strings can be empty strings if they are not needed +// for the query. +// parameters is a map of the parameter names used in the command to their +// values. +func NewQueryWithParameters(command, database, precision string, parameters map[string]interface{}) Query { + return Query{ + Command: command, + Database: database, + Precision: precision, + Parameters: parameters, } } @@ -454,12 +470,20 @@ func (c *client) Query(q Query) (*Response, error) { u := c.url u.Path = "query" + jsonParameters, err := json.Marshal(q.Parameters) + + if err != nil { + return nil, err + } + req, err := http.NewRequest("POST", u.String(), nil) if err != nil { return nil, err } + req.Header.Set("Content-Type", "") req.Header.Set("User-Agent", c.useragent) + if c.username != "" { req.SetBasicAuth(c.username, c.password) } @@ -467,6 +491,8 @@ func (c *client) Query(q Query) (*Response, error) { params := req.URL.Query() params.Set("q", q.Command) params.Set("db", q.Database) + params.Set("params", string(jsonParameters)) + if q.Precision != "" { params.Set("epoch", q.Precision) } diff --git a/client/v2/client_test.go b/client/v2/client_test.go index 30ee09df44..c286518e2a 100644 --- a/client/v2/client_test.go +++ b/client/v2/client_test.go @@ -153,6 +153,47 @@ func TestClient_Query(t *testing.T) { } } +func TestClient_BoundParameters(t *testing.T) { + var parameterString string + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + var data Response + r.ParseForm() + parameterString = r.FormValue("params") + w.WriteHeader(http.StatusOK) + _ = json.NewEncoder(w).Encode(data) + })) + defer ts.Close() + + config := HTTPConfig{Addr: ts.URL} + c, _ := NewHTTPClient(config) + defer c.Close() + + expectedParameters := map[string]interface{}{ + "testStringParameter": "testStringValue", + "testNumberParameter": 12.3, + } + + query := Query{ + Parameters: expectedParameters, + } + + _, err := c.Query(query) + if err != nil { + t.Errorf("unexpected error. expected %v, actual %v", nil, err) + } + + var actualParameters map[string]interface{} + + err = json.Unmarshal([]byte(parameterString), &actualParameters) + if err != nil { + t.Errorf("unexpected error. expected %v, actual %v", nil, err) + } + + if !reflect.DeepEqual(expectedParameters, actualParameters) { + t.Errorf("unexpected parameters. expected %v, actual %v", expectedParameters, actualParameters) + } +} + func TestClient_BasicAuth(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { u, p, ok := r.BasicAuth() From 0cb456bda19f4eccb1ddeb909f3f0d7d650b0ebb Mon Sep 17 00:00:00 2001 From: Harry Rose Date: Tue, 20 Dec 2016 20:18:43 +0000 Subject: [PATCH 2/2] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 355cc88911..3ce45ca737 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ The stress tool `influx_stress` will be removed in a subsequent release. We reco - [#7036](https://github.com/influxdata/influxdb/issues/7036): Switch logging to use structured logging everywhere. - [#3188](https://github.com/influxdata/influxdb/issues/3188): [CLI feature request] USE retention policy for queries. - [#7709](https://github.com/influxdata/influxdb/pull/7709): Add clear command to cli. +- [#7688](https://github.com/influxdata/influxdb/pull/7688): Adding ability to use parameters in queries in the v2 client using the `Parameters` map in the `Query` struct. ### Bugfixes