lib/ex_teal/search/simple_search.ex

defmodule ExTeal.Search.SimpleSearch do
  @moduledoc """
  The default search adapter.  Uses dynamic ecto queries to build a simple
  ILIKE comparison across the field specified by the `search/2` function on
  the resource.
  """
  import Ecto.Query

  @doc """
  Build a dynamic ecto where statement by reducing over the resource's
  searchable fields and creating an ilike where expression
  """
  @spec build(Ecto.Query.t(), module(), map()) :: Ecto.Query.t()
  def build(query, resource, %{"search" => term}) do
    dynamic =
      Enum.reduce([:id | resource.search()], false, fn field_name, dynamic ->
        dynamic([q], ilike(type(field(q, ^field_name), :string), ^"%#{term}%") or ^dynamic)
      end)

    from(query, where: ^dynamic)
  end
end