/** * Executes the graphql query using calling the builder function and giving it a new builder. * <p> * This allows a lambda style like : * <pre> * {@code * ExecutionResult result = graphql.execute(input -> input.query("{hello}").root(startingObj).context(contextObj)); * } * </pre> * * @param builderFunction a function that is given a {@link ExecutionInput.Builder} * * @return an {@link ExecutionResult} which can include errors */ public ExecutionResult execute(UnaryOperator<ExecutionInput.Builder> builderFunction) { return execute(builderFunction.apply(ExecutionInput.newExecutionInput()).build()); }
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; }
public ExecutionInput build() { return new ExecutionInput(query, operationName, context, root, variables, dataLoaderRegistry); } }
private CompletableFuture<ExecutionResult> parseValidateAndExecute(ExecutionInput executionInput, GraphQLSchema graphQLSchema, InstrumentationState instrumentationState) { AtomicReference<ExecutionInput> executionInputRef = new AtomicReference<>(executionInput); PreparsedDocumentEntry preparsedDoc = preparsedDocumentProvider.get(executionInput.getQuery(), transformedQuery -> { // if they change the original query in the pre-parser, then we want to see it downstream from then on executionInputRef.set(executionInput.transform(bldr -> bldr.query(transformedQuery))); return parseAndValidate(executionInputRef.get(), graphQLSchema, instrumentationState); }); if (preparsedDoc.hasErrors()) { return CompletableFuture.completedFuture(new ExecutionResultImpl(preparsedDoc.getErrors())); } return execute(executionInputRef.get(), preparsedDoc.getDocument(), graphQLSchema, instrumentationState); }
log.debug("Executing request. operation name: '{}'. query: '{}'. variables '{}'", executionInput.getOperationName(), executionInput.getQuery(), executionInput.getVariables());
public CompletableFuture<ExecutionResult> execute(Document document, GraphQLSchema graphQLSchema, ExecutionId executionId, ExecutionInput executionInput, InstrumentationState instrumentationState) { NodeUtil.GetOperationResult getOperationResult = NodeUtil.getOperation(document, executionInput.getOperationName()); Map<String, FragmentDefinition> fragmentsByName = getOperationResult.fragmentsByName; OperationDefinition operationDefinition = getOperationResult.operationDefinition; Map<String, Object> inputVariables = executionInput.getVariables(); List<VariableDefinition> variableDefinitions = operationDefinition.getVariableDefinitions(); .mutationStrategy(mutationStrategy) .subscriptionStrategy(subscriptionStrategy) .context(executionInput.getContext()) .root(executionInput.getRoot()) .fragmentsByName(fragmentsByName) .variables(coercedVariables) .document(document) .operationDefinition(operationDefinition) .dataLoaderRegistry(executionInput.getDataLoaderRegistry()) .build(); ); executionContext = instrumentation.instrumentExecutionContext(executionContext, parameters); return executeOperation(executionContext, parameters, executionInput.getRoot(), executionContext.getOperationDefinition());
private PreparsedDocumentEntry parseAndValidate(ExecutionInput executionInput, GraphQLSchema graphQLSchema, InstrumentationState instrumentationState) { log.debug("Parsing query: '{}'...", executionInput.getQuery()); ParseResult parseResult = parse(executionInput, graphQLSchema, instrumentationState); if (parseResult.isFailure()) { log.warn("Query failed to parse : '{}'", executionInput.getQuery()); return new PreparsedDocumentEntry(parseResult.getException().toInvalidSyntaxError()); } else { final Document document = parseResult.getDocument(); log.debug("Validating query: '{}'", executionInput.getQuery()); final List<ValidationError> errors = validate(executionInput, document, graphQLSchema, instrumentationState); if (!errors.isEmpty()) { log.warn("Query failed to validate : '{}'", executionInput.getQuery()); return new PreparsedDocumentEntry(errors); } return new PreparsedDocumentEntry(document); } }
private ParseResult parse(ExecutionInput executionInput, GraphQLSchema graphQLSchema, InstrumentationState instrumentationState) { InstrumentationExecutionParameters parameters = new InstrumentationExecutionParameters(executionInput, graphQLSchema, instrumentationState); InstrumentationContext<Document> parseInstrumentation = instrumentation.beginParse(parameters); Parser parser = new Parser(); Document document; DocumentAndVariables documentAndVariables; try { document = parser.parseDocument(executionInput.getQuery()); documentAndVariables = newDocumentAndVariables() .document(document).variables(executionInput.getVariables()).build(); documentAndVariables = instrumentation.instrumentDocumentAndVariables(documentAndVariables, parameters); } catch (InvalidSyntaxException e) { parseInstrumentation.onCompleted(null, e); return ParseResult.ofError(e); } parseInstrumentation.onCompleted(documentAndVariables.getDocument(), null); return ParseResult.of(documentAndVariables); }
@Override public CompletableFuture<ExecutionResult> executeAsync(ExecutionInput executionInput) { return delegate.executeAsync(executionInput.transform(builder -> builder.context(new ContextWrapper(executionInput.getContext())))); }
private ExecutionResult query(GraphQLSchema schema, ExecutionInput executionInput) { return newGraphQL(schema, executionInput.getContext()).execute(executionInput); }
log.debug("Executing request. operation name: '{}'. query: '{}'. variables '{}'", executionInput.getOperationName(), executionInput.getQuery(), executionInput.getVariables());
InstrumentationState instrumentationState) { NodeUtil.GetOperationResult getOperationResult = NodeUtil.getOperation(document, executionInput.getOperationName()); Map<String, FragmentDefinition> fragmentsByName = getOperationResult.fragmentsByName; OperationDefinition operationDefinition = getOperationResult.operationDefinition; Map<String, Object> inputVariables = executionInput.getVariables(); List<VariableDefinition> variableDefinitions = operationDefinition.getVariableDefinitions(); .instrumentationState(instrumentationState) .graphQLSchema(graphQLSchema) .context(executionInput.getContext()) .root(executionInput.getRoot()) .fragmentsByName(fragmentsByName) .variables(coercedVariables) .source(executionInput.getRoot()) .localContext(executionInput.getContext()) .mergedSelectionSet(mergedSelectionSet) .executionInfo(executionInfo)
private CompletableFuture<ExecutionResult> parseValidateAndExecute(ExecutionInput executionInput, GraphQLSchema graphQLSchema, InstrumentationState instrumentationState) { AtomicReference<ExecutionInput> executionInputRef = new AtomicReference<>(executionInput); PreparsedDocumentEntry preparsedDoc = preparsedDocumentProvider.get(executionInput.getQuery(), transformedQuery -> { // if they change the original query in the pre-parser, then we want to see it downstream from then on executionInputRef.set(executionInput.transform(bldr -> bldr.query(transformedQuery))); return parseAndValidate(executionInputRef, graphQLSchema, instrumentationState); }); if (preparsedDoc.hasErrors()) { return CompletableFuture.completedFuture(new ExecutionResultImpl(preparsedDoc.getErrors())); } return execute(executionInputRef.get(), preparsedDoc.getDocument(), graphQLSchema, instrumentationState); }
private PreparsedDocumentEntry parseAndValidate(ExecutionInput executionInput, GraphQLSchema graphQLSchema, InstrumentationState instrumentationState) { log.debug("Parsing query: '{}'...", executionInput.getQuery()); ParseResult parseResult = parse(executionInput, graphQLSchema, instrumentationState); if (parseResult.isFailure()) { log.warn("Query failed to parse : '{}'", executionInput.getQuery()); return new PreparsedDocumentEntry(parseResult.getException().toInvalidSyntaxError()); } else { final Document document = parseResult.getDocument(); log.debug("Validating query: '{}'", executionInput.getQuery()); final List<ValidationError> errors = validate(executionInput, document, graphQLSchema, instrumentationState); if (!errors.isEmpty()) { log.warn("Query failed to validate : '{}'", executionInput.getQuery()); return new PreparsedDocumentEntry(errors); } return new PreparsedDocumentEntry(document); } }
private ParseResult parse(ExecutionInput executionInput, GraphQLSchema graphQLSchema, InstrumentationState instrumentationState) { InstrumentationExecutionParameters parameters = new InstrumentationExecutionParameters(executionInput, graphQLSchema, instrumentationState); InstrumentationContext<Document> parseInstrumentation = instrumentation.beginParse(parameters); Parser parser = new Parser(); Document document; DocumentAndVariables documentAndVariables; try { document = parser.parseDocument(executionInput.getQuery()); documentAndVariables = newDocumentAndVariables() .document(document).variables(executionInput.getVariables()).build(); documentAndVariables = instrumentation.instrumentDocumentAndVariables(documentAndVariables, parameters); } catch (InvalidSyntaxException e) { parseInstrumentation.onCompleted(null, e); return ParseResult.ofError(e); } parseInstrumentation.onCompleted(documentAndVariables.getDocument(), null); return ParseResult.of(documentAndVariables); }
private ExecutionResult query(GraphQLSchema schema, ExecutionInput executionInput) { return newGraphQL(schema, executionInput.getContext()).execute(executionInput); }
/** * Executes the graphql query using the provided input object builder * <p> * This will return a completed {@link ExecutionResult} * which is the result of executing the provided query. * <p> * This allows a lambda style like : * <pre> * {@code * ExecutionResult result = graphql.execute(input -> input.query("{hello}").root(startingObj).context(contextObj)); * } * </pre> * * @param builderFunction a function that is given a {@link ExecutionInput.Builder} * * @return a promise to an {@link ExecutionResult} which can include errors */ public CompletableFuture<ExecutionResult> execute(UnaryOperator<ExecutionInput.Builder> builderFunction) { return executeAsync(builderFunction.apply(ExecutionInput.newExecutionInput()).build()); }
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; }
log.debug("Executing request. operation name: '{}'. query: '{}'. variables '{}'", executionInput.getOperationName(), executionInput.getQuery(), executionInput.getVariables());
public CompletableFuture<ExecutionResult> execute(Document document, GraphQLSchema graphQLSchema, ExecutionId executionId, ExecutionInput executionInput, InstrumentationState instrumentationState) { NodeUtil.GetOperationResult getOperationResult = NodeUtil.getOperation(document, executionInput.getOperationName()); Map<String, FragmentDefinition> fragmentsByName = getOperationResult.fragmentsByName; OperationDefinition operationDefinition = getOperationResult.operationDefinition; Map<String, Object> inputVariables = executionInput.getVariables(); List<VariableDefinition> variableDefinitions = operationDefinition.getVariableDefinitions(); .mutationStrategy(mutationStrategy) .subscriptionStrategy(subscriptionStrategy) .context(executionInput.getContext()) .root(executionInput.getRoot()) .fragmentsByName(fragmentsByName) .variables(coercedVariables) .document(document) .operationDefinition(operationDefinition) .dataLoaderRegistry(executionInput.getDataLoaderRegistry()) .build(); ); executionContext = instrumentation.instrumentExecutionContext(executionContext, parameters); return executeOperation(executionContext, parameters, executionInput.getRoot(), executionContext.getOperationDefinition());