FatEcto.Query.FatBuildable behaviour (FatEcto v1.1.0)

View Source

Builds queries after filtering fields based on user-provided filterable and overrideable fields.

This module provides functionality to filter Ecto queries using predefined filterable fields (handled by FatWhere) and overrideable fields (handled by a fallback function).

Options

  • filterable_fields: A map of fields and their allowed operators. Example: %{
    "id" => ["$eq", "$neq"],
    "name" => ["$ilike"]
    }
  • overrideable_fields: A list of fields that can be overridden. Example: ["name", "phone"]
  • ignoreable_fields_values: A map of fields and their ignoreable values. Example: %{
    "name" => ["%%", "", [], nil],
    "phone" => ["%%", "", [], nil]
    }

Example Usage

defmodule MyApp.HospitalFilter do
  use FatEcto.Query.FatBuildable,
    filterable_fields: %{
      "id" => ["$eq", "$neq"]
    },
    overrideable_fields: ["name", "phone"],
    ignoreable_fields_values: %{
      "name" => ["%%", "", [], nil],
      "phone" => ["%%", "", [], nil]
    }

  import Ecto.Query

  def override_whereable(query, "name", "$ilike", value) do
    where(query, [r], ilike(fragment("(?)::TEXT", r.name), ^value))
  end

  def override_whereable(query, "phone", "$ilike", value) do
    where(query, [r], ilike(fragment("(?)::TEXT", r.phone), ^value))
  end

  def override_whereable(query, _, _, _) do
    query
  end
end

Summary

Callbacks

Callback for performing custom processing on the final query.

Callback for handling custom filtering logic for overrideable fields.

Callbacks

after_whereable(dynamics)

@callback after_whereable(dynamics :: Ecto.Query.dynamic_expr()) ::
  Ecto.Query.dynamic_expr()

Callback for performing custom processing on the final query.

This function is called at the end of the build/2 function. The default behavior is to return the query, but it can be overridden by the using module.

override_whereable(query, field, operator, value)

@callback override_whereable(
  query :: Ecto.Query.t(),
  field :: String.t() | atom(),
  operator :: String.t(),
  value :: any()
) :: Ecto.Query.t()

Callback for handling custom filtering logic for overrideable fields.

This function acts as a fallback for overrideable fields. The default behavior is to return the query, but it can be overridden by the using module.