|
4 | 4 | import graphql.ExecutionResult; |
5 | 5 | import graphql.ExecutionResultImpl; |
6 | 6 | import graphql.GraphQLException; |
| 7 | +import graphql.TypeResolutionEnvironment; |
7 | 8 | import graphql.execution.instrumentation.Instrumentation; |
8 | 9 | import graphql.execution.instrumentation.InstrumentationContext; |
9 | 10 | import graphql.execution.instrumentation.parameters.FieldFetchParameters; |
@@ -105,6 +106,7 @@ protected ExecutionResult resolveField(ExecutionContext executionContext, Execut |
105 | 106 | ExecutionParameters newParameters = ExecutionParameters.newParameters() |
106 | 107 | .typeInfo(fieldType) |
107 | 108 | .fields(parameters.fields()) |
| 109 | + .arguments(argumentValues) |
108 | 110 | .source(resolvedValue).build(); |
109 | 111 |
|
110 | 112 | ExecutionResult result = completeValue(executionContext, newParameters, fields); |
@@ -137,9 +139,22 @@ protected ExecutionResult completeValue(ExecutionContext executionContext, Execu |
137 | 139 |
|
138 | 140 | GraphQLObjectType resolvedType; |
139 | 141 | if (fieldType instanceof GraphQLInterfaceType) { |
140 | | - resolvedType = resolveType((GraphQLInterfaceType) fieldType, result); |
| 142 | + TypeResolutionParameters resolutionParams = TypeResolutionParameters.newParameters() |
| 143 | + .graphQLInterfaceType((GraphQLInterfaceType) fieldType) |
| 144 | + .field(fields.get(0)) |
| 145 | + .value(parameters.source()) |
| 146 | + .argumentValues(parameters.arguments()) |
| 147 | + .schema(executionContext.getGraphQLSchema()).build(); |
| 148 | + resolvedType = resolveTypeForInterface(resolutionParams); |
| 149 | + |
141 | 150 | } else if (fieldType instanceof GraphQLUnionType) { |
142 | | - resolvedType = resolveType((GraphQLUnionType) fieldType, result); |
| 151 | + TypeResolutionParameters resolutionParams = TypeResolutionParameters.newParameters() |
| 152 | + .graphQLUnionType((GraphQLUnionType) fieldType) |
| 153 | + .field(fields.get(0)) |
| 154 | + .value(parameters.source()) |
| 155 | + .argumentValues(parameters.arguments()) |
| 156 | + .schema(executionContext.getGraphQLSchema()).build(); |
| 157 | + resolvedType = resolveTypeForUnion(resolutionParams); |
143 | 158 | } else { |
144 | 159 | resolvedType = (GraphQLObjectType) fieldType; |
145 | 160 | } |
@@ -169,18 +184,20 @@ private Iterable<Object> toIterable(Object result) { |
169 | 184 | return (Iterable<Object>) result; |
170 | 185 | } |
171 | 186 |
|
172 | | - protected GraphQLObjectType resolveType(GraphQLInterfaceType graphQLInterfaceType, Object value) { |
173 | | - GraphQLObjectType result = graphQLInterfaceType.getTypeResolver().getType(value); |
| 187 | + protected GraphQLObjectType resolveTypeForInterface(TypeResolutionParameters params) { |
| 188 | + TypeResolutionEnvironment env = new TypeResolutionEnvironment(params.getValue(), params.getArgumentValues(), params.getField(), params.getGraphQLInterfaceType(), params.getSchema()); |
| 189 | + GraphQLObjectType result = params.getGraphQLInterfaceType().getTypeResolver().getType(env); |
174 | 190 | if (result == null) { |
175 | | - throw new GraphQLException("could not determine type"); |
| 191 | + throw new GraphQLException("Could not determine the exact type of " + params.getGraphQLInterfaceType().getName()); |
176 | 192 | } |
177 | 193 | return result; |
178 | 194 | } |
179 | 195 |
|
180 | | - protected GraphQLObjectType resolveType(GraphQLUnionType graphQLUnionType, Object value) { |
181 | | - GraphQLObjectType result = graphQLUnionType.getTypeResolver().getType(value); |
| 196 | + protected GraphQLObjectType resolveTypeForUnion(TypeResolutionParameters params) { |
| 197 | + TypeResolutionEnvironment env = new TypeResolutionEnvironment(params.getValue(), params.getArgumentValues(), params.getField(), params.getGraphQLUnionType(), params.getSchema()); |
| 198 | + GraphQLObjectType result = params.getGraphQLUnionType().getTypeResolver().getType(env); |
182 | 199 | if (result == null) { |
183 | | - throw new GraphQLException("could not determine type"); |
| 200 | + throw new GraphQLException("Could not determine the exact type of " + params.getGraphQLUnionType().getName()); |
184 | 201 | } |
185 | 202 | return result; |
186 | 203 | } |
@@ -230,10 +247,8 @@ protected GraphQLFieldDefinition getFieldDef(GraphQLSchema schema, GraphQLObject |
230 | 247 |
|
231 | 248 | GraphQLFieldDefinition fieldDefinition = parentType.getFieldDefinition(field.getName()); |
232 | 249 | if (fieldDefinition == null) { |
233 | | - throw new GraphQLException("unknown field " + field.getName()); |
| 250 | + throw new GraphQLException("Unknown field " + field.getName()); |
234 | 251 | } |
235 | 252 | return fieldDefinition; |
236 | 253 | } |
237 | | - |
238 | | - |
239 | 254 | } |
0 commit comments