Skip to content

Commit 3d49e71

Browse files
daheigeyrong
authored andcommitted
Optimize reflect value length and method (go-gorm#4280)
* Respect ignore migration when add column (go-gorm#4276) continue go-gorm#4028 * feat: Optimal value type acquisition for v (go-gorm#4278) * feat: optimize relect value length and value * feat: optimize ConvertSliceOfMapToValuesForCreate method Co-authored-by: yrong1997 <[email protected]>
1 parent 0a5b36c commit 3d49e71

File tree

4 files changed

+22
-12
lines changed

4 files changed

+22
-12
lines changed

callbacks/associations.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -288,12 +288,13 @@ func SaveAfterAssociations(create bool) func(db *gorm.DB) {
288288
appendToElems(db.Statement.ReflectValue)
289289
}
290290

291-
if elems.Len() > 0 {
291+
// optimize elems of reflect value length
292+
if elemLen := elems.Len(); elemLen > 0 {
292293
if v, ok := selectColumns[rel.Name+".*"]; !ok || v {
293294
saveAssociations(db, rel, elems.Interface(), selectColumns, restricted, nil)
294295
}
295296

296-
for i := 0; i < elems.Len(); i++ {
297+
for i := 0; i < elemLen; i++ {
297298
appendToJoins(objs[i], elems.Index(i))
298299
}
299300
}

callbacks/helper.go

+8-3
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,21 @@ func ConvertMapToValuesForCreate(stmt *gorm.Statement, mapValue map[string]inter
4141
// ConvertSliceOfMapToValuesForCreate convert slice of map to values
4242
func ConvertSliceOfMapToValuesForCreate(stmt *gorm.Statement, mapValues []map[string]interface{}) (values clause.Values) {
4343
var (
44-
columns = make([]string, 0, len(mapValues))
45-
result = map[string][]interface{}{}
46-
selectColumns, restricted = stmt.SelectAndOmitColumns(true, false)
44+
columns = make([]string, 0, len(mapValues))
4745
)
4846

47+
// when the length of mapValues,return directly here
48+
// no need to call stmt.SelectAndOmitColumns method
4949
if len(mapValues) == 0 {
5050
stmt.AddError(gorm.ErrEmptySlice)
5151
return
5252
}
5353

54+
var (
55+
result = make(map[string][]interface{}, len(mapValues))
56+
selectColumns, restricted = stmt.SelectAndOmitColumns(true, false)
57+
)
58+
5459
for idx, mapValue := range mapValues {
5560
for k, v := range mapValue {
5661
if stmt.Schema != nil {

schema/utils.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,10 @@ func GetRelationsValues(reflectValue reflect.Value, rels []*Relationship) (refle
7171
reflectResults = reflect.Append(reflectResults, result.Addr())
7272
case reflect.Slice, reflect.Array:
7373
for i := 0; i < result.Len(); i++ {
74-
if result.Index(i).Kind() == reflect.Ptr {
75-
reflectResults = reflect.Append(reflectResults, result.Index(i))
74+
if elem := result.Index(i); elem.Kind() == reflect.Ptr {
75+
reflectResults = reflect.Append(reflectResults, elem)
7676
} else {
77-
reflectResults = reflect.Append(reflectResults, result.Index(i).Addr())
77+
reflectResults = reflect.Append(reflectResults, elem.Addr())
7878
}
7979
}
8080
}

statement.go

+8-4
Original file line numberDiff line numberDiff line change
@@ -328,8 +328,10 @@ func (stmt *Statement) BuildCondition(query interface{}, args ...interface{}) []
328328
} else if _, ok := v[key].(Valuer); ok {
329329
conds = append(conds, clause.Eq{Column: key, Value: v[key]})
330330
} else {
331-
values := make([]interface{}, reflectValue.Len())
332-
for i := 0; i < reflectValue.Len(); i++ {
331+
// optimize relect value length
332+
valueLen := reflectValue.Len()
333+
values := make([]interface{}, valueLen)
334+
for i := 0; i < valueLen; i++ {
333335
values[i] = reflectValue.Index(i).Interface()
334336
}
335337

@@ -396,8 +398,10 @@ func (stmt *Statement) BuildCondition(query interface{}, args ...interface{}) []
396398
if len(args) == 1 {
397399
switch reflectValue.Kind() {
398400
case reflect.Slice, reflect.Array:
399-
values := make([]interface{}, reflectValue.Len())
400-
for i := 0; i < reflectValue.Len(); i++ {
401+
// optimize relect value length
402+
valueLen := reflectValue.Len()
403+
values := make([]interface{}, valueLen)
404+
for i := 0; i < valueLen; i++ {
401405
values[i] = reflectValue.Index(i).Interface()
402406
}
403407

0 commit comments

Comments
 (0)