turbo_ecto v0.1.5 Turbo.Ecto.Hooks.Search

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

Link to this section Summary

Functions

Builds a search Ecto.Query.t on top of a given Ecto.Query.t variable with given params

Link to this section Functions

Link to this function build_search_mapbox(arg, mapbox, queryable)
Link to this function run(queryable, search_params)

Builds a search Ecto.Query.t on top of a given Ecto.Query.t variable with given params.

Example

When search_type is :like

iex> params = %{"q" => %{"name_like" => "elixir"}}
iex> Turbo.Ecto.Hooks.Search.run(Turbo.Ecto.Product, params)
#Ecto.Query<from p in subquery(from p in Turbo.Ecto.Product), where: like(p.name, ^"%elixir%")>

When search_type is :ilike

iex> params = %{"q" => %{"name_ilike" => "elixir"}}
iex> Turbo.Ecto.Hooks.Search.run(Turbo.Ecto.Product, params)
#Ecto.Query<from p in subquery(from p in Turbo.Ecto.Product), where: ilike(p.name, ^"%elixir%")>

When search_type is :eq

iex> params = %{"q" => %{"price_eq" => 100}}
iex> Turbo.Ecto.Hooks.Search.run(Turbo.Ecto.Product, params)
#Ecto.Query<from p in subquery(from p in Turbo.Ecto.Product), where: p.price == ^100>

When search_type is :gt

iex> params = %{"q" => %{"price_gt" => 100}}
iex> Turbo.Ecto.Hooks.Search.run(Turbo.Ecto.Product, params)
#Ecto.Query<from p in subquery(from p in Turbo.Ecto.Product), where: p.price > ^100>

When search_type is :lt

iex> params = %{"q" => %{"price_lt" => 100}}
iex> Turbo.Ecto.Hooks.Search.run(Turbo.Ecto.Product, params)
#Ecto.Query<from p in subquery(from p in Turbo.Ecto.Product), where: p.price < ^100>

When search_type is :gteq

iex> params = %{"q" => %{"price_gteq" => 100}}
iex> Turbo.Ecto.Hooks.Search.run(Turbo.Ecto.Product, params)
#Ecto.Query<from p in subquery(from p in Turbo.Ecto.Product), where: p.price >= ^100>

When search_type is :lteq

iex> params = %{"q" => %{"price_lteq" => 100}}
iex> Turbo.Ecto.Hooks.Search.run(Turbo.Ecto.Product, params)
#Ecto.Query<from p in subquery(from p in Turbo.Ecto.Product), where: p.price <= ^100>

when use and symbol condition

iex> params = %{"q" => %{"name_and_body_like" => "elixir"}}
iex> Turbo.Ecto.Hooks.Search.run(Turbo.Ecto.Product, params)
#Ecto.Query<from p in subquery(from p in subquery(from p in Turbo.Ecto.Product),
  where: like(p.body, ^"%elixir%")), where: like(p.name, ^"%elixir%")>

when use or symbol condition

iex> params = %{"q" => %{"name_or_body_like" => "elixir"}}
iex> Turbo.Ecto.Hooks.Search.run(Turbo.Ecto.Product, params)
#Ecto.Query<from p in subquery(from p in subquery(from p in Turbo.Ecto.Product),
  or_where: like(p.body, ^"%elixir%")), where: like(p.name, ^"%elixir%")>

when use assoc

iex> params = %{"q" => %{"category_name_like" => "elixir"}}
iex> Turbo.Ecto.Hooks.Search.run(Turbo.Ecto.Product, params)
#Ecto.Query<from p in subquery(from p in Turbo.Ecto.Product), join: c in assoc(p, :category), where: like(c.name, ^"%elixir%")>

when use and && or && assoc condition

iex> params = %{"q" => %{"category_name_or_name_and_body_like" => "elixir"}}
iex> Turbo.Ecto.Hooks.Search.run(Turbo.Ecto.Product, params)
#Ecto.Query<from p in subquery(from p in subquery(from p in subquery(from p in Turbo.Ecto.Product),
  where: like(p.body, ^"%elixir%")),
  join: c in assoc(p, :category),
  where: like(c.name, ^"%elixir%")), or_where: like(p.name, ^"%elixir%")>

when multi association && or && and condition

iex> params = %{"q" => %{"product_category_name_and_product_name_or_name_like" => "elixir"}}
iex> Turbo.Ecto.Hooks.Search.run(Turbo.Ecto.Variant, params)
#Ecto.Query<from v in subquery(from v in subquery(from v in subquery(from v in Turbo.Ecto.Variant),
  or_where: like(v.name, ^"%elixir%")),
  join: p in assoc(v, :product),
  join: c in assoc(p, :category),
  where: like(c.name, ^"%elixir%")), join: p in assoc(v, :product), where: like(p.name, ^"%elixir%")>