defmodule Durango.AQL.Limit do @moduledoc """ General Forms: ``` LIMIT count ``` ``` LIMIT offset, count ``` AQL Example Usage: ``` FOR u IN users LIMIT 5 RETURN u ``` ``` FOR u IN users SORT u.firstName, u.lastName, u.id DESC LIMIT 2, 5 RETURN u ``` Durango Query Usage: iex> require Durango Durango iex> Durango.query([for: u, in: :users, limit: 5, return: u]) |> to_string "FOR u IN users LIMIT 5 RETURN u" """ alias Durango.Query alias Durango.Dsl.BoundVar defmacro inject_parser() do quote do alias Durango.Query alias Durango.Dsl def parse_query(%Query{} = q, [{:limit, {offset, count}} | rest]) do limit_token = Durango.AQL.Limit.render_args(offset, count) q |> Query.append_tokens(["LIMIT", limit_token]) |> Dsl.parse_query(rest) end def parse_query(%Query{} = q, [{:limit, count} | rest ]) do limit_token = Durango.AQL.Limit.render_args(count) q |> Query.append_tokens(["LIMIT", limit_token]) |> Dsl.parse_query(rest) end end end @doc """ iex> Durango.AQL.Limit.render_args(5) "5" iex> Durango.AQL.Limit.render_args(%Durango.Dsl.BoundVar{key: :thing}) "@thing" iex> Durango.AQL.Limit.render_args(100, 10) "100, 10" """ def render_args(num) when is_integer(num) do to_string(num) end def render_args(%BoundVar{} = var) do BoundVar.to_aql(var) end def render_args(offset, count) do render_args(offset) <> ", " <> render_args(count) end end