Drops.Relation.Plugins.Ecto.Query (drops_relation v0.1.0)

View Source

Plugin for defining custom Ecto queries within relation modules.

This plugin provides the defquery macro that allows defining custom query functions that return relation structs with the queryable set to the result of the query block.

Architecture

For each relation module that defines queries, this plugin creates a dedicated QueryBuilder module (e.g., MyRelation.QueryBuilder) that contains the actual query functions with Ecto.Query imported once at the module level. The relation module then delegates to these QueryBuilder functions.

Usage

defmodule MyApp.Users do
  use Drops.Relation, repo: MyApp.Repo

  schema("users", infer: true)

  defquery active() do
    from(u in relation(), where: u.active == true)
  end

  defquery by_role(role) when is_binary(role) do
    from(u in relation(), where: u.role == ^role)
  end

  defquery recent(days \\ 7) do
    cutoff = DateTime.utc_now() |> DateTime.add(-days, :day)
    from(u in relation(), where: u.inserted_at >= ^cutoff)
  end
end

# This creates:
# - MyApp.Users.active() -> delegates to MyApp.Users.QueryBuilder.active()
# - MyApp.Users.QueryBuilder module with Ecto.Query imported
# - relation() function available in query blocks

# Usage examples:
active_users = MyApp.Users.active() |> MyApp.Users.all()
admin_users = MyApp.Users.by_role("admin") |> MyApp.Users.all()
recent_users = MyApp.Users.recent(30) |> MyApp.Users.all()

The relation() function within the query block returns the relation module, allowing you to reference the current relation in your Ecto queries.

Summary

Functions

defquery(call, list)

(macro)