Skip to content

Commit 13dffc1

Browse files
authored
Merge pull request #75 from VoidClancy/hooks
refactor(hooks+composites): unify Delete signature, inline Select/Omit builders, add composite PK name support, wrap constraints as typed structs with EQ(), and add AppendData helper
2 parents 82c59e8 + 69d5511 commit 13dffc1

31 files changed

Lines changed: 1342 additions & 610 deletions

‎generator/templates/builders_delete.gotpl‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ func (b *DeleteManyBuilder[M]) Exec(ctx context.Context) (int64, error) {
88
}
99

1010
type DeleteBuilder[M any, S any, O any] struct {
11-
where UniquePredicate[M]
12-
selects *S
13-
omits *O
14-
execFunc func(ctx context.Context, where UniquePredicate[M], selects *S, omits *O) (*M, error)
11+
where UniquePredicate[M]
12+
additional []PredicateOf[M]
13+
selects *S
14+
omits *O
15+
execFunc func(ctx context.Context, where UniquePredicate[M], additional []PredicateOf[M], selects *S, omits *O) (*M, error)
1516
}
1617

1718
func (b *DeleteBuilder[M, S, O]) Select(selects S) *DeleteBuilder[M, S, O] {
@@ -25,5 +26,5 @@ func (b *DeleteBuilder[M, S, O]) Omit(omits O) *DeleteBuilder[M, S, O] {
2526
}
2627

2728
func (b *DeleteBuilder[M, S, O]) Exec(ctx context.Context) (*M, error) {
28-
return b.execFunc(ctx, b.where, b.selects, b.omits)
29+
return b.execFunc(ctx, b.where, b.additional, b.selects, b.omits)
2930
}
Lines changed: 27 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,23 @@
11
type FindUniqueBuilder[M any, S any, O any] struct {
22
where UniquePredicate[M]
33
additional []PredicateOf[M]
4+
selects *S
5+
omits *O
46
execFunc func(ctx context.Context, where UniquePredicate[M], additional []PredicateOf[M], s *S, o *O) (*M, error)
57
}
68

7-
func (b *FindUniqueBuilder[M, S, O]) Select(s S) *FindUniqueSelectBuilder[M, S, O] {
8-
return &FindUniqueSelectBuilder[M, S, O]{builder: b, selects: s}
9+
func (b *FindUniqueBuilder[M, S, O]) Select(s S) *FindUniqueBuilder[M, S, O] {
10+
b.selects = &s
11+
return b
912
}
1013

11-
func (b *FindUniqueBuilder[M, S, O]) Omit(o O) *FindUniqueOmitBuilder[M, S, O] {
12-
return &FindUniqueOmitBuilder[M, S, O]{builder: b, omits: o}
14+
func (b *FindUniqueBuilder[M, S, O]) Omit(o O) *FindUniqueBuilder[M, S, O] {
15+
b.omits = &o
16+
return b
1317
}
1418

1519
func (b *FindUniqueBuilder[M, S, O]) Exec(ctx context.Context) (*M, error) {
16-
return b.execFunc(ctx, b.where, b.additional, nil, nil)
17-
}
18-
19-
type FindUniqueSelectBuilder[M any, S any, O any] struct {
20-
builder *FindUniqueBuilder[M, S, O]
21-
selects S
22-
}
23-
24-
func (b *FindUniqueSelectBuilder[M, S, O]) Exec(ctx context.Context) (*M, error) {
25-
return b.builder.execFunc(ctx, b.builder.where, b.builder.additional, &b.selects, nil)
26-
}
27-
28-
type FindUniqueOmitBuilder[M any, S any, O any] struct {
29-
builder *FindUniqueBuilder[M, S, O]
30-
omits O
31-
}
32-
33-
func (b *FindUniqueOmitBuilder[M, S, O]) Exec(ctx context.Context) (*M, error) {
34-
return b.builder.execFunc(ctx, b.builder.where, b.builder.additional, nil, &b.omits)
20+
return b.execFunc(ctx, b.where, b.additional, b.selects, b.omits)
3521
}
3622

3723
type FindFirstBuilder[M any, S any, O any] struct {
@@ -40,6 +26,8 @@ type FindFirstBuilder[M any, S any, O any] struct {
4026
skip *int
4127
orderBy []OrderBy[M]
4228
cursor UniquePredicate[M]
29+
selects *S
30+
omits *O
4331
execFunc func(ctx context.Context, params QueryParams[M], s *S, o *O) (*M, error)
4432
}
4533

@@ -63,12 +51,14 @@ func (b *FindFirstBuilder[M, S, O]) Cursor(where UniquePredicate[M]) *FindFirstB
6351
return b
6452
}
6553

66-
func (b *FindFirstBuilder[M, S, O]) Select(s S) *FindFirstSelectBuilder[M, S, O] {
67-
return &FindFirstSelectBuilder[M, S, O]{builder: b, selects: s}
54+
func (b *FindFirstBuilder[M, S, O]) Select(s S) *FindFirstBuilder[M, S, O] {
55+
b.selects = &s
56+
return b
6857
}
6958

70-
func (b *FindFirstBuilder[M, S, O]) Omit(o O) *FindFirstOmitBuilder[M, S, O] {
71-
return &FindFirstOmitBuilder[M, S, O]{builder: b, omits: o}
59+
func (b *FindFirstBuilder[M, S, O]) Omit(o O) *FindFirstBuilder[M, S, O] {
60+
b.omits = &o
61+
return b
7262
}
7363

7464
func (b *FindFirstBuilder[M, S, O]) Exec(ctx context.Context) (*M, error) {
@@ -79,39 +69,7 @@ func (b *FindFirstBuilder[M, S, O]) Exec(ctx context.Context) (*M, error) {
7969
OrderBy: b.orderBy,
8070
Cursor: b.cursor,
8171
}
82-
return b.execFunc(ctx, params, nil, nil)
83-
}
84-
85-
type FindFirstSelectBuilder[M any, S any, O any] struct {
86-
builder *FindFirstBuilder[M, S, O]
87-
selects S
88-
}
89-
90-
func (b *FindFirstSelectBuilder[M, S, O]) Exec(ctx context.Context) (*M, error) {
91-
params := QueryParams[M]{
92-
Where: b.builder.where,
93-
Take: b.builder.take,
94-
Skip: b.builder.skip,
95-
OrderBy: b.builder.orderBy,
96-
Cursor: b.builder.cursor,
97-
}
98-
return b.builder.execFunc(ctx, params, &b.selects, nil)
99-
}
100-
101-
type FindFirstOmitBuilder[M any, S any, O any] struct {
102-
builder *FindFirstBuilder[M, S, O]
103-
omits O
104-
}
105-
106-
func (b *FindFirstOmitBuilder[M, S, O]) Exec(ctx context.Context) (*M, error) {
107-
params := QueryParams[M]{
108-
Where: b.builder.where,
109-
Take: b.builder.take,
110-
Skip: b.builder.skip,
111-
OrderBy: b.builder.orderBy,
112-
Cursor: b.builder.cursor,
113-
}
114-
return b.builder.execFunc(ctx, params, nil, &b.omits)
72+
return b.execFunc(ctx, params, b.selects, b.omits)
11573
}
11674

11775
type FindManyBuilder[M any, S any, O any] struct {
@@ -120,6 +78,8 @@ type FindManyBuilder[M any, S any, O any] struct {
12078
skip *int
12179
orderBy []OrderBy[M]
12280
cursor UniquePredicate[M]
81+
selects *S
82+
omits *O
12383
execFunc func(ctx context.Context, params QueryParams[M], s *S, o *O) ([]*M, error)
12484
}
12585

@@ -143,12 +103,14 @@ func (b *FindManyBuilder[M, S, O]) Cursor(where UniquePredicate[M]) *FindManyBui
143103
return b
144104
}
145105

146-
func (b *FindManyBuilder[M, S, O]) Select(s S) *FindManySelectBuilder[M, S, O] {
147-
return &FindManySelectBuilder[M, S, O]{builder: b, selects: s}
106+
func (b *FindManyBuilder[M, S, O]) Select(s S) *FindManyBuilder[M, S, O] {
107+
b.selects = &s
108+
return b
148109
}
149110

150-
func (b *FindManyBuilder[M, S, O]) Omit(o O) *FindManyOmitBuilder[M, S, O] {
151-
return &FindManyOmitBuilder[M, S, O]{builder: b, omits: o}
111+
func (b *FindManyBuilder[M, S, O]) Omit(o O) *FindManyBuilder[M, S, O] {
112+
b.omits = &o
113+
return b
152114
}
153115

154116
func (b *FindManyBuilder[M, S, O]) Exec(ctx context.Context) ([]*M, error) {
@@ -159,39 +121,5 @@ func (b *FindManyBuilder[M, S, O]) Exec(ctx context.Context) ([]*M, error) {
159121
OrderBy: b.orderBy,
160122
Cursor: b.cursor,
161123
}
162-
return b.execFunc(ctx, params, nil, nil)
163-
}
164-
165-
type FindManySelectBuilder[M any, S any, O any] struct {
166-
builder *FindManyBuilder[M, S, O]
167-
selects S
168-
}
169-
170-
func (b *FindManySelectBuilder[M, S, O]) Exec(ctx context.Context) ([]*M, error) {
171-
params := QueryParams[M]{
172-
Where: b.builder.where,
173-
Take: b.builder.take,
174-
Skip: b.builder.skip,
175-
OrderBy: b.builder.orderBy,
176-
Cursor: b.builder.cursor,
177-
}
178-
return b.builder.execFunc(ctx, params, &b.selects, nil)
179-
}
180-
181-
type FindManyOmitBuilder[M any, S any, O any] struct {
182-
builder *FindManyBuilder[M, S, O]
183-
omits O
184-
}
185-
186-
func (b *FindManyOmitBuilder[M, S, O]) Exec(ctx context.Context) ([]*M, error) {
187-
params := QueryParams[M]{
188-
Where: b.builder.where,
189-
Take: b.builder.take,
190-
Skip: b.builder.skip,
191-
OrderBy: b.builder.orderBy,
192-
Cursor: b.builder.cursor,
193-
}
194-
return b.builder.execFunc(ctx, params, nil, &b.omits)
124+
return b.execFunc(ctx, params, b.selects, b.omits)
195125
}
196-
197-

‎generator/templates/model_delete.gotpl‎

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -63,24 +63,29 @@ func (d *{{ .Model.Name }}Delegate) runDeleteMany(ctx context.Context, preds []P
6363
return result.RowsAffected()
6464
}
6565

66-
func (d *{{ .Model.Name }}Delegate) Delete(where UniquePredicate[{{ .Model.Name }}]) *DeleteBuilder[{{ .Model.Name }}, {{ .Model.Name }}Select, {{ .Model.Name }}Omit] {
66+
func (d *{{ .Model.Name }}Delegate) Delete(where UniquePredicate[{{ .Model.Name }}], additional ...PredicateOf[{{ .Model.Name }}]) *DeleteBuilder[{{ .Model.Name }}, {{ .Model.Name }}Select, {{ .Model.Name }}Omit] {
6767
return &DeleteBuilder[{{ .Model.Name }}, {{ .Model.Name }}Select, {{ .Model.Name }}Omit]{
68-
where: where,
69-
execFunc: d.executeDelete,
68+
where: where,
69+
additional: additional,
70+
execFunc: d.executeDelete,
7071
}
7172
}
7273

73-
func (d *{{ .Model.Name }}Delegate) executeDelete(ctx context.Context, where UniquePredicate[{{ .Model.Name }}], selects *{{ .Model.Name }}Select, omits *{{ .Model.Name }}Omit) (*{{ .Model.Name }}, error) {
74+
func (d *{{ .Model.Name }}Delegate) executeDelete(ctx context.Context, where UniquePredicate[{{ .Model.Name }}], additional []PredicateOf[{{ .Model.Name }}], selects *{{ .Model.Name }}Select, omits *{{ .Model.Name }}Omit) (*{{ .Model.Name }}, error) {
75+
allWhere := make([]PredicateOf[{{ .Model.Name }}], 0, 1+len(additional))
76+
allWhere = append(allWhere, where)
77+
allWhere = append(allWhere, additional...)
78+
7479
if len(d.extensions) == 0 {
75-
return d.runDelete(ctx, where, selects, omits)
80+
return d.runDelete(ctx, allWhere, selects, omits)
7681
}
7782

7883
if selects == nil || !selects.hasAnySelected() {
7984
selects = full{{ .Model.Name }}Select()
8085
}
8186

8287
args := &{{ .Model.Name }}DeleteArgs{
83-
Where: where,
88+
Where: allWhere,
8489
Select: selects,
8590
}
8691

@@ -107,9 +112,13 @@ func (d *{{ .Model.Name }}Delegate) executeDelete(ctx context.Context, where Uni
107112
return curr(ctx, args)
108113
}
109114

110-
func (d *{{ .Model.Name }}Delegate) runDelete(ctx context.Context, where UniquePredicate[{{ .Model.Name }}], selects *{{ .Model.Name }}Select, omits *{{ .Model.Name }}Omit) (*{{ .Model.Name }}, error) {
111-
if err := where.Validate(); err != nil {
112-
return nil, err
115+
func (d *{{ .Model.Name }}Delegate) runDelete(ctx context.Context, where []PredicateOf[{{ .Model.Name }}], selects *{{ .Model.Name }}Select, omits *{{ .Model.Name }}Omit) (*{{ .Model.Name }}, error) {
116+
for _, p := range where {
117+
if p != nil {
118+
if err := p.Validate(); err != nil {
119+
return nil, err
120+
}
121+
}
113122
}
114123

115124
returningCols := select{{ .Model.Name }}Cols(selects, omits, {{ lowercase .Model.Name }}PKCols...)
@@ -121,7 +130,7 @@ func (d *{{ .Model.Name }}Delegate) runDelete(ctx context.Context, where UniqueP
121130
var res *{{ .Model.Name }}
122131
err := d.client.transaction(ctx, func(txQ *Queries) error {
123132
var err error
124-
res, err = txQ.{{ .Model.Name }}.runFindUnique(ctx, []PredicateOf[{{ .Model.Name }}]{where}, selects, omits)
133+
res, err = txQ.{{ .Model.Name }}.runFindUnique(ctx, where, selects, omits)
125134
if err != nil {
126135
return err
127136
}
@@ -137,7 +146,7 @@ func (d *{{ .Model.Name }}Delegate) runDelete(ctx context.Context, where UniqueP
137146

138147
var pkPreds []PredicateOf[{{ .Model.Name }}]
139148
{{- if .Model.CompositePK }}
140-
{{- range $fName := .Model.CompositePK }}
149+
{{- range $fName := .Model.CompositePK.Fields }}
141150
{{- $field := $.Model.GetField $fName }}
142151
pkPreds = append(pkPreds, Predicate[{{ $.Model.Name }}]{
143152
Data: PredicateData{
@@ -181,7 +190,7 @@ func (d *{{ .Model.Name }}Delegate) runDelete(ctx context.Context, where UniqueP
181190
sb.WriteString("DELETE FROM ")
182191
d.client.dialect.WriteQuotedIdent(&sb, "{{ .Model.EffectiveTableName }}")
183192

184-
whereClause, vals, _ := CompilePredicates(d.client.dialect, []PredicateOf[{{ .Model.Name }}]{where})
193+
whereClause, vals, _ := CompilePredicates(d.client.dialect, where)
185194
if whereClause != "" {
186195
sb.WriteString(" WHERE ")
187196
sb.WriteString(whereClause)

0 commit comments

Comments
 (0)