feat: complex query to handle artist member relevance (#988)

This commit is contained in:
Kyrch
2025-10-30 21:05:28 -03:00
committed by GitHub
parent 5120342f37
commit 5fd00ec028
2 changed files with 37 additions and 2 deletions
@@ -155,6 +155,8 @@ class ManageSongPerformances
[ArtistMember::ATTRIBUTE_ALIAS, ArtistMember::ATTRIBUTE_AS],
);
$this->setArtistMemberRelevance();
$this->syncSongArtist();
DB::commit();
@@ -169,6 +171,40 @@ class ManageSongPerformances
return $this;
}
/**
* Complex query to set relevance for artist members based on created_at order.
*/
protected function setArtistMemberRelevance(): void
{
DB::statement('
WITH base AS (
SELECT
artist_id,
COALESCE(MAX(relevance), 0) AS max_rel
FROM artist_member
GROUP BY artist_id
),
ranked AS (
SELECT
artist_id,
member_id,
ROW_NUMBER() OVER (
PARTITION BY artist_id
ORDER BY created_at
) AS rn
FROM artist_member
WHERE relevance IS NULL
)
UPDATE artist_member am
JOIN ranked r
ON am.artist_id = r.artist_id
AND am.member_id = r.member_id
JOIN base b
ON b.artist_id = r.artist_id
SET am.relevance = r.rn + b.max_rel;
');
}
/**
* Temporary function where the performances feature synchronizes with the artist_song pivot table.
*/
@@ -39,8 +39,7 @@ class LoadMembersAction extends Action
$group = Artist::query()
->with([
Artist::RELATION_MEMBERS => function (Relation $relation): void {
$relation->orderBy(ArtistMember::ATTRIBUTE_RELEVANCE)
->orderBy(ArtistMember::ATTRIBUTE_CREATED_AT);
$relation->orderBy(ArtistMember::ATTRIBUTE_RELEVANCE)->oldest();
},
])
->find($artistId);