Skip to content

Commit

Permalink
Merge pull request #18 from Stratoscale/ronnie/query_builder_int
Browse files Browse the repository at this point in the history
Enhanced query test to check int and int64 and fixed code to work
  • Loading branch information
ronnie-stratoscale authored Jul 22, 2018
2 parents 3da550f + 1c43e05 commit ef0389a
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 16 deletions.
41 changes: 28 additions & 13 deletions query/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,15 @@ func parseNumber(k, v string, min, max int) (int, error) {
return n, nil
}

func (b *Builder) addFilterFieldsForNumericFields(withSep, colName string, parse parseFn, splitOnComma bool ) {
b.addFilterField(withSep+opEqual, colName+" = ?", parse, splitOnComma)
b.addFilterField(withSep+opNotEqual, colName+" <> ?", parse, splitOnComma)
b.addFilterField(withSep+opLessThan, colName+" < ?", parse, splitOnComma)
b.addFilterField(withSep+opLessThanOrEqual, colName+" <= ?", parse, splitOnComma)
b.addFilterField(withSep+opGreaterThan, colName+" > ?", parse, splitOnComma)
b.addFilterField(withSep+opGreaterThanOrEqual, colName+" >= ?", parse, splitOnComma)
}

// parseField handle sort and filter fields.
func (b *Builder) parseField(field *structs.Field) {
// get all options from the struct field.
Expand Down Expand Up @@ -300,20 +309,18 @@ func (b *Builder) parseField(field *structs.Field) {
switch v.(type) {
case string, *string:
b.addStringField(colName, withSep, splitOnComma, wrapFn)
case int, *int, time.Time, *time.Time:
case int, *int:
parseFn := parseInt
if _, ok := v.(time.Time); ok {
parseFn = parseDate
}
if _, ok := v.(*time.Time); ok {
parseFn = parseDatePointer
}
b.addFilterField(withSep+opEqual, colName+" = ?", parseFn, splitOnComma)
b.addFilterField(withSep+opNotEqual, colName+" <> ?", parseFn, splitOnComma)
b.addFilterField(withSep+opLessThan, colName+" < ?", parseFn, splitOnComma)
b.addFilterField(withSep+opLessThanOrEqual, colName+" <= ?", parseFn, splitOnComma)
b.addFilterField(withSep+opGreaterThan, colName+" > ?", parseFn, splitOnComma)
b.addFilterField(withSep+opGreaterThanOrEqual, colName+" >= ?", parseFn, splitOnComma)
b.addFilterFieldsForNumericFields(withSep, colName, parseFn, splitOnComma)
case int64, *int64:
parseFn := parseInt64
b.addFilterFieldsForNumericFields(withSep, colName, parseFn, splitOnComma)
case time.Time:
parseFn := parseDate
b.addFilterFieldsForNumericFields(withSep, colName, parseFn, splitOnComma)
case *time.Time:
parseFn := parseDatePointer
b.addFilterFieldsForNumericFields(withSep, colName, parseFn, splitOnComma)
default:
typ := reflect.TypeOf(v)
_, isStringer := v.(fmt.Stringer)
Expand Down Expand Up @@ -369,6 +376,14 @@ func contains(l []string, s string) bool {

// filter parsers.
func parseInt(s string) (interface{}, bool) {
if s == "" {
return nil, false
}
n, err := strconv.Atoi(s)
return n, err == nil
}

func parseInt64(s string) (interface{}, bool) {
if s == "" {
return nil, false
}
Expand Down
8 changes: 5 additions & 3 deletions query/query_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ func (Tags) Wrap(s string) string {
type model struct {
Name string `query:"sort,filter"`
Status string `query:"filter"`
Age int `query:"filter"`
Age int64 `query:"filter"`
Year int `query:"filter""`
CreatedAt time.Time `query:"sort,filter"`
UpdatedAt time.Time `query:"sort,filter"`
Tags Tags `query:"filter,param=tag_name"`
Expand Down Expand Up @@ -168,11 +169,12 @@ func TestQuery(t *testing.T) {
parseInput: url.Values{
"search": []string{"foo", "bar"},
"age_eq": []string{"20"},
"year_eq": []string{"1998"},
},
expectedQueryInput: &DBQuery{
Limit: 25,
CondExp: "age = ? AND ((name = ? OR status LIKE ?) AND (name = ? OR status LIKE ?))",
CondVal: []interface{}{"foo", "%foo%", "bar", "%bar%", int64(20)},
CondExp: "age = ? AND year = ? AND ((name = ? OR status LIKE ?) AND (name = ? OR status LIKE ?))",
CondVal: []interface{}{"foo", "%foo%", "bar", "%bar%", int64(20), 1998},
},
},
}
Expand Down

0 comments on commit ef0389a

Please sign in to comment.