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)
}
if elems.Len() > 0 {
// optimize elems of reflect value length
if elemLen := elems.Len(); elemLen > 0 {
if v, ok := selectColumns[rel.Name+".*"]; !ok || v {
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))
}
}

View File

@ -71,10 +71,10 @@ func GetRelationsValues(reflectValue reflect.Value, rels []*Relationship) (refle
reflectResults = reflect.Append(reflectResults, result.Addr())
case reflect.Slice, reflect.Array:
for i := 0; i < result.Len(); i++ {
if result.Index(i).Kind() == reflect.Ptr {
reflectResults = reflect.Append(reflectResults, result.Index(i))
if elem := result.Index(i); elem.Kind() == reflect.Ptr {
reflectResults = reflect.Append(reflectResults, elem)
} 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 {
conds = append(conds, clause.Eq{Column: key, Value: v[key]})
} else {
values := make([]interface{}, reflectValue.Len())
for i := 0; i < reflectValue.Len(); i++ {
// optimize relect value length
valueLen := reflectValue.Len()
values := make([]interface{}, valueLen)
for i := 0; i < valueLen; i++ {
values[i] = reflectValue.Index(i).Interface()
}
@ -396,8 +398,10 @@ func (stmt *Statement) BuildCondition(query interface{}, args ...interface{}) []
if len(args) == 1 {
switch reflectValue.Kind() {
case reflect.Slice, reflect.Array:
values := make([]interface{}, reflectValue.Len())
for i := 0; i < reflectValue.Len(); i++ {
// optimize relect value length
valueLen := reflectValue.Len()
values := make([]interface{}, valueLen)
for i := 0; i < valueLen; i++ {
values[i] = reflectValue.Index(i).Interface()
}