Skip to content

Commit d6b8442

Browse files
committed
allow any AsNamedShort to be a target column of an update
1 parent dbfd9e8 commit d6b8442

File tree

2 files changed

+40
-13
lines changed

2 files changed

+40
-13
lines changed

sqlbuilder_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ func TestUpdateWithFromReturning(t *testing.T) {
7373

7474
expiry := time.Date(2023, time.July, 25, 18, 34, 15, 0, time.UTC)
7575

76-
q := Update().With(nextJob).Target(updatedJob).Set(UpdateColumns{
77-
updatedJob.C("reserved_to"): Bind(expiry),
76+
q := Update().With(nextJob).Target(updatedJob).Fields([]UpdateField{
77+
{updatedJob.C("reserved_to"), Bind(expiry)},
7878
}).Where(Eq(updatedJob.C("id"), nextJob.C("id"))).Returning(updatedJob.C("id"))
7979

8080
qs, qv, err := NewSerializer(DialectPostgres{}).F(q.AsStatement).ToSQL()

update.go

+38-11
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,24 @@ package sqlbuilder
22

33
type UpdateColumns map[*BasicColumn]AsExpr
44

5+
func (m UpdateColumns) asFields() []UpdateField {
6+
var a []UpdateField
7+
for k, e := range m {
8+
a = append(a, UpdateField{k, e})
9+
}
10+
return a
11+
}
12+
13+
type UpdateField struct {
14+
Name AsNamedShort
15+
Value AsExpr
16+
}
17+
518
type UpdateStatement struct {
619
with []AsCommonTableExpression
720
target AsTableOrSubquery
8-
set UpdateColumns
21+
columns UpdateColumns
22+
fields []UpdateField
923
from AsTableOrSubquery
1024
where AsExpr
1125
returning []AsExpr
@@ -15,15 +29,16 @@ func (s *UpdateStatement) clone() *UpdateStatement {
1529
return &UpdateStatement{
1630
with: s.with,
1731
target: s.target,
18-
set: s.set,
32+
columns: s.columns,
33+
fields: s.fields,
1934
from: s.from,
2035
where: s.where,
2136
returning: s.returning,
2237
}
2338
}
2439

2540
func Update() *UpdateStatement {
26-
return &UpdateStatement{set: make(UpdateColumns)}
41+
return &UpdateStatement{columns: make(UpdateColumns)}
2742
}
2843

2944
func (s *UpdateStatement) With(with ...AsCommonTableExpression) *UpdateStatement {
@@ -52,27 +67,41 @@ func (s *UpdateStatement) GetTarget() AsTableOrSubquery {
5267
return s.target
5368
}
5469

55-
func (s *UpdateStatement) Set(set UpdateColumns) *UpdateStatement {
70+
func (s *UpdateStatement) Set(columns UpdateColumns) *UpdateStatement {
5671
c := s.clone()
57-
c.set = set
72+
c.columns = columns
73+
c.fields = nil
5874
return c
5975
}
6076

6177
func (s *UpdateStatement) AndSet(column *BasicColumn, expr AsExpr) *UpdateStatement {
6278
c := s.clone()
6379

6480
m := make(UpdateColumns)
65-
for k, e := range c.set {
81+
for k, e := range c.columns {
6682
m[k] = e
6783
}
6884

6985
m[column] = expr
7086

71-
c.set = m
87+
c.columns = m
7288

7389
return c
7490
}
7591

92+
func (s *UpdateStatement) Fields(fields []UpdateField) *UpdateStatement {
93+
c := s.clone()
94+
c.columns = nil
95+
c.fields = fields
96+
return c
97+
}
98+
99+
func (s *UpdateStatement) AndField(field UpdateField) *UpdateStatement {
100+
c := s.clone()
101+
c.fields = append(c.fields[:], field)
102+
return c
103+
}
104+
76105
func (s *UpdateStatement) From(from AsTableOrSubquery) *UpdateStatement {
77106
c := s.clone()
78107
c.from = from
@@ -109,10 +138,8 @@ func (q *UpdateStatement) AsStatement(s *Serializer) {
109138

110139
s.D("UPDATE ").F(q.target.AsTableOrSubquery).D(" SET ")
111140

112-
i := 0
113-
for k, e := range q.set {
114-
s.F(k.AsNamedShort).D(" = ").F(e.AsExpr).DC(", ", i < len(q.set)-1)
115-
i++
141+
for i, f := range append(q.columns.asFields(), q.fields...) {
142+
s.DC(", ", i != 0).F(f.Name.AsNamedShort).D(" = ").F(f.Value.AsExpr)
116143
}
117144

118145
if q.from != nil {

0 commit comments

Comments
 (0)