@@ -4,67 +4,46 @@ package queryparser
44
55import (
66 "fmt"
7- "quesma/logger"
87 "quesma/model/bucket_aggregations"
98 "unicode"
109)
1110
1211func (cw * ClickhouseQueryTranslator ) parseDateRangeAggregation (aggregation * pancakeAggregationTreeNode , params QueryMap ) (err error ) {
13- var format string
14- if formatRaw , exists := params ["format" ]; exists {
15- if formatParsed , ok := formatRaw .(string ); ok {
16- format = formatParsed
17- } else {
18- logger .WarnWithCtx (cw .Ctx ).Msgf ("format specified for date range aggregation is not a string. Using empty. Params: %v" , params )
19- }
12+ field := cw .parseFieldField (params , "date_range" )
13+ if field == nil {
14+ return fmt .Errorf ("no field specified for date range aggregation, params: %v" , params )
2015 }
21-
22- var ranges []any
23- var ok bool
24- if rangesRaw , exists := params ["ranges" ]; exists {
25- if ranges , ok = rangesRaw .([]any ); ! ok {
26- return fmt .Errorf ("ranges specified for date range aggregation is not an array, params: %v" , params )
27- }
28- } else {
29- return fmt .Errorf ("no ranges specified for date range aggregation, params: %v" , params )
16+ format := cw .parseStringField (params , "format" , "" )
17+ ranges , err := cw .parseArrayField (params , "ranges" )
18+ if err != nil {
19+ return err
3020 }
3121
3222 intervals := make ([]bucket_aggregations.DateTimeInterval , 0 , len (ranges ))
3323 selectColumnsNr := len (ranges ) // we query Clickhouse for every unbounded part of interval (begin and end)
34- for _ , Range := range ranges {
35- rangeMap := Range .(QueryMap )
36- var intervalBegin , intervalEnd string
37- from , exists := rangeMap ["from" ]
38- if exists {
39- if fromRaw , ok := from .(string ); ok {
40- intervalBegin , err = cw .parseDateTimeInClickhouseMathLanguage (fromRaw )
41- if err != nil {
42- return err
43- }
44- selectColumnsNr ++
45- } else {
46- logger .WarnWithCtx (cw .Ctx ).Msgf ("from specified for date range aggregation is not a string, params: %v " +
47- "using default (unbounded)." , params )
48- intervalBegin = bucket_aggregations .UnboundedInterval
24+ for _ , rangeRaw := range ranges {
25+ rangeMap , ok := rangeRaw .(QueryMap )
26+ if ! ok {
27+ return fmt .Errorf ("range is not a map, but %T, range: %v" , rangeRaw , rangeRaw )
28+ }
29+
30+ const defaultIntervalBound = bucket_aggregations .UnboundedInterval
31+ intervalBegin := defaultIntervalBound
32+ if from := cw .parseStringField (rangeMap , "from" , defaultIntervalBound ); from != defaultIntervalBound {
33+ intervalBegin , err = cw .parseDateTimeInClickhouseMathLanguage (from )
34+ if err != nil {
35+ return err
4936 }
50- } else {
51- intervalBegin = bucket_aggregations .UnboundedInterval
37+ selectColumnsNr ++
5238 }
53- to , exists := rangeMap ["to" ]
54- if exists {
55- if toRaw , ok := to .(string ); ok {
56- intervalEnd , err = cw .parseDateTimeInClickhouseMathLanguage (toRaw )
57- if err != nil {
58- return err
59- }
60- selectColumnsNr ++
61- } else {
62- logger .WarnWithCtx (cw .Ctx ).Msgf ("To specified for date range aggregation is not a string, params: %v " +
63- "using default (unbounded)." , params )
64- intervalEnd = bucket_aggregations .UnboundedInterval
39+
40+ intervalEnd := bucket_aggregations .UnboundedInterval
41+ if to := cw .parseStringField (rangeMap , "to" , defaultIntervalBound ); to != defaultIntervalBound {
42+ intervalEnd , err = cw .parseDateTimeInClickhouseMathLanguage (to )
43+ if err != nil {
44+ return err
6545 }
66- } else {
67- intervalEnd = bucket_aggregations .UnboundedInterval
46+ selectColumnsNr ++
6847 }
6948 intervals = append (intervals , bucket_aggregations .NewDateTimeInterval (intervalBegin , intervalEnd ))
7049 }
@@ -81,12 +60,9 @@ func (cw *ClickhouseQueryTranslator) parseDateRangeAggregation(aggregation *panc
8160 if sqlSelect, selectNeeded := interval.EndTimestampToSQL(); selectNeeded {
8261 aggregation.selectedColumns = append(aggregation.selectedColumns, sqlSelect)
8362 }
84- }*/
63+ }
64+ */
8565
86- field := cw .parseFieldField (params , "date_range" )
87- if field == nil {
88- return fmt .Errorf ("no field specified for date range aggregation, params: %v" , params )
89- }
9066 aggregation .queryType = bucket_aggregations .NewDateRange (cw .Ctx , field , format , intervals , selectColumnsNr )
9167 return nil
9268}
0 commit comments