Skip to content

Commit

Permalink
Use caller when executing queries
Browse files Browse the repository at this point in the history
  • Loading branch information
drewolson committed Mar 27, 2017
1 parent 961fdac commit 03dc132
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 13 deletions.
14 changes: 7 additions & 7 deletions lib/scrivener/paginater/ecto/query.ex
Original file line number Diff line number Diff line change
Expand Up @@ -6,36 +6,36 @@ 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)
|> exclude(:select)
|> exclude(:order_by)
|> subquery
|> select(count("*"))
|> repo.one
|> repo.one(caller: caller)

total_entries || 0
end
Expand Down
2 changes: 1 addition & 1 deletion mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -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},
Expand Down
6 changes: 3 additions & 3 deletions mix.lock
Original file line number Diff line number Diff line change
@@ -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], []},
Expand All @@ -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], []}}
34 changes: 34 additions & 0 deletions test/scrivener/paginator/ecto/query_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions test/test_helper.exs
Original file line number Diff line number Diff line change
Expand Up @@ -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()

0 comments on commit 03dc132

Please sign in to comment.