@@ -35,6 +35,8 @@ func FieldSelectionToGorm(ctx context.Context, fs *query.FieldSelection, obj int
35
35
}
36
36
toPreload = append (toPreload , subPreload ... )
37
37
}
38
+
39
+ toPreload = tidySubPreload (fs .GetFields (), objType , toPreload )
38
40
return toPreload , nil
39
41
}
40
42
@@ -71,8 +73,61 @@ fields:
71
73
return toPreload , nil
72
74
}
73
75
74
- func handlePreloads (f * query.Field , objType reflect.Type ) ([]string , error ) {
76
+ func tidySubPreload (subs map [string ]* query.Field , objType reflect.Type , subPreload []string ) []string {
77
+ edited := false
78
+
79
+ exists := make (map [string ]string , len (subPreload ))
80
+ for _ , e := range subPreload {
81
+ sp := strings .Split (e , "." )
82
+ exists [sp [0 ]] = e
83
+ }
84
+
85
+ _ , nf := subs ["_nf" ]
86
+ if nf {
87
+ numField := objType .NumField ()
88
+ for i := 0 ; i < numField ; i ++ {
89
+ sf := objType .Field (i )
90
+
91
+ if _ , ok := exists [sf .Name ]; ok {
92
+ continue
93
+ }
94
+
95
+ fType := indirectType (sf .Type )
96
+ if isModel (fType ) {
97
+ exists [sf .Name ] = sf .Name
98
+ edited = true
99
+ }
100
+ }
101
+ }
102
+
103
+ for k := range subs {
104
+ if strings .HasPrefix (k , "!" ) {
105
+ cn := generator .CamelCase (k [1 :])
106
+ if _ , ok := exists [cn ]; ok {
107
+ delete (exists , cn )
108
+ edited = true
109
+ }
110
+ }
111
+ }
112
+
113
+ if ! edited {
114
+ return subPreload
115
+ }
116
+
117
+ var vals []string
118
+ for _ , v := range exists {
119
+ vals = append (vals , v )
120
+ }
121
+ return vals
122
+ }
123
+
124
+ func handlePreloads (f * query.Field , objType reflect.Type ) (sps []string , rer error ) {
75
125
ccName := generator .CamelCase (f .GetName ())
126
+ if strings .HasPrefix (ccName , "_" ) ||
127
+ strings .HasPrefix (ccName , "!" ) {
128
+ return nil , nil
129
+ }
130
+
76
131
sf , ok := objType .FieldByName (ccName )
77
132
if ! ok {
78
133
return nil , nil
@@ -96,11 +151,14 @@ func handlePreloads(f *query.Field, objType reflect.Type) ([]string, error) {
96
151
if err != nil {
97
152
return nil , err
98
153
}
99
- for i , e := range subPreload {
100
- subPreload [i ] = ccName + "." + e
101
- }
102
154
toPreload = append (toPreload , subPreload ... )
103
155
}
156
+
157
+ toPreload = tidySubPreload (f .GetSubs (), fType , toPreload )
158
+
159
+ for i , e := range toPreload {
160
+ toPreload [i ] = ccName + "." + e
161
+ }
104
162
return append (toPreload , ccName ), nil
105
163
}
106
164
0 commit comments