@@ -22,18 +22,24 @@ def get_base_type(type):
22
22
return type
23
23
24
24
25
- def get_resolvers (context , type , selection_set ):
26
- from .resolver import field_resolver
25
+ def get_subfield_asts (context , return_type , field_asts ):
27
26
subfield_asts = DefaultOrderedDict (list )
28
27
visited_fragment_names = set ()
29
- if selection_set :
30
- subfield_asts = collect_fields (
31
- context , type , selection_set ,
32
- subfield_asts , visited_fragment_names
33
- )
28
+ for field_ast in field_asts :
29
+ selection_set = field_ast .selection_set
30
+ if selection_set :
31
+ subfield_asts = collect_fields (
32
+ context , return_type , selection_set ,
33
+ subfield_asts , visited_fragment_names
34
+ )
35
+ return subfield_asts
36
+
37
+
38
+ def get_resolvers (context , type , field_asts ):
39
+ from .resolver import field_resolver
34
40
35
41
resolvers = []
36
- for response_name , field_asts in subfield_asts .items ():
42
+ for response_name , field_asts in field_asts .items ():
37
43
field_ast = field_asts [0 ]
38
44
field_name = field_ast .name .value
39
45
field_def = get_field_def (context and context .schema , type , field_name )
@@ -55,14 +61,14 @@ def get_resolvers(context, type, selection_set):
55
61
if isinstance (field_base_type , GraphQLObjectType ):
56
62
field_fragment = Fragment (
57
63
type = field_base_type ,
58
- selection_set = field_ast . selection_set ,
64
+ field_asts = get_subfield_asts ( context , field_base_type , field_asts ) ,
59
65
info = info ,
60
66
context = context
61
67
)
62
68
elif isinstance (field_base_type , (GraphQLInterfaceType , GraphQLUnionType )):
63
69
field_fragment = AbstractFragment (
64
70
abstract_type = field_base_type ,
65
- selection_set = field_ast . selection_set ,
71
+ field_asts = field_asts ,
66
72
info = info ,
67
73
context = context
68
74
)
@@ -78,9 +84,9 @@ def get_resolvers(context, type, selection_set):
78
84
79
85
class Fragment (object ):
80
86
81
- def __init__ (self , type , selection_set , context = None , info = None ):
87
+ def __init__ (self , type , field_asts , context = None , info = None ):
82
88
self .type = type
83
- self .selection_set = selection_set
89
+ self .field_asts = field_asts
84
90
self .context = context
85
91
self .info = info
86
92
@@ -89,7 +95,7 @@ def partial_resolvers(self):
89
95
return get_resolvers (
90
96
self .context ,
91
97
self .type ,
92
- self .selection_set
98
+ self .field_asts
93
99
)
94
100
95
101
def have_type (self , root ):
@@ -156,17 +162,17 @@ def execute_field(prev_promise, resolver):
156
162
def __eq__ (self , other ):
157
163
return isinstance (other , Fragment ) and (
158
164
other .type == self .type and
159
- other .selection_set == self .selection_set and
165
+ other .field_asts == self .field_asts and
160
166
other .context == self .context and
161
167
other .info == self .info
162
168
)
163
169
164
170
165
171
class AbstractFragment (object ):
166
172
167
- def __init__ (self , abstract_type , selection_set , context = None , info = None ):
173
+ def __init__ (self , abstract_type , field_asts , context = None , info = None ):
168
174
self .abstract_type = abstract_type
169
- self .selection_set = selection_set
175
+ self .field_asts = field_asts
170
176
self .context = context
171
177
self .info = info
172
178
self ._fragments = {}
@@ -183,7 +189,12 @@ def get_fragment(self, type):
183
189
assert type in self .possible_types , (
184
190
'Runtime Object type "{}" is not a possible type for "{}".'
185
191
).format (type , self .abstract_type )
186
- self ._fragments [type ] = Fragment (type , self .selection_set , self .context , self .info )
192
+ self ._fragments [type ] = Fragment (
193
+ type ,
194
+ get_subfield_asts (self .context , type , self .field_asts ),
195
+ self .context ,
196
+ self .info
197
+ )
187
198
return self ._fragments [type ]
188
199
189
200
def resolve_type (self , result ):
0 commit comments