-
Notifications
You must be signed in to change notification settings - Fork 0
/
order.go
109 lines (89 loc) · 2.49 KB
/
order.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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package stmt
import (
"strings"
"github.com/jaehoonkim/synapse/pkg/manager/database/vanilla/stmt"
"github.com/pkg/errors"
)
type Order struct {
order string
columns []string
}
// Order
func (order Order) Order() string {
quote := stmt.MapQuote(stmt.BackQuote)
//컬럼이 없으면 empty string 리턴
//값이 없으면 Prepare에서 거른다
if len(order.columns) == 0 {
return ""
}
return strings.Join([]string{strings.Join(quote(order.columns...), ", "), order.order}, " ")
}
func (order Order) Combine(other stmt.OrderResult) stmt.OrderResult {
return CombineOrder([]stmt.OrderResult{order, other})
}
type CombineOrder []stmt.OrderResult
func (orders CombineOrder) Order() string {
o := make([]string, 0, len(orders))
for i := range orders {
o = append(o, orders[i].Order())
}
return strings.Join(o, ", ")
}
func (order CombineOrder) Combine(other stmt.OrderResult) stmt.OrderResult {
return append(order, other)
}
type MysqlOrder struct {
stmt.OrderStmtBuilder
// Asc func(v interface{}) (stmt.OrderResult, error)
// Desc func(v interface{}) (stmt.OrderResult, error)
}
func NewMysqlOrder() *MysqlOrder {
flavor := new(MysqlOrder)
// flavor.Asc = MakeOrderFunc("ASC")
// flavor.Desc = MakeOrderFunc("DESC")
flavor.OrderStmtBuilder = stmt.NewOrderBuildEngine(__DIALECT__, map[string]stmt.OrderFunctor{
"asc": flavor.Asc,
"desc": flavor.Desc,
})
return flavor
}
var (
order_asc = MakeOrderFunc("ASC")
order_desc = MakeOrderFunc("DESC")
)
func (flavor *MysqlOrder) Asc(v interface{}) (stmt.OrderResult, error) {
return order_asc(v)
}
func (flavor *MysqlOrder) Desc(v interface{}) (stmt.OrderResult, error) {
return order_desc(v)
}
func MakeOrderFunc(order string) func(v interface{}) (stmt.OrderResult, error) {
scan := func(emun []interface{}) ([]string, error) {
s := make([]string, len(emun))
for n := range emun {
switch value := emun[n].(type) {
case string:
s[n] = value
default:
return nil, errors.WithStack(stmt.ErrorUnsupportedType)
}
}
return s, nil
}
return func(v interface{}) (stmt.OrderResult, error) {
switch value := v.(type) {
case []interface{}:
columns, err := scan(value)
if err != nil {
return nil, errors.Wrapf(err, "scan %T", value)
}
return &Order{order: order, columns: columns}, nil
case []string:
return &Order{order: order, columns: value}, nil
case string:
return &Order{order: order, columns: []string{value}}, nil
default:
return nil, errors.WithStack(stmt.ErrorUnsupportedType)
}
}
}