Skip to content

Commit 3eca533

Browse files
committed
rewrote execution result handler to allow more customization of batch query processing
1 parent ee6defb commit 3eca533

File tree

4 files changed

+26
-50
lines changed

4 files changed

+26
-50
lines changed

src/main/java/graphql/servlet/DefaultGraphQLExecutionResultHandlerFactory.java

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package graphql.servlet;
22

3+
import graphql.ExecutionInput;
34
import graphql.ExecutionResult;
45

56
import java.io.IOException;
67
import java.io.Writer;
7-
import java.util.ArrayList;
88
import java.util.Iterator;
9-
import java.util.List;
9+
import java.util.function.BiFunction;
1010

1111
public class DefaultGraphQLExecutionResultHandlerFactory implements GraphQLExecutionResultHandlerFactory {
1212
@Override
@@ -16,8 +16,6 @@ public ExecutionResultHandler getBatchHandler(Writer respWriter, GraphQLObjectMa
1616

1717
private class DefaultGraphQLExecutionResultHandler implements ExecutionResultHandler {
1818

19-
private final List<ExecutionResult> results = new ArrayList<>();
20-
2119
private final Writer respWriter;
2220

2321
private final GraphQLObjectMapper graphQLObjectMapper;
@@ -28,19 +26,16 @@ private DefaultGraphQLExecutionResultHandler(Writer respWriter, GraphQLObjectMap
2826
}
2927

3028
@Override
31-
public void accept(ExecutionResult result) {
32-
results.add(result);
33-
}
34-
35-
@Override
36-
public void finalizeResults() {
29+
public void handleBatch(GraphQLBatchedInvocationInput batchedInvocationInput, BiFunction<GraphQLInvocationInput, ExecutionInput,
30+
ExecutionResult> queryFunction) {
31+
Iterator<ExecutionInput> executionInputIterator = batchedInvocationInput.getExecutionInputs().iterator();
3732
try {
3833
respWriter.write("[");
39-
Iterator<ExecutionResult> iterator = results.iterator();
40-
while (iterator.hasNext()) {
41-
respWriter.write(graphQLObjectMapper.serializeResultAsJson(iterator.next()));
42-
if (iterator.hasNext()) {
43-
respWriter.write(",");
34+
while (executionInputIterator.hasNext()) {
35+
ExecutionResult result = queryFunction.apply(batchedInvocationInput, executionInputIterator.next());
36+
respWriter.write(graphQLObjectMapper.serializeResultAsJson(result));
37+
if (executionInputIterator.hasNext()) {
38+
respWriter.write(",");
4439
}
4540
}
4641
respWriter.write("]");

src/main/java/graphql/servlet/ExecutionResultHandler.java

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,13 @@
44
import graphql.ExecutionResult;
55

66
import java.util.Iterator;
7+
import java.util.function.BiFunction;
78
import java.util.function.Consumer;
89

910
/**
1011
* @author Andrew Potter
1112
*/
12-
public interface ExecutionResultHandler extends Consumer<ExecutionResult> {
13-
/**
14-
* Allows the number of queries in a batch to be limited.
15-
* @param executionInputIterator iterator for the current set of requests.
16-
* @return if processing should continue.
17-
*/
18-
default boolean shouldContinue(Iterator<ExecutionInput> executionInputIterator){
19-
return executionInputIterator.hasNext();
20-
}
21-
22-
/**
23-
* Should perform any actions, such as formatting and sending results, to complete a batch.
24-
*/
25-
void finalizeResults();
13+
public interface ExecutionResultHandler {
14+
void handleBatch(GraphQLBatchedInvocationInput batchedInvocationInput, BiFunction<GraphQLInvocationInput, ExecutionInput, ExecutionResult> queryFunction);
2615
}
2716

src/main/java/graphql/servlet/GraphQLQueryInvoker.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,7 @@ public ExecutionResult query(GraphQLSingleInvocationInput singleInvocationInput)
4242
}
4343

4444
public void query(GraphQLBatchedInvocationInput batchedInvocationInput, ExecutionResultHandler executionResultHandler) {
45-
Iterator<ExecutionInput> executionInputIterator = batchedInvocationInput.getExecutionInputs().iterator();
46-
47-
while (executionResultHandler.shouldContinue(executionInputIterator)) {
48-
ExecutionResult result = query(batchedInvocationInput, executionInputIterator.next());
49-
executionResultHandler.accept(result);
50-
}
51-
52-
executionResultHandler.finalizeResults();
45+
executionResultHandler.handleBatch(batchedInvocationInput, this::query);
5346
}
5447

5548
private GraphQL newGraphQL(GraphQLSchema schema, Object context) {

src/test/groovy/graphql/servlet/TestBatchInputHandlerFactory.java

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55

66
import java.io.IOException;
77
import java.io.Writer;
8-
import java.util.ArrayList;
98
import java.util.Iterator;
109
import java.util.List;
10+
import java.util.function.BiFunction;
11+
import java.util.stream.Collectors;
1112

1213
public class TestBatchInputHandlerFactory implements GraphQLExecutionResultHandlerFactory {
1314
@Override
@@ -19,15 +20,23 @@ private class LimitedBatchSizeHandler implements ExecutionResultHandler {
1920

2021
Writer writer;
2122
GraphQLObjectMapper mapper;
22-
List<ExecutionResult> results = new ArrayList<>();
2323

2424
private LimitedBatchSizeHandler(Writer respWriter, GraphQLObjectMapper graphQLObjectMapper) {
2525
this.mapper = graphQLObjectMapper;
2626
this.writer = respWriter;
2727
}
2828

2929
@Override
30-
public void finalizeResults() {
30+
public void handleBatch(GraphQLBatchedInvocationInput batchedInvocationInput, BiFunction<GraphQLInvocationInput, ExecutionInput,
31+
ExecutionResult> queryFunction) {
32+
List<ExecutionResult> results = batchedInvocationInput.getExecutionInputs().parallelStream()
33+
.limit(2)
34+
.map(input -> queryFunction.apply(batchedInvocationInput, input))
35+
.collect(Collectors.toList());
36+
writeResults(results);
37+
}
38+
39+
public void writeResults(List<ExecutionResult> results) {
3140
try {
3241
writer.write("[");
3342
Iterator<ExecutionResult> iter = results.iterator();
@@ -42,15 +51,5 @@ public void finalizeResults() {
4251
throw new RuntimeException(e);
4352
}
4453
}
45-
46-
@Override
47-
public void accept(ExecutionResult executionResult) {
48-
results.add(executionResult);
49-
}
50-
51-
@Override
52-
public boolean shouldContinue(Iterator<ExecutionInput> executionInputIterator) {
53-
return results.size() < 2 && executionInputIterator.hasNext();
54-
}
5554
}
5655
}

0 commit comments

Comments
 (0)