Bugfix: Run() fails for queries, add MarshalJSON()
The `Run()` method on the `QueryRequest` type would fail, since it would encode the _inner_ body of the query to JSON and not the complete, outer body (i.e. including the "body: {}" portion). The commit also adds `MarshalJSON()` methods to both `QueryRequest` and `AggregationRequest`, allowing them to implement the `json.Marshaller` interface, and providing easier debugging of the library. A test skeleton for this is also added.
This commit is contained in:
parent
8de6de1468
commit
48ad6f919c
|
@ -40,6 +40,10 @@ func (req *AggregationRequest) Map() map[string]interface{} {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (req *AggregationRequest) MarshalJSON() ([]byte, error) {
|
||||||
|
return json.Marshal(req.Map())
|
||||||
|
}
|
||||||
|
|
||||||
func (req *AggregationRequest) Run(
|
func (req *AggregationRequest) Run(
|
||||||
api *elasticsearch.Client,
|
api *elasticsearch.Client,
|
||||||
o ...func(*esapi.SearchRequest),
|
o ...func(*esapi.SearchRequest),
|
||||||
|
|
19
es_test.go
19
es_test.go
|
@ -4,6 +4,8 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/jgroeneveld/trial/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
type mapTest struct {
|
type mapTest struct {
|
||||||
|
@ -38,3 +40,20 @@ func sameJSON(a, b map[string]interface{}) (aJSON, bJSON []byte, ok bool) {
|
||||||
ok = reflect.DeepEqual(aJSON, bJSON)
|
ok = reflect.DeepEqual(aJSON, bJSON)
|
||||||
return aJSON, bJSON, ok
|
return aJSON, bJSON, ok
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type jsonTest struct {
|
||||||
|
name string
|
||||||
|
q json.Marshaler
|
||||||
|
expJSON string
|
||||||
|
expErr error
|
||||||
|
}
|
||||||
|
|
||||||
|
func runJSONTests(t *testing.T, tests []jsonTest) {
|
||||||
|
for _, test := range tests {
|
||||||
|
t.Run(test.name, func(t *testing.T) {
|
||||||
|
b, err := test.q.MarshalJSON()
|
||||||
|
assert.Equal(t, test.expErr, err)
|
||||||
|
assert.Equal(t, test.expJSON, string(b))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
2
go.mod
2
go.mod
|
@ -5,4 +5,6 @@ go 1.13
|
||||||
require (
|
require (
|
||||||
github.com/elastic/go-elasticsearch/v7 v7.6.0
|
github.com/elastic/go-elasticsearch/v7 v7.6.0
|
||||||
github.com/fatih/structs v1.1.0
|
github.com/fatih/structs v1.1.0
|
||||||
|
github.com/jgroeneveld/schema v1.0.0 // indirect
|
||||||
|
github.com/jgroeneveld/trial v2.0.0+incompatible
|
||||||
)
|
)
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -6,3 +6,7 @@ github.com/elastic/go-elasticsearch/v8 v8.0.0-20200210103600-aff00e5adfde h1:Y9S
|
||||||
github.com/elastic/go-elasticsearch/v8 v8.0.0-20200210103600-aff00e5adfde/go.mod h1:xe9a/L2aeOgFKKgrO3ibQTnMdpAeL0GC+5/HpGScSa4=
|
github.com/elastic/go-elasticsearch/v8 v8.0.0-20200210103600-aff00e5adfde/go.mod h1:xe9a/L2aeOgFKKgrO3ibQTnMdpAeL0GC+5/HpGScSa4=
|
||||||
github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
|
github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
|
||||||
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
|
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
|
||||||
|
github.com/jgroeneveld/schema v1.0.0 h1:J0E10CrOkiSEsw6dfb1IfrDJD14pf6QLVJ3tRPl/syI=
|
||||||
|
github.com/jgroeneveld/schema v1.0.0/go.mod h1:M14lv7sNMtGvo3ops1MwslaSYgDYxrSmbzWIQ0Mr5rs=
|
||||||
|
github.com/jgroeneveld/trial v2.0.0+incompatible h1:d59ctdgor+VqdZCAiUfVN8K13s0ALDioG5DWwZNtRuQ=
|
||||||
|
github.com/jgroeneveld/trial v2.0.0+incompatible/go.mod h1:I6INLW96EN8WysNBXUFI3M4RIC8ePg9ntAc/Wy+U/+M=
|
||||||
|
|
|
@ -22,12 +22,16 @@ func (req *QueryRequest) Map() map[string]interface{} {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (req *QueryRequest) MarshalJSON() ([]byte, error) {
|
||||||
|
return json.Marshal(req.Map())
|
||||||
|
}
|
||||||
|
|
||||||
func (req *QueryRequest) Run(
|
func (req *QueryRequest) Run(
|
||||||
api *elasticsearch.Client,
|
api *elasticsearch.Client,
|
||||||
o ...func(*esapi.SearchRequest),
|
o ...func(*esapi.SearchRequest),
|
||||||
) (res *esapi.Response, err error) {
|
) (res *esapi.Response, err error) {
|
||||||
var b bytes.Buffer
|
var b bytes.Buffer
|
||||||
err = json.NewEncoder(&b).Encode(req.Query.Map())
|
err = json.NewEncoder(&b).Encode(req.Map())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestQueries(t *testing.T) {
|
func TestQueryMaps(t *testing.T) {
|
||||||
runMapTests(t, []mapTest{
|
runMapTests(t, []mapTest{
|
||||||
{
|
{
|
||||||
"a simple match_all query",
|
"a simple match_all query",
|
||||||
|
@ -66,3 +66,17 @@ func TestQueries(t *testing.T) {
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestQueryJSONs(t *testing.T) {
|
||||||
|
runJSONTests(t, []jsonTest{
|
||||||
|
{
|
||||||
|
"simple query",
|
||||||
|
Query(
|
||||||
|
Bool().
|
||||||
|
Must(Term("account_id", "bla")),
|
||||||
|
),
|
||||||
|
`{"query":{"bool":{"must":[{"term":{"account_id":{"value":"bla"}}}]}}}`,
|
||||||
|
nil,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue