Skip to content

Commit

Permalink
Merge 926c1b4 into 9cdf956
Browse files Browse the repository at this point in the history
  • Loading branch information
thebugcatcher authored Oct 8, 2018
2 parents 9cdf956 + 926c1b4 commit 75ff150
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 21 deletions.
15 changes: 8 additions & 7 deletions lib/rummage_ecto.ex
Original file line number Diff line number Diff line change
Expand Up @@ -157,10 +157,11 @@ defmodule Rummage.Ecto do
sort: Keyword.get(opts, :sort, RConfig.sort()),
paginate: Keyword.get(opts, :paginate, RConfig.paginate())]

rummage =
Enum.reduce(hooks, rummage, &format_hook_params(&1, &2, queryable, opts))

{Enum.reduce(hooks, queryable, &run_hook(&1, &2, rummage)), rummage}
Enum.reduce(hooks, {queryable, rummage}, fn(hook, {queryable, rummage}) ->
rummage = format_hook_params(hook, rummage, queryable, opts)
queryable = run_hook(hook, queryable, rummage)
{queryable, rummage}
end)
end

defp format_hook_params({_, nil}, rummage, _, _), do: rummage
Expand Down Expand Up @@ -229,14 +230,14 @@ defmodule Rummage.Ecto do
alias Rummage.Ecto.Config, as: RConfig

def rummage(rummage, opts \\ []) do
Rummage.Ecto.rummage(__MODULE__, rummage, uniq_merge(opts, defaults()))
Rummage.Ecto.rummage(__MODULE__, rummage, uniq_merge(opts, __rummage_defaults__()))
end

def rummageq(queryable, rummage, opts \\ []) do
Rummage.Ecto.rummage(queryable, rummage, uniq_merge(opts, defaults()))
Rummage.Ecto.rummage(queryable, rummage, uniq_merge(opts, __rummage_defaults__()))
end

defp defaults() do
def __rummage_defaults__ do
keys = ~w{repo per_page search sort paginate}a
Enum.map(keys, &get_defs/1)
end
Expand Down
12 changes: 6 additions & 6 deletions lib/rummage_ecto/hooks/custom_sort.ex
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@ defmodule Rummage.Ecto.Hook.CustomSort do

# Helper function which handles addition of paginated query on top of
# the sent queryable variable
defp handle_sort(queryable, {field, order}) do
defp handle_sort(queryable, %{scope: scope, order: order}) do
module = get_module(queryable)
name = :"__rummage_custom_sort_#{field}"
name = :"__rummage_custom_sort_#{scope}"

case function_exported?(module, name, 1) do
true -> apply(module, name, [{queryable, order}])
_ -> "No scope `#{field}` of type custom_sort defined in #{module}"
_ -> "No scope `#{scope}` of type custom_sort defined in #{module}"
end
end

Expand All @@ -34,8 +34,8 @@ defmodule Rummage.Ecto.Hook.CustomSort do
iex> Sort.format_params(Parent, %{}, [])
%{assoc: [], order: :asc}
"""
@spec format_params(Ecto.Query.t(), map() | tuple(), keyword()) :: map()
def format_params(queryable, {sort_scope, order}, opts) do
@spec format_params(Ecto.Query.t(), map(), keyword()) :: map()
def format_params(queryable, %{scope: sort_scope, order: order}, opts) do
module = get_module(queryable)
name = :"__rummage_sort_#{sort_scope}"

Expand All @@ -44,7 +44,7 @@ defmodule Rummage.Ecto.Hook.CustomSort do
format_params(queryable, sort_params, opts)
_ ->
case function_exported?(module, :"__rummage_custom_sort_#{sort_scope}", 1) do
true -> {sort_scope, order}
true -> %{scope: sort_scope, order: order}
_ -> raise "No scope `#{sort_scope}` of type custom_sort defined in the #{module}"
end
end
Expand Down
2 changes: 2 additions & 0 deletions lib/rummage_ecto/hooks/paginate.ex
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,7 @@ defmodule Rummage.Ecto.Hook.Paginate do
|> (& &1 / per_page).()
|> Float.ceil()
|> trunc()
max_page = max_page == 0 && 1 || max_page

%{page: Map.get(paginate_params, :page),
per_page: per_page, total_count: total_count, max_page: max_page}
Expand All @@ -377,6 +378,7 @@ defmodule Rummage.Ecto.Hook.Paginate do
|> apply(:all, [distinct(query, :true)])
|> Enum.count()
end

defp get_count(query, repo, pk) do
query = select(query, [s], count(field(s, ^pk), :distinct))
hd(apply(repo, :all, [query]))
Expand Down
4 changes: 2 additions & 2 deletions lib/rummage_ecto/hooks/sort.ex
Original file line number Diff line number Diff line change
Expand Up @@ -343,8 +343,8 @@ defmodule Rummage.Ecto.Hook.Sort do
iex> Sort.format_params(Parent, %{}, [])
%{assoc: [], order: :asc}
"""
@spec format_params(Ecto.Query.t(), map() | tuple(), keyword()) :: map()
def format_params(queryable, {sort_scope, order}, opts) do
@spec format_params(Ecto.Query.t(), map(), keyword()) :: map()
def format_params(queryable, %{scope: sort_scope, order: order}, opts) do
module = get_module(queryable)
name = :"__rummage_sort_#{sort_scope}"
sort_params = case function_exported?(module, name, 1) do
Expand Down
12 changes: 6 additions & 6 deletions test/rummage_ecto_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ defmodule Rummage.EctoTest do
search: %{price: %{search_type: :lteq, search_term: 10, assoc: [],
search_expr: :where}},
sort: %{field: :name, order: :asc, assoc: []},
paginate: %{per_page: 2, page: 2, max_page: 4, total_count: 8},
paginate: %{per_page: 2, page: 2, max_page: 1, total_count: 2},
}
end

Expand Down Expand Up @@ -263,7 +263,7 @@ defmodule Rummage.EctoTest do
search: %{name: %{assoc: [inner: :category], search_term: "1",
search_type: :like, search_expr: :where}},
sort: %{field: :name, order: :asc, assoc: [inner: :category]},
paginate: %{per_page: 2, page: 1, max_page: 4, total_count: 8}
paginate: %{per_page: 2, page: 1, max_page: 1, total_count: 2}
}
end

Expand Down Expand Up @@ -398,7 +398,7 @@ defmodule Rummage.EctoTest do
test "rummage call with sort scope" do
create_categories_and_products()

rummage = %{sort: {:category_name, :asc}}
rummage = %{sort: %{scope: :category_name, order: :asc}}

{queryable, rummage} = Product.rummage(rummage)

Expand All @@ -413,7 +413,7 @@ defmodule Rummage.EctoTest do
"Product 2->3", "Product 1->3",
"Product 2->4", "Product 1->4"]
)
rummage = %{sort: {:invalid_scope, :asc}}
rummage = %{sort: %{scope: :invalid_scope, order: :asc}}

assert_raise RuntimeError, ~r/No scope `invalid_scope`/, fn ->
Product.rummage(rummage)
Expand Down Expand Up @@ -467,7 +467,7 @@ defmodule Rummage.EctoTest do
test "rummage call with custom sort scope" do
create_categories_and_products()

rummage = %{sort: {:category_microseconds, :desc}}
rummage = %{sort: %{scope: :category_microseconds, order: :desc}}

{queryable, rummage} = Product.rummage(rummage)

Expand All @@ -483,7 +483,7 @@ defmodule Rummage.EctoTest do
"Product 2->4", "Product 1->4"]
)

rummage = %{sort: {:category_milliseconds, :desc}}
rummage = %{sort: %{scope: :category_milliseconds, order: :desc}}

assert_raise RuntimeError, ~r/No scope `category_milliseconds`/, fn ->
Product.rummage(rummage)
Expand Down

0 comments on commit 75ff150

Please sign in to comment.