From be563d8fcaa6b4c2e7eb5ed35d953d7d240fe472 Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Fri, 13 Mar 2026 16:26:01 +0000 Subject: [PATCH] Streamline record set items reordering query --- lib/music_library/record_sets.ex | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/music_library/record_sets.ex b/lib/music_library/record_sets.ex index e8fb689c..8e83c3ba 100644 --- a/lib/music_library/record_sets.ex +++ b/lib/music_library/record_sets.ex @@ -135,19 +135,24 @@ defmodule MusicLibrary.RecordSets do {:ok, get_record_set!(record_set.id)} end + # sobelow_skip ["SQL.Query"] @spec reorder_records_in_set(RecordSet.t(), [String.t()]) :: {:ok, RecordSet.t()} def reorder_records_in_set(%RecordSet{} = record_set, ordered_record_ids) when is_list(ordered_record_ids) do - Repo.transaction(fn -> + {case_clauses, params} = ordered_record_ids |> Enum.with_index() - |> Enum.each(fn {record_id, position} -> - from(i in RecordSetItem, - where: i.record_set_id == ^record_set.id and i.record_id == ^record_id - ) - |> Repo.update_all(set: [position: position]) + |> Enum.reduce({"", []}, fn {record_id, position}, {sql_acc, params_acc} -> + {"#{sql_acc}WHEN record_id = ? THEN ? ", params_acc ++ [record_id, position]} end) - end) + + sql = """ + UPDATE record_set_items + SET position = CASE #{case_clauses}ELSE position END + WHERE record_set_id = ? + """ + + Repo.query(sql, params ++ [record_set.id]) {:ok, get_record_set!(record_set.id)} end