/
stat.go
52 lines (47 loc) · 1.36 KB
/
stat.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package esutils
import (
"context"
"github.com/olivere/elastic"
"github.com/pkg/errors"
"github.com/unionj-cloud/go-doudou/copier"
)
// Stat aggr only accept map[string]interface{} or elastic.Aggregation
func (es *Es) Stat(ctx context.Context, paging *Paging, aggr interface{}) (map[string]interface{}, error) {
var (
err error
sr *elastic.SearchResult
statQueryMap map[string]interface{}
src elastic.Query
)
if paging != nil {
src = query(paging.StartDate, paging.EndDate, paging.DateField, paging.QueryConds)
}
searchService := es.client.Search().Index(es.esIndex).Type(es.esType)
switch raw := aggr.(type) {
case map[string]interface{}:
statQueryMap = make(map[string]interface{})
if src != nil {
_query, _ := src.Source()
statQueryMap["query"] = _query
}
if aggr != nil {
statQueryMap["aggs"] = aggr
}
if len(statQueryMap) == 0 {
return nil, nil
}
if sr, err = searchService.Source(statQueryMap).Do(ctx); err != nil {
return nil, errors.Wrap(err, "call Search() error")
}
case elastic.Aggregation:
if src != nil {
searchService = searchService.Query(src)
}
if sr, err = searchService.Aggregation("volume", raw).Do(ctx); err != nil {
return nil, errors.Wrap(err, "call Search() error")
}
}
var result map[string]interface{}
copier.DeepCopy(sr.Aggregations, &result)
return result, nil
}