Files
music_library/lib/music_library/collection.ex
T
Claudio Ortolina 2e2000fe01 Introduce separate search index
Uses a fts5 virtual table, kept up to date via triggers on the records
table.
2024-11-22 19:37:13 +00:00

67 lines
1.5 KiB
Elixir

defmodule MusicLibrary.Collection do
import Ecto.Query, warn: false
alias MusicLibrary.Repo
alias MusicLibrary.Records
alias MusicLibrary.Records.{Record, SearchIndex}
def search_records(query, opts \\ []) do
limit = Keyword.get(opts, :limit, 20)
offset = Keyword.get(opts, :offset, 0)
Records.search_records(base_search(), query, limit: limit, offset: offset)
end
def search_records_count(query) do
Records.search_records_count(base_search(), query)
end
def count_records_by_format do
q =
from r in Record,
where: not is_nil(r.purchased_at),
group_by: r.format,
order_by: [desc: count(r.id)],
select: {r.format, count(r.id)}
Repo.all(q)
end
def count_records_by_type do
q =
from r in Record,
where: not is_nil(r.purchased_at),
group_by: r.type,
order_by: [desc: count(r.id)],
select: {r.type, count(r.id)}
Repo.all(q)
end
def get_latest_record! do
q =
from r in Record,
where: not is_nil(r.purchased_at),
order_by: [desc: r.purchased_at],
limit: 1,
select: ^Records.essential_fields()
Repo.one!(q)
end
def collected_release_ids(release_ids) do
q =
from r in fragment("records, json_each(records.release_ids)"),
where: r.value in ^release_ids,
where: fragment("records.purchased_at IS NOT NULL"),
select: r.value
Repo.all(q)
end
defp base_search do
from r in SearchIndex,
where: not is_nil(r.purchased_at)
end
end