-
Notifications
You must be signed in to change notification settings - Fork 0
/
builder.go
154 lines (130 loc) · 3.08 KB
/
builder.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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package sqlbuilder
import (
"fmt"
"strings"
"github.com/elliotchance/pie/v2"
)
type Keyword interface {
fmt.Stringer
Select(...Field) *Builder
From(...Table) *Builder
Where(Condition) *Builder
And(Condition) *Builder
Or(Condition) *Builder
ForUpdate() *Builder
OrderBy(...Field) *Builder
Asc() *Builder
Desc() *Builder
Limit() *Builder
InsertInto(Table) *Builder
Columns(...Field) *Builder
Update(Table) *Builder
Set(...Field) *Builder
DeleteFrom(Table) *Builder
}
type Builder struct {
buf strings.Builder
}
// Limit implements Keyword.
func (b *Builder) Limit() *Builder {
b.buf.WriteString(" LIMIT :limit OFFSET :offset")
return b
}
// DeleteFrom implements Keyword.
func (b *Builder) DeleteFrom(table Table) *Builder {
b.buf.WriteString("DELETE FROM ")
b.buf.WriteString(string(table))
return b
}
// Set implements Keyword.
func (b *Builder) Set(fields ...Field) *Builder {
var assignFields []Field
pie.Each(fields, func(field Field) {
assignFields = append(assignFields, field.Assign())
})
b.buf.WriteString(" SET ")
writeFields(&b.buf, assignFields)
return b
}
// Update implements Keyword.
func (b *Builder) Update(table Table) *Builder {
b.buf.WriteString("UPDATE ")
b.buf.WriteString(string(table))
return b
}
// Columns implements Keyword.
func (b *Builder) Columns(fields ...Field) *Builder {
b.buf.WriteString("(")
writeFields(&b.buf, fields)
b.buf.WriteRune(')')
var namedFields []Field
pie.Each(fields, func(field Field) {
namedFields = append(namedFields, field.Named())
})
b.buf.WriteString(" VALUES(")
writeFields(&b.buf, namedFields)
b.buf.WriteRune(')')
return b
}
// InsertInto implements Keyword.
func (b *Builder) InsertInto(table Table) *Builder {
b.buf.WriteString("INSERT INTO ")
b.buf.WriteString(string(table))
return b
}
// ForUpdate implements Keyword.
func (b *Builder) ForUpdate() *Builder {
b.buf.WriteString(" FOR UPDATE")
return b
}
// Asc implements Keyword.
func (b *Builder) Asc() *Builder {
b.buf.WriteString(" ASC")
return b
}
// Desc implements Keyword.
func (b *Builder) Desc() *Builder {
b.buf.WriteString(" DESC")
return b
}
// Or implements Keyword.
func (b *Builder) Or(cond Condition) *Builder {
b.buf.WriteString(" OR ")
b.buf.WriteString(cond.String())
return b
}
// OrderBy implements Keyword.
func (b *Builder) OrderBy(fields ...Field) *Builder {
b.buf.WriteString(" ORDER BY ")
writeFields(&b.buf, fields)
return b
}
func NewBuilder() *Builder {
return &Builder{}
}
func (b *Builder) Select(fields ...Field) *Builder {
b.buf.WriteString("SELECT ")
writeFields(&b.buf, fields)
return b
}
func (b *Builder) From(tables ...Table) *Builder {
b.buf.WriteString(" FROM ")
writeTables(&b.buf, tables)
return b
}
func (b *Builder) Where(cond Condition) *Builder {
b.buf.WriteString(" WHERE ")
b.buf.WriteString(cond.String())
return b
}
// And implements Keyword.
func (b *Builder) And(cond Condition) *Builder {
b.buf.WriteString(" AND ")
b.buf.WriteString(cond.String())
return b
}
// String implements Keyword.
func (b *Builder) String() string {
return b.buf.String()
}
var _ Keyword = (*Builder)(nil)