Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions src/main/java/graphql/ExecutionInput.java
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,17 @@ public static Builder newExecutionInput() {
return new Builder();
}

/**
* Creates a new builder of ExecutionInput objects with the given query
*
* @param query the query to execute
*
* @return a new builder of ExecutionInput objects
*/
public static Builder newExecutionInput(String query) {
return new Builder().query(query);
}

public static class Builder {

private String query;
Expand Down
36 changes: 2 additions & 34 deletions src/main/java/graphql/GraphQL.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import java.util.function.UnaryOperator;

import static graphql.Assert.assertNotNull;
import static graphql.execution.ExecutionIdProvider.DEFAULT_EXECUTION_ID_PROVIDER;
import static graphql.execution.instrumentation.DocumentAndVariables.newDocumentAndVariables;

/**
Expand Down Expand Up @@ -79,6 +80,7 @@
*
* </ul>
*/
@SuppressWarnings("Duplicates")
@PublicApi
public class GraphQL {

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

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

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

private final GraphQLSchema graphQLSchema;
private final ExecutionStrategy queryStrategy;
Expand Down Expand Up @@ -603,37 +604,4 @@ private CompletableFuture<ExecutionResult> execute(ExecutionInput executionInput
return future;
}

private static class ParseResult {
private final DocumentAndVariables documentAndVariables;
private final InvalidSyntaxException exception;

private ParseResult(DocumentAndVariables documentAndVariables, InvalidSyntaxException exception) {
this.documentAndVariables = documentAndVariables;
this.exception = exception;
}

private boolean isFailure() {
return documentAndVariables == null;
}

private Document getDocument() {
return documentAndVariables.getDocument();
}

private Map<String, Object> getVariables() {
return documentAndVariables.getVariables();
}

private InvalidSyntaxException getException() {
return exception;
}

private static ParseResult of(DocumentAndVariables document) {
return new ParseResult(document, null);
}

private static ParseResult ofError(InvalidSyntaxException e) {
return new ParseResult(null, e);
}
}
}
42 changes: 42 additions & 0 deletions src/main/java/graphql/ParseResult.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package graphql;

import graphql.execution.instrumentation.DocumentAndVariables;
import graphql.language.Document;
import graphql.parser.InvalidSyntaxException;

import java.util.Map;

@Internal
public class ParseResult {
private final DocumentAndVariables documentAndVariables;
private final InvalidSyntaxException exception;

public ParseResult(DocumentAndVariables documentAndVariables, InvalidSyntaxException exception) {
this.documentAndVariables = documentAndVariables;
this.exception = exception;
}

public boolean isFailure() {
return documentAndVariables == null;
}

public Document getDocument() {
return documentAndVariables.getDocument();
}

public Map<String, Object> getVariables() {
return documentAndVariables.getVariables();
}

public InvalidSyntaxException getException() {
return exception;
}

public static ParseResult of(DocumentAndVariables document) {
return new ParseResult(document, null);
}

public static ParseResult ofError(InvalidSyntaxException e) {
return new ParseResult(null, e);
}
}
3 changes: 3 additions & 0 deletions src/main/java/graphql/execution/ExecutionIdProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
*/
public interface ExecutionIdProvider {

ExecutionIdProvider DEFAULT_EXECUTION_ID_PROVIDER = (query, operationName, context) -> ExecutionId.generate();


/**
* Allows provision of a unique identifier per query execution.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
import java.util.List;
import java.util.concurrent.CompletableFuture;

import static graphql.execution.instrumentation.SimpleInstrumentationContext.noOp;

/**
* Provides the capability to instrument the execution steps of a GraphQL query.
*
Expand Down Expand Up @@ -139,7 +141,7 @@ default InstrumentationState createState(InstrumentationCreateStateParameters pa
* @return a non null {@link InstrumentationContext} object that will be called back when the step ends
*/
default InstrumentationContext<ExecutionResult> beginFieldComplete(InstrumentationFieldCompleteParameters parameters) {
return new SimpleInstrumentationContext<>();
return noOp();
}

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

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,17 @@
@PublicApi
public class SimpleInstrumentationContext<T> implements InstrumentationContext<T> {

/**
* A context that does nothing
*
* @param <T> the type needed
*
* @return a context that does nothing
*/
public static <T> InstrumentationContext<T> noOp() {
return new SimpleInstrumentationContext<>();
}

private final BiConsumer<T, Throwable> codeToRunOnComplete;
private final Consumer<CompletableFuture<T>> codeToRunOnDispatch;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package graphql.execution.instrumentation.nextgen;

import graphql.ExecutionInput;
import graphql.ExecutionResult;
import graphql.Internal;
import graphql.execution.instrumentation.DocumentAndVariables;
import graphql.execution.instrumentation.InstrumentationContext;
import graphql.execution.instrumentation.InstrumentationState;
import graphql.language.Document;
import graphql.schema.GraphQLSchema;
import graphql.validation.ValidationError;

import java.util.List;

import static graphql.execution.instrumentation.SimpleInstrumentationContext.noOp;

@Internal
public interface Instrumentation {

default InstrumentationState createState(InstrumentationCreateStateParameters parameters) {
return new InstrumentationState() {
};
}

default ExecutionInput instrumentExecutionInput(ExecutionInput executionInput, InstrumentationExecutionParameters parameters) {
return executionInput;
}

default DocumentAndVariables instrumentDocumentAndVariables(DocumentAndVariables documentAndVariables, InstrumentationExecutionParameters parameters) {
return documentAndVariables;
}

default GraphQLSchema instrumentSchema(GraphQLSchema graphQLSchema, InstrumentationExecutionParameters parameters) {
return graphQLSchema;
}

default ExecutionResult instrumentExecutionResult(ExecutionResult result, InstrumentationExecutionParameters parameters) {
return result;
}

default InstrumentationContext<ExecutionResult> beginExecution(InstrumentationExecutionParameters parameters) {
return noOp();
}

default InstrumentationContext<Document> beginParse(InstrumentationExecutionParameters parameters) {
return noOp();
}

default InstrumentationContext<List<ValidationError>> beginValidation(InstrumentationValidationParameters parameters) {
return noOp();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package graphql.execution.instrumentation.nextgen;

import graphql.ExecutionInput;
import graphql.Internal;
import graphql.schema.GraphQLSchema;

/**
* Parameters sent to {@link graphql.execution.instrumentation.nextgen.Instrumentation} methods
*/
@Internal
public class InstrumentationCreateStateParameters {
private final GraphQLSchema schema;
private final ExecutionInput executionInput;

public InstrumentationCreateStateParameters(GraphQLSchema schema, ExecutionInput executionInput) {
this.schema = schema;
this.executionInput = executionInput;
}

public GraphQLSchema getSchema() {
return schema;
}

public ExecutionInput getExecutionInput() {
return executionInput;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package graphql.execution.instrumentation.nextgen;

import graphql.ExecutionInput;
import graphql.Internal;
import graphql.execution.instrumentation.InstrumentationState;
import graphql.schema.GraphQLSchema;

import java.util.Collections;
import java.util.Map;

/**
* Parameters sent to {@link graphql.execution.instrumentation.nextgen.Instrumentation} methods
*/
@Internal
public class InstrumentationExecutionParameters {
private final ExecutionInput executionInput;
private final String query;
private final String operation;
private final Object context;
private final Map<String, Object> variables;
private final InstrumentationState instrumentationState;
private final GraphQLSchema schema;

public InstrumentationExecutionParameters(ExecutionInput executionInput, GraphQLSchema schema, InstrumentationState instrumentationState) {
this.executionInput = executionInput;
this.query = executionInput.getQuery();
this.operation = executionInput.getOperationName();
this.context = executionInput.getContext();
this.variables = executionInput.getVariables() != null ? executionInput.getVariables() : Collections.emptyMap();
this.instrumentationState = instrumentationState;
this.schema = schema;
}

/**
* Returns a cloned parameters object with the new state
*
* @param instrumentationState the new state for this parameters object
*
* @return a new parameters object with the new state
*/
public InstrumentationExecutionParameters withNewState(InstrumentationState instrumentationState) {
return new InstrumentationExecutionParameters(this.getExecutionInput(), this.schema, instrumentationState);
}

public ExecutionInput getExecutionInput() {
return executionInput;
}

public String getQuery() {
return query;
}

public String getOperation() {
return operation;
}

@SuppressWarnings({"unchecked", "TypeParameterUnusedInFormals"})
public <T> T getContext() {
return (T) context;
}

public Map<String, Object> getVariables() {
return variables;
}

@SuppressWarnings("TypeParameterUnusedInFormals")
public <T extends InstrumentationState> T getInstrumentationState() {
//noinspection unchecked
return (T) instrumentationState;
}

public GraphQLSchema getSchema() {
return this.schema;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package graphql.execution.instrumentation.nextgen;

import graphql.ExecutionInput;
import graphql.Internal;
import graphql.execution.instrumentation.InstrumentationState;
import graphql.language.Document;
import graphql.schema.GraphQLSchema;

/**
* Parameters sent to {@link graphql.execution.instrumentation.nextgen.Instrumentation} methods
*/
@Internal
public class InstrumentationValidationParameters extends InstrumentationExecutionParameters {
private final Document document;

public InstrumentationValidationParameters(ExecutionInput executionInput, Document document, GraphQLSchema schema, InstrumentationState instrumentationState) {
super(executionInput, schema, instrumentationState);
this.document = document;
}

/**
* Returns a cloned parameters object with the new state
*
* @param instrumentationState the new state for this parameters object
*
* @return a new parameters object with the new state
*/
@Override
public InstrumentationValidationParameters withNewState(InstrumentationState instrumentationState) {
return new InstrumentationValidationParameters(
this.getExecutionInput(), document, getSchema(), instrumentationState);
}


public Document getDocument() {
return document;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/**
* WARNING: All code in this package is a work in progress for a new execution engine.
*/
package graphql.execution.instrumentation.nextgen;
Loading