14
14
import com .intuit .graphql .orchestrator .schema .ServiceMetadata ;
15
15
import graphql .GraphQLContext ;
16
16
import graphql .execution .DataFetcherResult ;
17
+ import graphql .execution .MergedField ;
17
18
import graphql .introspection .Introspection ;
18
19
import graphql .language .Field ;
19
20
import graphql .language .InlineFragment ;
@@ -58,9 +59,7 @@ public CompletionStage<List<DataFetcherResult<Object>>> load(List<DataFetchingEn
58
59
GraphQLContext graphQLContext = dfeTemplate .getContext ();
59
60
60
61
List <Map <String , Object >> representations = dataFetchingEnvironments .stream ()
61
- //.map(DataFetchingEnvironment::getSource)
62
- .map (dataFetchingEnvironment -> getSource (dataFetchingEnvironment ))
63
- .map (source -> createRepresentation ((Map <String , Object >) source ))
62
+ .map (dataFetchingEnvironment -> createRepresentation (dataFetchingEnvironment ))
64
63
.collect (Collectors .toList ());
65
64
66
65
List <InlineFragment > inlineFragments = new ArrayList <>();
@@ -78,12 +77,6 @@ public CompletionStage<List<DataFetcherResult<Object>>> load(List<DataFetchingEn
78
77
.thenApply (result -> batchResultTransformer .toBatchResult (result , dataFetchingEnvironments ));
79
78
}
80
79
81
- private Map <String , Object > getSource (DataFetchingEnvironment dataFetchingEnvironment ) {
82
- // TODO
83
- // return a POJO with source, and metadata about alias mapping.
84
- return dataFetchingEnvironment .getSource ();
85
- }
86
-
87
80
private List <String > generateRepresentationTemplate (FederationMetadata .EntityExtensionMetadata metadata , String fieldName ) {
88
81
List <String > representationFields = new ArrayList <>();
89
82
@@ -140,20 +133,43 @@ private InlineFragment createEntityRequestInlineFragment(DataFetchingEnvironment
140
133
newField ()
141
134
.selectionSet (fieldSelectionSet )
142
135
.name (originalField .getName ())
136
+ .alias (originalField .getAlias ())
143
137
.build ())
144
138
.build ());
145
139
return inlineFragmentBuilder .build ();
146
140
}
147
141
148
142
private Map <String , Object > createRepresentation (
149
- Map < String , Object > dataSource
143
+ DataFetchingEnvironment dataFetchingEnvironment
150
144
){
145
+ Map <String , Object > dataSource = dataFetchingEnvironment .getSource ();
146
+ Map <String , String > fieldToAliasMap = buildFieldToAliasMap (dataFetchingEnvironment );
147
+
151
148
Map <String , Object > entityRepresentation = new HashMap <>();
152
149
entityRepresentation .put (Introspection .TypeNameMetaFieldDef .getName (), this .entityTypeName );
153
150
154
151
this .representationFieldTemplate
155
- .forEach (fieldName -> entityRepresentation .put (fieldName , dataSource .get (fieldName )));
152
+ .forEach (fieldName -> {
153
+ String dataSourceKey = fieldToAliasMap .get (fieldName );
154
+ entityRepresentation .put (fieldName , dataSource .get (dataSourceKey ));
155
+ });
156
156
157
157
return entityRepresentation ;
158
158
}
159
+
160
+ /**
161
+ * builds mapping of fieldName-alias. If fieldName has no alias, it will be mapped to itself.
162
+ *
163
+ * @param dataFetchingEnvironment
164
+ * @return
165
+ */
166
+ private Map <String , String > buildFieldToAliasMap (DataFetchingEnvironment dataFetchingEnvironment ) {
167
+ MergedField parentField = dataFetchingEnvironment .getExecutionStepInfo ().getParent ().getField ();
168
+ return parentField .getSingleField ().getSelectionSet ().getSelections ()
169
+ .stream ()
170
+ .filter (selection -> selection instanceof Field )
171
+ .map (selection -> (Field ) selection )
172
+ .filter (field -> this .representationFieldTemplate .contains (field .getName ()))
173
+ .collect (Collectors .toMap (field -> field .getName (), field -> field .getAlias () == null ? field .getName () : field .getAlias ()));
174
+ }
159
175
}
0 commit comments