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

Executor: allow overriding AsyncExecute #500

Closed
wants to merge 2 commits into from
Closed
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
14 changes: 8 additions & 6 deletions src/FSharp.Data.GraphQL.Server/Executor.fs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ open FSharp.Data.GraphQL.Parser
open FSharp.Data.GraphQL.Planning

/// A function signature that represents a middleware for schema compile phase.
/// I takes two arguments: A schema compile context, containing all the data used for the
/// It takes two arguments: A schema compile context, containing all the data used for the
/// compilation phase, and another function that can be called to pass
/// the execution for the next middleware.
type SchemaCompileMiddleware =
Expand Down Expand Up @@ -175,6 +175,8 @@ type Executor<'Root>(schema: ISchema<'Root>, middlewares : IExecutorMiddleware s
new(schema) =
Executor(schema, middlewares = Seq.empty)

abstract member AsyncExecute: ExecutionPlan * 'Root option * ImmutableDictionary<string, JsonElement> option -> Async<GQLExecutionResult>

/// <summary>
/// Asynchronously executes a provided execution plan. In case of repetitive queries, execution plan may be preprocessed
/// and cached using `documentId` as an identifier.
Expand All @@ -186,7 +188,7 @@ type Executor<'Root>(schema: ISchema<'Root>, middlewares : IExecutorMiddleware s
/// <param name="executionPlan">Execution plan for the operation.</param>
/// <param name="data">Optional object provided as a root to all top level field resolvers</param>
/// <param name="variables">Map of all variable values provided by the client request.</param>
member _.AsyncExecute(executionPlan: ExecutionPlan, ?data: 'Root, ?variables: ImmutableDictionary<string, JsonElement>): Async<GQLExecutionResult> =
default _.AsyncExecute(executionPlan: ExecutionPlan, ?data: 'Root, ?variables: ImmutableDictionary<string, JsonElement>): Async<GQLExecutionResult> =
execute (executionPlan, data, variables)

/// <summary>
Expand All @@ -200,10 +202,10 @@ type Executor<'Root>(schema: ISchema<'Root>, middlewares : IExecutorMiddleware s
/// <param name="variables">Map of all variable values provided by the client request.</param>
/// <param name="operationName">In case when document consists of many operations, this field describes which of them to execute.</param>
/// <param name="meta">A plain dictionary of metadata that can be used through execution customizations.</param>
member _.AsyncExecute(ast: Document, ?data: 'Root, ?variables: ImmutableDictionary<string, JsonElement>, ?operationName: string, ?meta : Metadata): Async<GQLExecutionResult> =
member this.AsyncExecute(ast: Document, ?data: 'Root, ?variables: ImmutableDictionary<string, JsonElement>, ?operationName: string, ?meta : Metadata): Async<GQLExecutionResult> =
let meta = defaultArg meta Metadata.Empty
match createExecutionPlan (ast, operationName, meta) with
| Ok executionPlan -> execute (executionPlan, data, variables)
| Ok executionPlan -> this.AsyncExecute (executionPlan, data, variables)
| Error (documentId, errors) -> async.Return <| GQLExecutionResult.Invalid(documentId, errors, meta)

/// <summary>
Expand All @@ -217,11 +219,11 @@ type Executor<'Root>(schema: ISchema<'Root>, middlewares : IExecutorMiddleware s
/// <param name="variables">Map of all variable values provided by the client request.</param>
/// <param name="operationName">In case when document consists of many operations, this field describes which of them to execute.</param>
/// <param name="meta">A plain dictionary of metadata that can be used through execution customizations.</param>
member _.AsyncExecute(queryOrMutation: string, ?data: 'Root, ?variables: ImmutableDictionary<string, JsonElement>, ?operationName: string, ?meta : Metadata): Async<GQLExecutionResult> =
member this.AsyncExecute(queryOrMutation: string, ?data: 'Root, ?variables: ImmutableDictionary<string, JsonElement>, ?operationName: string, ?meta : Metadata): Async<GQLExecutionResult> =
let meta = defaultArg meta Metadata.Empty
let ast = parse queryOrMutation
match createExecutionPlan (ast, operationName, meta) with
| Ok executionPlan -> execute (executionPlan, data, variables)
| Ok executionPlan -> this.AsyncExecute (executionPlan, data, variables)
| Error (documentId, errors) -> async.Return <| GQLExecutionResult.Invalid(documentId, errors, meta)

/// Creates an execution plan for provided GraphQL document AST without
Expand Down
Loading