Skip to content

Commit eff6106

Browse files
authored
Merge pull request #1940 from graphql-java/ng-stratgey-universal
refactor NG ExecutionStrategy to be more general
2 parents f328040 + fbe39bd commit eff6106

5 files changed

Lines changed: 36 additions & 18 deletions

File tree

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package graphql.execution.nextgen;
22

3+
import graphql.ExecutionResult;
34
import graphql.Internal;
45
import graphql.execution.Async;
56
import graphql.execution.ExecutionContext;
@@ -39,10 +40,18 @@ public class BatchedExecutionStrategy implements ExecutionStrategy {
3940

4041
FetchedValueAnalyzer fetchedValueAnalyzer = new FetchedValueAnalyzer();
4142
ExecutionStrategyUtil util = new ExecutionStrategyUtil();
43+
ExecutionHelper executionHelper = new ExecutionHelper();
4244

4345

4446
@Override
45-
public CompletableFuture<RootExecutionResultNode> execute(ExecutionContext executionContext, FieldSubSelection fieldSubSelection) {
47+
public CompletableFuture<ExecutionResult> execute(ExecutionContext context) {
48+
FieldSubSelection fieldSubSelection = executionHelper.getFieldSubSelection(context);
49+
return executeImpl(context, fieldSubSelection)
50+
.thenApply(ResultNodesUtil::toExecutionResult);
51+
}
52+
53+
54+
public CompletableFuture<RootExecutionResultNode> executeImpl(ExecutionContext executionContext, FieldSubSelection fieldSubSelection) {
4655
CompletableFuture<RootExecutionResultNode> rootCF = Async.each(util.fetchSubSelection(executionContext, fieldSubSelection))
4756
.thenApply(RootExecutionResultNode::new);
4857

src/main/java/graphql/execution/nextgen/DefaultExecutionStrategy.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package graphql.execution.nextgen;
22

3+
import graphql.ExecutionResult;
34
import graphql.Internal;
45
import graphql.execution.ExecutionContext;
56
import graphql.execution.ExecutionStepInfo;
@@ -22,16 +23,22 @@
2223
public class DefaultExecutionStrategy implements ExecutionStrategy {
2324

2425
ExecutionStrategyUtil util = new ExecutionStrategyUtil();
26+
ExecutionHelper executionHelper = new ExecutionHelper();
2527

28+
@Override
29+
public CompletableFuture<ExecutionResult> execute(ExecutionContext context) {
30+
FieldSubSelection fieldSubSelection = executionHelper.getFieldSubSelection(context);
31+
return executeImpl(context, fieldSubSelection)
32+
.thenApply(ResultNodesUtil::toExecutionResult);
33+
}
2634

2735
/*
2836
* the fundamental algorithm is:
2937
* - fetch sub selection and analyze it
3038
* - convert the fetched value analysis into result node
3139
* - get all unresolved result nodes and resolve the sub selection (start again recursively)
3240
*/
33-
@Override
34-
public CompletableFuture<RootExecutionResultNode> execute(ExecutionContext context, FieldSubSelection fieldSubSelection) {
41+
public CompletableFuture<RootExecutionResultNode> executeImpl(ExecutionContext context, FieldSubSelection fieldSubSelection) {
3542
return resolveSubSelection(context, fieldSubSelection)
3643
.thenApply(RootExecutionResultNode::new);
3744
}

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import graphql.execution.Async;
99
import graphql.execution.ExecutionId;
1010
import graphql.execution.instrumentation.InstrumentationState;
11-
import graphql.execution.nextgen.result.ResultNodesUtil;
1211
import graphql.language.Document;
1312
import graphql.schema.GraphQLSchema;
1413

@@ -37,8 +36,7 @@ public CompletableFuture<ExecutionResult> execute(ExecutionStrategy executionStr
3736

3837
try {
3938
return executionStrategy
40-
.execute(executionData.executionContext, executionData.fieldSubSelection)
41-
.thenApply(ResultNodesUtil::toExecutionResult);
39+
.execute(executionData.executionContext);
4240
} catch (Exception e) {
4341
throw new RuntimeException(e);
4442
}

src/main/java/graphql/execution/nextgen/ExecutionHelper.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ public class ExecutionHelper {
3232

3333
public static class ExecutionData {
3434
public ExecutionContext executionContext;
35-
public FieldSubSelection fieldSubSelection;
3635
}
3736

3837
public ExecutionData createExecutionData(Document document,
@@ -64,28 +63,33 @@ public ExecutionData createExecutionData(Document document,
6463
.operationDefinition(operationDefinition)
6564
.build();
6665

67-
GraphQLObjectType operationRootType;
68-
operationRootType = Common.getOperationRootType(executionContext.getGraphQLSchema(), operationDefinition);
66+
ExecutionData executionData = new ExecutionData();
67+
executionData.executionContext = executionContext;
68+
return executionData;
69+
70+
}
71+
72+
public FieldSubSelection getFieldSubSelection(ExecutionContext executionContext) {
73+
OperationDefinition operationDefinition = executionContext.getOperationDefinition();
74+
GraphQLObjectType operationRootType = Common.getOperationRootType(executionContext.getGraphQLSchema(), operationDefinition);
75+
6976
FieldCollectorParameters collectorParameters = FieldCollectorParameters.newParameters()
7077
.schema(executionContext.getGraphQLSchema())
7178
.objectType(operationRootType)
7279
.fragments(executionContext.getFragmentsByName())
7380
.variables(executionContext.getVariables())
7481
.build();
82+
7583
MergedSelectionSet mergedSelectionSet = fieldCollector.collectFields(collectorParameters, operationDefinition.getSelectionSet());
7684
ExecutionStepInfo executionInfo = newExecutionStepInfo().type(operationRootType).path(ExecutionPath.rootPath()).build();
7785

7886
FieldSubSelection fieldSubSelection = FieldSubSelection.newFieldSubSelection()
79-
.source(executionInput.getRoot())
80-
.localContext(executionInput.getContext())
87+
.source(executionContext.getRoot())
88+
.localContext(executionContext.getLocalContext())
8189
.mergedSelectionSet(mergedSelectionSet)
8290
.executionInfo(executionInfo)
8391
.build();
84-
85-
ExecutionData executionData = new ExecutionData();
86-
executionData.executionContext = executionContext;
87-
executionData.fieldSubSelection = fieldSubSelection;
88-
return executionData;
92+
return fieldSubSelection;
8993

9094
}
9195
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package graphql.execution.nextgen;
22

3+
import graphql.ExecutionResult;
34
import graphql.Internal;
45
import graphql.execution.ExecutionContext;
5-
import graphql.execution.nextgen.result.RootExecutionResultNode;
66

77
import java.util.concurrent.CompletableFuture;
88

99
@Internal
1010
public interface ExecutionStrategy {
1111

12-
CompletableFuture<RootExecutionResultNode> execute(ExecutionContext context, FieldSubSelection fieldSubSelection);
12+
CompletableFuture<ExecutionResult> execute(ExecutionContext context);
1313

1414
}

0 commit comments

Comments
 (0)