123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 |
- // Copyright 2012-present Oliver Eilhard. All rights reserved.
- // Use of this source code is governed by a MIT-license.
- // See http://olivere.mit-license.org/license.txt for details.
- package elastic
- import (
- "encoding/json"
- "net/url"
- "reflect"
- "sort"
- "testing"
- )
- func TestFieldStatsURLs(t *testing.T) {
- tests := []struct {
- Service *FieldStatsService
- ExpectedPath string
- ExpectedParams url.Values
- }{
- {
- Service: &FieldStatsService{},
- ExpectedPath: "/_field_stats",
- ExpectedParams: url.Values{},
- },
- {
- Service: &FieldStatsService{
- level: FieldStatsClusterLevel,
- },
- ExpectedPath: "/_field_stats",
- ExpectedParams: url.Values{"level": []string{FieldStatsClusterLevel}},
- },
- {
- Service: &FieldStatsService{
- level: FieldStatsIndicesLevel,
- },
- ExpectedPath: "/_field_stats",
- ExpectedParams: url.Values{"level": []string{FieldStatsIndicesLevel}},
- },
- {
- Service: &FieldStatsService{
- level: FieldStatsClusterLevel,
- index: []string{"index1"},
- },
- ExpectedPath: "/index1/_field_stats",
- ExpectedParams: url.Values{"level": []string{FieldStatsClusterLevel}},
- },
- {
- Service: &FieldStatsService{
- level: FieldStatsIndicesLevel,
- index: []string{"index1", "index2"},
- },
- ExpectedPath: "/index1%2Cindex2/_field_stats",
- ExpectedParams: url.Values{"level": []string{FieldStatsIndicesLevel}},
- },
- {
- Service: &FieldStatsService{
- level: FieldStatsIndicesLevel,
- index: []string{"index_*"},
- },
- ExpectedPath: "/index_%2A/_field_stats",
- ExpectedParams: url.Values{"level": []string{FieldStatsIndicesLevel}},
- },
- }
- for _, test := range tests {
- gotPath, gotParams, err := test.Service.buildURL()
- if err != nil {
- t.Fatalf("expected no error; got: %v", err)
- }
- if gotPath != test.ExpectedPath {
- t.Errorf("expected URL path = %q; got: %q", test.ExpectedPath, gotPath)
- }
- if gotParams.Encode() != test.ExpectedParams.Encode() {
- t.Errorf("expected URL params = %v; got: %v", test.ExpectedParams, gotParams)
- }
- }
- }
- func TestFieldStatsValidate(t *testing.T) {
- tests := []struct {
- Service *FieldStatsService
- Valid bool
- }{
- {
- Service: &FieldStatsService{},
- Valid: true,
- },
- {
- Service: &FieldStatsService{
- fields: []string{"field"},
- },
- Valid: true,
- },
- {
- Service: &FieldStatsService{
- bodyJson: &FieldStatsRequest{
- Fields: []string{"field"},
- },
- },
- Valid: true,
- },
- {
- Service: &FieldStatsService{
- level: FieldStatsClusterLevel,
- bodyJson: &FieldStatsRequest{
- Fields: []string{"field"},
- },
- },
- Valid: true,
- },
- {
- Service: &FieldStatsService{
- level: FieldStatsIndicesLevel,
- bodyJson: &FieldStatsRequest{
- Fields: []string{"field"},
- },
- },
- Valid: true,
- },
- {
- Service: &FieldStatsService{
- level: "random",
- },
- Valid: false,
- },
- }
- for _, test := range tests {
- err := test.Service.Validate()
- isValid := err == nil
- if isValid != test.Valid {
- t.Errorf("expected validity to be %v, got %v", test.Valid, isValid)
- }
- }
- }
- func TestFieldStatsRequestSerialize(t *testing.T) {
- req := &FieldStatsRequest{
- Fields: []string{"creation_date", "answer_count"},
- IndexConstraints: map[string]*FieldStatsConstraints{
- "creation_date": &FieldStatsConstraints{
- Min: &FieldStatsComparison{Gte: "2014-01-01T00:00:00.000Z"},
- Max: &FieldStatsComparison{Lt: "2015-01-01T10:00:00.000Z"},
- },
- },
- }
- data, err := json.Marshal(req)
- if err != nil {
- t.Fatalf("marshaling to JSON failed: %v", err)
- }
- got := string(data)
- expected := `{"fields":["creation_date","answer_count"],"index_constraints":{"creation_date":{"min_value":{"gte":"2014-01-01T00:00:00.000Z"},"max_value":{"lt":"2015-01-01T10:00:00.000Z"}}}}`
- if got != expected {
- t.Errorf("expected\n%s\n,got:\n%s", expected, got)
- }
- }
- func TestFieldStatsRequestDeserialize(t *testing.T) {
- body := `{
- "fields" : ["creation_date", "answer_count"],
- "index_constraints" : {
- "creation_date" : {
- "min_value" : {
- "gte" : "2014-01-01T00:00:00.000Z"
- },
- "max_value" : {
- "lt" : "2015-01-01T10:00:00.000Z"
- }
- }
- }
- }`
- var request FieldStatsRequest
- if err := json.Unmarshal([]byte(body), &request); err != nil {
- t.Errorf("unexpected error during unmarshalling: %v", err)
- }
- sort.Sort(lexicographically{request.Fields})
- expectedFields := []string{"answer_count", "creation_date"}
- if !reflect.DeepEqual(request.Fields, expectedFields) {
- t.Errorf("expected fields to be %v, got %v", expectedFields, request.Fields)
- }
- constraints, ok := request.IndexConstraints["creation_date"]
- if !ok {
- t.Errorf("expected field creation_date, didn't find it!")
- }
- if constraints.Min.Lt != nil {
- t.Errorf("expected min value less than constraint to be empty, got %v", constraints.Min.Lt)
- }
- if constraints.Min.Gte != "2014-01-01T00:00:00.000Z" {
- t.Errorf("expected min value >= %v, found %v", "2014-01-01T00:00:00.000Z", constraints.Min.Gte)
- }
- if constraints.Max.Lt != "2015-01-01T10:00:00.000Z" {
- t.Errorf("expected max value < %v, found %v", "2015-01-01T10:00:00.000Z", constraints.Max.Lt)
- }
- }
- func TestFieldStatsResponseUnmarshalling(t *testing.T) {
- clusterStats := `{
- "_shards": {
- "total": 1,
- "successful": 1,
- "failed": 0
- },
- "indices": {
- "_all": {
- "fields": {
- "creation_date": {
- "type": "date",
- "max_doc": 1326564,
- "doc_count": 564633,
- "density": 42,
- "sum_doc_freq": 2258532,
- "sum_total_term_freq": -1,
- "searchable": true,
- "aggregatable": true,
- "min_value":1483016404000,
- "min_value_as_string": "2016-12-29T13:00:04.000Z",
- "max_value":1484152326000,
- "max_value_as_string": "2017-01-11T16:32:06.000Z"
- },
- "answer_count": {
- "max_doc": 1326564,
- "doc_count": 139885,
- "density": 10,
- "sum_doc_freq": 559540,
- "sum_total_term_freq": -1,
- "searchable": true,
- "aggregatable": true,
- "min_value":1483016404000,
- "min_value_as_string": "2016-12-29T13:00:04.000Z",
- "max_value":1484152326000,
- "max_value_as_string": "2017-01-11T16:32:06.000Z"
- }
- }
- }
- }
- }`
- var response FieldStatsResponse
- if err := json.Unmarshal([]byte(clusterStats), &response); err != nil {
- t.Errorf("unexpected error during unmarshalling: %v", err)
- }
- stats, ok := response.Indices["_all"]
- if !ok {
- t.Errorf("expected _all to be in the indices map, didn't find it")
- }
- fieldStats, ok := stats.Fields["creation_date"]
- if !ok {
- t.Errorf("expected creation_date to be in the fields map, didn't find it")
- }
- if want, have := true, fieldStats.Searchable; want != have {
- t.Errorf("expected creation_date searchable to be %v, got %v", want, have)
- }
- if want, have := true, fieldStats.Aggregatable; want != have {
- t.Errorf("expected creation_date aggregatable to be %v, got %v", want, have)
- }
- if want, have := "2016-12-29T13:00:04.000Z", fieldStats.MinValueAsString; want != have {
- t.Errorf("expected creation_date min value string to be %q, got %q", want, have)
- }
- }
- type lexicographically struct {
- strings []string
- }
- func (l lexicographically) Len() int {
- return len(l.strings)
- }
- func (l lexicographically) Less(i, j int) bool {
- return l.strings[i] < l.strings[j]
- }
- func (l lexicographically) Swap(i, j int) {
- l.strings[i], l.strings[j] = l.strings[j], l.strings[i]
- }
|