Current section
Files
Jump to
Current section
Files
lib/query/order_by.ex
defmodule QueryBuilder.Query.OrderBy do
@moduledoc false
require Ecto.Query
import QueryBuilder.Utils
def order_by(%QueryBuilder.Query{ecto_query: ecto_query, token: token}, assoc_fields, value) do
token = QueryBuilder.Token.token(ecto_query, token, assoc_fields)
%QueryBuilder.Query{ecto_query: ecto_query, token: token} =
QueryBuilder.JoinMaker.make_joins(ecto_query, token)
%QueryBuilder.Query{
ecto_query: apply_order_values(ecto_query, token, List.wrap(value)),
token: token
}
end
def order_by(query, assoc_fields, value) do
order_by(%QueryBuilder.Query{ecto_query: query, token: nil}, assoc_fields, value)
end
defp apply_order_values(query, _token, []), do: query
defp apply_order_values(query, token, [order | tail]) do
query = apply_order(query, token, order)
apply_order_values(query, token, tail)
end
defp apply_order(query, token, {field, direction}) do
{field, binding} = find_field_and_binding_from_token(query, token, field)
Ecto.Query.order_by(query, [{^binding, x}], [{^direction, field(x, ^field)}])
end
end