From 762ea93c276d593972655ad145f9a17aedd4ccdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toma=C5=BE=20Jerman?= Date: Mon, 9 Aug 2021 18:04:59 +0200 Subject: [PATCH] Include sort in the data frame --- pkg/filter/sorting.go | 9 +++++++ pkg/report/frame.go | 8 +++---- store/rdbms/compose_record_datasource.go | 5 +++- tests/reporter/grouping_base_test.go | 2 ++ tests/reporter/joining_base_test.go | 8 +++++++ tests/reporter/loading_base_test.go | 2 ++ tests/reporter/sorting_test.go | 21 ++++++++++++++++ .../S1003_loading_sorting/report.json | 2 +- .../S3003_joining_sorting_local/report.json | 4 ++-- .../testdata/S8001_sorting_empty/report.json | 24 +++++++++++++++++++ 10 files changed, 77 insertions(+), 8 deletions(-) create mode 100644 tests/reporter/sorting_test.go create mode 100644 tests/reporter/testdata/S8001_sorting_empty/report.json diff --git a/pkg/filter/sorting.go b/pkg/filter/sorting.go index 44020470e..58d78146c 100644 --- a/pkg/filter/sorting.go +++ b/pkg/filter/sorting.go @@ -1,6 +1,7 @@ package filter import ( + "bytes" "encoding/json" "fmt" "regexp" @@ -46,6 +47,9 @@ func parseSort(in string) (set SortExprSet, err error) { exprMatcher := regexp.MustCompile(`([0-9a-zA-Z_\.]+)(\s+(asc|ASC|desc|DESC))?`) set = SortExprSet{} + if in == "" { + return + } in = strings.TrimSpace(in) if in == "" { @@ -74,6 +78,11 @@ func parseSort(in string) (set SortExprSet, err error) { // UnmarshalJSON parses sort expression when passed inside JSON func (set *SortExprSet) UnmarshalJSON(in []byte) error { + // This is an edgecase where `sort: ""` is passed in + if bytes.Compare(in, []byte{34, 34}) == 0 { + return nil + } + tmp, err := parseSort(string(in)) *set = tmp return err diff --git a/pkg/report/frame.go b/pkg/report/frame.go index 1cff3720f..1e819c67c 100644 --- a/pkg/report/frame.go +++ b/pkg/report/frame.go @@ -23,8 +23,8 @@ type ( Columns FrameColumnSet `json:"columns"` Rows FrameRowSet `json:"rows"` - Paging *filter.Paging `json:"paging"` - Sort *filter.Sorting `json:"sort"` + Paging *filter.Paging `json:"paging"` + Sort filter.SortExprSet `json:"sort"` // params to help us perform things in place startIndex int @@ -271,9 +271,9 @@ func (f *Frame) String() string { out += fmt.Sprintf("< %s; =%s; > %s", f.Paging.PrevPage.String(), f.Paging.PageCursor.String(), f.Paging.NextPage.String()) } - if f.Sort != nil { + if len(f.Sort) > 0 { out += "\n" - out += f.Sort.Sort.String() + out += f.Sort.String() } out += "\n" diff --git a/store/rdbms/compose_record_datasource.go b/store/rdbms/compose_record_datasource.go index d5121ac7f..6c0f7afd7 100644 --- a/store/rdbms/compose_record_datasource.go +++ b/store/rdbms/compose_record_datasource.go @@ -314,6 +314,7 @@ func (r *recordDatasource) load(ctx context.Context, def *report.FrameDefinition Name: def.Name, Source: def.Source, Ref: def.Ref, + Sort: def.Sort, } checkCap := cap > 0 @@ -336,7 +337,9 @@ func (r *recordDatasource) load(ctx context.Context, def *report.FrameDefinition // If the count goes over the capacity, then we have a next page if checkCap && i > cap { out := []*report.Frame{f} - f = &report.Frame{} + f = &report.Frame{ + Sort: def.Sort, + } i = 0 return r.calculatePaging(out, def.Sort, uint(cap), def.Paging.PageCursor), nil } diff --git a/tests/reporter/grouping_base_test.go b/tests/reporter/grouping_base_test.go index 6a0b9190d..b82eeaa1f 100644 --- a/tests/reporter/grouping_base_test.go +++ b/tests/reporter/grouping_base_test.go @@ -72,6 +72,8 @@ func Test2003_grouping_sorting(t *testing.T) { "Manu, 1, 61", "Sascha, 1, 38", "Sigi, 1, 67") + + h.a.Equal("count DESC, by_name", r.Sort.String()) } func Test2004_grouping_paging(t *testing.T) { diff --git a/tests/reporter/joining_base_test.go b/tests/reporter/joining_base_test.go index 94cee1ea5..d06f9ba57 100644 --- a/tests/reporter/joining_base_test.go +++ b/tests/reporter/joining_base_test.go @@ -160,6 +160,7 @@ func Test3003_joining_sorting_local(t *testing.T) { // local h.a.Equal(12, local.Size()) h.a.Equal("id, join_key, first_name, last_name", local.Columns.String()) + h.a.Equal("first_name, last_name DESC", local.Sort.String()) checkRows(h, local, ", Engel, Loritz", ", Engel, Kiefer", @@ -178,6 +179,7 @@ func Test3003_joining_sorting_local(t *testing.T) { foreign = ix["Maria_Königsmann"] h.a.NotNil(foreign) h.a.Equal("id, usr, name, type, cost, time_spent", foreign.Columns.String()) + h.a.Equal("type", foreign.Sort.String()) checkRows(h, foreign, ", Engel_Loritz, u3 j1, a, 10, 1", ", Engel_Loritz, u3 j2, a, 0, 0", @@ -200,6 +203,7 @@ func Test3003_joining_sorting_local(t *testing.T) { foreign = ix["Sigi_Goldschmidt"] h.a.NotNil(foreign) h.a.Equal("id, usr, name, type, cost, time_spent", foreign.Columns.String()) + h.a.Equal("type", foreign.Sort.String()) checkRows(h, foreign, ", Engel_Kiefer, u12 j1, a, 42, 69", ", Engel_Kiefer, u12 j4, a, 35, 26", @@ -226,6 +231,7 @@ func Test3003_joining_sorting_local(t *testing.T) { foreign = ix["Manu_Specht"] h.a.NotNil(foreign) h.a.Equal("id, usr, name, type, cost, time_spent", foreign.Columns.String()) + h.a.Equal("type", foreign.Sort.String()) checkRows(h, foreign, ", Ulli_Böhler, u5 j1, a, 1, 2") } @@ -261,6 +268,7 @@ func Test3004_joining_sorting_foreign(t *testing.T) { // local h.a.Equal(6, local.Size()) h.a.Equal("id, join_key, first_name, last_name", local.Columns.String()) + h.a.Equal("jobs.type, first_name, last_name DESC", local.Sort.String()) checkRows(h, local, ", Engel, Loritz", ", Engel, Kiefer", diff --git a/tests/reporter/loading_base_test.go b/tests/reporter/loading_base_test.go index 62305e59e..4b1e94f1c 100644 --- a/tests/reporter/loading_base_test.go +++ b/tests/reporter/loading_base_test.go @@ -75,6 +75,8 @@ func Test1003_loading_sorting(t *testing.T) { ", Ulli, Haupt, 21", ", Ulli, Förstner, 87", ", Ulli, Böhler, 14") + + h.a.Equal("first_name, last_name DESC, id", f.Sort.String()) } func Test1004_loading_paging(t *testing.T) { diff --git a/tests/reporter/sorting_test.go b/tests/reporter/sorting_test.go new file mode 100644 index 000000000..968ebc4a7 --- /dev/null +++ b/tests/reporter/sorting_test.go @@ -0,0 +1,21 @@ +package reporter + +import ( + "testing" + + "github.com/cortezaproject/corteza-server/pkg/report" +) + +func Test8001_sorting_empty(t *testing.T) { + var ( + ctx, h, s = setup(t) + m, _, dd = loadScenario(ctx, s, t, h) + ff = loadNoErrMulti(ctx, h, m, dd...) + f *report.Frame + ) + + h.a.Len(ff, 1) + + f = ff[0] + h.a.Len(f.Rows, 12) +} diff --git a/tests/reporter/testdata/S1003_loading_sorting/report.json b/tests/reporter/testdata/S1003_loading_sorting/report.json index 89217b659..5c80aa586 100644 --- a/tests/reporter/testdata/S1003_loading_sorting/report.json +++ b/tests/reporter/testdata/S1003_loading_sorting/report.json @@ -18,6 +18,6 @@ { "name": "last_name", "label": "last_name" }, { "name": "number_of_numbers", "label": "number_of_numbers" } ], - "sort": "first_name ASC, last_name DESC, id ASC" + "sort": "first_name, last_name DESC, id" }] } diff --git a/tests/reporter/testdata/S3003_joining_sorting_local/report.json b/tests/reporter/testdata/S3003_joining_sorting_local/report.json index cf08a1eba..e648e247a 100644 --- a/tests/reporter/testdata/S3003_joining_sorting_local/report.json +++ b/tests/reporter/testdata/S3003_joining_sorting_local/report.json @@ -35,7 +35,7 @@ { "name": "first_name", "label": "first_name" }, { "name": "last_name", "label": "last_name" } ], - "sort": "first_name ASC, last_name DESC" + "sort": "first_name, last_name DESC" }, { "name": "result", "source": "joined", @@ -48,6 +48,6 @@ { "name": "cost", "label": "cost" }, { "name": "time_spent", "label": "time_spent" } ], - "sort": "type ASC" + "sort": "type" }] } diff --git a/tests/reporter/testdata/S8001_sorting_empty/report.json b/tests/reporter/testdata/S8001_sorting_empty/report.json new file mode 100644 index 000000000..404a191b8 --- /dev/null +++ b/tests/reporter/testdata/S8001_sorting_empty/report.json @@ -0,0 +1,24 @@ +{ + "handle": "testing_report", + "sources": [{ + "step": { "load": { + "name": "users", + "source": "composeRecords", + "definition": { + "module": "user", + "namespace": "ns" + }, + + "sort": "" + }}}], + "frames": [{ + "name": "result", + "source": "users", + "columns": [ + { "name": "first_name", "label": "first_name" }, + { "name": "last_name", "label": "last_name" } + ], + + "sort": "" + }] +}