3b558044b4
Split the 450+ line Records context into focused modules: - Records.Search — FTS5 search, SearchParser integration, genre listing - Records.Import — MusicBrainz release/group import, release status - Records.Enrichment — genre population, cover refresh, color extraction, MusicBrainz data refresh - Records.Query — shared helpers (essential_fields, order_alphabetically macro) Records module is now a facade with defdelegate for compile-time safety. CRUD and PubSub stay directly in Records. Tests moved alongside each sub-module. Zero callers changed, 886 tests pass.
27 lines
681 B
Elixir
27 lines
681 B
Elixir
defmodule MusicLibrary.Records.Query do
|
|
@moduledoc """
|
|
Helpers to compose Ecto queries based on record-like schemas.
|
|
"""
|
|
|
|
alias MusicLibrary.Records.SearchIndex
|
|
|
|
@spec essential_fields() :: [atom()]
|
|
def essential_fields do
|
|
SearchIndex.__schema__(:fields)
|
|
end
|
|
|
|
@doc """
|
|
Ecto query fragment for alphabetical ordering by artist name and title.
|
|
|
|
Used by callers that compose queries (e.g. `Collection`) and by search
|
|
ordering internally via `Records.Search`.
|
|
"""
|
|
defmacro order_alphabetically do
|
|
quote do
|
|
fragment(
|
|
"unaccent(artists ->> '$[0].sort_name') COLLATE NOCASE ASC, unaccent(title) COLLATE NOCASE ASC"
|
|
)
|
|
end
|
|
end
|
|
end
|