...
1 package goqu
2
3 import (
4 "github.com/doug-martin/goqu/v9/exec"
5 "github.com/doug-martin/goqu/v9/exp"
6 "github.com/doug-martin/goqu/v9/internal/errors"
7 "github.com/doug-martin/goqu/v9/internal/sb"
8 )
9
10 var ErrBadFromArgument = errors.New("unsupported DeleteDataset#From argument, a string or identifier expression is required")
11
12 type DeleteDataset struct {
13 dialect SQLDialect
14 clauses exp.DeleteClauses
15 isPrepared prepared
16 queryFactory exec.QueryFactory
17 err error
18 }
19
20
21 func newDeleteDataset(d string, queryFactory exec.QueryFactory) *DeleteDataset {
22 return &DeleteDataset{
23 clauses: exp.NewDeleteClauses(),
24 dialect: GetDialect(d),
25 queryFactory: queryFactory,
26 isPrepared: preparedNoPreference,
27 err: nil,
28 }
29 }
30
31 func Delete(table interface{}) *DeleteDataset {
32 return newDeleteDataset("default", nil).From(table)
33 }
34
35 func (dd *DeleteDataset) Expression() exp.Expression {
36 return dd
37 }
38
39
40 func (dd *DeleteDataset) Clone() exp.Expression {
41 return dd.copy(dd.clauses)
42 }
43
44
45
46
47 func (dd *DeleteDataset) Prepared(prepared bool) *DeleteDataset {
48 ret := dd.copy(dd.clauses)
49 ret.isPrepared = preparedFromBool(prepared)
50 return ret
51 }
52
53
54 func (dd *DeleteDataset) IsPrepared() bool {
55 return dd.isPrepared.Bool()
56 }
57
58
59 func (dd *DeleteDataset) WithDialect(dl string) *DeleteDataset {
60 ds := dd.copy(dd.GetClauses())
61 ds.dialect = GetDialect(dl)
62 return ds
63 }
64
65
66 func (dd *DeleteDataset) Dialect() SQLDialect {
67 return dd.dialect
68 }
69
70
71 func (dd *DeleteDataset) SetDialect(dialect SQLDialect) *DeleteDataset {
72 cd := dd.copy(dd.GetClauses())
73 cd.dialect = dialect
74 return cd
75 }
76
77
78 func (dd *DeleteDataset) GetClauses() exp.DeleteClauses {
79 return dd.clauses
80 }
81
82
83 func (dd *DeleteDataset) copy(clauses exp.DeleteClauses) *DeleteDataset {
84 return &DeleteDataset{
85 dialect: dd.dialect,
86 clauses: clauses,
87 isPrepared: dd.isPrepared,
88 queryFactory: dd.queryFactory,
89 err: dd.err,
90 }
91 }
92
93
94
95
96
97
98
99 func (dd *DeleteDataset) With(name string, subquery exp.Expression) *DeleteDataset {
100 return dd.copy(dd.clauses.CommonTablesAppend(exp.NewCommonTableExpression(false, name, subquery)))
101 }
102
103
104
105
106
107
108
109
110
111 func (dd *DeleteDataset) WithRecursive(name string, subquery exp.Expression) *DeleteDataset {
112 return dd.copy(dd.clauses.CommonTablesAppend(exp.NewCommonTableExpression(true, name, subquery)))
113 }
114
115
116
117
118
119
120 func (dd *DeleteDataset) From(table interface{}) *DeleteDataset {
121 switch t := table.(type) {
122 case exp.IdentifierExpression:
123 return dd.copy(dd.clauses.SetFrom(t))
124 case string:
125 return dd.copy(dd.clauses.SetFrom(exp.ParseIdentifier(t)))
126 default:
127 panic(ErrBadFromArgument)
128 }
129 }
130
131
132 func (dd *DeleteDataset) Where(expressions ...exp.Expression) *DeleteDataset {
133 return dd.copy(dd.clauses.WhereAppend(expressions...))
134 }
135
136
137 func (dd *DeleteDataset) ClearWhere() *DeleteDataset {
138 return dd.copy(dd.clauses.ClearWhere())
139 }
140
141
142 func (dd *DeleteDataset) Order(order ...exp.OrderedExpression) *DeleteDataset {
143 return dd.copy(dd.clauses.SetOrder(order...))
144 }
145
146
147
148 func (dd *DeleteDataset) OrderAppend(order ...exp.OrderedExpression) *DeleteDataset {
149 return dd.copy(dd.clauses.OrderAppend(order...))
150 }
151
152
153
154 func (dd *DeleteDataset) OrderPrepend(order ...exp.OrderedExpression) *DeleteDataset {
155 return dd.copy(dd.clauses.OrderPrepend(order...))
156 }
157
158
159 func (dd *DeleteDataset) ClearOrder() *DeleteDataset {
160 return dd.copy(dd.clauses.ClearOrder())
161 }
162
163
164 func (dd *DeleteDataset) Limit(limit uint) *DeleteDataset {
165 if limit > 0 {
166 return dd.copy(dd.clauses.SetLimit(limit))
167 }
168 return dd.copy(dd.clauses.ClearLimit())
169 }
170
171
172 func (dd *DeleteDataset) LimitAll() *DeleteDataset {
173 return dd.copy(dd.clauses.SetLimit(L("ALL")))
174 }
175
176
177 func (dd *DeleteDataset) ClearLimit() *DeleteDataset {
178 return dd.copy(dd.clauses.ClearLimit())
179 }
180
181
182 func (dd *DeleteDataset) Returning(returning ...interface{}) *DeleteDataset {
183 return dd.copy(dd.clauses.SetReturning(exp.NewColumnListExpression(returning...)))
184 }
185
186
187 func (dd *DeleteDataset) Error() error {
188 return dd.err
189 }
190
191
192
193
194 func (dd *DeleteDataset) SetError(err error) *DeleteDataset {
195 if dd.err == nil {
196 dd.err = err
197 }
198
199 return dd
200 }
201
202
203
204
205
206
207 func (dd *DeleteDataset) ToSQL() (sql string, params []interface{}, err error) {
208 return dd.deleteSQLBuilder().ToSQL()
209 }
210
211
212
213 func (dd *DeleteDataset) AppendSQL(b sb.SQLBuilder) {
214 if dd.err != nil {
215 b.SetError(dd.err)
216 return
217 }
218 dd.dialect.ToDeleteSQL(b, dd.GetClauses())
219 }
220
221 func (dd *DeleteDataset) GetAs() exp.IdentifierExpression {
222 return nil
223 }
224
225 func (dd *DeleteDataset) ReturnsColumns() bool {
226 return dd.clauses.HasReturning()
227 }
228
229
230
231
232
233 func (dd *DeleteDataset) Executor() exec.QueryExecutor {
234 return dd.queryFactory.FromSQLBuilder(dd.deleteSQLBuilder())
235 }
236
237 func (dd *DeleteDataset) deleteSQLBuilder() sb.SQLBuilder {
238 buf := sb.NewSQLBuilder(dd.isPrepared.Bool())
239 if dd.err != nil {
240 return buf.SetError(dd.err)
241 }
242 dd.dialect.ToDeleteSQL(buf, dd.clauses)
243 return buf
244 }
245
View as plain text