EctoFilter.Operators.JSON behaviour (EctoFilter v0.3.1) View Source

Operators on PostgreSQL JSON/JSONB fields.

These operators are not included in EctoFilter by default and must be used manually:

defmodule JSONFilter do
  use EctoFilter
  use EctoFilter.Operators.JSON
end

Examples:

With arrays

iex> Repo.insert(%User{first_name: "Bob", interests: ["Art", "Books"]})
iex> Repo.insert(%User{first_name: "Alice", interests: ["Books", "Comics"]})
iex> result =
...>   User
...>   |> JSONFilter.filter([{:interests, :contains, "Art"}])
...>   |> Repo.all()
iex> length(result)
1
iex> hd(result).first_name
"Bob"

With maps

iex> Repo.insert(%User{first_name: "Bob", settings: %{send_newsletter: false}})
iex> Repo.insert(%User{first_name: "Alice", settings: %{send_newsletter: true}})
iex> result =
...>   User
...>   |> JSONFilter.filter([{:settings, nil, [{:send_newsletter, :equal, true}]}])
...>   |> Repo.all()
iex> length(result)
1
iex> hd(result).first_name
"Alice"

With nested maps

iex> Repo.insert(%User{first_name: "Bob", settings: %{send_newsletter: %{weekly: true, monthly: false}}})
iex> Repo.insert(%User{first_name: "Alice", settings: %{send_newsletter: %{weekly: false, monthly: true}}})
iex> result =
...>   User
...>   |> JSONFilter.filter([{:settings, nil, [{:send_newsletter, nil, [{:weekly, :equal, true}]}]}])
...>   |> Repo.all()
iex> length(result)
1
iex> hd(result).first_name
"Bob"

With arrays of maps

iex> Repo.insert(%User{first_name: "Bob", addresses: [%{city: "Kyiv"}, %{city: "Berlin"}]})
iex> Repo.insert(%User{first_name: "Alice", addresses: [%{city: "Chicago"}]})
iex> result =
...>   User
...>   |> JSONFilter.filter([{:addresses, nil, [{:city, :equal, "Kyiv"}]}])
...>   |> Repo.all()
iex> length(result)
1
iex> hd(result).first_name
"Bob"

Link to this section Summary

Link to this section Types

Specs

condition() :: {field :: atom(), nil, conditions :: [EctoFilter.condition()]}

Specs

field_type() :: :map | {:map, Ecto.Type.base()} | {:array, Ecto.Type.base()}

Link to this section Callbacks

Link to this callback

apply(query, condition, type, context)

View Source

Specs

apply(
  query :: Ecto.Query.t(),
  condition :: condition(),
  type :: field_type(),
  context :: Ecto.Queriable.t()
) :: Ecto.Query.t()