-
Notifications
You must be signed in to change notification settings - Fork 2
/
case.go
57 lines (43 loc) · 1015 Bytes
/
case.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
package sqlbuilder
import (
"strings"
)
type caseClause struct {
clauses []SQLProvider
}
type SingleCase struct {
when SQLProvider
then SQLProvider
}
func When(clause SQLProvider) *SingleCase {
sc := &SingleCase{
when: clause,
}
return sc
}
func (sc *SingleCase) Then(clause SQLProvider) SQLProvider {
sc.then = clause
return sc
}
func (sc *SingleCase) GetSQL(cache *VarCache) string {
return "WHEN " + sc.when.GetSQL(cache) + " THEN " + sc.then.GetSQL(cache)
}
type elseClause struct {
clause SQLProvider
}
func Else(clause SQLProvider) SQLProvider {
return &elseClause{clause}
}
func (e *elseClause) GetSQL(cache *VarCache) string {
return "ELSE " + e.clause.GetSQL(cache)
}
func Case(clauses ...SQLProvider) SQLProvider {
return &caseClause{clauses}
}
func (c *caseClause) GetSQL(cache *VarCache) string {
clauses := make([]string, len(c.clauses))
for i, clause := range c.clauses {
clauses[i] = clause.GetSQL(cache)
}
return "(CASE " + strings.Join(clauses, " ") + " END)"
}