Turbo.Ecto.Hooks.Search (turbo_ecto v1.0.2)

This module provides a operations that can add searching functionality to a pipeline of Ecto queries. This module works by taking fields.

Inspire from: ex_sieve

Link to this section Summary

Functions

Returns the search object.

Link to this section Types

Specs

t() :: %Turbo.Ecto.Hooks.Search{
  combinator: term(),
  conditions: term(),
  groupings: term()
}

Link to this section Functions

Link to this function

run(schema, params)

Specs

run(Ecto.Query.t(), map()) :: tuple()

Returns the search object.

Examples

iex> params = %{"q" => %{"name_or_category_name_like" => "elixir", "price_eq" => 1}, "s" => "updated_at+asc", "per_page" => 5, "page" => 1}
iex> Turbo.Ecto.Hooks.Search.run(Turbo.Ecto.Schemas.Post, params)
{:ok,
  %Turbo.Ecto.Hooks.Search{
    combinator: :and,
    conditions: [
      %Turbo.Ecto.Hooks.Search.Condition{
        attributes: [
          %Turbo.Ecto.Hooks.Search.Attribute{name: :name, parent: :query},
          %Turbo.Ecto.Hooks.Search.Attribute{name: :name, parent: :category}
        ],
        combinator: :or,
        search_type: :like,
        values: ["elixir"]
      },
      %Turbo.Ecto.Hooks.Search.Condition{
        attributes: [
          %Turbo.Ecto.Hooks.Search.Attribute{name: :price, parent: :query}
        ],
        combinator: :and,
        search_type: :eq,
        values: [1]
      }
    ],
    groupings: []
  }
}

iex> params = %{"filter" => %{"name_like" => "elixir", "price_eq" => 1}}
iex> Turbo.Ecto.Hooks.Search.run(Turbo.Ecto.Schemas.Post, params)
{:ok,
  %Turbo.Ecto.Hooks.Search{
    combinator: :and,
    groupings: [],
    conditions: [%Turbo.Ecto.Hooks.Search.Condition{search_type: :like, values: ["elixir"], attributes: [%Turbo.Ecto.Hooks.Search.Attribute{name: :name, parent: :query}], combinator: :and}, %Turbo.Ecto.Hooks.Search.Condition{attributes: [%Turbo.Ecto.Hooks.Search.Attribute{name: :price, parent: :query}], combinator: :and, search_type: :eq, values: [1]}]}
}