Packages

Library for building an ecto query from some JSON API parameters.

Current section

Files

Jump to
json_api_ecto_builder lib appliers sort.ex
Raw

lib/appliers/sort.ex

defmodule JsonApiEctoBuilder.Applier.Sort do
import Ecto.Query
alias JsonApiEctoBuilder.ParamParser.Sort
def apply(query, %{ "sort" => _ } = param, base_alias, primary_key) do
order_by =
param
|> Sort.parse(base_alias)
|> Enum.reduce([], fn
{field, :asc, binding}, orders ->
orders ++ [asc: dynamic([{^binding, x}], field(x, ^field))]
{field, :desc, binding}, orders ->
orders ++ [desc: dynamic([{^binding, x}], field(x, ^field))]
end)
from x in query,
windows: [w: [order_by: ^order_by]],
select: %{id: field(x, ^primary_key), ordinal: row_number() |> over(:w)},
distinct: field(x, ^primary_key)
end
def apply(query, _, _, primary_key) do
from x in query,
select: %{id: field(x, ^primary_key), ordinal: row_number() |> over(order_by: x.id)},
distinct: field(x, ^primary_key)
end
end