parsePreloadMap extracts nested preloads. e.g. // schema has a "k0" relation and a "k7.k8" embedded relation parsePreloadMap(schema, map[string][]interface{}{ clause.Associations: {"arg1"}, "k1": {"arg2"}, "k2.k3": {"arg3"}, "k4.k5.k6": {"arg4"}, }) /
(s *schema.Schema, preloads map[string][]interface{})
| 36 | // }, |
| 37 | // } |
| 38 | func parsePreloadMap(s *schema.Schema, preloads map[string][]interface{}) map[string]map[string][]interface{} { |
| 39 | preloadMap := map[string]map[string][]interface{}{} |
| 40 | setPreloadMap := func(name, value string, args []interface{}) { |
| 41 | if _, ok := preloadMap[name]; !ok { |
| 42 | preloadMap[name] = map[string][]interface{}{} |
| 43 | } |
| 44 | if value != "" { |
| 45 | preloadMap[name][value] = args |
| 46 | } |
| 47 | } |
| 48 | |
| 49 | for name, args := range preloads { |
| 50 | preloadFields := strings.Split(name, ".") |
| 51 | value := strings.TrimPrefix(strings.TrimPrefix(name, preloadFields[0]), ".") |
| 52 | if preloadFields[0] == clause.Associations { |
| 53 | for _, relation := range s.Relationships.Relations { |
| 54 | if relation.Schema == s { |
| 55 | setPreloadMap(relation.Name, value, args) |
| 56 | } |
| 57 | } |
| 58 | |
| 59 | for embedded, embeddedRelations := range s.Relationships.EmbeddedRelations { |
| 60 | for _, value := range embeddedValues(embeddedRelations) { |
| 61 | setPreloadMap(embedded, value, args) |
| 62 | } |
| 63 | } |
| 64 | } else { |
| 65 | setPreloadMap(preloadFields[0], value, args) |
| 66 | } |
| 67 | } |
| 68 | return preloadMap |
| 69 | } |
| 70 | |
| 71 | func embeddedValues(embeddedRelations *schema.Relationships) []string { |
| 72 | if embeddedRelations == nil { |
no test coverage detected
searching dependent graphs…