Elasticsearch: Client refactor (#114745)
* split up client.go * split up search_request.go * remove double spaces
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
package es
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
||||
@@ -11,9 +10,6 @@ const (
|
||||
HighlightPreTagsString = "@HIGHLIGHT@"
|
||||
HighlightPostTagsString = "@/HIGHLIGHT@"
|
||||
HighlightFragmentSize = 2147483647
|
||||
DefaultGeoHashPrecision = 3
|
||||
|
||||
termsOrderTerm = "_term"
|
||||
)
|
||||
|
||||
type SortOrder string
|
||||
@@ -192,326 +188,3 @@ func (m *MultiSearchRequestBuilder) Build() (*MultiSearchRequest, error) {
|
||||
Requests: requests,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// QueryBuilder represents a query builder
|
||||
type QueryBuilder struct {
|
||||
boolQueryBuilder *BoolQueryBuilder
|
||||
}
|
||||
|
||||
// NewQueryBuilder create a new query builder
|
||||
func NewQueryBuilder() *QueryBuilder {
|
||||
return &QueryBuilder{}
|
||||
}
|
||||
|
||||
// Build builds and return a query builder
|
||||
func (b *QueryBuilder) Build() (*Query, error) {
|
||||
q := Query{}
|
||||
|
||||
if b.boolQueryBuilder != nil {
|
||||
b, err := b.boolQueryBuilder.Build()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
q.Bool = b
|
||||
}
|
||||
|
||||
return &q, nil
|
||||
}
|
||||
|
||||
// Bool creates and return a query builder
|
||||
func (b *QueryBuilder) Bool() *BoolQueryBuilder {
|
||||
if b.boolQueryBuilder == nil {
|
||||
b.boolQueryBuilder = NewBoolQueryBuilder()
|
||||
}
|
||||
return b.boolQueryBuilder
|
||||
}
|
||||
|
||||
// BoolQueryBuilder represents a bool query builder
|
||||
type BoolQueryBuilder struct {
|
||||
filterQueryBuilder *FilterQueryBuilder
|
||||
}
|
||||
|
||||
// NewBoolQueryBuilder create a new bool query builder
|
||||
func NewBoolQueryBuilder() *BoolQueryBuilder {
|
||||
return &BoolQueryBuilder{}
|
||||
}
|
||||
|
||||
// Filter creates and return a filter query builder
|
||||
func (b *BoolQueryBuilder) Filter() *FilterQueryBuilder {
|
||||
if b.filterQueryBuilder == nil {
|
||||
b.filterQueryBuilder = NewFilterQueryBuilder()
|
||||
}
|
||||
return b.filterQueryBuilder
|
||||
}
|
||||
|
||||
// Build builds and return a bool query builder
|
||||
func (b *BoolQueryBuilder) Build() (*BoolQuery, error) {
|
||||
boolQuery := BoolQuery{}
|
||||
|
||||
if b.filterQueryBuilder != nil {
|
||||
filters, err := b.filterQueryBuilder.Build()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
boolQuery.Filters = filters
|
||||
}
|
||||
|
||||
return &boolQuery, nil
|
||||
}
|
||||
|
||||
// FilterQueryBuilder represents a filter query builder
|
||||
type FilterQueryBuilder struct {
|
||||
filters []Filter
|
||||
}
|
||||
|
||||
// NewFilterQueryBuilder creates a new filter query builder
|
||||
func NewFilterQueryBuilder() *FilterQueryBuilder {
|
||||
return &FilterQueryBuilder{
|
||||
filters: make([]Filter, 0),
|
||||
}
|
||||
}
|
||||
|
||||
// Build builds and return a filter query builder
|
||||
func (b *FilterQueryBuilder) Build() ([]Filter, error) {
|
||||
return b.filters, nil
|
||||
}
|
||||
|
||||
// AddDateRangeFilter adds a new time range filter
|
||||
func (b *FilterQueryBuilder) AddDateRangeFilter(timeField string, lte, gte int64, format string) *FilterQueryBuilder {
|
||||
b.filters = append(b.filters, &RangeFilter{
|
||||
Key: timeField,
|
||||
Lte: lte,
|
||||
Gte: gte,
|
||||
Format: format,
|
||||
})
|
||||
return b
|
||||
}
|
||||
|
||||
// AddQueryStringFilter adds a new query string filter
|
||||
func (b *FilterQueryBuilder) AddQueryStringFilter(querystring string, analyseWildcard bool) *FilterQueryBuilder {
|
||||
if len(strings.TrimSpace(querystring)) == 0 {
|
||||
return b
|
||||
}
|
||||
|
||||
b.filters = append(b.filters, &QueryStringFilter{
|
||||
Query: querystring,
|
||||
AnalyzeWildcard: analyseWildcard,
|
||||
})
|
||||
return b
|
||||
}
|
||||
|
||||
// AggBuilder represents an aggregation builder
|
||||
type AggBuilder interface {
|
||||
Histogram(key, field string, fn func(a *HistogramAgg, b AggBuilder)) AggBuilder
|
||||
DateHistogram(key, field string, fn func(a *DateHistogramAgg, b AggBuilder)) AggBuilder
|
||||
Terms(key, field string, fn func(a *TermsAggregation, b AggBuilder)) AggBuilder
|
||||
Nested(key, path string, fn func(a *NestedAggregation, b AggBuilder)) AggBuilder
|
||||
Filters(key string, fn func(a *FiltersAggregation, b AggBuilder)) AggBuilder
|
||||
GeoHashGrid(key, field string, fn func(a *GeoHashGridAggregation, b AggBuilder)) AggBuilder
|
||||
Metric(key, metricType, field string, fn func(a *MetricAggregation)) AggBuilder
|
||||
Pipeline(key, pipelineType string, bucketPath any, fn func(a *PipelineAggregation)) AggBuilder
|
||||
Build() (AggArray, error)
|
||||
}
|
||||
|
||||
type aggBuilderImpl struct {
|
||||
AggBuilder
|
||||
aggDefs []*aggDef
|
||||
}
|
||||
|
||||
func newAggBuilder() *aggBuilderImpl {
|
||||
return &aggBuilderImpl{
|
||||
aggDefs: make([]*aggDef, 0),
|
||||
}
|
||||
}
|
||||
|
||||
func (b *aggBuilderImpl) Build() (AggArray, error) {
|
||||
aggs := make(AggArray, 0)
|
||||
|
||||
for _, aggDef := range b.aggDefs {
|
||||
agg := &Agg{
|
||||
Key: aggDef.key,
|
||||
Aggregation: aggDef.aggregation,
|
||||
}
|
||||
|
||||
for _, cb := range aggDef.builders {
|
||||
childAggs, err := cb.Build()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
agg.Aggregation.Aggs = append(agg.Aggregation.Aggs, childAggs...)
|
||||
}
|
||||
|
||||
aggs = append(aggs, agg)
|
||||
}
|
||||
|
||||
return aggs, nil
|
||||
}
|
||||
|
||||
func (b *aggBuilderImpl) Histogram(key, field string, fn func(a *HistogramAgg, b AggBuilder)) AggBuilder {
|
||||
innerAgg := &HistogramAgg{
|
||||
Field: field,
|
||||
}
|
||||
aggDef := newAggDef(key, &aggContainer{
|
||||
Type: "histogram",
|
||||
Aggregation: innerAgg,
|
||||
})
|
||||
|
||||
if fn != nil {
|
||||
builder := newAggBuilder()
|
||||
aggDef.builders = append(aggDef.builders, builder)
|
||||
fn(innerAgg, builder)
|
||||
}
|
||||
|
||||
b.aggDefs = append(b.aggDefs, aggDef)
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
func (b *aggBuilderImpl) DateHistogram(key, field string, fn func(a *DateHistogramAgg, b AggBuilder)) AggBuilder {
|
||||
innerAgg := &DateHistogramAgg{
|
||||
Field: field,
|
||||
}
|
||||
aggDef := newAggDef(key, &aggContainer{
|
||||
Type: "date_histogram",
|
||||
Aggregation: innerAgg,
|
||||
})
|
||||
|
||||
if fn != nil {
|
||||
builder := newAggBuilder()
|
||||
aggDef.builders = append(aggDef.builders, builder)
|
||||
fn(innerAgg, builder)
|
||||
}
|
||||
|
||||
b.aggDefs = append(b.aggDefs, aggDef)
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
func (b *aggBuilderImpl) Terms(key, field string, fn func(a *TermsAggregation, b AggBuilder)) AggBuilder {
|
||||
innerAgg := &TermsAggregation{
|
||||
Field: field,
|
||||
Order: make(map[string]any),
|
||||
}
|
||||
aggDef := newAggDef(key, &aggContainer{
|
||||
Type: "terms",
|
||||
Aggregation: innerAgg,
|
||||
})
|
||||
|
||||
if fn != nil {
|
||||
builder := newAggBuilder()
|
||||
aggDef.builders = append(aggDef.builders, builder)
|
||||
fn(innerAgg, builder)
|
||||
}
|
||||
|
||||
if len(innerAgg.Order) > 0 {
|
||||
if orderBy, exists := innerAgg.Order[termsOrderTerm]; exists {
|
||||
innerAgg.Order["_key"] = orderBy
|
||||
delete(innerAgg.Order, termsOrderTerm)
|
||||
}
|
||||
}
|
||||
|
||||
b.aggDefs = append(b.aggDefs, aggDef)
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
func (b *aggBuilderImpl) Nested(key, field string, fn func(a *NestedAggregation, b AggBuilder)) AggBuilder {
|
||||
innerAgg := &NestedAggregation{
|
||||
Path: field,
|
||||
}
|
||||
aggDef := newAggDef(key, &aggContainer{
|
||||
Type: "nested",
|
||||
Aggregation: innerAgg,
|
||||
})
|
||||
|
||||
if fn != nil {
|
||||
builder := newAggBuilder()
|
||||
aggDef.builders = append(aggDef.builders, builder)
|
||||
fn(innerAgg, builder)
|
||||
}
|
||||
|
||||
b.aggDefs = append(b.aggDefs, aggDef)
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
func (b *aggBuilderImpl) Filters(key string, fn func(a *FiltersAggregation, b AggBuilder)) AggBuilder {
|
||||
innerAgg := &FiltersAggregation{
|
||||
Filters: make(map[string]any),
|
||||
}
|
||||
aggDef := newAggDef(key, &aggContainer{
|
||||
Type: "filters",
|
||||
Aggregation: innerAgg,
|
||||
})
|
||||
if fn != nil {
|
||||
builder := newAggBuilder()
|
||||
aggDef.builders = append(aggDef.builders, builder)
|
||||
fn(innerAgg, builder)
|
||||
}
|
||||
|
||||
b.aggDefs = append(b.aggDefs, aggDef)
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
func (b *aggBuilderImpl) GeoHashGrid(key, field string, fn func(a *GeoHashGridAggregation, b AggBuilder)) AggBuilder {
|
||||
innerAgg := &GeoHashGridAggregation{
|
||||
Field: field,
|
||||
Precision: DefaultGeoHashPrecision,
|
||||
}
|
||||
aggDef := newAggDef(key, &aggContainer{
|
||||
Type: "geohash_grid",
|
||||
Aggregation: innerAgg,
|
||||
})
|
||||
|
||||
if fn != nil {
|
||||
builder := newAggBuilder()
|
||||
aggDef.builders = append(aggDef.builders, builder)
|
||||
fn(innerAgg, builder)
|
||||
}
|
||||
|
||||
b.aggDefs = append(b.aggDefs, aggDef)
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
func (b *aggBuilderImpl) Metric(key, metricType, field string, fn func(a *MetricAggregation)) AggBuilder {
|
||||
innerAgg := &MetricAggregation{
|
||||
Type: metricType,
|
||||
Field: field,
|
||||
Settings: make(map[string]any),
|
||||
}
|
||||
|
||||
aggDef := newAggDef(key, &aggContainer{
|
||||
Type: metricType,
|
||||
Aggregation: innerAgg,
|
||||
})
|
||||
|
||||
if fn != nil {
|
||||
fn(innerAgg)
|
||||
}
|
||||
|
||||
b.aggDefs = append(b.aggDefs, aggDef)
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
func (b *aggBuilderImpl) Pipeline(key, pipelineType string, bucketPath any, fn func(a *PipelineAggregation)) AggBuilder {
|
||||
innerAgg := &PipelineAggregation{
|
||||
BucketPath: bucketPath,
|
||||
Settings: make(map[string]any),
|
||||
}
|
||||
aggDef := newAggDef(key, &aggContainer{
|
||||
Type: pipelineType,
|
||||
Aggregation: innerAgg,
|
||||
})
|
||||
|
||||
if fn != nil {
|
||||
fn(innerAgg)
|
||||
}
|
||||
|
||||
b.aggDefs = append(b.aggDefs, aggDef)
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user