From dc8463a290fa716af4298c7f3e94e4a11dbd44b6 Mon Sep 17 00:00:00 2001 From: ston1th Date: Mon, 13 Nov 2017 19:29:43 +0100 Subject: [PATCH] made asc sorting optional and added regression tests --- README.md | 1 + filter.go | 26 +++++++++++--------------- helper.go | 6 ++++-- regression_test.go | 20 ++++++++++++++++++++ 4 files changed, 36 insertions(+), 17 deletions(-) create mode 100644 regression_test.go diff --git a/README.md b/README.md index 6a2b248..c19fbb5 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ Bool does not support the wildcard operator, only the literal strings `true` and The sort statement consists of the literal string `sort`, the field name (nesting like above is supported) and the literal strings `asc` or `desc`. ``` +sort: (short version for asc) sort::asc sort::desc sort:.:desc diff --git a/filter.go b/filter.go index 0025946..124fb9d 100644 --- a/filter.go +++ b/filter.go @@ -115,27 +115,23 @@ func NewQuery(s string) (q *Query, err error) { } if !q.s.enabled { s := strings.SplitN(v, ":", 3) - if len(s) == 3 { - if s[0] == "sort" { + if s[0] == "sort" && len(s) >= 2 { + q.s.fields = strings.Split(s[1], ".") + if err = checkFields(q.s.fields, v); err != nil { + return + } + if len(s) == 3 { switch s[2] { - case asc, desc: - q.s.fields = strings.Split(s[1], ".") - if err = checkFields(q.s.fields, v); err != nil { - return - } - if len(q.s.fields) > 0 { - if s[2] == desc { - q.s.desc = true - } - q.s.enabled = true - } - continue + case desc: + q.s.desc = true + case asc: default: err = newErr("invalid sort: " + v) return } - } + q.s.enabled = true + continue } } m := strings.SplitN(v, ":", 2) diff --git a/helper.go b/helper.go index 4bd92a7..2be87f2 100644 --- a/helper.go +++ b/helper.go @@ -1,7 +1,6 @@ package filter import ( - "errors" "reflect" "strconv" "strings" @@ -13,9 +12,12 @@ const ( ) func checkFields(s []string, val string) error { + if len(s) == 0 { + return newErr("invalid field: " + val) + } for _, v := range s { if v == "" { - return errors.New("invalid subfield: " + val) + return newErr("invalid subfield: " + val) } } return nil diff --git a/regression_test.go b/regression_test.go new file mode 100644 index 0000000..ae46655 --- /dev/null +++ b/regression_test.go @@ -0,0 +1,20 @@ +package filter + +import "testing" + +func TestRegression(t *testing.T) { + data := []string{ + "sort::asc", + "Int.:", + "String.:", + "sort::desc", + ".:", + "sort:.0:asc", + } + for _, v := range data { + _, err := NewQuery(v) + if err == nil { + t.Errorf("regression: '%s'", v) + } + } +}