Skip to content

Commit 89e741d

Browse files
Move gate mechanism from ExecutionInput to GraphQLContext
1 parent 4db2122 commit 89e741d

File tree

10 files changed

+48
-64
lines changed

10 files changed

+48
-64
lines changed

src/main/java/graphql/ExecutionInput.java

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ public class ExecutionInput {
2929
private final DataLoaderRegistry dataLoaderRegistry;
3030
private final ExecutionId executionId;
3131
private final Locale locale;
32-
private final boolean incrementalSupport;
3332

3433

3534
@Internal
@@ -45,7 +44,6 @@ private ExecutionInput(Builder builder) {
4544
this.locale = builder.locale != null ? builder.locale : Locale.getDefault(); // always have a locale in place
4645
this.localContext = builder.localContext;
4746
this.extensions = builder.extensions;
48-
this.incrementalSupport = builder.incrementalSupport;
4947
}
5048

5149
/**
@@ -141,16 +139,6 @@ public Map<String, Object> getExtensions() {
141139
return extensions;
142140
}
143141

144-
/**
145-
* @return whether the execution has support for incremental delivery of data, via the @defer and @stream directives.
146-
*
147-
* This is currently an experimental feature, and only @defer is supported.
148-
*/
149-
@ExperimentalApi
150-
public boolean isIncrementalSupport() {
151-
return incrementalSupport;
152-
}
153-
154142
/**
155143
* This helps you transform the current ExecutionInput object into another one by starting a builder with all
156144
* the current values and allows you to transform it how you want.
@@ -171,8 +159,7 @@ public ExecutionInput transform(Consumer<Builder> builderConsumer) {
171159
.variables(this.rawVariables.toMap())
172160
.extensions(this.extensions)
173161
.executionId(this.executionId)
174-
.locale(this.locale)
175-
.incrementalSupport(this.incrementalSupport);
162+
.locale(this.locale);
176163

177164
builderConsumer.accept(builder);
178165

@@ -229,7 +216,6 @@ public static class Builder {
229216
private DataLoaderRegistry dataLoaderRegistry = DataLoaderDispatcherInstrumentationState.EMPTY_DATALOADER_REGISTRY;
230217
private Locale locale = Locale.getDefault();
231218
private ExecutionId executionId;
232-
public boolean incrementalSupport = false;
233219

234220
public Builder query(String query) {
235221
this.query = assertNotNull(query, () -> "query can't be null");
@@ -393,19 +379,6 @@ public Builder dataLoaderRegistry(DataLoaderRegistry dataLoaderRegistry) {
393379
return this;
394380
}
395381

396-
/**
397-
* @param incrementalSupport whether the execution has support for incremental delivery of data, via the @defer and @stream directives.
398-
* <p>
399-
* This is currently an experimental feature, and only @defer is supported.
400-
*
401-
* @return this builder
402-
*/
403-
@ExperimentalApi
404-
public Builder incrementalSupport(boolean incrementalSupport) {
405-
this.incrementalSupport = incrementalSupport;
406-
return this;
407-
}
408-
409382
public ExecutionInput build() {
410383
return new ExecutionInput(this);
411384
}

src/main/java/graphql/GraphQLContext.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ public class GraphQLContext {
4242

4343
private final ConcurrentMap<Object, Object> map;
4444

45+
/**
46+
* The key that should be associated with a boolean value which indicates whether @defer and @stream behaviour is enabled for this execution.
47+
*/
48+
@ExperimentalApi
49+
public static final String ENABLE_INCREMENTAL_SUPPORT = "ENABLE_INCREMENTAL_SUPPORT";
50+
4551
private GraphQLContext(ConcurrentMap<Object, Object> map) {
4652
this.map = map;
4753
}

src/main/java/graphql/execution/AsyncExecutionStrategy.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44
import com.google.common.collect.ImmutableListMultimap;
55
import com.google.common.collect.ImmutableSet;
66
import graphql.ExecutionResult;
7+
import graphql.GraphQLContext;
78
import graphql.PublicApi;
89
import graphql.execution.incremental.DeferredCall;
910
import graphql.execution.incremental.DeferredCallContext;
10-
import graphql.execution.incremental.IncrementalCall;
1111
import graphql.execution.incremental.DeferredExecution;
12+
import graphql.execution.incremental.IncrementalCall;
1213
import graphql.execution.instrumentation.ExecutionStrategyInstrumentationContext;
1314
import graphql.execution.instrumentation.Instrumentation;
1415
import graphql.execution.instrumentation.InstrumentationContext;
@@ -22,6 +23,7 @@
2223
import java.util.LinkedHashMap;
2324
import java.util.List;
2425
import java.util.Map;
26+
import java.util.Optional;
2527
import java.util.Set;
2628
import java.util.concurrent.CompletableFuture;
2729
import java.util.function.BiConsumer;
@@ -64,7 +66,10 @@ public CompletableFuture<ExecutionResult> execute(ExecutionContext executionCont
6466
MergedSelectionSet fields = parameters.getFields();
6567
List<String> fieldNames = fields.getKeys();
6668

67-
DeferredExecutionSupport deferredExecutionSupport = executionContext.isIncrementalSupport() ?
69+
DeferredExecutionSupport deferredExecutionSupport =
70+
Optional.ofNullable(executionContext.getGraphQLContext())
71+
.map(graphqlContext -> (Boolean) graphqlContext.get(GraphQLContext.ENABLE_INCREMENTAL_SUPPORT))
72+
.orElse(false) ?
6873
new DeferredExecutionSupport.DeferredExecutionSupportImpl(
6974
fields,
7075
parameters,

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.util.Collections;
3030
import java.util.List;
3131
import java.util.Map;
32+
import java.util.Optional;
3233
import java.util.concurrent.CompletableFuture;
3334

3435
import static graphql.execution.ExecutionContextBuilder.newExecutionContextBuilder;
@@ -140,7 +141,9 @@ private CompletableFuture<ExecutionResult> executeOperation(ExecutionContext exe
140141
MergedSelectionSet fields = fieldCollector.collectFields(
141142
collectorParameters,
142143
operationDefinition.getSelectionSet(),
143-
executionContext.isIncrementalSupport()
144+
Optional.ofNullable(executionContext.getGraphQLContext())
145+
.map(graphqlContext -> (Boolean) graphqlContext.get(GraphQLContext.ENABLE_INCREMENTAL_SUPPORT))
146+
.orElse(false)
144147
);
145148

146149
ResultPath path = ResultPath.rootPath();
@@ -179,13 +182,13 @@ private CompletableFuture<ExecutionResult> executeOperation(ExecutionContext exe
179182

180183
result = result.whenComplete(executeOperationCtx::onCompleted);
181184

182-
return deferSupport(executionContext, result);
185+
return incrementalSupport(executionContext, result);
183186
}
184187

185188
/*
186189
* Adds the deferred publisher if it's needed at the end of the query. This is also a good time for the deferred code to start running
187190
*/
188-
private CompletableFuture<ExecutionResult> deferSupport(ExecutionContext executionContext, CompletableFuture<ExecutionResult> result) {
191+
private CompletableFuture<ExecutionResult> incrementalSupport(ExecutionContext executionContext, CompletableFuture<ExecutionResult> result) {
189192
return result.thenApply(er -> {
190193
IncrementalCallState incrementalCallState = executionContext.getIncrementalCallState();
191194
if (incrementalCallState.getIncrementalCallsDetected()) {

src/main/java/graphql/execution/ExecutionContext.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -261,10 +261,6 @@ public IncrementalCallState getIncrementalCallState() {
261261
return incrementalCallState;
262262
}
263263

264-
public boolean isIncrementalSupport() {
265-
return executionInput != null && executionInput.isIncrementalSupport();
266-
}
267-
268264
public ExecutionStrategy getStrategy(OperationDefinition.Operation operation) {
269265
if (operation == OperationDefinition.Operation.MUTATION) {
270266
return getMutationStrategy();

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.google.common.collect.ImmutableList;
44
import graphql.ExecutionResult;
55
import graphql.ExecutionResultImpl;
6+
import graphql.GraphQLContext;
67
import graphql.GraphQLError;
78
import graphql.Internal;
89
import graphql.PublicSpi;
@@ -45,6 +46,7 @@
4546
import java.util.Collections;
4647
import java.util.List;
4748
import java.util.Map;
49+
import java.util.Optional;
4850
import java.util.OptionalInt;
4951
import java.util.concurrent.CompletableFuture;
5052
import java.util.concurrent.CompletionException;
@@ -684,7 +686,9 @@ protected CompletableFuture<ExecutionResult> completeValueForObject(ExecutionCon
684686
MergedSelectionSet subFields = fieldCollector.collectFields(
685687
collectorParameters,
686688
parameters.getField(),
687-
executionContext.isIncrementalSupport()
689+
Optional.ofNullable(executionContext.getGraphQLContext())
690+
.map(graphqlContext -> (Boolean) graphqlContext.get(GraphQLContext.ENABLE_INCREMENTAL_SUPPORT))
691+
.orElse(false)
688692
);
689693

690694
ExecutionStepInfo newExecutionStepInfo = executionStepInfo.changeTypeWithPreservedNonNull(resolvedObjectType);

src/test/groovy/graphql/execution/AsyncExecutionStrategyTest.groovy

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package graphql.execution
22

33
import graphql.ErrorType
4-
import graphql.ExecutionInput
54
import graphql.ExecutionResult
65
import graphql.GraphQLContext
76
import graphql.execution.instrumentation.ExecutionStrategyInstrumentationContext
@@ -34,7 +33,7 @@ import static org.awaitility.Awaitility.await
3433
abstract class AsyncExecutionStrategyTest extends Specification {
3534
static boolean incrementalSupport
3635

37-
def executionInputMock = Mock(ExecutionInput)
36+
def graphqlContextMock = Mock(GraphQLContext)
3837

3938
GraphQLSchema schema(DataFetcher dataFetcher1, DataFetcher dataFetcher2) {
4039
def queryName = "RootQueryType"
@@ -70,7 +69,7 @@ abstract class AsyncExecutionStrategyTest extends Specification {
7069
}
7170

7271
def setup() {
73-
executionInputMock.isIncrementalSupport() >> incrementalSupport
72+
graphqlContextMock.get(GraphQLContext.ENABLE_INCREMENTAL_SUPPORT) >> incrementalSupport
7473
}
7574

7675
def "execution is serial if the dataFetchers are blocking"() {
@@ -106,9 +105,8 @@ abstract class AsyncExecutionStrategyTest extends Specification {
106105
.operationDefinition(operation)
107106
.instrumentation(SimplePerformantInstrumentation.INSTANCE)
108107
.valueUnboxer(ValueUnboxer.DEFAULT)
109-
.graphQLContext(GraphQLContext.getDefault())
108+
.graphQLContext(graphqlContextMock)
110109
.locale(Locale.getDefault())
111-
.executionInput(executionInputMock)
112110
.build()
113111
ExecutionStrategyParameters executionStrategyParameters = ExecutionStrategyParameters
114112
.newParameters()
@@ -149,8 +147,7 @@ abstract class AsyncExecutionStrategyTest extends Specification {
149147
.valueUnboxer(ValueUnboxer.DEFAULT)
150148
.instrumentation(SimplePerformantInstrumentation.INSTANCE)
151149
.locale(Locale.getDefault())
152-
.graphQLContext(GraphQLContext.getDefault())
153-
.executionInput(executionInputMock)
150+
.graphQLContext(graphqlContextMock)
154151
.build()
155152
ExecutionStrategyParameters executionStrategyParameters = ExecutionStrategyParameters
156153
.newParameters()
@@ -192,9 +189,8 @@ abstract class AsyncExecutionStrategyTest extends Specification {
192189
.operationDefinition(operation)
193190
.valueUnboxer(ValueUnboxer.DEFAULT)
194191
.instrumentation(SimplePerformantInstrumentation.INSTANCE)
195-
.graphQLContext(GraphQLContext.getDefault())
192+
.graphQLContext(graphqlContextMock)
196193
.locale(Locale.getDefault())
197-
.executionInput(executionInputMock)
198194
.build()
199195
ExecutionStrategyParameters executionStrategyParameters = ExecutionStrategyParameters
200196
.newParameters()
@@ -236,8 +232,7 @@ abstract class AsyncExecutionStrategyTest extends Specification {
236232
.instrumentation(SimplePerformantInstrumentation.INSTANCE)
237233
.valueUnboxer(ValueUnboxer.DEFAULT)
238234
.locale(Locale.getDefault())
239-
.graphQLContext(GraphQLContext.getDefault())
240-
.executionInput(executionInputMock)
235+
.graphQLContext(graphqlContextMock)
241236
.build()
242237
ExecutionStrategyParameters executionStrategyParameters = ExecutionStrategyParameters
243238
.newParameters()
@@ -276,7 +271,7 @@ abstract class AsyncExecutionStrategyTest extends Specification {
276271
.executionId(ExecutionId.generate())
277272
.operationDefinition(operation)
278273
.valueUnboxer(ValueUnboxer.DEFAULT)
279-
.graphQLContext(GraphQLContext.getDefault())
274+
.graphQLContext(graphqlContextMock)
280275
.locale(Locale.getDefault())
281276
.instrumentation(new SimplePerformantInstrumentation() {
282277

@@ -299,7 +294,6 @@ abstract class AsyncExecutionStrategyTest extends Specification {
299294
}
300295
}
301296
})
302-
.executionInput(executionInputMock)
303297
.build()
304298
ExecutionStrategyParameters executionStrategyParameters = ExecutionStrategyParameters
305299
.newParameters()

src/test/groovy/graphql/execution/incremental/DeferExecutionSupportIntegrationTest.groovy

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import graphql.Directives
44
import graphql.ExecutionInput
55
import graphql.ExecutionResult
66
import graphql.GraphQL
7+
import graphql.GraphQLContext
78
import graphql.TestUtil
89
import graphql.execution.pubsub.CapturingSubscriber
910
import graphql.incremental.DelayedIncrementalExecutionResult
@@ -1348,7 +1349,7 @@ class DeferExecutionSupportIntegrationTest extends Specification {
13481349
private ExecutionResult executeQuery(String query, boolean incrementalSupport, Map<String, Object> variables) {
13491350
return graphQL.execute(
13501351
ExecutionInput.newExecutionInput()
1351-
.incrementalSupport(incrementalSupport)
1352+
.graphQLContext([(GraphQLContext.ENABLE_INCREMENTAL_SUPPORT): incrementalSupport])
13521353
.query(query)
13531354
.variables(variables)
13541355
.build()

src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderPerformanceTest.groovy

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package graphql.execution.instrumentation.dataloader
22

33
import graphql.ExecutionInput
44
import graphql.GraphQL
5+
import graphql.GraphQLContext
56
import graphql.execution.instrumentation.Instrumentation
67
import graphql.incremental.IncrementalExecutionResult
78
import org.dataloader.DataLoaderRegistry
@@ -37,7 +38,7 @@ class DataLoaderPerformanceTest extends Specification {
3738
ExecutionInput executionInput = ExecutionInput.newExecutionInput()
3839
.query(query)
3940
.dataLoaderRegistry(dataLoaderRegistry)
40-
.incrementalSupport(incrementalSupport)
41+
.graphQLContext([(GraphQLContext.ENABLE_INCREMENTAL_SUPPORT): incrementalSupport])
4142
.build()
4243
def result = graphQL.execute(executionInput)
4344

@@ -59,7 +60,7 @@ class DataLoaderPerformanceTest extends Specification {
5960
ExecutionInput executionInput = ExecutionInput.newExecutionInput()
6061
.query(expensiveQuery)
6162
.dataLoaderRegistry(dataLoaderRegistry)
62-
.incrementalSupport(incrementalSupport)
63+
.graphQLContext([(GraphQLContext.ENABLE_INCREMENTAL_SUPPORT): incrementalSupport])
6364
.build()
6465
def result = graphQL.execute(executionInput)
6566

@@ -82,7 +83,7 @@ class DataLoaderPerformanceTest extends Specification {
8283
ExecutionInput executionInput = ExecutionInput.newExecutionInput()
8384
.query(query)
8485
.dataLoaderRegistry(dataLoaderRegistry)
85-
.incrementalSupport(incrementalSupport)
86+
.graphQLContext([(GraphQLContext.ENABLE_INCREMENTAL_SUPPORT): incrementalSupport])
8687
.build()
8788

8889
def result = graphQL.execute(executionInput)
@@ -107,7 +108,7 @@ class DataLoaderPerformanceTest extends Specification {
107108
ExecutionInput executionInput = ExecutionInput.newExecutionInput()
108109
.query(expensiveQuery)
109110
.dataLoaderRegistry(dataLoaderRegistry)
110-
.incrementalSupport(incrementalSupport)
111+
.graphQLContext([(GraphQLContext.ENABLE_INCREMENTAL_SUPPORT): incrementalSupport])
111112
.build()
112113

113114
def result = graphQL.execute(executionInput)
@@ -129,7 +130,7 @@ class DataLoaderPerformanceTest extends Specification {
129130
ExecutionInput executionInput = ExecutionInput.newExecutionInput()
130131
.query(deferredQuery)
131132
.dataLoaderRegistry(dataLoaderRegistry)
132-
.incrementalSupport(true)
133+
.graphQLContext([(GraphQLContext.ENABLE_INCREMENTAL_SUPPORT): true])
133134
.build()
134135

135136
IncrementalExecutionResult result = graphQL.execute(executionInput)
@@ -155,7 +156,7 @@ class DataLoaderPerformanceTest extends Specification {
155156
ExecutionInput executionInput = ExecutionInput.newExecutionInput()
156157
.query(expensiveDeferredQuery)
157158
.dataLoaderRegistry(dataLoaderRegistry)
158-
.incrementalSupport(true)
159+
.graphQLContext([(GraphQLContext.ENABLE_INCREMENTAL_SUPPORT): true])
159160
.build()
160161

161162
IncrementalExecutionResult result = graphQL.execute(executionInput)

0 commit comments

Comments
 (0)