Skip to content

Commit dbef786

Browse files
jmichalak-fluxninjaGurinderRawala
authored andcommitted
Support math expressions for druid granularity (#81)
1 parent 668b06b commit dbef786

File tree

3 files changed

+47
-1
lines changed

3 files changed

+47
-1
lines changed

go.sum

-1
Original file line numberDiff line numberDiff line change
@@ -3804,7 +3804,6 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc
38043804
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
38053805
golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
38063806
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
3807-
golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
38083807
golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
38093808
golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
38103809
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

pkg/tsdb/druid/druid.go

+26
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"strings"
1212
"time"
1313

14+
"github.com/Knetic/govaluate"
1415
"github.com/bitly/go-simplejson"
1516
"github.com/grafadruid/go-druid"
1617
druidquerybuilder "github.com/grafadruid/go-druid/builder"
@@ -440,6 +441,9 @@ func (ds *Service) prepareQuery(qry []byte, s *druidInstanceSettings) (druidquer
440441
defaultQueryContext,
441442
ds.prepareQueryContext(queryContextParameters.([]interface{})))
442443
}
444+
if g, ok := q.Builder["granularity"].(map[string]any); ok {
445+
q.Builder["granularity"] = resolveGranularity(g)
446+
}
443447
jsonQuery, err := json.Marshal(q.Builder)
444448
if err != nil {
445449
return nil, nil, err
@@ -449,6 +453,28 @@ func (ds *Service) prepareQuery(qry []byte, s *druidInstanceSettings) (druidquer
449453
return query, mergeSettings(s.defaultQuerySettings, q.Settings), err
450454
}
451455

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+
452478
func (ds *Service) prepareQueryContext(parameters []interface{}) map[string]interface{} {
453479
ctx := make(map[string]interface{})
454480
for _, parameter := range parameters {

pkg/tsdb/druid/druid_test.go

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package druid
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func TestResolveGranularity(t *testing.T) {
10+
granularity := map[string]any{
11+
"type": "duration",
12+
"duration": "10 * 10",
13+
"origin": "2012-01-01T00:30:00Z",
14+
}
15+
gran := resolveGranularity(granularity)
16+
assert.Equal(t, gran, map[string]any{
17+
"type": "duration",
18+
"duration": 100,
19+
"origin": "2012-01-01T00:30:00Z",
20+
})
21+
}

0 commit comments

Comments
 (0)