diff --git a/pkg/report/frame.go b/pkg/report/frame.go index 3d021aabf..48d4fd036 100644 --- a/pkg/report/frame.go +++ b/pkg/report/frame.go @@ -360,6 +360,15 @@ func (cc FrameColumnSet) Find(name string) int { return -1 } +func (cc FrameColumnSet) FirstPrimary() *FrameColumn { + for _, c := range cc { + if c.Primary { + return c + } + } + return nil +} + func (cc FrameColumnSet) String() string { out := "" for _, c := range cc { diff --git a/store/rdbms/ast_transformer.go b/store/rdbms/ast_transformer.go index 8ddc5af57..006e68857 100644 --- a/store/rdbms/ast_transformer.go +++ b/store/rdbms/ast_transformer.go @@ -160,6 +160,11 @@ var ( Result: wrapRes("Number"), Handler: makeGenericAggFncHandler("COUNT"), }, + "distinct": { + Args: collectParams(true, "Any"), + Result: wrapRes("Any"), + Handler: makeGenericAggFncHandler("DISTINCT"), + }, "sum": { Args: collectParams(true, "Any"), Result: wrapRes("Number"), diff --git a/store/rdbms/compose_record_datasource.go b/store/rdbms/compose_record_datasource.go index c9f48f9fb..19efcfdc2 100644 --- a/store/rdbms/compose_record_datasource.go +++ b/store/rdbms/compose_record_datasource.go @@ -22,10 +22,6 @@ type ( name string module *types.Module - // @todo use these - supportedAggregationFunctions map[string]string - supportedFilterFunctions map[string]bool - store *Store rows *sql.Rows @@ -176,6 +172,19 @@ func (r *recordDatasource) Group(d report.GroupDefinition, name string) (bool, e // - validate columns & functions err = k.Def.Traverse(func(n *qlng.ASTNode) (bool, *qlng.ASTNode, error) { + if n.Ref == "count" && len(n.Args) == 0 { + pc := r.cols.FirstPrimary() + if pc == nil { + return false, nil, errors.New("cannot use count(): no primary key defined") + } + n.Args = append(n.Args, &qlng.ASTNode{ + Ref: "distinct", + Args: qlng.ASTNodeSet{{ + Symbol: pc.Name, + }}, + }) + } + if n.Symbol != "" { if _, ok := auxLevelColumns[n.Symbol]; !ok { return false, nil, fmt.Errorf("column %s does not exist on level %d", n.Symbol, r.nestLevel) @@ -470,7 +479,6 @@ func (r *recordDatasource) baseQuery(f *report.Filter) (sqb squirrel.SelectBuild Column(squirrel.Alias(squirrel.Expr(fmt.Sprintf(tcp, c.Name+".value")), c.Name)) } - // @todo this is temporary!! sqb = squirrel.Select("*"). PlaceholderFormat(r.store.config.PlaceholderFormat). FromSelect(sqb, "q_base")