Skip to content

Commit

Permalink
Merge pull request #3 from whoosh-golf/latest
Browse files Browse the repository at this point in the history
Latest
  • Loading branch information
cspeper authored Apr 30, 2022
2 parents b5206b5 + 8b226c8 commit dee7b76
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lib/dataloader/ecto.ex
Original file line number Diff line number Diff line change
Expand Up @@ -672,7 +672,7 @@ if Code.ensure_loaded?(Ecto) do
records = records |> Enum.map(&Map.put(&1, field, empty))

results =
if query.limit || query.offset do
if query.limit || query.offset || Enum.any?(query.order_bys) do
records
|> preload_lateral(field, query, source.repo, repo_opts)
else
Expand Down
49 changes: 49 additions & 0 deletions test/dataloader/ecto_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,19 @@ defmodule Dataloader.EctoTest do
end

defp query(User, args, test_pid) do
{sort_order, args} = Map.pop(args, :sort_order)
{sort_by, args} = Map.pop(args, :sort_by)
send(test_pid, :querying)

User
|> where(^Enum.to_list(args))
|> then(fn user ->
if is_nil(sort_by) or is_nil(sort_order) do
user
else
order_by(user, {^sort_order, ^sort_by})
end
end)
end

defp query(queryable, _args, test_pid) do
Expand Down Expand Up @@ -324,6 +333,46 @@ defmodule Dataloader.EctoTest do
assert length(loaded_posts) == 2
end

test "order_by works", %{loader: loader} do
user1 = %User{username: "Ben Wilson"} |> Repo.insert!()
user2 = %User{username: "Bruce Williams"} |> Repo.insert!()

post1 = %Post{user_id: user1.id} |> Repo.insert!()

[
%Like{user_id: user1.id, post_id: post1.id},
%Like{user_id: user2.id, post_id: post1.id}
]
|> Enum.map(&Repo.insert/1)

for {sort_order, expected_usernames} <- [
{:asc, ["Ben Wilson", "Bruce Williams"]},
{:desc, ["Bruce Williams", "Ben Wilson"]}
] do
loader =
loader
|> Dataloader.load(
Test,
{:liking_users, [sort_order: sort_order, sort_by: :username]},
post1
)
|> Dataloader.run()

loaded_posts =
loader
|> Dataloader.get(
Test,
{:liking_users, [sort_order: sort_order, sort_by: :username]},
post1
)

ordered_usernames = Enum.map(loaded_posts, & &1.username)

assert ordered_usernames == expected_usernames,
"got #{inspect(ordered_usernames)} but was expecting #{inspect(expected_usernames)} for sort_order #{sort_order}"
end
end

test "works with query filtering", %{loader: loader} do
user1 = %User{username: "Ben Wilson"} |> Repo.insert!()
user2 = %User{username: "Bruce Williams"} |> Repo.insert!()
Expand Down

0 comments on commit dee7b76

Please sign in to comment.