diff --git a/lib/dataloader/ecto.ex b/lib/dataloader/ecto.ex index d32dc11..f18ca71 100644 --- a/lib/dataloader/ecto.ex +++ b/lib/dataloader/ecto.ex @@ -600,8 +600,10 @@ if Code.ensure_loaded?(Ecto) do on_timeout: :kill_task ] + batches = Enum.to_list(source.batches) + results = - source.batches + batches |> Task.async_stream( fn batch -> id = :erlang.unique_integer() @@ -621,7 +623,7 @@ if Code.ensure_loaded?(Ecto) do {:exit, reason} -> {:error, reason} end) - source.batches + batches |> Enum.map(fn {key, _set} -> key end) |> Enum.zip(results) |> Map.new() diff --git a/test/dataloader/ecto_test.exs b/test/dataloader/ecto_test.exs index 66d042a..3e745ff 100644 --- a/test/dataloader/ecto_test.exs +++ b/test/dataloader/ecto_test.exs @@ -456,4 +456,34 @@ defmodule Dataloader.EctoTest do Dataloader.get(loader, Timeout, User, user.id) end end + + test "when there are many batches (more than 32)" do + source = + Dataloader.Ecto.new( + Repo, + query: fn queryable, _ -> + queryable + end + ) + + loader = + Dataloader.new() + |> Dataloader.add_source(Test, source) + + users = + for x <- 0..50 do + %User{username: "Ben Wilson #{x}"} |> Repo.insert!() + end + + loader = + users + |> Enum.reduce(loader, fn user, loader -> + # Force a batch per user by adding id to batch key + Dataloader.load(loader, Test, {User, id: user.id}, user.id) + end) + |> Dataloader.run() + + assert Enum.map(users, &Dataloader.get(loader, Test, {User, id: &1.id}, &1.id)) == + users + end end