Current section
Files
Jump to
Current section
Files
lib/pager.ex
defmodule Pager do
import Ecto.Query, warn: false
@moduledoc """
Documentation for `Pager`.
"""
def page(repo, query, nil, per_page) do
page(repo, query, 1, per_page)
end
def page(repo, query, page, per_page) when is_nil(per_page) or per_page == "" do
page(repo, query, page, 50)
end
def page(repo, query, page, per_page) when is_binary(page) and is_binary(per_page) do
page(repo, query, String.to_integer(page), String.to_integer(per_page))
end
def page(repo, query, page, per_page) when is_binary(page) do
page(repo, query, String.to_integer(page), per_page)
end
def page(repo, query, page, per_page) when is_binary(per_page) do
page(repo, query, page, String.to_integer(per_page))
end
def page(repo, query, page, per_page) do
results = query(repo, query, page, per_page: per_page)
count = repo.one(from(t in subquery(query), select: count("*")))
%{
has_next: length(results) > per_page,
has_prev: page > 1,
prev_page: page - 1,
page: page,
next_page: page + 1,
first: (page - 1) * per_page + 1,
last: Enum.min([page * per_page, count]),
count: count,
list: Enum.slice(results, 0, per_page)
}
end
defp query(repo, query, page, per_page: per_page) do
query
|> limit(^(per_page + 1))
|> offset(^(per_page * (page - 1)))
|> repo.all()
end
end