Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DO NOT MERGE : This POC shows what a new GraphQLEngine might look like #3348

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
141 changes: 44 additions & 97 deletions src/main/java/graphql/GraphQL.java

Large diffs are not rendered by default.

184 changes: 184 additions & 0 deletions src/main/java/graphql/engine/EngineParameters.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
package graphql.engine;

import graphql.Assert;
import graphql.Internal;
import graphql.PublicApi;
import graphql.execution.ExecutionStepInfo;
import graphql.execution.MergedField;
import graphql.execution.MergedSelectionSet;
import graphql.execution.NonNullableFieldValidator;
import graphql.execution.ResultPath;
import graphql.language.OperationDefinition;

import java.util.function.Consumer;

import static graphql.Assert.assertNotNull;

/**
* The parameters that are passed to {@link GraphQLEngine}s
*/
@PublicApi
public class EngineParameters {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is pretty much a copy of ExecutionStrategyParameters but I felt that is too tied to the old ES way

private final ExecutionStepInfo executionStepInfo;
private final Object source;
private final Object localContext;
private final MergedSelectionSet fields;
private final NonNullableFieldValidator nonNullableFieldValidator;
private final ResultPath path;
private final MergedField currentField;
private final OperationDefinition.Operation operation;

private EngineParameters(Builder builder) {

this.executionStepInfo = assertNotNull(builder.executionStepInfo, () -> "executionStepInfo is null");
this.localContext = builder.localContext;
this.fields = assertNotNull(builder.fields, () -> "fields is null");
this.source = builder.source;
this.nonNullableFieldValidator = builder.nonNullableFieldValidator;
this.path = builder.path;
this.currentField = builder.currentField;
this.operation = builder.operation;
}

public NonNullableFieldValidator getNonNullableFieldValidator() {
return nonNullableFieldValidator;
}

public OperationDefinition.Operation getOperation() {
return operation;
}

public ExecutionStepInfo getExecutionStepInfo() {
return executionStepInfo;
}

public Object getSource() {
return source;
}

public MergedSelectionSet getFields() {
return fields;
}

public NonNullableFieldValidator getNonNullFieldValidator() {
return nonNullableFieldValidator;
}

public ResultPath getPath() {
return path;
}

public Object getLocalContext() {
return localContext;
}

/**
* This returns the current field in its query representations.
*
* @return the current merged fields
*/
public MergedField getField() {
return currentField;
}

public EngineParameters transform(Consumer<Builder> builderConsumer) {
Builder builder = newParameters(this);
builderConsumer.accept(builder);
return builder.build();
}

@Override
public String toString() {
return String.format("EngineParameters { path=%s, executionStepInfo=%s, source=%s, fields=%s }",
path, executionStepInfo, source, fields);
}

public static Builder newParameters() {
return new Builder();
}

public static Builder newParameters(EngineParameters oldParameters) {
return new Builder(oldParameters);
}

@Internal
public static class Builder {
ExecutionStepInfo executionStepInfo;
Object source;
Object localContext;
MergedSelectionSet fields;
NonNullableFieldValidator nonNullableFieldValidator;
ResultPath path = ResultPath.rootPath();
MergedField currentField;
OperationDefinition.Operation operation;

/**
* @see EngineParameters#newParameters()
*/
private Builder() {
}

/**
* @see EngineParameters#newParameters(EngineParameters)
*/
private Builder(EngineParameters oldParameters) {
this.executionStepInfo = oldParameters.executionStepInfo;
this.source = oldParameters.source;
this.localContext = oldParameters.localContext;
this.fields = oldParameters.fields;
this.nonNullableFieldValidator = oldParameters.nonNullableFieldValidator;
this.currentField = oldParameters.currentField;
this.path = oldParameters.path;
this.operation = oldParameters.operation;
}

public Builder executionStepInfo(ExecutionStepInfo executionStepInfo) {
this.executionStepInfo = executionStepInfo;
return this;
}

public Builder executionStepInfo(ExecutionStepInfo.Builder executionStepInfoBuilder) {
this.executionStepInfo = executionStepInfoBuilder.build();
return this;
}

public Builder fields(MergedSelectionSet fields) {
this.fields = fields;
return this;
}

public Builder field(MergedField currentField) {
this.currentField = currentField;
return this;
}

public Builder source(Object source) {
this.source = source;
return this;
}

public Builder localContext(Object localContext) {
this.localContext = localContext;
return this;
}

public Builder nonNullFieldValidator(NonNullableFieldValidator nonNullableFieldValidator) {
this.nonNullableFieldValidator = Assert.assertNotNull(nonNullableFieldValidator, () -> "requires a NonNullValidator");
return this;
}

public Builder path(ResultPath path) {
this.path = path;
return this;
}

public Builder operation(OperationDefinition.Operation operation) {
this.operation = operation;
return this;
}

public EngineParameters build() {
return new EngineParameters(this);
}
}
}
15 changes: 15 additions & 0 deletions src/main/java/graphql/engine/GraphQLEngine.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package graphql.engine;

import graphql.ExecutionResult;
import graphql.execution.ExecutionContext;
import graphql.execution.NonNullableFieldWasNullException;
import graphql.execution.instrumentation.Instrumentation;

import java.util.concurrent.CompletableFuture;

public interface GraphQLEngine {

Instrumentation getInstrumentation();
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instrumentation is engine specific - it has to be


CompletableFuture<ExecutionResult> execute(ExecutionContext executionContext, EngineParameters parameters) throws NonNullableFieldWasNullException;
}