Skip to content

Commit 03c536f

Browse files
author
Miguel Molina
authored
Merge pull request #172 from erizocosmico/fix/rels-no-inverse-insert
ensure all virtual columns are added in inserts and updates
2 parents 356d0a6 + 8875c18 commit 03c536f

File tree

5 files changed

+1798
-648
lines changed

5 files changed

+1798
-648
lines changed

model.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ func (m *Model) ClearVirtualColumns() {
7979
m.virtualColumns = make(map[string]Identifier)
8080
}
8181

82+
func (m *Model) getVirtualColumns() map[string]Identifier {
83+
return m.virtualColumns
84+
}
85+
8286
// AddVirtualColumn adds a new virtual column with the given name and value.
8387
// This method is only intended for internal use. It is only exposed for
8488
// technical reasons.
@@ -164,6 +168,7 @@ type VirtualColumnContainer interface {
164168
AddVirtualColumn(string, Identifier)
165169
// VirtualColumn returns the virtual column with the given column name.
166170
VirtualColumn(string) Identifier
171+
getVirtualColumns() map[string]Identifier
167172
}
168173

169174
// RecordValues returns the values of a record at the given columns in the same

store.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,10 @@ func (s *Store) Insert(schema Schema, record Record) error {
158158
return err
159159
}
160160

161+
virtualCols, virtualColValues := virtualColumns(record, cols)
162+
cols = append(cols, virtualCols...)
163+
values = append(values, virtualColValues...)
164+
161165
builder := s.builder.
162166
Insert(schema.Table()).
163167
Columns(cols...).
@@ -213,6 +217,10 @@ func (s *Store) Update(schema Schema, record Record, cols ...SchemaField) (int64
213217
return 0, err
214218
}
215219

220+
virtualCols, virtualColValues := virtualColumns(record, columnNames)
221+
columnNames = append(columnNames, virtualCols...)
222+
values = append(values, virtualColValues...)
223+
216224
var clauses = make(map[string]interface{}, len(cols))
217225
for i, col := range columnNames {
218226
clauses[col] = values[i]
@@ -418,3 +426,29 @@ type RecordWithSchema struct {
418426
Schema Schema
419427
Record Record
420428
}
429+
430+
func virtualColumns(r Record, columns []string) (cols []string, vals []interface{}) {
431+
c, ok := r.(VirtualColumnContainer)
432+
if !ok {
433+
return
434+
}
435+
436+
vcols := c.getVirtualColumns()
437+
for col, val := range vcols {
438+
if !containsString(columns, col) {
439+
cols = append(cols, col)
440+
vals = append(vals, val)
441+
}
442+
}
443+
444+
return
445+
}
446+
447+
func containsString(strs []string, str string) bool {
448+
for _, s := range strs {
449+
if s == str {
450+
return true
451+
}
452+
}
453+
return false
454+
}

0 commit comments

Comments
 (0)