44import com .google .common .collect .ImmutableMap ;
55import graphql .Assert ;
66import graphql .PublicApi ;
7+ import graphql .execution .directives .QueryDirectives ;
78import graphql .introspection .Introspection ;
89import graphql .language .Argument ;
910import graphql .language .ArrayValue ;
11+ import graphql .language .Directive ;
1012import graphql .language .Document ;
1113import graphql .language .Field ;
1214import graphql .language .InlineFragment ;
3032import java .util .LinkedHashMap ;
3133import java .util .List ;
3234import java .util .Map ;
35+ import java .util .stream .Collectors ;
3336
3437import static graphql .collect .ImmutableKit .emptyList ;
3538import static graphql .collect .ImmutableKit .map ;
@@ -96,10 +99,20 @@ public static CompilerResult compileToDocument(@NotNull GraphQLSchema schema,
9699 @ Nullable String operationName ,
97100 @ NotNull List <ExecutableNormalizedField > topLevelFields ,
98101 @ Nullable VariablePredicate variablePredicate ) {
102+ return compileToDocument (schema ,operationKind ,operationName ,topLevelFields ,Map .of (),variablePredicate );
103+ }
104+
105+
106+ public static CompilerResult compileToDocument (@ NotNull GraphQLSchema schema ,
107+ @ NotNull OperationDefinition .Operation operationKind ,
108+ @ Nullable String operationName ,
109+ @ NotNull List <ExecutableNormalizedField > topLevelFields ,
110+ @ NotNull Map <ExecutableNormalizedField , QueryDirectives > fieldToQueryDirectives ,
111+ @ Nullable VariablePredicate variablePredicate ) {
99112 GraphQLObjectType operationType = getOperationType (schema , operationKind );
100113
101114 VariableAccumulator variableAccumulator = new VariableAccumulator (variablePredicate );
102- List <Selection <?>> selections = subselectionsForNormalizedField (schema , operationType .getName (), topLevelFields , variableAccumulator );
115+ List <Selection <?>> selections = subselectionsForNormalizedField (schema , operationType .getName (), topLevelFields , fieldToQueryDirectives , variableAccumulator );
103116 SelectionSet selectionSet = new SelectionSet (selections );
104117
105118 OperationDefinition .Builder definitionBuilder = OperationDefinition .newOperationDefinition ()
@@ -120,6 +133,7 @@ public static CompilerResult compileToDocument(@NotNull GraphQLSchema schema,
120133 private static List <Selection <?>> subselectionsForNormalizedField (GraphQLSchema schema ,
121134 @ NotNull String parentOutputType ,
122135 List <ExecutableNormalizedField > executableNormalizedFields ,
136+ @ NotNull Map <ExecutableNormalizedField , QueryDirectives > normalizedFieldToQueryDirectives ,
123137 VariableAccumulator variableAccumulator ) {
124138 ImmutableList .Builder <Selection <?>> selections = ImmutableList .builder ();
125139
@@ -129,13 +143,13 @@ private static List<Selection<?>> subselectionsForNormalizedField(GraphQLSchema
129143
130144 for (ExecutableNormalizedField nf : executableNormalizedFields ) {
131145 if (nf .isConditional (schema )) {
132- selectionForNormalizedField (schema , nf , variableAccumulator )
146+ selectionForNormalizedField (schema , nf , normalizedFieldToQueryDirectives , variableAccumulator )
133147 .forEach ((objectTypeName , field ) ->
134148 fieldsByTypeCondition
135149 .computeIfAbsent (objectTypeName , ignored -> new ArrayList <>())
136150 .add (field ));
137151 } else {
138- selections .add (selectionForNormalizedField (schema , parentOutputType , nf , variableAccumulator ));
152+ selections .add (selectionForNormalizedField (schema , parentOutputType , nf , normalizedFieldToQueryDirectives , variableAccumulator ));
139153 }
140154 }
141155
@@ -156,11 +170,12 @@ private static List<Selection<?>> subselectionsForNormalizedField(GraphQLSchema
156170 */
157171 private static Map <String , Field > selectionForNormalizedField (GraphQLSchema schema ,
158172 ExecutableNormalizedField executableNormalizedField ,
173+ @ NotNull Map <ExecutableNormalizedField , QueryDirectives > normalizedFieldToQueryDirectives ,
159174 VariableAccumulator variableAccumulator ) {
160175 Map <String , Field > groupedFields = new LinkedHashMap <>();
161176
162177 for (String objectTypeName : executableNormalizedField .getObjectTypeNames ()) {
163- groupedFields .put (objectTypeName , selectionForNormalizedField (schema , objectTypeName , executableNormalizedField , variableAccumulator ));
178+ groupedFields .put (objectTypeName , selectionForNormalizedField (schema , objectTypeName , executableNormalizedField ,normalizedFieldToQueryDirectives , variableAccumulator ));
164179 }
165180
166181 return groupedFields ;
@@ -172,6 +187,7 @@ private static Map<String, Field> selectionForNormalizedField(GraphQLSchema sche
172187 private static Field selectionForNormalizedField (GraphQLSchema schema ,
173188 String objectTypeName ,
174189 ExecutableNormalizedField executableNormalizedField ,
190+ @ NotNull Map <ExecutableNormalizedField , QueryDirectives > normalizedFieldToQueryDirectives ,
175191 VariableAccumulator variableAccumulator ) {
176192 final List <Selection <?>> subSelections ;
177193 if (executableNormalizedField .getChildren ().isEmpty ()) {
@@ -184,19 +200,30 @@ private static Field selectionForNormalizedField(GraphQLSchema schema,
184200 schema ,
185201 fieldOutputType .getName (),
186202 executableNormalizedField .getChildren (),
203+ normalizedFieldToQueryDirectives ,
187204 variableAccumulator
188205 );
189206 }
190207
191208 SelectionSet selectionSet = selectionSetOrNullIfEmpty (subSelections );
192209 List <Argument > arguments = createArguments (executableNormalizedField , variableAccumulator );
193210
194- return newField ()
211+ QueryDirectives queryDirectives = normalizedFieldToQueryDirectives .get (executableNormalizedField );
212+
213+
214+ Field .Builder builder = newField ()
195215 .name (executableNormalizedField .getFieldName ())
196216 .alias (executableNormalizedField .getAlias ())
197217 .selectionSet (selectionSet )
198- .arguments (arguments )
199- .build ();
218+ .arguments (arguments );
219+ if (queryDirectives == null || queryDirectives .getImmediateAppliedDirectivesByField ().isEmpty () ){
220+ return builder .build ();
221+ }else {
222+ List <Directive > directives = queryDirectives .getImmediateAppliedDirectivesByField ().keySet ().stream ().flatMap (field -> field .getDirectives ().stream ()).collect (Collectors .toList ());
223+ return builder
224+ .directives (directives )
225+ .build ();
226+ }
200227 }
201228
202229 @ Nullable
0 commit comments