Enable searching across record sets

This commit is contained in:
Claudio Ortolina
2026-02-06 17:03:21 +00:00
parent 990d9f4c7e
commit 635bffc9fe
3 changed files with 70 additions and 4 deletions
+48
View File
@@ -21,6 +21,23 @@ defmodule MusicLibrary.RecordSets do
Repo.aggregate(RecordSet, :count)
end
def count_record_sets(query) do
record_sets_search_query(query)
|> Repo.aggregate(:count)
end
def search_record_sets(query, opts \\ []) do
offset = Keyword.get(opts, :offset, 0)
limit = Keyword.get(opts, :limit, 20)
record_sets_search_query(query)
|> order_by([rs], desc: rs.updated_at)
|> offset(^offset)
|> limit(^limit)
|> preload(items: :record)
|> Repo.all()
end
def get_record_set!(id) do
RecordSet
|> Repo.get!(id)
@@ -125,6 +142,37 @@ defmodule MusicLibrary.RecordSets do
{:ok, get_record_set!(record_set.id)}
end
defp record_sets_search_query(""), do: from(rs in RecordSet)
defp record_sets_search_query(query) do
like_query = "%#{query}%"
from(rs in RecordSet,
where:
like(rs.name, ^like_query) or
like(rs.description, ^like_query) or
fragment(
"""
EXISTS (
SELECT 1 FROM record_set_items AS i
JOIN records AS r ON r.id = i.record_id
WHERE i.record_set_id = ?
AND (
r.title LIKE ?
OR EXISTS (
SELECT 1 FROM json_each(r.artists)
WHERE json_extract(value, '$.name') LIKE ?
)
)
)
""",
rs.id,
^like_query,
^like_query
)
)
end
defp recompact_positions(record_set_id) do
items =
from(i in RecordSetItem,