Add a temporary fix to grouping records with multi-value fields

Use a distinct count over primary key.
This commit is contained in:
Tomaž Jerman
2022-06-10 09:43:07 +02:00
parent ff1391298e
commit 7546dbb01e
3 changed files with 27 additions and 5 deletions
+9
View File
@@ -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 {
+5
View File
@@ -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"),
+13 -5
View File
@@ -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")