@@ -93,14 +93,16 @@ func evalProjectionArray(ctx context.Context, pf ProjectionField, payload []inte
93
93
name = pf .Alias
94
94
}
95
95
96
- if ref , ok := validator .(* schema.Reference ); ok {
96
+ switch fieldType := validator .(type ) {
97
+ // schema.Reference has higher priority than schema.FieldGetter
98
+ case * schema.Reference :
97
99
// Execute sub-request in batch
98
100
e := & In {Field : "id" , Values : payload }
99
101
q := & Query {
100
102
Projection : pf .Children ,
101
103
Predicate : Predicate {e },
102
104
}
103
- rbr .request (ref .Path , q , func (payloads []map [string ]interface {}, validator schema.Validator ) error {
105
+ rbr .request (fieldType .Path , q , func (payloads []map [string ]interface {}, validator schema.Validator ) error {
104
106
var v interface {}
105
107
var err error
106
108
for i := range payloads {
@@ -119,28 +121,13 @@ func evalProjectionArray(ctx context.Context, pf ProjectionField, payload []inte
119
121
resMu .Unlock ()
120
122
return nil
121
123
})
122
- } else if dict , ok := validator .(* schema.Dict ); ok {
123
- for _ , val := range payload {
124
- subval , ok := val .(map [string ]interface {})
125
- if ! ok {
126
- return nil , fmt .Errorf ("%s: invalid value: not a dict" , pf .Name )
127
- }
128
- var err error
129
- if subval , err = evalProjection (ctx , pf .Children , subval , dict , rbr ); err != nil {
130
- return nil , fmt .Errorf ("%s.%v" , pf .Name , err )
131
- }
132
- var v interface {}
133
- if v , err = resolveFieldHandler (ctx , pf , def , subval ); err != nil {
134
- return nil , err
135
- }
136
- res = append (res , v )
137
- }
138
- } else if array , ok := validator .(* schema.Array ); ok {
124
+ // schema.Array has higher priority than schema.FieldGetter
125
+ case * schema.Array :
139
126
for i , val := range payload {
140
127
if subval , ok := val .([]interface {}); ok {
141
128
var err error
142
129
var subvalp * []interface {}
143
- if subvalp , err = evalProjectionArray (ctx , pf , subval , & array .Values , rbr ); err != nil {
130
+ if subvalp , err = evalProjectionArray (ctx , pf , subval , & fieldType .Values , rbr ); err != nil {
144
131
return nil , fmt .Errorf ("%s: error applying projection on array item #%d: %v" , pf .Name , i , err )
145
132
}
146
133
var v interface {}
@@ -152,26 +139,24 @@ func evalProjectionArray(ctx context.Context, pf ProjectionField, payload []inte
152
139
return nil , fmt .Errorf ("%s. is not an array" , pf .Name )
153
140
}
154
141
}
155
- } else {
142
+ case schema. FieldGetter :
156
143
for _ , val := range payload {
157
144
subval , ok := val .(map [string ]interface {})
158
145
if ! ok {
159
- return nil , fmt .Errorf ("%s: invalid value: not a dict" , pf .Name )
146
+ return nil , fmt .Errorf ("%s: invalid value: not a dict/object " , pf .Name )
160
147
}
161
- if fg , ok := validator .(schema.FieldGetter ); ok {
162
- var err error
163
- if subval , err = evalProjection (ctx , pf .Children , subval , fg , rbr ); err != nil {
164
- return nil , fmt .Errorf ("%s.%v" , pf .Name , err )
165
- }
166
- var v interface {}
167
- if v , err = resolveFieldHandler (ctx , pf , def , subval ); err != nil {
168
- return nil , err
169
- }
170
- res = append (res , v )
171
- } else {
172
- return nil , fmt .Errorf ("%s. is not an object" , pf .Name )
148
+ var err error
149
+ if subval , err = evalProjection (ctx , pf .Children , subval , fieldType , rbr ); err != nil {
150
+ return nil , fmt .Errorf ("%s.%v" , pf .Name , err )
173
151
}
152
+ var v interface {}
153
+ if v , err = resolveFieldHandler (ctx , pf , def , subval ); err != nil {
154
+ return nil , err
155
+ }
156
+ res = append (res , v )
174
157
}
158
+ default :
159
+ return nil , fmt .Errorf ("%s. unknown field type" , pf .Name )
175
160
}
176
161
177
162
return resp , nil
@@ -238,18 +223,6 @@ func evalProjection(ctx context.Context, p Projection, payload map[string]interf
238
223
resMu .Unlock ()
239
224
return nil
240
225
})
241
- } else if dict , ok := def .Validator .(* schema.Dict ); ok {
242
- subval , ok := val .(map [string ]interface {})
243
- if ! ok {
244
- return nil , fmt .Errorf ("%s: invalid value: not a dict" , pf .Name )
245
- }
246
- var err error
247
- if subval , err = evalProjection (ctx , pf .Children , subval , dict , rbr ); err != nil {
248
- return nil , fmt .Errorf ("%s.%v" , pf .Name , err )
249
- }
250
- if res [name ], err = resolveFieldHandler (ctx , pf , def , subval ); err != nil {
251
- return nil , err
252
- }
253
226
} else if array , ok := def .Validator .(* schema.Array ); ok {
254
227
if payload , ok := val .([]interface {}); ok {
255
228
var err error
@@ -263,6 +236,18 @@ func evalProjection(ctx context.Context, p Projection, payload map[string]interf
263
236
} else {
264
237
return nil , fmt .Errorf ("%s: invalid value: not an array" , pf .Name )
265
238
}
239
+ } else if fg , ok := def .Validator .(schema.FieldGetter ); ok {
240
+ subval , ok := val .(map [string ]interface {})
241
+ if ! ok {
242
+ return nil , fmt .Errorf ("%s: invalid value: not a dict" , pf .Name )
243
+ }
244
+ var err error
245
+ if subval , err = evalProjection (ctx , pf .Children , subval , fg , rbr ); err != nil {
246
+ return nil , fmt .Errorf ("%s.%v" , pf .Name , err )
247
+ }
248
+ if res [name ], err = resolveFieldHandler (ctx , pf , def , subval ); err != nil {
249
+ return nil , err
250
+ }
266
251
} else {
267
252
return nil , fmt .Errorf ("%s: field has no children" , pf .Name )
268
253
}
0 commit comments