feat: optimize relect value length and value

This commit is contained in:
daheige 2021-04-13 22:34:34 +08:00
parent 125d6b0f24
commit c0b910e7d3
3 changed files with 14 additions and 9 deletions

View File

@ -288,12 +288,13 @@ func SaveAfterAssociations(create bool) func(db *gorm.DB) {
appendToElems(db.Statement.ReflectValue) appendToElems(db.Statement.ReflectValue)
} }
if elems.Len() > 0 { // optimize elems of reflect value length
if elemLen := elems.Len(); elemLen > 0 {
if v, ok := selectColumns[rel.Name+".*"]; !ok || v { if v, ok := selectColumns[rel.Name+".*"]; !ok || v {
saveAssociations(db, rel, elems.Interface(), selectColumns, restricted, nil) saveAssociations(db, rel, elems.Interface(), selectColumns, restricted, nil)
} }
for i := 0; i < elems.Len(); i++ { for i := 0; i < elemLen; i++ {
appendToJoins(objs[i], elems.Index(i)) appendToJoins(objs[i], elems.Index(i))
} }
} }

View File

@ -71,10 +71,10 @@ func GetRelationsValues(reflectValue reflect.Value, rels []*Relationship) (refle
reflectResults = reflect.Append(reflectResults, result.Addr()) reflectResults = reflect.Append(reflectResults, result.Addr())
case reflect.Slice, reflect.Array: case reflect.Slice, reflect.Array:
for i := 0; i < result.Len(); i++ { for i := 0; i < result.Len(); i++ {
if result.Index(i).Kind() == reflect.Ptr { if elem := result.Index(i); elem.Kind() == reflect.Ptr {
reflectResults = reflect.Append(reflectResults, result.Index(i)) reflectResults = reflect.Append(reflectResults, elem)
} else { } else {
reflectResults = reflect.Append(reflectResults, result.Index(i).Addr()) reflectResults = reflect.Append(reflectResults, elem.Addr())
} }
} }
} }

View File

@ -328,8 +328,10 @@ func (stmt *Statement) BuildCondition(query interface{}, args ...interface{}) []
} else if _, ok := v[key].(Valuer); ok { } else if _, ok := v[key].(Valuer); ok {
conds = append(conds, clause.Eq{Column: key, Value: v[key]}) conds = append(conds, clause.Eq{Column: key, Value: v[key]})
} else { } else {
values := make([]interface{}, reflectValue.Len()) // optimize relect value length
for i := 0; i < reflectValue.Len(); i++ { valueLen := reflectValue.Len()
values := make([]interface{}, valueLen)
for i := 0; i < valueLen; i++ {
values[i] = reflectValue.Index(i).Interface() values[i] = reflectValue.Index(i).Interface()
} }
@ -396,8 +398,10 @@ func (stmt *Statement) BuildCondition(query interface{}, args ...interface{}) []
if len(args) == 1 { if len(args) == 1 {
switch reflectValue.Kind() { switch reflectValue.Kind() {
case reflect.Slice, reflect.Array: case reflect.Slice, reflect.Array:
values := make([]interface{}, reflectValue.Len()) // optimize relect value length
for i := 0; i < reflectValue.Len(); i++ { valueLen := reflectValue.Len()
values := make([]interface{}, valueLen)
for i := 0; i < valueLen; i++ {
values[i] = reflectValue.Index(i).Interface() values[i] = reflectValue.Index(i).Interface()
} }