From 207594849db28ee1ca1563774940fdc4730ed2d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6ksel=20K=C3=BC=C3=A7=C3=BCk=C5=9Fahin?= Date: Sun, 14 Apr 2024 20:00:24 +0300 Subject: [PATCH] feature: add aggs support (terms, multi_terms and nested aggs) --- es/types.go | 77 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 70 insertions(+), 7 deletions(-) diff --git a/es/types.go b/es/types.go index 9ad263b..5ac597c 100644 --- a/es/types.go +++ b/es/types.go @@ -49,6 +49,8 @@ type nestedType Object type aggsType Object +type aggTermType Object + func unsafeIsNil(x any) bool { return (*[2]uintptr)(unsafe.Pointer(&x))[1] == 0 } @@ -452,22 +454,83 @@ func (n nestedType) ScoreMode(scoreMode ScoreMode.ScoreMode) nestedType { return n.putInNested("score_mode", scoreMode) } -// AGGS +func AggTerm(field string) aggTermType { + return aggTermType{ + "field": field, + } +} + +func (aggTerm aggTermType) Missing(missing string) aggTermType { + aggTerm["missing"] = missing + return aggTerm +} -func Agg() aggsType { +func AggTerms() aggsType { return aggsType{ - "terms": Object{ - "field": "my-field", - }, + "terms": Object{}, + } +} + +func AggMultiTerms() aggsType { + return aggsType{ + "multi_terms": Object{}, + } +} + +func AggCustom(agg Object) aggsType { + return aggsType(agg) +} + +func (agg aggsType) putInTheField(key string, value any) aggsType { + for field := range agg { + if fieldObject, ok := agg[field].(Object); ok { + fieldObject[key] = value + } } + return agg +} + +func (agg aggsType) Aggs(name string, nestedAgg aggsType) aggsType { + agg["aggs"] = Object{ + name: nestedAgg, + } + return agg +} + +func (agg aggsType) Field(field string) aggsType { + return agg.putInTheField("field", field) +} + +func (agg aggsType) Size(size int) aggsType { + return agg.putInTheField("size", size) +} + +func (agg aggsType) Order(field string, order Order.Order) aggsType { + return agg.putInTheField("order", + Object{ + field: order, + }, + ) +} + +func (agg aggsType) Include(include string) aggsType { + return agg.putInTheField("include", include) +} + +func (agg aggsType) Exclude(exclude string) aggsType { + return agg.putInTheField("exclude", exclude) +} + +func (agg aggsType) Terms(terms ...aggTermType) aggsType { + return agg.putInTheField("terms", terms) } -func (o Object) AddAggs(aggName string, agg aggsType) Object { +func (o Object) Aggs(name string, agg aggsType) Object { aggs, exists := o["aggs"] if !exists { aggs = Object{} } - aggs.(Object)[aggName] = agg + aggs.(Object)[name] = agg o["aggs"] = aggs return o }