performance improve for schema
This commit is contained in:
parent
725aa5b5ff
commit
67de7a8af8
@ -94,9 +94,6 @@ func (schema *Schema) LookUpField(name string) *Field {
|
|||||||
// ID string // is selected by LookUpFieldByBindName([]string{"ID"}, "ID")
|
// ID string // is selected by LookUpFieldByBindName([]string{"ID"}, "ID")
|
||||||
// }
|
// }
|
||||||
func (schema *Schema) LookUpFieldByBindName(bindNames []string, name string) *Field {
|
func (schema *Schema) LookUpFieldByBindName(bindNames []string, name string) *Field {
|
||||||
if len(bindNames) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
for i := len(bindNames) - 1; i >= 0; i-- {
|
for i := len(bindNames) - 1; i >= 0; i-- {
|
||||||
find := strings.Join(bindNames[:i], ".") + "." + name
|
find := strings.Join(bindNames[:i], ".") + "." + name
|
||||||
if field, ok := schema.FieldsByBindName[find]; ok {
|
if field, ok := schema.FieldsByBindName[find]; ok {
|
||||||
@ -133,13 +130,11 @@ func ParseWithSpecialTableName(dest interface{}, cacheStore *sync.Map, namer Nam
|
|||||||
return nil, fmt.Errorf("%w: %+v", ErrUnsupportedDataType, dest)
|
return nil, fmt.Errorf("%w: %+v", ErrUnsupportedDataType, dest)
|
||||||
}
|
}
|
||||||
|
|
||||||
value := reflect.ValueOf(dest)
|
modelType := reflect.ValueOf(dest).Type()
|
||||||
if value.Kind() == reflect.Ptr && value.IsNil() {
|
if modelType.Kind() == reflect.Ptr {
|
||||||
value = reflect.New(value.Type().Elem())
|
modelType = modelType.Elem()
|
||||||
}
|
}
|
||||||
|
|
||||||
modelType := reflect.Indirect(value).Type()
|
|
||||||
|
|
||||||
if modelType.Kind() != reflect.Struct {
|
if modelType.Kind() != reflect.Struct {
|
||||||
if modelType.Kind() == reflect.Interface {
|
if modelType.Kind() == reflect.Interface {
|
||||||
modelType = reflect.Indirect(reflect.ValueOf(dest)).Elem().Type()
|
modelType = reflect.Indirect(reflect.ValueOf(dest)).Elem().Type()
|
||||||
@ -174,7 +169,7 @@ func ParseWithSpecialTableName(dest interface{}, cacheStore *sync.Map, namer Nam
|
|||||||
|
|
||||||
var tableName string
|
var tableName string
|
||||||
modelValue := reflect.New(modelType)
|
modelValue := reflect.New(modelType)
|
||||||
if specialTableName != "" && specialTableName != tableName {
|
if specialTableName != "" {
|
||||||
tableName = specialTableName
|
tableName = specialTableName
|
||||||
} else if en, ok := namer.(embeddedNamer); ok {
|
} else if en, ok := namer.(embeddedNamer); ok {
|
||||||
tableName = en.Table
|
tableName = en.Table
|
||||||
@ -190,6 +185,8 @@ func ParseWithSpecialTableName(dest interface{}, cacheStore *sync.Map, namer Nam
|
|||||||
Name: modelType.Name(),
|
Name: modelType.Name(),
|
||||||
ModelType: modelType,
|
ModelType: modelType,
|
||||||
Table: tableName,
|
Table: tableName,
|
||||||
|
DBNames: make([]string, 0, 10),
|
||||||
|
Fields: make([]*Field, 0, 10),
|
||||||
FieldsByName: make(map[string]*Field, 10),
|
FieldsByName: make(map[string]*Field, 10),
|
||||||
FieldsByBindName: make(map[string]*Field, 10),
|
FieldsByBindName: make(map[string]*Field, 10),
|
||||||
FieldsByDBName: make(map[string]*Field, 10),
|
FieldsByDBName: make(map[string]*Field, 10),
|
||||||
@ -236,8 +233,9 @@ func ParseWithSpecialTableName(dest interface{}, cacheStore *sync.Map, namer Nam
|
|||||||
schema.FieldsByBindName[bindName] = field
|
schema.FieldsByBindName[bindName] = field
|
||||||
|
|
||||||
if v != nil && v.PrimaryKey {
|
if v != nil && v.PrimaryKey {
|
||||||
|
// remove the existing primary key field
|
||||||
for idx, f := range schema.PrimaryFields {
|
for idx, f := range schema.PrimaryFields {
|
||||||
if f == v {
|
if f.DBName == v.DBName {
|
||||||
schema.PrimaryFields = append(schema.PrimaryFields[0:idx], schema.PrimaryFields[idx+1:]...)
|
schema.PrimaryFields = append(schema.PrimaryFields[0:idx], schema.PrimaryFields[idx+1:]...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user