Unnest common schema initialization

This makes the common code path less deeply nested and the flow control easier to follow.
This commit is contained in:
Andy Bursavich 2020-12-03 06:44:55 -08:00
parent 30461cc297
commit 444c38806d
No known key found for this signature in database
GPG Key ID: 8304542BB2D65091

View File

@ -223,37 +223,38 @@ func Parse(dest interface{}, cacheStore *sync.Map, namer Namer) (*Schema, error)
} }
} }
if s, loaded := cacheStore.LoadOrStore(modelType, schema); !loaded { if v, loaded := cacheStore.LoadOrStore(modelType, schema); loaded {
defer close(schema.initialized) s := v.(*Schema)
if _, embedded := schema.cacheStore.Load(embeddedCacheKey); !embedded { <-s.initialized
for _, field := range schema.Fields { return s, s.err
if field.DataType == "" && (field.Creatable || field.Updatable || field.Readable) { }
if schema.parseRelation(field); schema.err != nil {
return schema, schema.err
}
}
fieldValue := reflect.New(field.IndirectFieldType) defer close(schema.initialized)
if fc, ok := fieldValue.Interface().(CreateClausesInterface); ok { if _, embedded := schema.cacheStore.Load(embeddedCacheKey); !embedded {
field.Schema.CreateClauses = append(field.Schema.CreateClauses, fc.CreateClauses(field)...) for _, field := range schema.Fields {
} if field.DataType == "" && (field.Creatable || field.Updatable || field.Readable) {
if schema.parseRelation(field); schema.err != nil {
if fc, ok := fieldValue.Interface().(QueryClausesInterface); ok { return schema, schema.err
field.Schema.QueryClauses = append(field.Schema.QueryClauses, fc.QueryClauses(field)...)
}
if fc, ok := fieldValue.Interface().(UpdateClausesInterface); ok {
field.Schema.UpdateClauses = append(field.Schema.UpdateClauses, fc.UpdateClauses(field)...)
}
if fc, ok := fieldValue.Interface().(DeleteClausesInterface); ok {
field.Schema.DeleteClauses = append(field.Schema.DeleteClauses, fc.DeleteClauses(field)...)
} }
} }
fieldValue := reflect.New(field.IndirectFieldType)
if fc, ok := fieldValue.Interface().(CreateClausesInterface); ok {
field.Schema.CreateClauses = append(field.Schema.CreateClauses, fc.CreateClauses(field)...)
}
if fc, ok := fieldValue.Interface().(QueryClausesInterface); ok {
field.Schema.QueryClauses = append(field.Schema.QueryClauses, fc.QueryClauses(field)...)
}
if fc, ok := fieldValue.Interface().(UpdateClausesInterface); ok {
field.Schema.UpdateClauses = append(field.Schema.UpdateClauses, fc.UpdateClauses(field)...)
}
if fc, ok := fieldValue.Interface().(DeleteClausesInterface); ok {
field.Schema.DeleteClauses = append(field.Schema.DeleteClauses, fc.DeleteClauses(field)...)
}
} }
} else {
schema = s.(*Schema)
<-schema.initialized
} }
return schema, schema.err return schema, schema.err