Skip to content

Commit 80b4fe9

Browse files
committed
ExecutionContext is not longer API but there is a replacement
1 parent 5d487ea commit 80b4fe9

12 files changed

+206
-64
lines changed

src/main/java/graphql/execution/ConditionalNodes.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,18 @@ public ConditionalNodes() {
1717
valuesResolver = new ValuesResolver();
1818
}
1919

20-
public boolean shouldInclude(ExecutionContext executionContext, List<Directive> directives) {
20+
public boolean shouldInclude(Map<String, Object> variables, List<Directive> directives) {
2121

2222
Directive skipDirective = findDirective(directives, SkipDirective.getName());
2323
if (skipDirective != null) {
24-
Map<String, Object> argumentValues = valuesResolver.getArgumentValues(SkipDirective.getArguments(), skipDirective.getArguments(), executionContext.getVariables());
24+
Map<String, Object> argumentValues = valuesResolver.getArgumentValues(SkipDirective.getArguments(), skipDirective.getArguments(), variables);
2525
return !(Boolean) argumentValues.get("if");
2626
}
2727

2828

2929
Directive includeDirective = findDirective(directives, IncludeDirective.getName());
3030
if (includeDirective != null) {
31-
Map<String, Object> argumentValues = valuesResolver.getArgumentValues(IncludeDirective.getArguments(), includeDirective.getArguments(), executionContext.getVariables());
31+
Map<String, Object> argumentValues = valuesResolver.getArgumentValues(IncludeDirective.getArguments(), includeDirective.getArguments(), variables);
3232
return (Boolean) argumentValues.get("if");
3333
}
3434

src/main/java/graphql/execution/Execution.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,12 @@
1414
import graphql.schema.GraphQLObjectType;
1515
import graphql.schema.GraphQLSchema;
1616

17-
import java.util.ArrayList;
1817
import java.util.Collections;
19-
import java.util.LinkedHashMap;
2018
import java.util.List;
2119
import java.util.Map;
2220

2321
import static graphql.execution.ExecutionParameters.newParameters;
2422
import static graphql.execution.TypeInfo.newTypeInfo;
25-
2623
import static graphql.language.OperationDefinition.Operation.MUTATION;
2724
import static graphql.language.OperationDefinition.Operation.QUERY;
2825

@@ -78,7 +75,12 @@ private ExecutionResult executeOperation(
7875
return new ExecutionResultImpl(Collections.singletonList(new MutationNotSupportedError()));
7976
}
8077

81-
Map<String, List<Field>> fields = fieldCollector.collectFields(executionContext,operationRootType,operationDefinition.getSelectionSet());
78+
FieldCollectorParameters collectorParameters = FieldCollectorParameters.newParameters(executionContext.getGraphQLSchema(), operationRootType)
79+
.fragments(executionContext.getFragmentsByName())
80+
.variables(executionContext.getVariables())
81+
.build();
82+
83+
Map<String, List<Field>> fields = fieldCollector.collectFields(collectorParameters, operationDefinition.getSelectionSet());
8284

8385
ExecutionParameters parameters = newParameters()
8486
.typeInfo(newTypeInfo().type(operationRootType))

src/main/java/graphql/execution/ExecutionStrategy.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@
2525

2626
import java.util.ArrayList;
2727
import java.util.Arrays;
28-
import java.util.LinkedHashMap;
2928
import java.util.List;
3029
import java.util.Map;
3130

31+
import static graphql.execution.FieldCollectorParameters.newParameters;
3232
import static graphql.execution.TypeInfo.newTypeInfo;
3333
import static graphql.introspection.Introspection.SchemaMetaFieldDef;
3434
import static graphql.introspection.Introspection.TypeMetaFieldDef;
@@ -70,10 +70,14 @@ protected ExecutionResult resolveField(ExecutionContext executionContext, Execut
7070
DataFetchingEnvironment environment = new DataFetchingEnvironmentImpl(
7171
parameters.source(),
7272
argumentValues,
73+
executionContext.getRoot(),
7374
fields,
7475
fieldDef.getType(),
7576
type,
76-
executionContext
77+
executionContext.getGraphQLSchema(),
78+
executionContext.getFragmentsByName(),
79+
executionContext.getExecutionId(),
80+
executionContext.getVariables()
7781
);
7882

7983
Instrumentation instrumentation = executionContext.getInstrumentation();
@@ -140,7 +144,12 @@ protected ExecutionResult completeValue(ExecutionContext executionContext, Execu
140144
resolvedType = (GraphQLObjectType) fieldType;
141145
}
142146

143-
Map<String, List<Field>> subFields = fieldCollector.collectFields(executionContext,resolvedType,fields);
147+
FieldCollectorParameters collectorParameters = newParameters(executionContext.getGraphQLSchema(), resolvedType)
148+
.fragments(executionContext.getFragmentsByName())
149+
.variables(executionContext.getVariables())
150+
.build();
151+
152+
Map<String, List<Field>> subFields = fieldCollector.collectFields(collectorParameters, fields);
144153

145154
ExecutionParameters newParameters = ExecutionParameters.newParameters()
146155
.typeInfo(typeInfo.asType(resolvedType))

src/main/java/graphql/execution/FieldCollector.java

Lines changed: 33 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -38,83 +38,81 @@ public FieldCollector() {
3838
/**
3939
* Given a list of fields this will collect the sub-field selections and return it as a map
4040
*
41-
* @param executionContext the {@link ExecutionContext} in play
42-
* @param objectType the graphql object type in context
43-
* @param fields the list of fields to collect for
41+
* @param parameters the parameters to this method
42+
* @param fields the list of fields to collect for
4443
*
4544
* @return a map of the sub field selections
4645
*/
47-
public Map<String, List<Field>> collectFields(ExecutionContext executionContext, GraphQLObjectType objectType, List<Field> fields) {
46+
public Map<String, List<Field>> collectFields(FieldCollectorParameters parameters, List<Field> fields) {
4847
Map<String, List<Field>> subFields = new LinkedHashMap<>();
4948
List<String> visitedFragments = new ArrayList<>();
5049
for (Field field : fields) {
5150
if (field.getSelectionSet() == null) {
5251
continue;
5352
}
54-
this.collectFields(executionContext, objectType, field.getSelectionSet(), visitedFragments, subFields);
53+
this.collectFields(parameters, field.getSelectionSet(), visitedFragments, subFields);
5554
}
5655
return subFields;
5756
}
5857

5958
/**
6059
* Given a selection set this will collect the sub-field selections and return it as a map
6160
*
62-
* @param executionContext the {@link ExecutionContext} in play
63-
* @param objectType the graphql object type in context
64-
* @param selectionSet the selection set to collect on
61+
* @param parameters the parameters to this method
62+
* @param selectionSet the selection set to collect on
6563
*
6664
* @return a map of the sub field selections
6765
*/
68-
public Map<String, List<Field>> collectFields(ExecutionContext executionContext, GraphQLObjectType objectType, SelectionSet selectionSet) {
66+
public Map<String, List<Field>> collectFields(FieldCollectorParameters parameters, SelectionSet selectionSet) {
6967
Map<String, List<Field>> subFields = new LinkedHashMap<>();
7068
List<String> visitedFragments = new ArrayList<>();
71-
this.collectFields(executionContext, objectType, selectionSet, visitedFragments, subFields);
69+
this.collectFields(parameters, selectionSet, visitedFragments, subFields);
7270
return subFields;
7371
}
7472

7573

76-
private void collectFields(ExecutionContext executionContext, GraphQLObjectType type, SelectionSet selectionSet, List<String> visitedFragments, Map<String, List<Field>> fields) {
74+
private void collectFields(FieldCollectorParameters parameters, SelectionSet selectionSet, List<String> visitedFragments, Map<String, List<Field>> fields) {
7775

7876
for (Selection selection : selectionSet.getSelections()) {
7977
if (selection instanceof Field) {
80-
collectField(executionContext, fields, (Field) selection);
78+
collectField(parameters, fields, (Field) selection);
8179
} else if (selection instanceof InlineFragment) {
82-
collectInlineFragment(executionContext, type, visitedFragments, fields, (InlineFragment) selection);
80+
collectInlineFragment(parameters, visitedFragments, fields, (InlineFragment) selection);
8381
} else if (selection instanceof FragmentSpread) {
84-
collectFragmentSpread(executionContext, type, visitedFragments, fields, (FragmentSpread) selection);
82+
collectFragmentSpread(parameters, visitedFragments, fields, (FragmentSpread) selection);
8583
}
8684
}
8785
}
8886

89-
private void collectFragmentSpread(ExecutionContext executionContext, GraphQLObjectType type, List<String> visitedFragments, Map<String, List<Field>> fields, FragmentSpread fragmentSpread) {
87+
private void collectFragmentSpread(FieldCollectorParameters parameters, List<String> visitedFragments, Map<String, List<Field>> fields, FragmentSpread fragmentSpread) {
9088
if (visitedFragments.contains(fragmentSpread.getName())) {
9189
return;
9290
}
93-
if (!conditionalNodes.shouldInclude(executionContext, fragmentSpread.getDirectives())) {
91+
if (!conditionalNodes.shouldInclude(parameters.getVariables(), fragmentSpread.getDirectives())) {
9492
return;
9593
}
9694
visitedFragments.add(fragmentSpread.getName());
97-
FragmentDefinition fragmentDefinition = executionContext.getFragment(fragmentSpread.getName());
95+
FragmentDefinition fragmentDefinition = parameters.getFragmentsByName().get(fragmentSpread.getName());
9896

99-
if (!conditionalNodes.shouldInclude(executionContext, fragmentDefinition.getDirectives())) {
97+
if (!conditionalNodes.shouldInclude(parameters.getVariables(), fragmentDefinition.getDirectives())) {
10098
return;
10199
}
102-
if (!doesFragmentConditionMatch(executionContext, fragmentDefinition, type)) {
100+
if (!doesFragmentConditionMatch(parameters, fragmentDefinition)) {
103101
return;
104102
}
105-
collectFields(executionContext, type, fragmentDefinition.getSelectionSet(), visitedFragments, fields);
103+
collectFields(parameters, fragmentDefinition.getSelectionSet(), visitedFragments, fields);
106104
}
107105

108-
private void collectInlineFragment(ExecutionContext executionContext, GraphQLObjectType type, List<String> visitedFragments, Map<String, List<Field>> fields, InlineFragment inlineFragment) {
109-
if (!conditionalNodes.shouldInclude(executionContext, inlineFragment.getDirectives()) ||
110-
!doesFragmentConditionMatch(executionContext, inlineFragment, type)) {
106+
private void collectInlineFragment(FieldCollectorParameters parameters, List<String> visitedFragments, Map<String, List<Field>> fields, InlineFragment inlineFragment) {
107+
if (!conditionalNodes.shouldInclude(parameters.getVariables(), inlineFragment.getDirectives()) ||
108+
!doesFragmentConditionMatch(parameters, inlineFragment)) {
111109
return;
112110
}
113-
collectFields(executionContext, type, inlineFragment.getSelectionSet(), visitedFragments, fields);
111+
collectFields(parameters, inlineFragment.getSelectionSet(), visitedFragments, fields);
114112
}
115113

116-
private void collectField(ExecutionContext executionContext, Map<String, List<Field>> fields, Field field) {
117-
if (!conditionalNodes.shouldInclude(executionContext, field.getDirectives())) {
114+
private void collectField(FieldCollectorParameters parameters, Map<String, List<Field>> fields, Field field) {
115+
if (!conditionalNodes.shouldInclude(parameters.getVariables(), field.getDirectives())) {
118116
return;
119117
}
120118
String name = getFieldEntryKey(field);
@@ -130,28 +128,29 @@ private String getFieldEntryKey(Field field) {
130128
}
131129

132130

133-
private boolean doesFragmentConditionMatch(ExecutionContext executionContext, InlineFragment inlineFragment, GraphQLObjectType type) {
131+
private boolean doesFragmentConditionMatch(FieldCollectorParameters parameters, InlineFragment inlineFragment) {
134132
if (inlineFragment.getTypeCondition() == null) {
135133
return true;
136134
}
137135
GraphQLType conditionType;
138-
conditionType = getTypeFromAST(executionContext.getGraphQLSchema(), inlineFragment.getTypeCondition());
139-
return checkTypeCondition(executionContext, type, conditionType);
136+
conditionType = getTypeFromAST(parameters.getGraphQLSchema(), inlineFragment.getTypeCondition());
137+
return checkTypeCondition(parameters, conditionType);
140138
}
141139

142-
private boolean doesFragmentConditionMatch(ExecutionContext executionContext, FragmentDefinition fragmentDefinition, GraphQLObjectType type) {
140+
private boolean doesFragmentConditionMatch(FieldCollectorParameters parameters, FragmentDefinition fragmentDefinition) {
143141
GraphQLType conditionType;
144-
conditionType = getTypeFromAST(executionContext.getGraphQLSchema(), fragmentDefinition.getTypeCondition());
145-
return checkTypeCondition(executionContext, type, conditionType);
142+
conditionType = getTypeFromAST(parameters.getGraphQLSchema(), fragmentDefinition.getTypeCondition());
143+
return checkTypeCondition(parameters, conditionType);
146144
}
147145

148-
private boolean checkTypeCondition(ExecutionContext executionContext, GraphQLObjectType type, GraphQLType conditionType) {
146+
private boolean checkTypeCondition(FieldCollectorParameters parameters, GraphQLType conditionType) {
147+
GraphQLObjectType type = parameters.getObjectType();
149148
if (conditionType.equals(type)) {
150149
return true;
151150
}
152151

153152
if (conditionType instanceof GraphQLInterfaceType) {
154-
List<GraphQLObjectType> implementations = schemaUtil.findImplementations(executionContext.getGraphQLSchema(), (GraphQLInterfaceType) conditionType);
153+
List<GraphQLObjectType> implementations = schemaUtil.findImplementations(parameters.getGraphQLSchema(), (GraphQLInterfaceType) conditionType);
155154
return implementations.contains(type);
156155
} else if (conditionType instanceof GraphQLUnionType) {
157156
return ((GraphQLUnionType) conditionType).getTypes().contains(type);
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package graphql.execution;
2+
3+
import graphql.Assert;
4+
import graphql.language.FragmentDefinition;
5+
import graphql.schema.GraphQLObjectType;
6+
import graphql.schema.GraphQLSchema;
7+
8+
import java.util.LinkedHashMap;
9+
import java.util.Map;
10+
11+
public class FieldCollectorParameters {
12+
private final GraphQLSchema graphQLSchema;
13+
private final Map<String, FragmentDefinition> fragmentsByName;
14+
private final Map<String, Object> variables;
15+
private final GraphQLObjectType objectType;
16+
17+
public GraphQLSchema getGraphQLSchema() {
18+
return graphQLSchema;
19+
}
20+
21+
public Map<String, FragmentDefinition> getFragmentsByName() {
22+
return fragmentsByName;
23+
}
24+
25+
public Map<String, Object> getVariables() {
26+
return variables;
27+
}
28+
29+
public GraphQLObjectType getObjectType() {
30+
return objectType;
31+
}
32+
33+
private FieldCollectorParameters(GraphQLSchema graphQLSchema, Map<String, Object> variables, Map<String, FragmentDefinition> fragmentsByName, GraphQLObjectType objectType) {
34+
this.fragmentsByName = fragmentsByName;
35+
this.graphQLSchema = graphQLSchema;
36+
this.variables = variables;
37+
this.objectType = objectType;
38+
}
39+
40+
public static Builder newParameters(GraphQLSchema graphQLSchema, GraphQLObjectType objectType) {
41+
Assert.assertNotNull(graphQLSchema, "You must provide a schema");
42+
Assert.assertNotNull(objectType, "You must provide an object type");
43+
return new Builder().schema(graphQLSchema).objectType(objectType);
44+
}
45+
46+
public static class Builder {
47+
private GraphQLSchema graphQLSchema;
48+
private Map<String, FragmentDefinition> fragmentsByName = new LinkedHashMap<>();
49+
private Map<String, Object> variables = new LinkedHashMap<>();
50+
private GraphQLObjectType objectType;
51+
52+
public Builder schema(GraphQLSchema graphQLSchema) {
53+
this.graphQLSchema = graphQLSchema;
54+
return this;
55+
}
56+
57+
public Builder objectType(GraphQLObjectType objectType) {
58+
this.objectType = objectType;
59+
return this;
60+
}
61+
62+
public Builder fragments(Map<String, FragmentDefinition> fragmentsByName) {
63+
this.fragmentsByName.putAll(fragmentsByName);
64+
return this;
65+
}
66+
67+
public Builder variables(Map<String, Object> variables) {
68+
this.variables.putAll(variables);
69+
return this;
70+
}
71+
72+
public FieldCollectorParameters build() {
73+
return new FieldCollectorParameters(graphQLSchema, variables, fragmentsByName, objectType);
74+
}
75+
76+
}
77+
}

src/main/java/graphql/execution/batched/BatchedExecutionStrategy.java

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,33 @@
66
import graphql.execution.ExecutionContext;
77
import graphql.execution.ExecutionParameters;
88
import graphql.execution.ExecutionStrategy;
9+
import graphql.execution.FieldCollectorParameters;
910
import graphql.language.Field;
10-
import graphql.schema.*;
11+
import graphql.schema.DataFetcher;
12+
import graphql.schema.DataFetchingEnvironment;
13+
import graphql.schema.DataFetchingEnvironmentImpl;
14+
import graphql.schema.GraphQLEnumType;
15+
import graphql.schema.GraphQLFieldDefinition;
16+
import graphql.schema.GraphQLInterfaceType;
17+
import graphql.schema.GraphQLList;
18+
import graphql.schema.GraphQLNonNull;
19+
import graphql.schema.GraphQLObjectType;
20+
import graphql.schema.GraphQLOutputType;
21+
import graphql.schema.GraphQLScalarType;
22+
import graphql.schema.GraphQLType;
23+
import graphql.schema.GraphQLUnionType;
1124
import org.slf4j.Logger;
1225
import org.slf4j.LoggerFactory;
1326

14-
import java.util.*;
27+
import java.util.ArrayDeque;
28+
import java.util.ArrayList;
29+
import java.util.Collections;
30+
import java.util.LinkedHashMap;
31+
import java.util.List;
32+
import java.util.Map;
33+
import java.util.Queue;
1534

35+
import static graphql.execution.FieldCollectorParameters.newParameters;
1636
import static java.util.Collections.singletonList;
1737

1838
/**
@@ -187,7 +207,12 @@ private boolean isNonNull(GraphQLType fieldType) {
187207
private Map<String, List<Field>> getChildFields(ExecutionContext executionContext, GraphQLObjectType resolvedType,
188208
List<Field> fields) {
189209

190-
return fieldCollector.collectFields(executionContext,resolvedType,fields);
210+
FieldCollectorParameters collectorParameters = newParameters(executionContext.getGraphQLSchema(), resolvedType)
211+
.fragments(executionContext.getFragmentsByName())
212+
.variables(executionContext.getVariables())
213+
.build();
214+
215+
return fieldCollector.collectFields(collectorParameters, fields);
191216
}
192217

193218
private GraphQLObjectType getGraphQLObjectType(GraphQLType fieldType, Object value) {
@@ -249,10 +274,14 @@ private List<GraphQLExecutionNodeValue> fetchData(ExecutionContext executionCont
249274
DataFetchingEnvironment environment = new DataFetchingEnvironmentImpl(
250275
sources,
251276
argumentValues,
277+
executionContext.getRoot(),
252278
fields,
253279
fieldDef.getType(),
254280
parentType,
255-
executionContext
281+
executionContext.getGraphQLSchema(),
282+
executionContext.getFragmentsByName(),
283+
executionContext.getExecutionId(),
284+
executionContext.getVariables()
256285
);
257286

258287
List<Object> values;

src/main/java/graphql/execution/batched/UnbatchedDataFetcher.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,14 @@ public Object get(DataFetchingEnvironment environment) {
3131
DataFetchingEnvironment singleEnv = new DataFetchingEnvironmentImpl(
3232
source,
3333
environment.getArguments(),
34+
environment.getContext(),
3435
environment.getFields(),
3536
environment.getFieldType(),
3637
environment.getParentType(),
37-
environment.getExecutionContext());
38+
environment.getGraphQLSchema(),
39+
environment.getFragmentsByName(),
40+
environment.getExecutionId(),
41+
environment.getVariables());
3842
results.add(delegate.get(singleEnv));
3943
}
4044
return results;

0 commit comments

Comments
 (0)