EctoTurbo.Hooks.Search (EctoTurbo v1.0.0)

View Source

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

Summary

Functions

Returns the search object.

Types

t()

@type t() :: %EctoTurbo.Hooks.Search{
  combinator: term(),
  conditions: term(),
  groupings: term()
}

Functions

run(schema, params)

@spec 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> EctoTurbo.Hooks.Search.run(EctoTurbo.Schemas.Post, params)
{:ok,
  %EctoTurbo.Hooks.Search{
    combinator: :and,
    conditions: [
      %EctoTurbo.Hooks.Search.Condition{
        attributes: [
          %EctoTurbo.Hooks.Search.Attribute{name: :name, parent: :query},
          %EctoTurbo.Hooks.Search.Attribute{name: :name, parent: :category}
        ],
        combinator: :or,
        search_type: :like,
        values: ["elixir"]
      },
      %EctoTurbo.Hooks.Search.Condition{
        attributes: [
          %EctoTurbo.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> EctoTurbo.Hooks.Search.run(EctoTurbo.Schemas.Post, params)
{:ok,
  %EctoTurbo.Hooks.Search{
    combinator: :and,
    groupings: [],
    conditions: [%EctoTurbo.Hooks.Search.Condition{search_type: :like, values: ["elixir"], attributes: [%EctoTurbo.Hooks.Search.Attribute{name: :name, parent: :query}], combinator: :and}, %EctoTurbo.Hooks.Search.Condition{attributes: [%EctoTurbo.Hooks.Search.Attribute{name: :price, parent: :query}], combinator: :and, search_type: :eq, values: [1]}]}
}