|
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