Current section
Files
Jump to
Current section
Files
lib/aql/sort.ex
defmodule Durango.AQL.Sort do
defmacro inject_parser() do
quote do
alias Durango.Query
def parse_query(%Query{} = q, [{:sort, {by_items, modifier}} | rest]) do
items_token = Durango.AQL.Sort.render_items(by_items)
modifier_token = Durango.AQL.Sort.render_modifier(modifier)
sort_token = [
items_token,
modifier_token,
]
|> Enum.join(" ")
|> String.trim
q
|> Query.append_tokens(["SORT", sort_token])
|> parse_query(rest)
end
def parse_query(%Query{} = q, [{:sort, by_items} | rest]) do
items_token = Durango.AQL.Sort.render_items(by_items)
q
|> Query.append_tokens(["SORT", items_token])
|> parse_query(rest)
end
end
end
def render_modifier(order) when order in [:desc, :DESC, "DESC", "desc"] do
"DESC"
end
def render_modifier(order) when order in [:asc, :ASC, "ASC", "asc"] do
"ASC"
end
def render_items(items) when is_list(items) do
items
|> Enum.map(&render_items/1)
|> Enum.join(", ")
end
def render_items(%module{} = item) do
module.to_aql(item)
end
end