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
Specs
apply( query :: Ecto.Query.t(), condition :: condition(), type :: field_type(), context :: Ecto.Queriable.t() ) :: Ecto.Query.t()