@@ -11,6 +11,7 @@ import (
11
11
"strings"
12
12
"time"
13
13
14
+ "github.com/Knetic/govaluate"
14
15
"github.com/bitly/go-simplejson"
15
16
"github.com/grafadruid/go-druid"
16
17
druidquerybuilder "github.com/grafadruid/go-druid/builder"
@@ -440,6 +441,9 @@ func (ds *Service) prepareQuery(qry []byte, s *druidInstanceSettings) (druidquer
440
441
defaultQueryContext ,
441
442
ds .prepareQueryContext (queryContextParameters .([]interface {})))
442
443
}
444
+ if g , ok := q .Builder ["granularity" ].(map [string ]any ); ok {
445
+ q .Builder ["granularity" ] = resolveGranularity (g )
446
+ }
443
447
jsonQuery , err := json .Marshal (q .Builder )
444
448
if err != nil {
445
449
return nil , nil , err
@@ -449,6 +453,28 @@ func (ds *Service) prepareQuery(qry []byte, s *druidInstanceSettings) (druidquer
449
453
return query , mergeSettings (s .defaultQuerySettings , q .Settings ), err
450
454
}
451
455
456
+ func resolveGranularity (m map [string ]any ) map [string ]any {
457
+ // granularity is optional, so return early if not set and is of wrong type
458
+ if m == nil || m ["type" ] != "duration" {
459
+ return m
460
+ }
461
+ expr , ok := m ["duration" ].(string )
462
+ if ! ok {
463
+ return m
464
+ }
465
+
466
+ eval , err := govaluate .NewEvaluableExpression (expr )
467
+ if err != nil {
468
+ return m
469
+ }
470
+ result , err := eval .Evaluate (nil )
471
+ if err != nil {
472
+ return m
473
+ }
474
+ m ["duration" ] = result
475
+ return m
476
+ }
477
+
452
478
func (ds * Service ) prepareQueryContext (parameters []interface {}) map [string ]interface {} {
453
479
ctx := make (map [string ]interface {})
454
480
for _ , parameter := range parameters {
0 commit comments