Skip to content

Commit a63da67

Browse files
authored
Nextgen entry point (#1381)
* Some initial code to get started * Migrated the execution test of DEStrategy to use this new call in mechanism * Removed nextgen.ExecutionInput * Now uses an instatiation of the ES as input * DefaultES test was deleted by accident - restored * Make it work with the new syntax errors
1 parent c967dac commit a63da67

19 files changed

+792
-423
lines changed

src/main/java/graphql/ExecutionInput.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,17 @@ public static Builder newExecutionInput() {
120120
return new Builder();
121121
}
122122

123+
/**
124+
* Creates a new builder of ExecutionInput objects with the given query
125+
*
126+
* @param query the query to execute
127+
*
128+
* @return a new builder of ExecutionInput objects
129+
*/
130+
public static Builder newExecutionInput(String query) {
131+
return new Builder().query(query);
132+
}
133+
123134
public static class Builder {
124135

125136
private String query;

src/main/java/graphql/GraphQL.java

Lines changed: 2 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import java.util.function.UnaryOperator;
4141

4242
import static graphql.Assert.assertNotNull;
43+
import static graphql.execution.ExecutionIdProvider.DEFAULT_EXECUTION_ID_PROVIDER;
4344
import static graphql.execution.instrumentation.DocumentAndVariables.newDocumentAndVariables;
4445

4546
/**
@@ -79,6 +80,7 @@
7980
*
8081
* </ul>
8182
*/
83+
@SuppressWarnings("Duplicates")
8284
@PublicApi
8385
public class GraphQL {
8486

@@ -90,7 +92,6 @@ public class GraphQL {
9092

9193
private static final Logger log = LoggerFactory.getLogger(GraphQL.class);
9294

93-
private static final ExecutionIdProvider DEFAULT_EXECUTION_ID_PROVIDER = (query, operationName, context) -> ExecutionId.generate();
9495

9596
private final GraphQLSchema graphQLSchema;
9697
private final ExecutionStrategy queryStrategy;
@@ -603,37 +604,4 @@ private CompletableFuture<ExecutionResult> execute(ExecutionInput executionInput
603604
return future;
604605
}
605606

606-
private static class ParseResult {
607-
private final DocumentAndVariables documentAndVariables;
608-
private final InvalidSyntaxException exception;
609-
610-
private ParseResult(DocumentAndVariables documentAndVariables, InvalidSyntaxException exception) {
611-
this.documentAndVariables = documentAndVariables;
612-
this.exception = exception;
613-
}
614-
615-
private boolean isFailure() {
616-
return documentAndVariables == null;
617-
}
618-
619-
private Document getDocument() {
620-
return documentAndVariables.getDocument();
621-
}
622-
623-
private Map<String, Object> getVariables() {
624-
return documentAndVariables.getVariables();
625-
}
626-
627-
private InvalidSyntaxException getException() {
628-
return exception;
629-
}
630-
631-
private static ParseResult of(DocumentAndVariables document) {
632-
return new ParseResult(document, null);
633-
}
634-
635-
private static ParseResult ofError(InvalidSyntaxException e) {
636-
return new ParseResult(null, e);
637-
}
638-
}
639607
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package graphql;
2+
3+
import graphql.execution.instrumentation.DocumentAndVariables;
4+
import graphql.language.Document;
5+
import graphql.parser.InvalidSyntaxException;
6+
7+
import java.util.Map;
8+
9+
@Internal
10+
public class ParseResult {
11+
private final DocumentAndVariables documentAndVariables;
12+
private final InvalidSyntaxException exception;
13+
14+
public ParseResult(DocumentAndVariables documentAndVariables, InvalidSyntaxException exception) {
15+
this.documentAndVariables = documentAndVariables;
16+
this.exception = exception;
17+
}
18+
19+
public boolean isFailure() {
20+
return documentAndVariables == null;
21+
}
22+
23+
public Document getDocument() {
24+
return documentAndVariables.getDocument();
25+
}
26+
27+
public Map<String, Object> getVariables() {
28+
return documentAndVariables.getVariables();
29+
}
30+
31+
public InvalidSyntaxException getException() {
32+
return exception;
33+
}
34+
35+
public static ParseResult of(DocumentAndVariables document) {
36+
return new ParseResult(document, null);
37+
}
38+
39+
public static ParseResult ofError(InvalidSyntaxException e) {
40+
return new ParseResult(null, e);
41+
}
42+
}

src/main/java/graphql/execution/ExecutionIdProvider.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
*/
66
public interface ExecutionIdProvider {
77

8+
ExecutionIdProvider DEFAULT_EXECUTION_ID_PROVIDER = (query, operationName, context) -> ExecutionId.generate();
9+
10+
811
/**
912
* Allows provision of a unique identifier per query execution.
1013
*

src/main/java/graphql/execution/instrumentation/Instrumentation.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import java.util.List;
2121
import java.util.concurrent.CompletableFuture;
2222

23+
import static graphql.execution.instrumentation.SimpleInstrumentationContext.noOp;
24+
2325
/**
2426
* Provides the capability to instrument the execution steps of a GraphQL query.
2527
*
@@ -139,7 +141,7 @@ default InstrumentationState createState(InstrumentationCreateStateParameters pa
139141
* @return a non null {@link InstrumentationContext} object that will be called back when the step ends
140142
*/
141143
default InstrumentationContext<ExecutionResult> beginFieldComplete(InstrumentationFieldCompleteParameters parameters) {
142-
return new SimpleInstrumentationContext<>();
144+
return noOp();
143145
}
144146

145147
/**
@@ -150,7 +152,7 @@ default InstrumentationContext<ExecutionResult> beginFieldComplete(Instrumentati
150152
* @return a non null {@link InstrumentationContext} object that will be called back when the step ends
151153
*/
152154
default InstrumentationContext<ExecutionResult> beginFieldListComplete(InstrumentationFieldCompleteParameters parameters) {
153-
return new SimpleInstrumentationContext<>();
155+
return noOp();
154156
}
155157

156158
/**

src/main/java/graphql/execution/instrumentation/SimpleInstrumentationContext.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,17 @@
1212
@PublicApi
1313
public class SimpleInstrumentationContext<T> implements InstrumentationContext<T> {
1414

15+
/**
16+
* A context that does nothing
17+
*
18+
* @param <T> the type needed
19+
*
20+
* @return a context that does nothing
21+
*/
22+
public static <T> InstrumentationContext<T> noOp() {
23+
return new SimpleInstrumentationContext<>();
24+
}
25+
1526
private final BiConsumer<T, Throwable> codeToRunOnComplete;
1627
private final Consumer<CompletableFuture<T>> codeToRunOnDispatch;
1728

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package graphql.execution.instrumentation.nextgen;
2+
3+
import graphql.ExecutionInput;
4+
import graphql.ExecutionResult;
5+
import graphql.Internal;
6+
import graphql.execution.instrumentation.DocumentAndVariables;
7+
import graphql.execution.instrumentation.InstrumentationContext;
8+
import graphql.execution.instrumentation.InstrumentationState;
9+
import graphql.language.Document;
10+
import graphql.schema.GraphQLSchema;
11+
import graphql.validation.ValidationError;
12+
13+
import java.util.List;
14+
15+
import static graphql.execution.instrumentation.SimpleInstrumentationContext.noOp;
16+
17+
@Internal
18+
public interface Instrumentation {
19+
20+
default InstrumentationState createState(InstrumentationCreateStateParameters parameters) {
21+
return new InstrumentationState() {
22+
};
23+
}
24+
25+
default ExecutionInput instrumentExecutionInput(ExecutionInput executionInput, InstrumentationExecutionParameters parameters) {
26+
return executionInput;
27+
}
28+
29+
default DocumentAndVariables instrumentDocumentAndVariables(DocumentAndVariables documentAndVariables, InstrumentationExecutionParameters parameters) {
30+
return documentAndVariables;
31+
}
32+
33+
default GraphQLSchema instrumentSchema(GraphQLSchema graphQLSchema, InstrumentationExecutionParameters parameters) {
34+
return graphQLSchema;
35+
}
36+
37+
default ExecutionResult instrumentExecutionResult(ExecutionResult result, InstrumentationExecutionParameters parameters) {
38+
return result;
39+
}
40+
41+
default InstrumentationContext<ExecutionResult> beginExecution(InstrumentationExecutionParameters parameters) {
42+
return noOp();
43+
}
44+
45+
default InstrumentationContext<Document> beginParse(InstrumentationExecutionParameters parameters) {
46+
return noOp();
47+
}
48+
49+
default InstrumentationContext<List<ValidationError>> beginValidation(InstrumentationValidationParameters parameters) {
50+
return noOp();
51+
}
52+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package graphql.execution.instrumentation.nextgen;
2+
3+
import graphql.ExecutionInput;
4+
import graphql.Internal;
5+
import graphql.schema.GraphQLSchema;
6+
7+
/**
8+
* Parameters sent to {@link graphql.execution.instrumentation.nextgen.Instrumentation} methods
9+
*/
10+
@Internal
11+
public class InstrumentationCreateStateParameters {
12+
private final GraphQLSchema schema;
13+
private final ExecutionInput executionInput;
14+
15+
public InstrumentationCreateStateParameters(GraphQLSchema schema, ExecutionInput executionInput) {
16+
this.schema = schema;
17+
this.executionInput = executionInput;
18+
}
19+
20+
public GraphQLSchema getSchema() {
21+
return schema;
22+
}
23+
24+
public ExecutionInput getExecutionInput() {
25+
return executionInput;
26+
}
27+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package graphql.execution.instrumentation.nextgen;
2+
3+
import graphql.ExecutionInput;
4+
import graphql.Internal;
5+
import graphql.execution.instrumentation.InstrumentationState;
6+
import graphql.schema.GraphQLSchema;
7+
8+
import java.util.Collections;
9+
import java.util.Map;
10+
11+
/**
12+
* Parameters sent to {@link graphql.execution.instrumentation.nextgen.Instrumentation} methods
13+
*/
14+
@Internal
15+
public class InstrumentationExecutionParameters {
16+
private final ExecutionInput executionInput;
17+
private final String query;
18+
private final String operation;
19+
private final Object context;
20+
private final Map<String, Object> variables;
21+
private final InstrumentationState instrumentationState;
22+
private final GraphQLSchema schema;
23+
24+
public InstrumentationExecutionParameters(ExecutionInput executionInput, GraphQLSchema schema, InstrumentationState instrumentationState) {
25+
this.executionInput = executionInput;
26+
this.query = executionInput.getQuery();
27+
this.operation = executionInput.getOperationName();
28+
this.context = executionInput.getContext();
29+
this.variables = executionInput.getVariables() != null ? executionInput.getVariables() : Collections.emptyMap();
30+
this.instrumentationState = instrumentationState;
31+
this.schema = schema;
32+
}
33+
34+
/**
35+
* Returns a cloned parameters object with the new state
36+
*
37+
* @param instrumentationState the new state for this parameters object
38+
*
39+
* @return a new parameters object with the new state
40+
*/
41+
public InstrumentationExecutionParameters withNewState(InstrumentationState instrumentationState) {
42+
return new InstrumentationExecutionParameters(this.getExecutionInput(), this.schema, instrumentationState);
43+
}
44+
45+
public ExecutionInput getExecutionInput() {
46+
return executionInput;
47+
}
48+
49+
public String getQuery() {
50+
return query;
51+
}
52+
53+
public String getOperation() {
54+
return operation;
55+
}
56+
57+
@SuppressWarnings({"unchecked", "TypeParameterUnusedInFormals"})
58+
public <T> T getContext() {
59+
return (T) context;
60+
}
61+
62+
public Map<String, Object> getVariables() {
63+
return variables;
64+
}
65+
66+
@SuppressWarnings("TypeParameterUnusedInFormals")
67+
public <T extends InstrumentationState> T getInstrumentationState() {
68+
//noinspection unchecked
69+
return (T) instrumentationState;
70+
}
71+
72+
public GraphQLSchema getSchema() {
73+
return this.schema;
74+
}
75+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package graphql.execution.instrumentation.nextgen;
2+
3+
import graphql.ExecutionInput;
4+
import graphql.Internal;
5+
import graphql.execution.instrumentation.InstrumentationState;
6+
import graphql.language.Document;
7+
import graphql.schema.GraphQLSchema;
8+
9+
/**
10+
* Parameters sent to {@link graphql.execution.instrumentation.nextgen.Instrumentation} methods
11+
*/
12+
@Internal
13+
public class InstrumentationValidationParameters extends InstrumentationExecutionParameters {
14+
private final Document document;
15+
16+
public InstrumentationValidationParameters(ExecutionInput executionInput, Document document, GraphQLSchema schema, InstrumentationState instrumentationState) {
17+
super(executionInput, schema, instrumentationState);
18+
this.document = document;
19+
}
20+
21+
/**
22+
* Returns a cloned parameters object with the new state
23+
*
24+
* @param instrumentationState the new state for this parameters object
25+
*
26+
* @return a new parameters object with the new state
27+
*/
28+
@Override
29+
public InstrumentationValidationParameters withNewState(InstrumentationState instrumentationState) {
30+
return new InstrumentationValidationParameters(
31+
this.getExecutionInput(), document, getSchema(), instrumentationState);
32+
}
33+
34+
35+
public Document getDocument() {
36+
return document;
37+
}
38+
}

0 commit comments

Comments
 (0)