Add AST value type validation & support for Number
This commit is contained in:
@@ -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{}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}]
|
||||
}
|
||||
}]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user