|
1 | 1 | package com.intuit.graphql.orchestrator.batch; |
2 | 2 |
|
3 | 3 | import static com.intuit.graphql.orchestrator.GraphQLOrchestrator.DATA_LOADER_REGISTRY_CONTEXT_KEY; |
| 4 | +import static com.intuit.graphql.orchestrator.resolverdirective.FieldResolverDirectiveUtil.FQN_FIELD_SEPARATOR; |
| 5 | +import static com.intuit.graphql.orchestrator.resolverdirective.FieldResolverDirectiveUtil.FQN_KEYWORD_QUERY; |
4 | 6 | import static com.intuit.graphql.orchestrator.resolverdirective.FieldResolverDirectiveUtil.createFieldResolverOperationName; |
5 | 7 | import static graphql.language.AstPrinter.printAstCompact; |
6 | 8 | import static graphql.schema.GraphQLTypeUtil.unwrapAll; |
@@ -70,7 +72,7 @@ public FieldResolverBatchLoader(FieldResolverContext fieldResolverContext) { |
70 | 72 | this.fieldResolverContext = fieldResolverContext; |
71 | 73 | ResolverDirectiveDefinition resolverDirectiveDefinition = fieldResolverContext.getResolverDirectiveDefinition(); |
72 | 74 |
|
73 | | - this.resolverSelectedFields = StringUtils.split(resolverDirectiveDefinition.getField(), '.'); |
| 75 | + this.resolverSelectedFields = StringUtils.split(resolverDirectiveDefinition.getField(), FQN_FIELD_SEPARATOR); |
74 | 76 | this.batchResultTransformer = new FieldResolverBatchResultTransformer(resolverSelectedFields, fieldResolverContext); |
75 | 77 | } |
76 | 78 |
|
@@ -118,25 +120,39 @@ private OperationDefinition removeExternalFields(OperationDefinition operationDe |
118 | 120 | } |
119 | 121 |
|
120 | 122 | private ServiceMetadata getServiceMetadata(DataFetchingEnvironment dataFetchingEnvironment) { |
121 | | - GraphQLCodeRegistry graphQLCodeRegistry = dataFetchingEnvironment.getGraphQLSchema().getCodeRegistry(); |
122 | | - GraphQLFieldDefinition graphQLFieldDefinition = dataFetchingEnvironment.getFieldDefinition(); |
| 123 | + GraphQLSchema graphQLSchema = dataFetchingEnvironment.getGraphQLSchema(); |
| 124 | + GraphQLCodeRegistry graphQLCodeRegistry = graphQLSchema.getCodeRegistry(); |
123 | 125 |
|
124 | | - FieldContext fieldContext = this.fieldResolverContext.getTargetFieldContext(); |
125 | | - FieldCoordinates fieldCoordinates = fieldContext.getFieldCoordinates(); |
| 126 | + int start = 0; |
| 127 | + if (FQN_KEYWORD_QUERY.equals(resolverSelectedFields[0])) { |
| 128 | + start = 1; |
| 129 | + } |
126 | 130 |
|
127 | | - DataFetcher<?> dataFetcher = graphQLCodeRegistry.getDataFetcher(fieldCoordinates, graphQLFieldDefinition); |
128 | | - if (Objects.nonNull(dataFetcher) && dataFetcher instanceof ServiceDataFetcher) { |
129 | | - ServiceDataFetcher serviceDataFetcher = (ServiceDataFetcher) dataFetcher; |
130 | | - return serviceDataFetcher.getServiceMetadata(); |
131 | | - } else { |
132 | | - throw FieldResolverGraphQLError.builder() |
133 | | - .errorMessage("ServiceDataFetcher not found.") |
134 | | - .fieldName(fieldCoordinates.getFieldName()) |
135 | | - .parentTypeName(fieldCoordinates.getTypeName()) |
136 | | - .resolverDirectiveDefinition(this.fieldResolverContext.getResolverDirectiveDefinition()) |
137 | | - .serviceNameSpace(fieldResolverContext.getServiceNamespace()) |
138 | | - .build(); |
| 131 | + GraphQLFieldsContainer currentParentType = graphQLSchema.getQueryType(); |
| 132 | + for (int i = start; i < resolverSelectedFields.length; i++) { |
| 133 | + String fieldName = resolverSelectedFields[i]; |
| 134 | + GraphQLFieldDefinition graphQLFieldDefinition = currentParentType.getFieldDefinition(fieldName); |
| 135 | + FieldCoordinates fieldCoordinates = FieldCoordinates.coordinates(currentParentType.getName(), fieldName); |
| 136 | + DataFetcher<?> dataFetcher = graphQLCodeRegistry.getDataFetcher(fieldCoordinates, graphQLFieldDefinition); |
| 137 | + if (Objects.nonNull(dataFetcher) && dataFetcher instanceof ServiceDataFetcher) { |
| 138 | + ServiceDataFetcher serviceDataFetcher = (ServiceDataFetcher) dataFetcher; |
| 139 | + return serviceDataFetcher.getServiceMetadata(); |
| 140 | + } |
| 141 | + if (!(graphQLFieldDefinition.getType() instanceof GraphQLFieldsContainer)) { |
| 142 | + break; |
| 143 | + } |
| 144 | + currentParentType = (GraphQLFieldsContainer) graphQLFieldDefinition.getType(); |
139 | 145 | } |
| 146 | + |
| 147 | + FieldContext fieldContext = this.fieldResolverContext.getTargetFieldContext(); |
| 148 | + FieldCoordinates fieldCoordinates = fieldContext.getFieldCoordinates(); |
| 149 | + throw FieldResolverGraphQLError.builder() |
| 150 | + .errorMessage("Service DataFetcher not found.") |
| 151 | + .fieldName(fieldCoordinates.getFieldName()) |
| 152 | + .parentTypeName(fieldCoordinates.getTypeName()) |
| 153 | + .resolverDirectiveDefinition(this.fieldResolverContext.getResolverDirectiveDefinition()) |
| 154 | + .serviceNameSpace(fieldResolverContext.getServiceNamespace()) |
| 155 | + .build(); |
140 | 156 | } |
141 | 157 |
|
142 | 158 | private List<Definition<FragmentDefinition>> createResolverQueryFragmentDefinitions(DataFetchingEnvironment dataFetchingEnvironment) { |
|
0 commit comments