Skip to content

Commit d558b78

Browse files
author
Miguel Molina
authored
Merge pull request #126 from erizocosmico/feature/save-relationships-order
save/update inverses before record
2 parents 5e79b71 + aa26abf commit d558b78

File tree

4 files changed

+200
-80
lines changed

4 files changed

+200
-80
lines changed

generator/templates/model.tgo

Lines changed: 73 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -96,35 +96,26 @@ func New{{.StoreName}}(db *sql.DB) *{{.StoreName}} {
9696
return &{{.StoreName}}{kallax.NewStore(db)}
9797
}
9898

99-
{{if .HasRelationships}}
99+
{{if .HasNonInverses}}
100100
func (s *{{.StoreName}}) relationshipRecords(record *{{.Name}}) []kallax.RecordWithSchema {
101-
record.ClearVirtualColumns()
102101
var records []kallax.RecordWithSchema
103-
{{range .Relationships}}
104-
{{- if .IsInverse -}}
105-
if {{if .IsPtr}}record.{{.Name}} != nil{{else}}!record.{{.Name}}.GetID().IsEmpty(){{end}} {
106-
record.AddVirtualColumn("{{.ForeignKey}}", record.{{.Name}}.GetID())
107-
records = append(records, kallax.RecordWithSchema{
108-
Schema.{{.TypeSchemaName}}.BaseSchema,
109-
{{if not .IsPtr}}&{{end}}record.{{.Name}},
110-
})
111-
}
112-
{{else if .IsOneToManyRelationship}}
102+
{{range .NonInverses}}
103+
{{if .IsOneToManyRelationship}}
113104
for _, rec := range record.{{.Name}} {
114105
rec.ClearVirtualColumns()
115106
rec.AddVirtualColumn("{{.ForeignKey}}", record.GetID())
116107
records = append(records, kallax.RecordWithSchema{
117-
Schema.{{.TypeSchemaName}}.BaseSchema,
118-
{{if not ($.IsPtrSlice .)}}&{{end}}rec,
108+
Schema: Schema.{{.TypeSchemaName}}.BaseSchema,
109+
Record: {{if not ($.IsPtrSlice .)}}&{{end}}rec,
119110
})
120111
}
121112
{{else}}
122113
if {{if .IsPtr}}record.{{.Name}} != nil{{else}}!record.{{.Name}}.GetID().IsEmpty(){{end}} {
123114
record.{{.Name}}.ClearVirtualColumns()
124115
record.{{.Name}}.AddVirtualColumn("{{.ForeignKey}}", record.GetID())
125116
records = append(records, kallax.RecordWithSchema{
126-
Schema.{{.TypeSchemaName}}.BaseSchema,
127-
{{if not .IsPtr}}&{{end}}record.{{.Name}},
117+
Schema: Schema.{{.TypeSchemaName}}.BaseSchema,
118+
Record: {{if not .IsPtr}}&{{end}}record.{{.Name}},
128119
})
129120
}
130121
{{end}}
@@ -133,6 +124,23 @@ func (s *{{.StoreName}}) relationshipRecords(record *{{.Name}}) []kallax.RecordW
133124
}
134125
{{end}}
135126

127+
{{if .HasInverses}}
128+
func (s *{{.StoreName}}) inverseRecords(record *{{.Name}}) []kallax.RecordWithSchema {
129+
record.ClearVirtualColumns()
130+
var records []kallax.RecordWithSchema
131+
{{range .Inverses}}
132+
if {{if .IsPtr}}record.{{.Name}} != nil{{else}}!record.{{.Name}}.GetID().IsEmpty(){{end}} {
133+
record.AddVirtualColumn("{{.ForeignKey}}", record.{{.Name}}.GetID())
134+
records = append(records, kallax.RecordWithSchema{
135+
Schema: Schema.{{.TypeSchemaName}}.BaseSchema,
136+
Record: {{if not .IsPtr}}&{{end}}record.{{.Name}},
137+
})
138+
}
139+
{{end}}
140+
return records
141+
}
142+
{{end}}
143+
136144
// Insert inserts a {{.Name}} in the database. A non-persisted object is
137145
// required for this operation.
138146
func (s *{{.StoreName}}) Insert(record *{{.Name}}) error {
@@ -146,13 +154,34 @@ func (s *{{.StoreName}}) Insert(record *{{.Name}}) error {
146154
}
147155
{{end}}
148156
{{if .HasRelationships}}
157+
{{if .HasNonInverses}}
149158
records := s.relationshipRecords(record)
150-
if len(records) > 0 {
159+
{{end}}
160+
{{if .HasInverses}}
161+
inverseRecords := s.inverseRecords(record)
162+
{{end}}
163+
if {{if .HasNonInverses}}len(records) > 0{{end}} {{if and (.HasNonInverses) (.HasInverses)}}&&{{end}} {{if .HasInverses}}len(inverseRecords) > 0{{end}} {
151164
return s.Store.Transaction(func(s *kallax.Store) error {
165+
{{if .HasInverses}}
166+
for _, r := range inverseRecords {
167+
if err := kallax.ApplyBeforeEvents(r.Record); err != nil {
168+
return err
169+
}
170+
persisted := r.Record.IsPersisted()
171+
172+
if _, err := s.Save(r.Schema, r.Record); err != nil {
173+
return err
174+
}
175+
176+
if err := kallax.ApplyAfterEvents(r.Record, persisted); err != nil {
177+
return err
178+
}
179+
}
180+
{{end}}
152181
if err := s.Insert(Schema.{{.Name}}.BaseSchema, record); err != nil {
153182
return err
154183
}
155-
184+
{{if .HasNonInverses}}
156185
for _, r := range records {
157186
if err := kallax.ApplyBeforeEvents(r.Record); err != nil {
158187
return err
@@ -167,6 +196,7 @@ func (s *{{.StoreName}}) Insert(record *{{.Name}}) error {
167196
return err
168197
}
169198
}
199+
{{end}}
170200

171201
{{if .Events.Has "AfterInsert"}}
172202
if err := record.AfterInsert(); err != nil {
@@ -224,14 +254,37 @@ func (s *{{.StoreName}}) Update(record *{{.Name}}, cols ...kallax.SchemaField) (
224254
}
225255
{{end}}
226256
{{if .HasRelationships}}
257+
{{if .HasNonInverses}}
227258
records := s.relationshipRecords(record)
228-
if len(records) > 0 {
259+
{{end}}
260+
{{if .HasInverses}}
261+
inverseRecords := s.inverseRecords(record)
262+
{{end}}
263+
if {{if .HasNonInverses}}len(records) > 0{{end}} {{if and (.HasNonInverses) (.HasInverses)}}&&{{end}} {{if .HasInverses}}len(inverseRecords) > 0{{end}} {
229264
err = s.Store.Transaction(func(s *kallax.Store) error {
265+
{{if .HasInverses}}
266+
for _, r := range inverseRecords {
267+
if err := kallax.ApplyBeforeEvents(r.Record); err != nil {
268+
return err
269+
}
270+
persisted := r.Record.IsPersisted()
271+
272+
if _, err := s.Save(r.Schema, r.Record); err != nil {
273+
return err
274+
}
275+
276+
if err := kallax.ApplyAfterEvents(r.Record, persisted); err != nil {
277+
return err
278+
}
279+
}
280+
{{end}}
281+
230282
updated, err = s.Update(Schema.{{.Name}}.BaseSchema, record, cols...)
231283
if err != nil {
232284
return err
233285
}
234286

287+
{{if .HasNonInverses}}
235288
for _, r := range records {
236289
if err := kallax.ApplyBeforeEvents(r.Record); err != nil {
237290
return err
@@ -246,6 +299,7 @@ func (s *{{.StoreName}}) Update(record *{{.Name}}, cols ...kallax.SchemaField) (
246299
return err
247300
}
248301
}
302+
{{end}}
249303

250304
{{if .Events.Has "AfterUpdate"}}
251305
if err := record.AfterUpdate(); err != nil {

generator/types.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,11 +440,43 @@ func (m *Model) Relationships() []*Field {
440440
return relationshipsOnFields(m.Fields)
441441
}
442442

443+
// Inverses returns the inverse relationships of the model.
444+
func (m *Model) Inverses() []*Field {
445+
var inverses []*Field
446+
for _, f := range relationshipsOnFields(m.Fields) {
447+
if f.IsInverse() {
448+
inverses = append(inverses, f)
449+
}
450+
}
451+
return inverses
452+
}
453+
454+
// NonInverses returns the relationships of the model that are not inverses.
455+
func (m *Model) NonInverses() []*Field {
456+
var rels []*Field
457+
for _, f := range relationshipsOnFields(m.Fields) {
458+
if !f.IsInverse() {
459+
rels = append(rels, f)
460+
}
461+
}
462+
return rels
463+
}
464+
443465
// HasRelationships returns whether the model has relationships or not.
444466
func (m *Model) HasRelationships() bool {
445467
return len(m.Relationships()) > 0
446468
}
447469

470+
// HasInverses returns whether the model has inverse relationships or not.
471+
func (m *Model) HasInverses() bool {
472+
return len(m.Inverses()) > 0
473+
}
474+
475+
// HasNonInverses returns whether the model has non inverse relationships or not.
476+
func (m *Model) HasNonInverses() bool {
477+
return len(m.NonInverses()) > 0
478+
}
479+
448480
func relationshipsOnFields(fields []*Field) []*Field {
449481
var result []*Field
450482
for _, f := range fields {

0 commit comments

Comments
 (0)