Packages
absinthe
1.4.12
1.11.0
1.10.2
1.10.1
1.10.0
1.9.1
1.9.0
1.8.0
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.8
1.6.7
retired
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.6.0-rc.1
1.6.0-rc.0
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.5.0-rc.5
1.5.0-rc.4
1.5.0-rc.3
1.5.0-rc.2
1.5.0-rc.1
1.5.0-rc.0
1.5.0-beta.2
1.5.0-beta.1
1.5.0-beta.0
1.5.0-alpha.4
1.5.0-alpha.3
1.5.0-alpha.2
1.5.0-alpha.1
1.5.0-alpha.0
1.4.16
1.4.15
1.4.14
1.4.13
1.4.12
1.4.11
1.4.10
1.4.9
1.4.8
retired
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.4.0-rc.3
1.4.0-rc.2
1.4.0-rc.1
1.4.0-rc.0
1.4.0-beta.5
1.4.0-beta.4
1.4.0-beta.3
1.4.0-beta.2
1.4.0-beta.1
1.3.2
1.3.1
1.3.0
1.3.0-rc.0
1.3.0-beta.2
1.3.0-beta.1
1.3.0-beta.0
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.2.0-rc.0
1.2.0-beta.0
1.2.0-alpha0
1.2.0-alpha.2
1.2.0-alpha.1
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.0
0.5.2
0.5.1
0.5.0
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.2.3
0.2.2
0.2.1
0.1.0
GraphQL for Elixir
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/absinthe/pipeline/batch_resolver.ex
defmodule Absinthe.Pipeline.BatchResolver do
alias Absinthe.Phase.Document.Execution
require Logger
@moduledoc false
def run([], _), do: []
def run([bp | _] = blueprints, options) do
schema = Keyword.fetch!(options, :schema)
plugins = schema.plugins()
acc = init(blueprints, :acc)
ctx = init(blueprints, :context)
# This will serve as a generic cross document execution struct
exec = %{
bp.execution
| acc: acc,
context: ctx,
fragments: %{},
validation_errors: [],
result: nil
}
resolution_phase = {Execution.Resolution, [plugin_callbacks: false] ++ options}
do_resolve(blueprints, [resolution_phase], exec, plugins, resolution_phase, options)
end
defp init(blueprints, attr) do
Enum.reduce(blueprints, %{}, &Map.merge(Map.fetch!(&1.execution, attr), &2))
end
# defp update()
defp do_resolve(blueprints, phases, exec, plugins, resolution_phase_template, options) do
exec =
Enum.reduce(plugins, exec, fn plugin, exec ->
plugin.before_resolution(exec)
end)
abort_on_error? = Keyword.get(options, :abort_on_error, true)
{blueprints, exec} = execute(blueprints, phases, abort_on_error?, [], exec)
exec =
Enum.reduce(plugins, exec, fn plugin, exec ->
plugin.after_resolution(exec)
end)
plugins
|> Absinthe.Plugin.pipeline(exec)
|> case do
[] ->
blueprints
pipeline ->
pipeline =
Absinthe.Pipeline.replace(pipeline, Execution.Resolution, resolution_phase_template)
do_resolve(blueprints, pipeline, exec, plugins, resolution_phase_template, options)
end
end
defp execute([], _phases, _abort_on_error?, results, exec) do
{:lists.reverse(results), exec}
end
defp execute([bp | rest], phases, abort_on_error?, results, exec) do
bp
|> update_exec(exec)
|> run_pipeline(phases, abort_on_error?)
|> case do
{:ok, bp} ->
%{acc: acc, context: ctx} = bp.execution
exec = %{exec | acc: acc, context: ctx}
execute(rest, phases, abort_on_error?, [bp | results], exec)
:error ->
execute(rest, phases, abort_on_error?, [:error | results], exec)
end
end
defp run_pipeline(bp, phases, _abort_on_error? = true) do
{:ok, blueprint, _} = Absinthe.Pipeline.run(bp, phases)
{:ok, blueprint}
end
defp run_pipeline(bp, phases, _) do
{:ok, blueprint, _} = Absinthe.Pipeline.run(bp, phases)
{:ok, blueprint}
rescue
e ->
pipeline_error(e)
:error
end
defp update_exec(%{execution: execution} = bp, %{acc: acc, context: ctx}) do
%{bp | execution: %{execution | acc: acc, context: ctx}}
end
def pipeline_error(exception) do
message = Exception.message(exception)
stacktrace = System.stacktrace() |> Exception.format_stacktrace()
Logger.error("""
#{message}
#{stacktrace}
""")
end
end