mirror of
https://github.com/AnimeThemes/animethemes-server.git
synced 2026-07-11 01:24:46 +02:00
feat: complex query to handle artist member relevance (#988)
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user