Skip to content

Commit f1c41b7

Browse files
committed
nf/! and preload
1 parent 17d57ca commit f1c41b7

File tree

2 files changed

+64
-7
lines changed

2 files changed

+64
-7
lines changed

gateway/fields.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,18 +49,17 @@ func doRetainFields(obj map[string]interface{}, fields query.FieldSelectionMap)
4949
_, nnf := fields["_nnf"]
5050
_, nf := fields["_nf"]
5151
for key := range obj {
52-
// 如果一定排除,就直接delete
5352
if _, ok := fields["!"+key]; ok {
5453
delete(obj, key)
5554
}
5655

5756
if _, ok := fields[key]; !ok {
5857
if _, isModel := obj[key].(map[string]interface{}); isModel {
59-
if nf { // 如果nf必须显示,此值又是model的情况下,就不删除
58+
if nf {
6059
continue
6160
}
6261
} else {
63-
if nnf { // 如果nnf必须显示,此值又不是model的情况下,就不删除
62+
if nnf {
6463
continue
6564
}
6665
}

gorm/fields.go

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ func FieldSelectionToGorm(ctx context.Context, fs *query.FieldSelection, obj int
3535
}
3636
toPreload = append(toPreload, subPreload...)
3737
}
38+
39+
toPreload = tidySubPreload(fs.GetFields(), objType, toPreload)
3840
return toPreload, nil
3941
}
4042

@@ -71,8 +73,61 @@ fields:
7173
return toPreload, nil
7274
}
7375

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) {
75125
ccName := generator.CamelCase(f.GetName())
126+
if strings.HasPrefix(ccName, "_") ||
127+
strings.HasPrefix(ccName, "!") {
128+
return nil, nil
129+
}
130+
76131
sf, ok := objType.FieldByName(ccName)
77132
if !ok {
78133
return nil, nil
@@ -96,11 +151,14 @@ func handlePreloads(f *query.Field, objType reflect.Type) ([]string, error) {
96151
if err != nil {
97152
return nil, err
98153
}
99-
for i, e := range subPreload {
100-
subPreload[i] = ccName + "." + e
101-
}
102154
toPreload = append(toPreload, subPreload...)
103155
}
156+
157+
toPreload = tidySubPreload(f.GetSubs(), fType, toPreload)
158+
159+
for i, e := range toPreload {
160+
toPreload[i] = ccName + "." + e
161+
}
104162
return append(toPreload, ccName), nil
105163
}
106164

0 commit comments

Comments
 (0)