Skip to content
This repository was archived by the owner on Nov 7, 2025. It is now read-only.

Commit a2b9125

Browse files
committed
Improve style date_range parser
1 parent 7ed955e commit a2b9125

File tree

1 file changed

+29
-53
lines changed

1 file changed

+29
-53
lines changed

quesma/queryparser/aggregation_date_range_parser.go

Lines changed: 29 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -4,67 +4,46 @@ package queryparser
44

55
import (
66
"fmt"
7-
"quesma/logger"
87
"quesma/model/bucket_aggregations"
98
"unicode"
109
)
1110

1211
func (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

Comments
 (0)