diff --git a/lib/scrivener/paginater/ecto/query.ex b/lib/scrivener/paginater/ecto/query.ex index e3cb278..313a6d6 100644 --- a/lib/scrivener/paginater/ecto/query.ex +++ b/lib/scrivener/paginater/ecto/query.ex @@ -53,7 +53,7 @@ defimpl Scrivener.Paginater, for: Ecto.Query do total_entries || 0 end - defp aggregate(%{distinct: %{expr: [_ | _]}} = query) do + defp aggregate(%{distinct: %{expr: expr}} = query) when expr == true or is_list(expr) do query |> exclude(:select) |> count() diff --git a/test/scrivener/paginator/ecto/query_test.exs b/test/scrivener/paginator/ecto/query_test.exs index f67558c..4b36c9b 100644 --- a/test/scrivener/paginator/ecto/query_test.exs +++ b/test/scrivener/paginator/ecto/query_test.exs @@ -403,5 +403,21 @@ defmodule Scrivener.Paginator.Ecto.QueryTest do assert page.total_entries == 7 assert page.total_pages == 2 end + + test "pagination plays nice with absolute distinct on a join query" do + create_posts() + + page = + Post + |> distinct(true) + |> join(:inner, [p], c in assoc(p, :comments)) + |> Scrivener.Ecto.Repo.paginate() + + assert length(page.entries) == 1 + assert page.page_size == 5 + assert page.page_number == 1 + assert page.total_entries == 1 + assert page.total_pages == 1 + end end end