Skip to content

Commit db9b4fe

Browse files
authored
Pass only the minimum set of fields needed to resolvers (#12)
* Pass only the minimum set of fields needed to resolvers * Add a test that ensures only the minimum set of values needed for resolvers are being passed
1 parent 7cf21be commit db9b4fe

File tree

2 files changed

+43
-2
lines changed

2 files changed

+43
-2
lines changed

lib/workflow.ex

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1005,18 +1005,32 @@ defmodule Pacer.Workflow do
10051005
case module.__graph__(:resolver, vertex) do
10061006
{:field, resolver} when is_function(resolver, 1) ->
10071007
metadata = %{field: vertex, workflow: workflow.__struct__}
1008+
resolver_args = Map.take(workflow, [vertex | module.__graph__(:dependencies, vertex)])
10081009

10091010
:telemetry.span([:pacer, :execute_vertex], metadata, fn ->
1010-
result = Map.put(workflow, vertex, resolver.(workflow))
1011+
result =
1012+
Map.put(
1013+
workflow,
1014+
vertex,
1015+
resolver.(resolver_args)
1016+
)
1017+
10111018
{result, metadata}
10121019
end)
10131020

10141021
{:batch, [{field, resolver}]} ->
10151022
metadata = %{field: field, workflow: workflow.__struct__}
10161023

10171024
try do
1025+
resolver_args =
1026+
Map.take(workflow, [field | module.__graph__(:batched_field_dependencies, field)])
1027+
10181028
:telemetry.span([:pacer, :execute_vertex], metadata, fn ->
1019-
{Map.put(workflow, field, resolver.(workflow)), metadata}
1029+
{Map.put(
1030+
workflow,
1031+
field,
1032+
resolver.(resolver_args)
1033+
), metadata}
10201034
end)
10211035
catch
10221036
_kind, _error ->

test/workflow_test.exs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,33 @@ defmodule Pacer.WorkflowTest do
290290
refute Map.has_key?(result, :field_with_default)
291291
end
292292

293+
test "resolver functions only receive their explicit dependencies and the current field when invoked" do
294+
defmodule ResolverInputSizeTest do
295+
use Pacer.Workflow
296+
297+
graph do
298+
field(:a, default: 1)
299+
field(:b, resolver: &__MODULE__.resolve_b/1, dependencies: [:a])
300+
field(:c, resolver: &__MODULE__.resolve_c/1, dependencies: [:a, :b])
301+
end
302+
303+
def resolve_b(args) do
304+
assert map_size(args) == 2
305+
assert Map.has_key?(args, :a)
306+
assert Map.has_key?(args, :b)
307+
end
308+
309+
def resolve_c(args) do
310+
assert map_size(args) == 3
311+
assert Map.has_key?(args, :a)
312+
assert Map.has_key?(args, :b)
313+
assert Map.has_key?(args, :c)
314+
end
315+
end
316+
317+
Pacer.Workflow.execute(ResolverInputSizeTest)
318+
end
319+
293320
test "field defaults" do
294321
assert %TestGraph{
295322
field_a: %FieldNotSet{},

0 commit comments

Comments
 (0)