Materialize included release group ids
This commit is contained in:
@@ -18,7 +18,7 @@ defmodule MusicLibrary.Records do
|
||||
:release,
|
||||
:genres,
|
||||
:musicbrainz_id,
|
||||
:musicbrainz_data,
|
||||
:included_release_group_ids,
|
||||
:cover_hash
|
||||
]
|
||||
end
|
||||
|
||||
@@ -24,12 +24,22 @@ defmodule MusicLibrary.Records.Batch do
|
||||
run_on_all_records(&update_release_ids/1)
|
||||
end
|
||||
|
||||
def update_included_release_group_ids do
|
||||
run_on_all_records(&update_included_release_group_ids/1)
|
||||
end
|
||||
|
||||
def update_release_ids(record) do
|
||||
record
|
||||
|> Record.update_release_ids()
|
||||
|> Repo.update()
|
||||
end
|
||||
|
||||
def update_included_release_group_ids(record) do
|
||||
record
|
||||
|> Record.update_included_release_group_ids()
|
||||
|> Repo.update()
|
||||
end
|
||||
|
||||
defp run_on_all_records(fun) do
|
||||
q = from(r in Record)
|
||||
stream = Repo.stream(q)
|
||||
|
||||
@@ -20,6 +20,7 @@ defmodule MusicLibrary.Records.Record do
|
||||
field :release, :string
|
||||
field :purchased_at, :utc_datetime
|
||||
field :release_ids, {:array, :string}, default: []
|
||||
field :included_release_group_ids, {:array, :string}, default: []
|
||||
|
||||
embeds_many :artists, Artist do
|
||||
field :name, :string
|
||||
@@ -43,6 +44,7 @@ defmodule MusicLibrary.Records.Record do
|
||||
:release,
|
||||
:genres,
|
||||
:release_ids,
|
||||
:included_release_group_ids,
|
||||
:cover_url,
|
||||
:cover_data,
|
||||
:purchased_at
|
||||
@@ -67,13 +69,7 @@ defmodule MusicLibrary.Records.Record do
|
||||
end
|
||||
|
||||
def child_release_groups_count(record) do
|
||||
record.musicbrainz_data
|
||||
|> Map.get("relations", [])
|
||||
|> Enum.count(fn relation ->
|
||||
relation["target-type"] == "release_group" and
|
||||
relation["type"] == "included in" and
|
||||
relation["direction"] == "backward"
|
||||
end)
|
||||
Enum.count(record.included_release_group_ids)
|
||||
end
|
||||
|
||||
@doc false
|
||||
@@ -99,6 +95,7 @@ defmodule MusicLibrary.Records.Record do
|
||||
record
|
||||
|> change(musicbrainz_data: musicbrainz_data)
|
||||
|> update_release_ids()
|
||||
|> update_included_release_group_ids()
|
||||
end
|
||||
|
||||
def update_release_ids(record = %__MODULE__{musicbrainz_data: musicbrainz_data}) do
|
||||
@@ -119,6 +116,36 @@ defmodule MusicLibrary.Records.Record do
|
||||
end
|
||||
end
|
||||
|
||||
def update_included_release_group_ids(record = %__MODULE__{musicbrainz_data: musicbrainz_data}) do
|
||||
included_release_group_ids = extract_included_release_group_ids(musicbrainz_data)
|
||||
|
||||
record
|
||||
|> change(included_release_group_ids: included_release_group_ids)
|
||||
end
|
||||
|
||||
def update_included_release_group_ids(changeset) do
|
||||
case get_change(changeset, :musicbrainz_data) do
|
||||
nil ->
|
||||
changeset
|
||||
|
||||
musicbrainz_data ->
|
||||
included_release_group_ids = extract_included_release_group_ids(musicbrainz_data)
|
||||
|
||||
put_change(changeset, :included_release_group_ids, included_release_group_ids)
|
||||
end
|
||||
end
|
||||
|
||||
defp extract_included_release_group_ids(musicbrainz_data) do
|
||||
musicbrainz_data
|
||||
|> Map.get("relations", [])
|
||||
|> Enum.filter(fn relation ->
|
||||
relation["target-type"] == "release_group" and
|
||||
relation["type"] == "included in" and
|
||||
relation["direction"] == "backward"
|
||||
end)
|
||||
|> Enum.map(fn relation -> relation["release_group"]["id"] end)
|
||||
end
|
||||
|
||||
def generate_cover_hash(record = %__MODULE__{cover_data: cover_data}) do
|
||||
hash = :crypto.hash(:sha256, cover_data) |> Base.encode16()
|
||||
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
defmodule MusicLibrary.Repo.Migrations.AddIncludedReleaseGroupIdsToRecords do
|
||||
use Ecto.Migration
|
||||
|
||||
def change do
|
||||
alter table(:records) do
|
||||
add :included_release_group_ids, {:array, :string}, default: []
|
||||
end
|
||||
|
||||
create index(:records, [:included_release_group_ids])
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user