EctoAutoFilter (Ecto Auto Filter v0.1.0) View Source

Ecto Auto Filter Automatic Filters based Ecto Schemas

EctoAutoFilter is a helper for projects that use Ecto Schemas and segregate the queries in entity repository modules. EctoAutoFilter inject the filter/3 function that by default has a pattern matching for each field of declared entity.

Link to this section Summary

Functions

Injeta a função filter/3 e as funções privadas responsáveis pelo filtro customizado a partir do schema base passado

Adiciona um filtro customizado e componivel aos demais filtros do módulo base em tempo de compilação.

Link to this section Functions

Link to this macro

__using__(opts)

View Source (macro)

Injeta a função filter/3 e as funções privadas responsáveis pelo filtro customizado a partir do schema base passado

Injects the filter/3 functions and the privated functions responsible for custom filters from base entity schema's passed.

Options:

  • schema: This options is required and is necessary for EctoAutoFilter build the queries.
  • repo: This options is optional and is used to execute the queries, and when is passed such as use option, overrides the global config for the current module.

Exemple:

defmodule MyApp.User do
  use Ecto.Schema

  schema "users" do
    field(:name, :string)
    field(:email, :string)
    field(:age, :integer)
  end
  ...
end


defmodule UserRepository do
  use EctoAutoFilter,
    repo: MyApp.Repo,
    schema: MyApp.User
end

After that entity repository module is declared the filter functions can already be used like a below example:

Depois de declarado o using no módulo de repositório as funções de filtro podem ser usadas como no exemplo a seguir:

iex> user_one = Repo.insert!(%User{name: "John Doe", email: "john@doe.com", age: 30})
iex> user_two = Repo.insert!(%User{name: "Jane Doe", email: "jane@doe.com", age: 28})
iex> UserRepository.filter(%{age: {30, ">="}})
%User{
  __meta__: #Ecto.Schema.Metadata<:loaded, "users">,
  age: 30,
  email: "john@doe.com",
  id: 1,
  name: "John Doe"
}
Link to this macro

add_filter(query, value, key, list)

View Source (macro)

Adiciona um filtro customizado e componivel aos demais filtros do módulo base em tempo de compilação.

  • query: é queryable que a função irá receber;
  • value: é o valor que será recebido para compor o filtro e pode ser manipulado por pattern matching;
  • key: indentify the created filter in filter/3 function.

Este filtro é adicionado as demais regras de filtro e se torna disponível na forma de filter/3, por exemplo:

defmodule MyApp.User do
  use Ecto.Schema

  schema "users" do
    field(:name, :string)
    field(:email, :string)
    field(:age, :integer)
    field(:bith_date, :date)
  end
  ...
end


defmodule UserRepository do
  use EctoAutoFilter,
    repo: MyApp.Repo,
    schema: MyApp.User

  add_filter query, value, :birth_years_ago do
    x_years_ago = (365 * value)
    limit_date = Date.utc_today() |> Date.add(-x_years_ago)

    where(query, [r], r.birth_date == ^limit_date)
  end
end

Depois de declarado o filtro customizado ele pode ser usado conforme o exemplo a seguir:

iex> user_one = Repo.insert!(%User{name: "John Doe", email: "john@doe.com", age: 30, birth_date: 1991-01-01})
iex> user_two = Repo.insert!(%User{name: "Jane Doe", email: "jane@doe.com", age: 28, birth_date: 1993-01-01})
iex> UserRepository.filter(%{birth_years_ago: 28})
%User{
  __meta__: #Ecto.Schema.Metadata<:loaded, "users">,
  age: 28,
  email: "jane@doe.com",
  id: 2,
  name: "Jane Doe"
}