From 1d806e2eccb31f234c9369fc87a796e575775840 Mon Sep 17 00:00:00 2001 From: "allen.k1m" Date: Tue, 31 Jan 2023 00:34:23 +0900 Subject: [PATCH 1/6] Add sql test code --- druid_test.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/druid_test.go b/druid_test.go index f7c772d..5d2d2fd 100644 --- a/druid_test.go +++ b/druid_test.go @@ -3,6 +3,7 @@ package druid import ( "context" "fmt" + "github.com/grafadruid/go-druid/builder/query" "io/ioutil" "net/http" "net/url" @@ -138,6 +139,31 @@ func TestDefaultRetry(t *testing.T) { assert.True(t, retry) } +func TestSQL(t *testing.T) { + assert := assert.New(t) + d, err := NewClient("http://localhost:8888") + assert.Nil(err, "error should be nil") + assert.NotNil(d, "client should not be nil") + var results []map[string]string + query := query.NewSQL().SetQuery(` +SELECT + "__time", + "isRobot", + "channel", + "flags", + "isUnpatrolled", + "page" +FROM "wikipedia" limit 1 +`) + _, err = d.Query().Execute(query, &results) + assert.Nil(err, "error should be nil") + assert.True(len(results) == 1) +} + +type resultTest struct { + result map[string]string +} + func buildMockResp(statusCode int, body string) http.Response { var st string switch statusCode { From f704b1fcc25b148c62c30524e8a92069a0579ab4 Mon Sep 17 00:00:00 2001 From: "allen.k1m" Date: Tue, 31 Jan 2023 00:36:56 +0900 Subject: [PATCH 2/6] Add sql test code --- druid_test.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/druid_test.go b/druid_test.go index 5d2d2fd..c44ce62 100644 --- a/druid_test.go +++ b/druid_test.go @@ -160,10 +160,6 @@ FROM "wikipedia" limit 1 assert.True(len(results) == 1) } -type resultTest struct { - result map[string]string -} - func buildMockResp(statusCode int, body string) http.Response { var st string switch statusCode { From 8fdc6d01e09c13ce5fdb8ebe5f44b40c1646cdcf Mon Sep 17 00:00:00 2001 From: "allen.k1m" Date: Fri, 3 Feb 2023 22:48:22 +0900 Subject: [PATCH 3/6] Change the value type of SQLParameter and modify the constructor, Add SetContext method --- builder/query/sql.go | 16 ++++++++++++---- druid_test.go | 22 ---------------------- 2 files changed, 12 insertions(+), 26 deletions(-) diff --git a/builder/query/sql.go b/builder/query/sql.go index 03f3daf..442fc19 100644 --- a/builder/query/sql.go +++ b/builder/query/sql.go @@ -15,8 +15,8 @@ type SQL struct { } type SQLParameter struct { - Type string `json:"type,omitempty"` - Value string `json:"value,omitempty"` + Type string `json:"type,omitempty"` + Value interface{} `json:"value,omitempty"` } func NewSQL() *SQL { @@ -25,8 +25,11 @@ func NewSQL() *SQL { return s } -func NewSQLParameter() *SQLParameter { - p := &SQLParameter{} +func NewSQLParameter(Type string, Value interface{}) SQLParameter { + p := SQLParameter{ + Type: Type, + Value: Value, + } return p } @@ -60,6 +63,11 @@ func (s *SQL) SetParameters(parameters []SQLParameter) *SQL { return s } +func (s *SQL) SetContext(context map[string]interface{}) *SQL { + s.Base.SetContext(context) + return s +} + func (s *SQL) UnmarshalJSON(data []byte) error { var err error var tmp struct { diff --git a/druid_test.go b/druid_test.go index c44ce62..f7c772d 100644 --- a/druid_test.go +++ b/druid_test.go @@ -3,7 +3,6 @@ package druid import ( "context" "fmt" - "github.com/grafadruid/go-druid/builder/query" "io/ioutil" "net/http" "net/url" @@ -139,27 +138,6 @@ func TestDefaultRetry(t *testing.T) { assert.True(t, retry) } -func TestSQL(t *testing.T) { - assert := assert.New(t) - d, err := NewClient("http://localhost:8888") - assert.Nil(err, "error should be nil") - assert.NotNil(d, "client should not be nil") - var results []map[string]string - query := query.NewSQL().SetQuery(` -SELECT - "__time", - "isRobot", - "channel", - "flags", - "isUnpatrolled", - "page" -FROM "wikipedia" limit 1 -`) - _, err = d.Query().Execute(query, &results) - assert.Nil(err, "error should be nil") - assert.True(len(results) == 1) -} - func buildMockResp(statusCode int, body string) http.Response { var st string switch statusCode { From 92cb740ce183f301eb3ed4263df437c9acb16dfb Mon Sep 17 00:00:00 2001 From: "allen.k1m" Date: Fri, 3 Feb 2023 22:48:52 +0900 Subject: [PATCH 4/6] Add sql test code --- builder/query/query_test.go | 83 +++++++++++++++++++++++++++++++++++++ examples/querySqlExample.go | 39 +++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 builder/query/query_test.go create mode 100644 examples/querySqlExample.go diff --git a/builder/query/query_test.go b/builder/query/query_test.go new file mode 100644 index 0000000..8c84298 --- /dev/null +++ b/builder/query/query_test.go @@ -0,0 +1,83 @@ +package query + +import ( + "encoding/json" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestSelectSQL(t *testing.T) { + var param []SQLParameter + param = append(param, NewSQLParameter("VARCHAR", "Salo Toraut")) + param = append(param, NewSQLParameter("VARCHAR", "NB")) + param = append(param, NewSQLParameter("BOOLEAN", "false")) + param = append(param, NewSQLParameter("INTEGER", 31)) // This is why I changed the type of values to interface. + param = append(param, NewSQLParameter("TIMESTAMP", "2016-06-27T00:00:11.080Z")) + query := NewSQL().SetQuery( + `SELECT * FROM "wikipedia" WHERE page=? AND flags=? AND isUnpatrolled=? AND delta=? AND __time=?`).SetParameters(param) + expected := `{ + "queryType": "sql", + "query": "SELECT * FROM \"wikipedia\" WHERE page=? AND flags=? AND isUnpatrolled=? AND delta=? AND __time=?", + "parameters": [ + { + "type": "VARCHAR", + "value": "Salo Toraut" + }, + { + "type": "VARCHAR", + "value": "NB" + }, + { + "type": "BOOLEAN", + "value": "false" + }, + { + "type": "INTEGER", + "value": 31 + }, + { + "type": "TIMESTAMP", + "value": "2016-06-27T00:00:11.080Z" + } + ] +}` + expressionJSON, err := json.Marshal(query) + assert.Nil(t, err) + assert.JSONEq(t, expected, string(expressionJSON)) +} + +func TestAllSetterSQL(t *testing.T) { + var param []SQLParameter + param = append(param, NewSQLParameter("VARCHAR", "Salo Toraut")) + context := make(map[string]interface{}) + context["sqlTimeZone"] = "America/Los_Angeles" + + query := NewSQL().SetQuery(`select * from "wikipedia" WHERE page=?`). + SetParameters(param). + SetHeader(true). + SetTypesHeader(true). + SetResultFormat("array"). + SetSQLTypesHeader(true). + SetContext(context) + expected := `{ + "queryType": "sql", + "context": { + "sqlTimeZone": "America/Los_Angeles" + }, + "query": "select * from \"wikipedia\" WHERE page=?", + "resultFormat": "array", + "header": true, + "typesHeader": true, + "sqlTypesHeader": true, + "parameters": [ + { + "type": "VARCHAR", + "value": "Salo Toraut" + } + ] +}` + expressionJSON, err := json.Marshal(query) + assert.Nil(t, err) + assert.JSONEq(t, expected, string(expressionJSON)) + +} diff --git a/examples/querySqlExample.go b/examples/querySqlExample.go new file mode 100644 index 0000000..de7b9ff --- /dev/null +++ b/examples/querySqlExample.go @@ -0,0 +1,39 @@ +//go:build mage +// +build mage + +package main + +import ( + "github.com/davecgh/go-spew/spew" + "github.com/grafadruid/go-druid" + "github.com/grafadruid/go-druid/builder/query" + "log" +) + +func main() { + d, err := druid.NewClient("http://localhost:8888") + if err != nil { + log.Fatal(err) + } + var results []map[string]interface{} + var param []query.SQLParameter + pageParam := query.NewSQLParameter("VARCHAR", "Salo Toraut") + flagParam := query.NewSQLParameter("VARCHAR", "NB") + isUnpatrolledParam := query.NewSQLParameter("VARCHAR", "false") // BOOLEAN type fails the convent in api. + deltaParam := query.NewSQLParameter("INTEGER", 31) // This is why I changed the type of values to interface. + param = append(param, pageParam) + param = append(param, flagParam) + param = append(param, isUnpatrolledParam) + param = append(param, deltaParam) + context := make(map[string]interface{}) + context["sqlTimeZone"] = "America/Los_Angeles" + query := query.NewSQL().SetQuery( + `SELECT * FROM "wikipedia" WHERE page=? AND flags=? AND isUnpatrolled=? AND delta=?`). + SetParameters(param). + SetContext(context) + _, err = d.Query().Execute(query, &results) + if err != nil { + log.Fatal(err) + } + spew.Dump(results) +} From c495af25497f82a0a12699ca1ca0c6285f35e27a Mon Sep 17 00:00:00 2001 From: "allen.k1m" Date: Fri, 3 Feb 2023 22:55:33 +0900 Subject: [PATCH 5/6] A bit more concise example code. --- examples/querySqlExample.go | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/examples/querySqlExample.go b/examples/querySqlExample.go index de7b9ff..b39365d 100644 --- a/examples/querySqlExample.go +++ b/examples/querySqlExample.go @@ -17,14 +17,10 @@ func main() { } var results []map[string]interface{} var param []query.SQLParameter - pageParam := query.NewSQLParameter("VARCHAR", "Salo Toraut") - flagParam := query.NewSQLParameter("VARCHAR", "NB") - isUnpatrolledParam := query.NewSQLParameter("VARCHAR", "false") // BOOLEAN type fails the convent in api. - deltaParam := query.NewSQLParameter("INTEGER", 31) // This is why I changed the type of values to interface. - param = append(param, pageParam) - param = append(param, flagParam) - param = append(param, isUnpatrolledParam) - param = append(param, deltaParam) + param = append(param, query.NewSQLParameter("VARCHAR", "Salo Toraut")) + param = append(param, query.NewSQLParameter("VARCHAR", "NB")) + param = append(param, query.NewSQLParameter("VARCHAR", "false")) // BOOLEAN type fails the convent in api. + param = append(param, query.NewSQLParameter("INTEGER", 31)) // This is why I changed the type of values to interface. context := make(map[string]interface{}) context["sqlTimeZone"] = "America/Los_Angeles" query := query.NewSQL().SetQuery( From 6b78070c907cc67587f917a354ad5dbcfafe0251 Mon Sep 17 00:00:00 2001 From: "allen.k1m" Date: Sat, 4 Feb 2023 22:54:13 +0900 Subject: [PATCH 6/6] Remove unnecessary comments --- builder/query/query_test.go | 2 +- examples/querySqlExample.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/builder/query/query_test.go b/builder/query/query_test.go index 8c84298..3dbdf4a 100644 --- a/builder/query/query_test.go +++ b/builder/query/query_test.go @@ -11,7 +11,7 @@ func TestSelectSQL(t *testing.T) { param = append(param, NewSQLParameter("VARCHAR", "Salo Toraut")) param = append(param, NewSQLParameter("VARCHAR", "NB")) param = append(param, NewSQLParameter("BOOLEAN", "false")) - param = append(param, NewSQLParameter("INTEGER", 31)) // This is why I changed the type of values to interface. + param = append(param, NewSQLParameter("INTEGER", 31)) param = append(param, NewSQLParameter("TIMESTAMP", "2016-06-27T00:00:11.080Z")) query := NewSQL().SetQuery( `SELECT * FROM "wikipedia" WHERE page=? AND flags=? AND isUnpatrolled=? AND delta=? AND __time=?`).SetParameters(param) diff --git a/examples/querySqlExample.go b/examples/querySqlExample.go index b39365d..7ef14ce 100644 --- a/examples/querySqlExample.go +++ b/examples/querySqlExample.go @@ -20,7 +20,7 @@ func main() { param = append(param, query.NewSQLParameter("VARCHAR", "Salo Toraut")) param = append(param, query.NewSQLParameter("VARCHAR", "NB")) param = append(param, query.NewSQLParameter("VARCHAR", "false")) // BOOLEAN type fails the convent in api. - param = append(param, query.NewSQLParameter("INTEGER", 31)) // This is why I changed the type of values to interface. + param = append(param, query.NewSQLParameter("INTEGER", 31)) context := make(map[string]interface{}) context["sqlTimeZone"] = "America/Los_Angeles" query := query.NewSQL().SetQuery(