Bylaw.Credo.Check.Ecto.PreferSelectOverRepoAllEnumMap (bylaw_credo v0.1.0-alpha.1)

Copy Markdown View Source

Basics

This check is disabled by default.

Learn how to enable it via .credo.exs.

This check has a base priority of high and works with any version of Elixir.

Explanation

Prefer using select in the Ecto query over loading full rows with Repo.all and then mapping them with Enum.map to extract fields.

Examples

Avoid:

  query
  |> Repo.all()
  |> Enum.map(&%{role: &1.role, content: &1.content})

Prefer:

  query
  |> select([m], %{role: m.role, content: m.content})
  |> Repo.all()

This pushes the projection down to the database, reducing memory usage and data transfer.

Cases where Enum.map references the full record (not just field accesses) are allowed, since they cannot be expressed as a select:

  # OK - the full record is referenced
  Repo.all(query) |> Enum.map(&%{id: &1.id, record: &1})

Notes

This check uses static AST analysis, so it favors clear source-level patterns over runtime behavior.

Options

This check has no check-specific options. Configure it with an empty option list.

Usage

Add this check to Credo's checks: list in .credo.exs:

%{
  configs: [
    %{
      name: "default",
      checks: [
        {Bylaw.Credo.Check.Ecto.PreferSelectOverRepoAllEnumMap, []}
      ]
    }
  ]
}

Check-Specific Parameters

There are no specific parameters for this check.

General Parameters

Like with all checks, general params can be applied.

Parameters can be configured via the .credo.exs config file.