@@ -10,6 +10,7 @@ import (
1010 "quesma/logger"
1111 "quesma/model"
1212 "quesma/model/bucket_aggregations"
13+ "sort"
1314 "strconv"
1415 "strings"
1516)
@@ -52,7 +53,6 @@ func (cw *ClickhouseQueryTranslator) pancakeTryBucketAggregation(aggregation *pa
5253 return nil
5354}
5455
55- // paramsRaw - in a proper request should be of QueryMap type.
5656func (cw * ClickhouseQueryTranslator ) parseHistogram (aggregation * pancakeAggregationTreeNode , params QueryMap ) (err error ) {
5757 const defaultInterval = 1.0
5858 var interval float64
@@ -97,7 +97,6 @@ func (cw *ClickhouseQueryTranslator) parseHistogram(aggregation *pancakeAggregat
9797 return nil
9898}
9999
100- // paramsRaw - in a proper request should be of QueryMap type.
101100func (cw * ClickhouseQueryTranslator ) parseDateHistogram (aggregation * pancakeAggregationTreeNode , params QueryMap ) (err error ) {
102101 field := cw .parseFieldField (params , "date_histogram" )
103102 dateTimeType := cw .Table .GetDateTimeTypeFromExpr (cw .Ctx , field )
@@ -146,7 +145,6 @@ func (cw *ClickhouseQueryTranslator) parseDateHistogram(aggregation *pancakeAggr
146145 return nil
147146}
148147
149- // paramsRaw - in a proper request should be of QueryMap type.
150148// aggrName - "terms" or "significant_terms"
151149func (cw * ClickhouseQueryTranslator ) parseTermsAggregation (aggregation * pancakeAggregationTreeNode , params QueryMap , aggrName string ) error {
152150 field := cw .parseFieldField (params , aggrName )
@@ -169,6 +167,38 @@ func (cw *ClickhouseQueryTranslator) parseTermsAggregation(aggregation *pancakeA
169167 return nil
170168}
171169
170+ func (cw * ClickhouseQueryTranslator ) parseFilters (aggregation * pancakeAggregationTreeNode , params QueryMap ) error {
171+ filtersParamRaw , exists := params ["filters" ]
172+ if ! exists {
173+ return fmt .Errorf ("filters is not a map, but %T, value: %v" , params , params )
174+ }
175+ filtersParam , ok := filtersParamRaw .(QueryMap )
176+ if ! ok {
177+ return fmt .Errorf ("filters is not a map, but %T, value: %v" , filtersParamRaw , filtersParamRaw )
178+ }
179+
180+ filters := make ([]bucket_aggregations.Filter , 0 , len (filtersParam ))
181+ for name , filterRaw := range filtersParam {
182+ filterMap , ok := filterRaw .(QueryMap )
183+ if ! ok {
184+ return fmt .Errorf ("filter is not a map, but %T, value: %v" , filterRaw , filterRaw )
185+ }
186+ filter := cw .parseQueryMap (filterMap )
187+ if filter .WhereClause == nil {
188+ filter .WhereClause = model .TrueExpr
189+ filter .CanParse = true
190+ }
191+ filters = append (filters , bucket_aggregations .NewFilter (name , filter ))
192+ }
193+
194+ sort .Slice (filters , func (i , j int ) bool {
195+ return filters [i ].Name < filters [j ].Name
196+ })
197+ aggregation .queryType = bucket_aggregations .NewFilters (cw .Ctx , filters )
198+ aggregation .isKeyed = true
199+ return nil
200+ }
201+
172202func (cw * ClickhouseQueryTranslator ) parseSampler (aggregation * pancakeAggregationTreeNode , params QueryMap ) error {
173203 const defaultSize = 100
174204 aggregation .queryType = bucket_aggregations .NewSampler (cw .Ctx , cw .parseIntField (params , "shard_size" , defaultSize ))
@@ -199,14 +229,7 @@ func (cw *ClickhouseQueryTranslator) parseRangeAggregation(aggregation *pancakeA
199229 }
200230
201231 const keyedDefault = false
202- keyed := keyedDefault
203- if keyedRaw , exists := params ["keyed" ]; exists {
204- var ok bool
205- if keyed , ok = keyedRaw .(bool ); ! ok {
206- logger .WarnWithCtx (cw .Ctx ).Msgf ("keyed is not a bool, but %T, value: %v" , keyedRaw , keyedRaw )
207- }
208- }
209-
232+ keyed := cw .parseBoolField (params , "keyed" , keyedDefault )
210233 field := cw .parseFieldField (params , "range" )
211234 aggregation .queryType = bucket_aggregations .NewRange (cw .Ctx , field , intervals , keyed )
212235 aggregation .isKeyed = keyed
@@ -305,7 +328,6 @@ func (cw *ClickhouseQueryTranslator) parseGeotileGrid(aggregation *pancakeAggreg
305328 return nil
306329}
307330
308- // compositeRaw - in a proper request should be of QueryMap type.
309331// TODO: In geotile_grid, without order specidfied, Elastic returns sort by key (a/b/c earlier than x/y/z if a<x or (a=x && b<y), etc.)
310332// Maybe add some ordering, but doesn't seem to be very important.
311333func (cw * ClickhouseQueryTranslator ) parseComposite (aggregation * pancakeAggregationTreeNode , params QueryMap ) error {
0 commit comments