/
filter.go
43 lines (37 loc) · 1.24 KB
/
filter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package admin
import (
"fmt"
"strings"
"github.com/jinzhu/gorm"
"github.com/qor/qor"
)
// Filter register filter for qor resource
func (res *Resource) Filter(filter *Filter) {
res.filters[filter.Name] = filter
}
// Filter filter definiation
type Filter struct {
Name string
Operations []string
Handler func(fieldName string, query string, scope *gorm.DB, context *qor.Context) *gorm.DB
}
var defaultFilterHandler = func(name string, value string, scope *gorm.DB, context *qor.Context) *gorm.DB {
lastIndex := strings.LastIndex(name, "_")
operation := name[lastIndex+1:]
column := name[0:lastIndex]
switch operation {
case "cont":
return scope.Where(fmt.Sprintf("%v ILIKE ?", scope.NewScope(nil).Quote(column)), "%"+value+"%")
case "eq":
return scope.Where(fmt.Sprintf("%v = ?", scope.NewScope(nil).Quote(column)), value)
case "gt":
return scope.Where(fmt.Sprintf("%v > ?", scope.NewScope(nil).Quote(column)), value)
case "gteq":
return scope.Where(fmt.Sprintf("%v >= ?", scope.NewScope(nil).Quote(column)), value)
case "lt":
return scope.Where(fmt.Sprintf("%v < ?", scope.NewScope(nil).Quote(column)), value)
case "lteq":
return scope.Where(fmt.Sprintf("%v <= ?", scope.NewScope(nil).Quote(column)), value)
}
return scope
}