defmodule Ravix.RQL.Tokens.Condition do @moduledoc """ Supported RQL Conditions """ defstruct [ :token, :field, :params ] alias Ravix.RQL.Tokens.Condition @type t :: %Condition{ token: atom(), field: String.t() | Condition.t(), params: list() } @doc """ Greater than condition Returns a `Ravix.RQL.Tokens.Condition` ## Examples iex> import Ravix.RQL.Tokens.Condition iex> greater_than("field", 10) """ @spec greater_than(atom() | String.t(), number()) :: Condition.t() def greater_than(field_name, value) do %Condition{ token: :greater_than, field: field_name, params: [value] } end @doc """ Greater than or equal to condition Returns a `Ravix.RQL.Tokens.Condition` ## Examples iex> import Ravix.RQL.Tokens.Condition iex> greater_than_or_equal_to("field", 10) """ @spec greater_than_or_equal_to(atom() | String.t(), number()) :: Condition.t() def greater_than_or_equal_to(field_name, value) do %Condition{ token: :greater_than_or_eq, field: field_name, params: [value] } end @doc """ Lower than condition Returns a `Ravix.RQL.Tokens.Condition` ## Examples iex> import Ravix.RQL.Tokens.Condition iex> lower_than("field", 10) """ @spec lower_than(atom() | String.t(), number()) :: Condition.t() def lower_than(field_name, value) do %Condition{ token: :lower_than, field: field_name, params: [value] } end @doc """ Lower than or equal to condition Returns a `Ravix.RQL.Tokens.Condition` ## Examples iex> import Ravix.RQL.Tokens.Condition iex> lower_than_or_equal_to("field", 10) """ @spec lower_than_or_equal_to(atom() | String.t(), number()) :: Condition.t() def lower_than_or_equal_to(field_name, value) do %Condition{ token: :lower_than_or_eq, field: field_name, params: [value] } end @doc """ Equal to condition Returns a `Ravix.RQL.Tokens.Condition` ## Examples iex> import Ravix.RQL.Tokens.Condition iex> equal_to("field", "value") """ @spec equal_to(atom() | String.t(), any) :: Condition.t() def equal_to(field_name, value) do %Condition{ token: :eq, field: field_name, params: [value] } end @doc """ Not Equal to condition Returns a `Ravix.RQL.Tokens.Condition` ## Examples iex> import Ravix.RQL.Tokens.Condition iex> not_equal_to("field", "value") """ @spec not_equal_to(atom() | String.t(), any) :: Condition.t() def not_equal_to(field_name, value) do %Condition{ token: :ne, field: field_name, params: [value] } end @doc """ Specifies that the value is in a list Returns a `Ravix.RQL.Tokens.Condition` ## Examples iex> import Ravix.RQL.Tokens.Condition iex> in?("field", [1,2,3]) """ @spec in?(atom() | String.t(), list()) :: Condition.t() def in?(field_name, values) do %Condition{ token: :in, field: field_name, params: values } end @doc """ Specifies that the value is not in a list Returns a `Ravix.RQL.Tokens.Condition` ## Examples iex> import Ravix.RQL.Tokens.Condition iex> not_in("field", ["a", "b", "c"]) """ @spec not_in(atom() | String.t(), list()) :: Condition.t() def not_in(field_name, values) do %Condition{ token: :nin, field: field_name, params: values } end @doc """ Specifies that the value is between two values Returns a `Ravix.RQL.Tokens.Condition` ## Examples iex> import Ravix.RQL.Tokens.Condition iex> between("field", [15,25]) """ @spec between(atom() | String.t(), list()) :: Condition.t() def between(field_name, values) do %Condition{ token: :between, field: field_name, params: values } end end