|
12 | 12 | import com.intuit.graphql.orchestrator.federation.metadata.FederationMetadata;
|
13 | 13 | import com.intuit.graphql.orchestrator.federation.metadata.KeyDirectiveMetadata;
|
14 | 14 | import com.intuit.graphql.orchestrator.schema.ServiceMetadata;
|
| 15 | +import com.intuit.graphql.orchestrator.utils.SelectionCollector; |
15 | 16 | import graphql.GraphQLContext;
|
16 | 17 | import graphql.execution.DataFetcherResult;
|
| 18 | +import graphql.execution.MergedField; |
17 | 19 | import graphql.introspection.Introspection;
|
18 | 20 | import graphql.language.Field;
|
19 | 21 | import graphql.language.InlineFragment;
|
|
27 | 29 | import java.util.HashMap;
|
28 | 30 | import java.util.List;
|
29 | 31 | import java.util.Map;
|
| 32 | +import java.util.Objects; |
30 | 33 | import java.util.concurrent.CompletionStage;
|
31 | 34 | import java.util.stream.Collectors;
|
32 | 35 | import org.apache.commons.collections4.CollectionUtils;
|
@@ -58,8 +61,7 @@ public CompletionStage<List<DataFetcherResult<Object>>> load(List<DataFetchingEn
|
58 | 61 | GraphQLContext graphQLContext = dfeTemplate.getContext();
|
59 | 62 |
|
60 | 63 | List<Map<String, Object>> representations = dataFetchingEnvironments.stream()
|
61 |
| - .map(DataFetchingEnvironment::getSource) |
62 |
| - .map(source -> createRepresentation((Map<String, Object>) source)) |
| 64 | + .map(this::createRepresentation) |
63 | 65 | .collect(Collectors.toList());
|
64 | 66 |
|
65 | 67 | List<InlineFragment> inlineFragments = new ArrayList<>();
|
@@ -96,6 +98,7 @@ private List<String> generateRepresentationTemplate(FederationMetadata.EntityExt
|
96 | 98 | .build();
|
97 | 99 | }
|
98 | 100 |
|
| 101 | + |
99 | 102 | if(CollectionUtils.isNotEmpty(metadata.getRequiredFields(fieldName))) {
|
100 | 103 | metadata.getRequiredFields(fieldName)
|
101 | 104 | .stream()
|
@@ -133,20 +136,44 @@ private InlineFragment createEntityRequestInlineFragment(DataFetchingEnvironment
|
133 | 136 | newField()
|
134 | 137 | .selectionSet(fieldSelectionSet)
|
135 | 138 | .name(originalField.getName())
|
| 139 | + .alias(originalField.getAlias()) |
136 | 140 | .build())
|
137 | 141 | .build());
|
138 | 142 | return inlineFragmentBuilder.build();
|
139 | 143 | }
|
140 | 144 |
|
141 | 145 | private Map<String, Object> createRepresentation(
|
142 |
| - Map<String, Object> dataSource |
| 146 | + DataFetchingEnvironment dataFetchingEnvironment |
143 | 147 | ){
|
| 148 | + Map<String, Object> dataSource = dataFetchingEnvironment.getSource(); |
| 149 | + Map<String, String> keyToAliasMap = buildkeyToAliasMap(dataFetchingEnvironment); |
| 150 | + |
144 | 151 | Map<String, Object> entityRepresentation = new HashMap<>();
|
145 | 152 | entityRepresentation.put(Introspection.TypeNameMetaFieldDef.getName(), this.entityTypeName);
|
146 | 153 |
|
147 | 154 | this.representationFieldTemplate
|
148 |
| - .forEach(fieldName -> entityRepresentation.put(fieldName, dataSource.get(fieldName))); |
| 155 | + .forEach(fieldName -> { |
| 156 | + String keyAlias = keyToAliasMap.get(fieldName); |
| 157 | + String dataSourceKey = keyAlias != null ? keyAlias : fieldName; |
| 158 | + Object value = Objects.requireNonNull(dataSource.get(dataSourceKey), "Entity Fetch failed. Key " + dataSourceKey + " not found in source"); |
| 159 | + entityRepresentation.put(fieldName, value); |
| 160 | + }); |
149 | 161 |
|
150 | 162 | return entityRepresentation;
|
151 | 163 | }
|
| 164 | + |
| 165 | + /** |
| 166 | + * builds mapping of fieldName-alias. If fieldName has no alias, it will be mapped to itself. |
| 167 | + */ |
| 168 | + private Map<String, String> buildkeyToAliasMap(DataFetchingEnvironment dataFetchingEnvironment) { |
| 169 | + MergedField parentField = dataFetchingEnvironment.getExecutionStepInfo().getParent().getField(); |
| 170 | + |
| 171 | + SelectionCollector selectionCollector = new SelectionCollector(dataFetchingEnvironment.getFragmentsByName()); |
| 172 | + return selectionCollector.collectFields(parentField.getSingleField().getSelectionSet()) |
| 173 | + .values() |
| 174 | + .stream() |
| 175 | + .filter(field -> this.representationFieldTemplate.contains(field.getName())) |
| 176 | + .collect(Collectors.toMap(Field::getName, field -> field.getAlias() == null? field.getName() : field.getAlias())); |
| 177 | + } |
| 178 | + |
152 | 179 | }
|
0 commit comments