diff --git a/lib/scrivener/paginater/ecto/query.ex b/lib/scrivener/paginater/ecto/query.ex index 4d2b075..a73f075 100644 --- a/lib/scrivener/paginater/ecto/query.ex +++ b/lib/scrivener/paginater/ecto/query.ex @@ -6,28 +6,28 @@ defimpl Scrivener.Paginater, for: Ecto.Query do @moduledoc false @spec paginate(Ecto.Query.t, Scrivener.Config.t) :: Scrivener.Page.t - def paginate(query, %Config{page_size: page_size, page_number: page_number, module: repo}) do - total_entries = total_entries(query, repo) + def paginate(query, %Config{page_size: page_size, page_number: page_number, module: repo, caller: caller}) do + total_entries = total_entries(query, repo, caller) %Page{ page_size: page_size, page_number: page_number, - entries: entries(query, repo, page_number, page_size), + entries: entries(query, repo, page_number, page_size, caller), total_entries: total_entries, total_pages: total_pages(total_entries, page_size) } end - defp entries(query, repo, page_number, page_size) do + defp entries(query, repo, page_number, page_size, caller) do offset = page_size * (page_number - 1) query |> limit(^page_size) |> offset(^offset) - |> repo.all + |> repo.all(caller: caller) end - defp total_entries(query, repo) do + defp total_entries(query, repo, caller) do total_entries = query |> exclude(:preload) @@ -35,7 +35,7 @@ defimpl Scrivener.Paginater, for: Ecto.Query do |> exclude(:order_by) |> subquery |> select(count("*")) - |> repo.one + |> repo.one(caller: caller) total_entries || 0 end diff --git a/mix.exs b/mix.exs index 2fab4ea..4d6b8fa 100644 --- a/mix.exs +++ b/mix.exs @@ -41,7 +41,7 @@ defmodule Scrivener.Ecto.Mixfile do defp deps do [ - {:scrivener, "~> 2.0"}, + {:scrivener, "~> 2.3"}, {:ecto, "~> 2.0"}, {:dialyxir, "~> 0.5.0", only: :dev}, {:earmark, ">= 0.0.0", only: :dev}, diff --git a/mix.lock b/mix.lock index af57660..e913319 100644 --- a/mix.lock +++ b/mix.lock @@ -1,6 +1,6 @@ -%{"connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [], []}, +%{"connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], []}, "db_connection": {:hex, :db_connection, "1.1.1", "f9d246e8f65b9490945cf7360875eee18fcec9a0115207603215eb1fd94c39ef", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, optional: true]}]}, - "decimal": {:hex, :decimal, "1.3.1", "157b3cedb2bfcb5359372a7766dd7a41091ad34578296e951f58a946fcab49c6", [], []}, + "decimal": {:hex, :decimal, "1.3.1", "157b3cedb2bfcb5359372a7766dd7a41091ad34578296e951f58a946fcab49c6", [:mix], []}, "dialyxir": {:hex, :dialyxir, "0.5.0", "5bc543f9c28ecd51b99cc1a685a3c2a1a93216990347f259406a910cf048d1d7", [:mix], []}, "dialyze": {:hex, :dialyze, "0.2.1"}, "earmark": {:hex, :earmark, "1.1.1", "433136b7f2e99cde88b745b3a0cfc3fbc81fe58b918a09b40fce7f00db4d8187", [:mix], []}, @@ -9,4 +9,4 @@ "ex_spec": {:hex, :ex_spec, "1.0.0", "b1e791072fecbf80c725adf45e7cbdf3d96af3765638a1f1547824706ece4bc9", [:mix], []}, "poolboy": {:hex, :poolboy, "1.5.1", "6b46163901cfd0a1b43d692657ed9d7e599853b3b21b95ae5ae0a777cf9b6ca8", [:rebar], []}, "postgrex": {:hex, :postgrex, "0.13.1", "ebf17b7348922af9db8b4d70f946328ab9ef5123526bf05567d9306393fce104", [:mix], [{:connection, "~> 1.0", [hex: :connection, optional: false]}, {:db_connection, "~> 1.1", [hex: :db_connection, optional: false]}, {:decimal, "~> 1.0", [hex: :decimal, optional: false]}]}, - "scrivener": {:hex, :scrivener, "2.2.1", "5a84cdfc042e3c318a03f965d8197b8294676a8fff7c4a29e482a90c467ebf19", [:mix], []}} + "scrivener": {:hex, :scrivener, "2.3.0", "16b1d744202d47233798205447b35592d96a209241c566304f84ddef63c718b2", [:mix], []}} diff --git a/test/scrivener/paginator/ecto/query_test.exs b/test/scrivener/paginator/ecto/query_test.exs index ba4bf93..7cd97a2 100644 --- a/test/scrivener/paginator/ecto/query_test.exs +++ b/test/scrivener/paginator/ecto/query_test.exs @@ -129,6 +129,40 @@ defmodule Scrivener.Paginator.Ecto.QueryTest do assert page.total_pages == 2 end + test "can be provided the caller as options" do + create_posts() + parent = self() + + task = Task.async(fn -> + Post + |> Scrivener.Ecto.Repo.paginate(caller: parent) + end) + + page = Task.await(task) + + assert page.page_size == 5 + assert page.page_number == 1 + assert page.total_entries == 7 + assert page.total_pages == 2 + end + + test "can be provided the caller as a map" do + create_posts() + parent = self() + + task = Task.async(fn -> + Post + |> Scrivener.Ecto.Repo.paginate(%{"caller" => parent}) + end) + + page = Task.await(task) + + assert page.page_size == 5 + assert page.page_number == 1 + assert page.total_entries == 7 + assert page.total_pages == 2 + end + test "will respect the max_page_size configuration" do page = Post diff --git a/test/test_helper.exs b/test/test_helper.exs index 51e70c3..ce1d2f3 100644 --- a/test/test_helper.exs +++ b/test/test_helper.exs @@ -9,11 +9,11 @@ defmodule Scrivener.Ecto.TestCase do end setup do - Ecto.Adapters.SQL.Sandbox.mode(Scrivener.Ecto.Repo, :manual) - :ok = Ecto.Adapters.SQL.Sandbox.checkout(Scrivener.Ecto.Repo) end end Scrivener.Ecto.Repo.start_link +Ecto.Adapters.SQL.Sandbox.mode(Scrivener.Ecto.Repo, :manual) + ExUnit.start()