-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwhere.go
123 lines (103 loc) · 2.16 KB
/
where.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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package orm
import (
"fmt"
"math"
"reflect"
"strings"
)
type joinSquel struct {
and []string
or []string
subAnd *joinSquel
subOr *joinSquel
}
func (j *joinSquel) String() string {
if j == nil {
return ""
}
if j.and == nil {
return ""
}
var s string
s = strings.Join(j.and, " AND ")
var or = j.or
or = append([]string{s}, or...)
s = strings.Join(or, " OR ")
if j.subAnd != nil {
var sa = j.subAnd.String()
if sa != "" {
s = strings.Join([]string{s, bracket(sa)}, " AND ")
}
}
if j.subOr != nil {
var so = j.subOr.String()
if so != "" {
s = strings.Join([]string{s, bracket(so)}, " OR ")
}
}
return s
}
func joinColumnValue(column string, symbol string, values ...interface{}) string {
if len(values) == 0 {
return ""
}
symbol = strings.ToUpper(symbol)
if len(values) == 1 {
var val = fmt.Sprintf("%v", values[0])
if symbol == "" {
symbol = "="
if strings.EqualFold(val, "NULL") {
symbol = "IS"
}
}
return strings.Join([]string{
convertToSqlColumn(column),
symbol,
val,
}, " ")
}
if symbol == "BETWEEN" && len(values) == 2 {
return strings.Join([]string{
convertToSqlColumn(column),
"BETWEEN",
fmt.Sprintf("%v", values[0]),
"AND",
fmt.Sprintf("%v", values[1]),
}, " ")
}
if symbol == "" {
symbol = "IN"
}
var strValues []string
for _, v := range values {
strValues = append(strValues, fmt.Sprintf("%v", v))
}
return strings.Join([]string{
convertToSqlColumn(column),
symbol,
bracket(strings.Join(strValues, ",")),
}, " ")
}
func newJoinSquel(k string, symbol string, v interface{}) *joinSquel {
var j joinSquel
j.and = append(j.and, joinColumnValue(k, symbol, v))
return &j
}
func newJoinSquelFromMap(src map[string][]interface{}, symbol string) *joinSquel {
var j joinSquel
for k, v := range src {
j.addAnd(k, symbol, v...)
}
return &j
}
func newJoinSquelFromTable(table reflect.Value) *joinSquel {
var columns, values = readTable(table, false)
var maxLength = int(math.Max(float64(len(columns)), float64(len(values))))
var j joinSquel
for i := 0; i < maxLength; i++ {
var k = columns[i]
var v = values[i]
j.addAnd(k, "=", v)
}
return &j
}