Add AST value type validation & support for Number

This commit is contained in:
Tomaž Jerman
2021-08-16 09:24:47 +02:00
parent 3e6fd1e47c
commit 259da8561c
7 changed files with 78 additions and 28 deletions
+6 -1
View File
@@ -2,6 +2,7 @@ package qlng
import (
"encoding/json"
"errors"
"github.com/cortezaproject/corteza-server/pkg/expr"
)
@@ -51,6 +52,10 @@ func (t *typedValue) UnmarshalJSON(in []byte) (err error) {
return
}
if aux.Type == "" {
return errors.New("invalid value definition: missing @type definition")
}
t.V, err = qlTypeRegistry(aux.Type).Cast(aux.Value)
return
}
@@ -284,7 +289,7 @@ func qlTypeRegistry(ref string) expr.Type {
return &expr.Integer{}
case "UnsignedInteger":
return &expr.UnsignedInteger{}
case "Float":
case "Float", "Number":
return &expr.Float{}
case "String":
return &expr.String{}
+1
View File
@@ -26,6 +26,7 @@ type (
Paging *filter.Paging `json:"paging"`
Sort filter.SortExprSet `json:"sort"`
Filter *Filter `json:"filter"`
// params to help us perform things in place
startIndex int
+1
View File
@@ -508,6 +508,7 @@ func (d *joinedDataset) sliceFramesFurther(ff []*Frame, selfCol, relCol string)
Columns: ff[0].Columns,
Paging: ff[0].Paging,
Sort: ff[0].Sort,
Filter: ff[0].Filter,
})
}
+3 -1
View File
@@ -320,6 +320,7 @@ func (r *recordDatasource) load(ctx context.Context, def *report.FrameDefinition
Source: def.Source,
Ref: def.Ref,
Sort: def.Sort,
Filter: def.Filter,
}
checkCap := cap > 0
@@ -343,7 +344,8 @@ func (r *recordDatasource) load(ctx context.Context, def *report.FrameDefinition
if checkCap && i > cap {
out := []*report.Frame{f}
f = &report.Frame{
Sort: def.Sort,
Sort: def.Sort,
Filter: def.Filter,
}
i = 0
return r.calculatePaging(out, def.Sort, uint(cap), def.Paging.PageCursor), nil
+45 -25
View File
@@ -11,33 +11,53 @@ func Test9007_filtering_specials(t *testing.T) {
ff = loadNoErrMulti(ctx, h, m, dd...)
)
f := ff[0]
h.a.Equal(12, f.Size())
h.a.Equal("empty_filter", f.Name)
h.a.Equal("first_name<String>, last_name<String>", f.Columns.String())
t.Run(ff[0].Name, func(t *testing.T) {
f := ff[0]
h.a.Equal(12, f.Size())
h.a.Equal("empty_filter", f.Name)
h.a.Equal("first_name<String>, last_name<String>", f.Columns.String())
})
f = ff[1]
h.a.Equal(0, f.Size())
h.a.Equal("false_filter", f.Name)
h.a.Equal("first_name<String>, last_name<String>", f.Columns.String())
t.Run(ff[1].Name, func(t *testing.T) {
f := ff[1]
h.a.Equal(0, f.Size())
h.a.Equal("false_filter", f.Name)
h.a.Equal("first_name<String>, last_name<String>", f.Columns.String())
})
f = ff[2]
h.a.Equal(12, f.Size())
h.a.Equal("true_filter", f.Name)
h.a.Equal("first_name<String>, last_name<String>", f.Columns.String())
t.Run(ff[2].Name, func(t *testing.T) {
f := ff[2]
h.a.Equal(12, f.Size())
h.a.Equal("true_filter", f.Name)
h.a.Equal("first_name<String>, last_name<String>", f.Columns.String())
})
f = ff[3]
h.a.Equal(4, f.Size())
h.a.Equal("weird_filter", f.Name)
h.a.Equal("first_name<String>, last_name<String>", f.Columns.String())
checkRows(h, f,
"Maria, Königsmann",
"Engel, Loritz",
"Maria, Krüger",
"Engel, Kiefer")
t.Run(ff[3].Name, func(t *testing.T) {
f := ff[3]
h.a.Equal(4, f.Size())
h.a.Equal("weird_filter", f.Name)
h.a.Equal("first_name<String>, last_name<String>", f.Columns.String())
checkRows(h, f,
"Maria, Königsmann",
"Engel, Loritz",
"Maria, Krüger",
"Engel, Kiefer")
f = ff[4]
h.a.Equal(12, f.Size())
h.a.Equal("empty_filter_object", f.Name)
h.a.Equal("first_name<String>, last_name<String>", f.Columns.String())
})
t.Run(ff[4].Name, func(t *testing.T) {
f := ff[4]
h.a.Equal(12, f.Size())
h.a.Equal("empty_filter_object", f.Name)
h.a.Equal("first_name<String>, last_name<String>", f.Columns.String())
})
t.Run(ff[5].Name, func(t *testing.T) {
f := ff[5]
h.a.Equal(1, f.Size())
h.a.Equal("wildcard_number_value", f.Name)
h.a.Equal("first_name<String>, last_name<String>", f.Columns.String())
checkRows(h, f,
"Engel, Loritz")
})
}
@@ -10,5 +10,7 @@ func Test9009_filtering_validation(t *testing.T) {
m, _, dd = loadScenario(ctx, s, t, h)
)
loadErr(ctx, h, m, dd[0], "could not build query: expecting 1 or more arguments, got 0")
t.Run("empty conjunction", func(t *testing.T) {
loadErr(ctx, h, m, dd[0], "could not build query: expecting 1 or more arguments, got 0")
})
}
@@ -68,5 +68,24 @@
],
"filter": {}
}, {
"name": "wildcard_number_value",
"source": "users",
"columns": [
{ "name": "first_name", "label": "first_name" },
{ "name": "last_name", "label": "last_name" }
],
"filter": {
"ref": "eq",
"args": [{
"symbol": "number_of_numbers"
}, {
"value": {
"@type": "Number",
"@value": 46
}
}]
}
}]
}