diff --git a/lib/music_library/listening_stats.ex b/lib/music_library/listening_stats.ex index 10678f72..87363146 100644 --- a/lib/music_library/listening_stats.ex +++ b/lib/music_library/listening_stats.ex @@ -170,20 +170,9 @@ defmodule MusicLibrary.ListeningStats do page_size = Map.get(params, :page_size, @pagination[:tracks_page_size]) order = Map.get(params, :order, :scrobbled_at) - base_query = tracks_with_record_info_query() - search_query = - if query == "" do - base_query - else - query_term = "%#{String.downcase(query)}%" - - from [t, cr, wr, ar] in base_query, - where: - like(fragment("lower(?)", t.title), ^query_term) or - like(fragment("lower(json_extract(?, '$.name'))", t.artist), ^query_term) or - like(fragment("lower(json_extract(?, '$.title'))", t.album), ^query_term) - end + tracks_with_record_info_query() + |> search_query(query) ordered_query = case order do @@ -234,22 +223,9 @@ defmodule MusicLibrary.ListeningStats do @spec search_tracks_count(String.t()) :: non_neg_integer() def search_tracks_count(query \\ "") do - base_query = from(t in Track) - - search_query = - if query == "" do - base_query - else - query_term = "%#{String.downcase(query)}%" - - from t in base_query, - where: - like(fragment("lower(?)", t.title), ^query_term) or - like(fragment("lower(json_extract(artist, '$.name'))"), ^query_term) or - like(fragment("lower(json_extract(album, '$.title'))"), ^query_term) - end - - Repo.aggregate(search_query, :count, :scrobbled_at_uts) + from(t in Track) + |> search_query(query) + |> Repo.aggregate(:count, :scrobbled_at_uts) end # Top albums/artists by period @@ -478,6 +454,18 @@ defmodule MusicLibrary.ListeningStats do fragment("? ->> '$.name'", t.artist) == ^main_artist_name end + defp search_query(base_query, ""), do: base_query + + defp search_query(base_query, query) do + query_term = "%#{String.downcase(query)}%" + + from t in base_query, + where: + like(fragment("lower(?)", t.title), ^query_term) or + like(fragment("lower(json_extract(?, '$.name'))", t.artist), ^query_term) or + like(fragment("lower(json_extract(?, '$.title'))", t.album), ^query_term) + end + defp polyfill_artist(artist, musicbrainz_id) do if is_nil(artist.musicbrainz_id) or artist.musicbrainz_id == "" do %{artist | musicbrainz_id: musicbrainz_id}