[mb-commits] r12543 - in mb_server/trunk: lib/MusicBrainz/Server/Controller lib/MusicBrainz/Server/Data root/artist root/release_group t t/sql

root at musicbrainz.org root at musicbrainz.org
Sun Jan 17 15:55:41 UTC 2010


Author: acid2
Date: 2010-01-17 15:55:41 +0000 (Sun, 17 Jan 2010)
New Revision: 12543

Modified:
   mb_server/trunk/lib/MusicBrainz/Server/Controller/Artist.pm
   mb_server/trunk/lib/MusicBrainz/Server/Data/Release.pm
   mb_server/trunk/lib/MusicBrainz/Server/Data/ReleaseGroup.pm
   mb_server/trunk/root/artist/index.tt
   mb_server/trunk/root/artist/releases.tt
   mb_server/trunk/root/release_group/releases-list.tt
   mb_server/trunk/t/data_release.t
   mb_server/trunk/t/data_releasegroup.t
   mb_server/trunk/t/sql/release.sql
   mb_server/trunk/t/sql/releasegroup.sql
Log:
Add an option to show various artist releases/release groups.

Adds a link at the bottom of artist/releases and artist/release_groups
to show various artist releases. A few new data methods have been
added to facilate this.

Fixes MBS-179, reviewed in review 502.

Modified: mb_server/trunk/lib/MusicBrainz/Server/Controller/Artist.pm
===================================================================
--- mb_server/trunk/lib/MusicBrainz/Server/Controller/Artist.pm	2010-01-17 15:55:10 UTC (rev 12542)
+++ mb_server/trunk/lib/MusicBrainz/Server/Controller/Artist.pm	2010-01-17 15:55:41 UTC (rev 12543)
@@ -176,8 +176,14 @@
     }
     else
     {
+        my $method = 'find_by_artist';
+        if ($c->req->query_params->{va}) {
+            $method = 'find_by_track_artist';
+            $c->stash( show_va => 1 );
+        }
+
         $release_groups = $self->_load_paged($c, sub {
-                $c->model('ReleaseGroup')->find_by_artist($c->stash->{artist}->id, shift, shift);
+                $c->model('ReleaseGroup')->$method($c->stash->{artist}->id, shift, shift);
             });
         if ($c->user_exists) {
             $c->model('ReleaseGroup')->rating->load_user_ratings($c->user->id, @$release_groups);
@@ -296,8 +302,14 @@
     }
     else
     {
+        my $method = 'find_by_artist';
+        if ($c->req->query_params->{va}) {
+            $method = 'find_by_track_artist';
+            $c->stash( show_va => 1 );
+        }
+
         $releases = $self->_load_paged($c, sub {
-                $c->model('Release')->find_by_artist($artist->id, shift, shift);
+                $c->model('Release')->$method($artist->id, shift, shift);
             });
 
         $c->stash( template => 'artist/releases.tt' );

Modified: mb_server/trunk/lib/MusicBrainz/Server/Data/Release.pm
===================================================================
--- mb_server/trunk/lib/MusicBrainz/Server/Data/Release.pm	2010-01-17 15:55:10 UTC (rev 12542)
+++ mb_server/trunk/lib/MusicBrainz/Server/Data/Release.pm	2010-01-17 15:55:41 UTC (rev 12543)
@@ -99,6 +99,25 @@
         $query, $release_group_id, $offset || 0);
 }
 
+sub find_by_track_artist
+{
+    my ($self, $artist_id, $limit, $offset) = @_;
+    my $query = "SELECT " . $self->_columns . "
+                 FROM " . $self->_table . "
+                 WHERE release.id IN (
+                     SELECT release FROM medium
+                         JOIN track tr
+                         ON tr.tracklist = medium.tracklist
+                         JOIN artist_credit_name acn
+                         ON acn.artist_credit = tr.artist_credit
+                     WHERE acn.artist = ?)
+                 ORDER BY date_year, date_month, date_day, name.name
+                 OFFSET ?";
+    return query_to_list_limited(
+        $self->c->dbh, $offset, $limit, sub { $self->_new_from_row(@_) },
+        $query, $artist_id, $offset || 0);
+}
+
 sub find_by_collection
 {
     my ($self, $collection_id, $limit, $offset, $order) = @_;

Modified: mb_server/trunk/lib/MusicBrainz/Server/Data/ReleaseGroup.pm
===================================================================
--- mb_server/trunk/lib/MusicBrainz/Server/Data/ReleaseGroup.pm	2010-01-17 15:55:10 UTC (rev 12542)
+++ mb_server/trunk/lib/MusicBrainz/Server/Data/ReleaseGroup.pm	2010-01-17 15:55:41 UTC (rev 12543)
@@ -91,6 +91,51 @@
         $query, $artist_id, $offset || 0);
 }
 
+sub find_by_track_artist
+{
+    my ($self, $artist_id, $limit, $offset) = @_;
+    my $query = "SELECT " . $self->_columns . ",
+                    rgm.firstreleasedate_year,
+                    rgm.firstreleasedate_month,
+                    rgm.firstreleasedate_day,
+                    rgm.releasecount,
+                    rgm.ratingcount,
+                    rgm.rating
+                 FROM " . $self->_table . "
+                    JOIN release_group_meta rgm
+                        ON rgm.id = rg.id
+                    JOIN artist_credit_name acn
+                        ON acn.artist_credit = rg.artist_credit
+                 WHERE rg.id IN (
+                     SELECT release_group FROM release
+                         JOIN medium
+                         ON medium.release = release.id
+                         JOIN track tr
+                         ON tr.tracklist = medium.tracklist
+                         JOIN artist_credit_name acn
+                         ON acn.artist_credit = tr.artist_credit
+                     WHERE acn.artist = ?
+                 )
+                 ORDER BY
+                    rg.type,
+                    rgm.firstreleasedate_year,
+                    rgm.firstreleasedate_month,
+                    rgm.firstreleasedate_day,
+                    name.name
+                 OFFSET ?";
+    return query_to_list_limited(
+        $self->c->dbh, $offset, $limit, sub {
+            my $row = $_[0];
+            my $rg = $self->_new_from_row($row);
+            $rg->rating($row->{rating}) if defined $row->{rating};
+            $rg->rating_count($row->{ratingcount}) if defined $row->{ratingcount};
+            $rg->first_release_date(partial_date_from_row($row, 'firstreleasedate_'));
+            $rg->release_count($row->{releasecount} || 0);
+            return $rg;
+        },
+        $query, $artist_id, $offset || 0);
+}
+
 # This could be wrapped into find_by_artist, but it still needs to support filtering on VA releases
 sub filter_by_artist
 {

Modified: mb_server/trunk/root/artist/index.tt
===================================================================
--- mb_server/trunk/root/artist/index.tt	2010-01-17 15:55:10 UTC (rev 12542)
+++ mb_server/trunk/root/artist/index.tt	2010-01-17 15:55:41 UTC (rev 12543)
@@ -16,6 +16,9 @@
                             <tr>
                                 <th class="year c">[% l('Year') %]</th>
                                 <th>[% l('Title') %]</th>
+                                [% IF show_va %]
+                                <th>[% l('Artist') %]</th>
+                                [% END %]
                                 <th class="rating c">[% l('Rating') %]</th>
                                 <th class="count c">[% l('Releases') %]</th>
                             </tr>
@@ -26,6 +29,9 @@
                 <tr[% ' class="ev"' IF loop.count % 2 == 0 %]>
                     <td class="c">[% rg.first_release_date.year or '&mdash;' %]</td>
                     <td>[% link_release_group(rg) %]</td>
+                    [% IF show_va %]
+                    <td>[% artist_credit(rg.artist_credit) %]</td>
+                    [% END %]
                     <td class="c">[% rating_stars(rg) %]</td>
                     <td class="c">[% rg.release_count %]</td>
                 </tr>
@@ -38,5 +44,8 @@
     [%- ELSE -%]
         <p>[% l('No release groups found') %]</p>
     [%- END -%]
-
+    [% IF !show_va %]
+        <p>[% l('This artist may also appear on releases by various artists. {show_all|Show all releases}',
+                { show_all = c.uri_for_action('/artist/show', [ artist.gid ], { va = 1 }) }) %]</p>
+    [% END %]
 [% END %]

Modified: mb_server/trunk/root/artist/releases.tt
===================================================================
--- mb_server/trunk/root/artist/releases.tt	2010-01-17 15:55:10 UTC (rev 12542)
+++ mb_server/trunk/root/artist/releases.tt	2010-01-17 15:55:41 UTC (rev 12543)
@@ -4,4 +4,8 @@
     [%- ELSE -%]
         <p>[%- l('No releases found') -%]</p>
     [%- END -%]
+    [% IF !show_va %]
+        <p>[% l('This artist may also appear on releases by various artists. {show_all|Show all releases}',
+                { show_all = c.uri_for_action('/artist/show', [ artist.gid ], { va = 1 }) }) %]</p>
+    [% END %]
 [%- END -%]

Modified: mb_server/trunk/root/release_group/releases-list.tt
===================================================================
--- mb_server/trunk/root/release_group/releases-list.tt	2010-01-17 15:55:10 UTC (rev 12542)
+++ mb_server/trunk/root/release_group/releases-list.tt	2010-01-17 15:55:41 UTC (rev 12543)
@@ -2,6 +2,9 @@
     <thead>
         <tr>
             <th>[% l('Release') %]</th>
+            [% IF show_va %]
+            <th>[% l('Artist') %]</th>
+            [% END %]
             <th>[% l('Format') %]</th>
             <th>[% l('Tracks') %]</th>
             <th>[% l('Date') %]</th>
@@ -14,6 +17,9 @@
         [%- FOR release=releases -%]
         <tr[% ' class="ev"' IF loop.count % 2 == 0 %]>
             <td>[% link_release(release) %]</td>
+            [% IF show_va %]
+            <td>[% artist_credit(release.artist_credit) %]</td>
+            [% END %]
             <td>[% release.combined_format_name or "-" %]</td>
             <td>[% release.combined_track_count or "-" %]</td>
             <td>[% release.date.format %]</td>

Modified: mb_server/trunk/t/data_release.t
===================================================================
--- mb_server/trunk/t/data_release.t	2010-01-17 15:55:10 UTC (rev 12542)
+++ mb_server/trunk/t/data_release.t	2010-01-17 15:55:41 UTC (rev 12543)
@@ -1,7 +1,7 @@
 #!/usr/bin/perl
 use strict;
 use warnings;
-use Test::More tests => 66;
+use Test::More;
 use_ok 'MusicBrainz::Server::Data::Release';
 use MusicBrainz::Server::Data::ReleaseLabel;
 
@@ -46,6 +46,11 @@
 is( $releases->[0]->id, 1 );
 is( $releases->[1]->id, 2 );
 
+($releases, $hits) = $release_data->find_by_track_artist(1, 100);
+is( $hits, 1 );
+is( scalar(@$releases), 1 );
+is( $releases->[0]->id, 3 );
+
 ($releases, $hits) = $release_data->find_by_release_group(1, 100);
 is( $hits, 2 );
 is( scalar(@$releases), 2 );
@@ -137,3 +142,5 @@
 ok(defined $release);
 $release = $release_data->get_by_id(2);
 ok(!defined $release);
+
+done_testing;

Modified: mb_server/trunk/t/data_releasegroup.t
===================================================================
--- mb_server/trunk/t/data_releasegroup.t	2010-01-17 15:55:10 UTC (rev 12542)
+++ mb_server/trunk/t/data_releasegroup.t	2010-01-17 15:55:41 UTC (rev 12543)
@@ -1,7 +1,7 @@
 #!/usr/bin/perl
 use strict;
 use warnings;
-use Test::More tests => 42;
+use Test::More;
 use_ok 'MusicBrainz::Server::Data::ReleaseGroup';
 use MusicBrainz::Server::Data::Release;
 use MusicBrainz::Server::Data::Search;
@@ -37,6 +37,12 @@
 is( $rgs->[0]->id, 1 );
 is( $rgs->[1]->id, 2 );
 
+
+($rgs, $hits) = $rg_data->find_by_track_artist(1, 100);
+is( $hits, 1 );
+is( scalar(@$rgs), 1 );
+is( $rgs->[0]->id, 3 );
+
 my $release_data = MusicBrainz::Server::Data::Release->new(c => $c);
 my $release = $release_data->get_by_id(1);
 isnt( $release, undef );
@@ -101,3 +107,5 @@
 
 $raw_sql->commit;
 $sql->commit;
+
+done_testing;

Modified: mb_server/trunk/t/sql/release.sql
===================================================================
--- mb_server/trunk/t/sql/release.sql	2010-01-17 15:55:10 UTC (rev 12542)
+++ mb_server/trunk/t/sql/release.sql	2010-01-17 15:55:41 UTC (rev 12543)
@@ -11,6 +11,7 @@
 TRUNCATE label_name CASCADE;
 TRUNCATE label CASCADE;
 TRUNCATE language CASCADE;
+TRUNCATE recording CASCADE;
 TRUNCATE release CASCADE;
 TRUNCATE release_annotation CASCADE;
 TRUNCATE release_gid_redirect CASCADE;
@@ -20,6 +21,10 @@
 TRUNCATE release_name CASCADE;
 TRUNCATE release_packaging CASCADE;
 TRUNCATE release_status CASCADE;
+TRUNCATE track_name CASCADE;
+TRUNCATE track CASCADE;
+TRUNCATE tracklist CASCADE;
+TRUNCATE medium CASCADE;
 TRUNCATE script CASCADE;
 
 INSERT INTO artist_name (id, name) VALUES (1, 'Name');
@@ -64,8 +69,28 @@
 
 INSERT INTO release_gid_redirect (gid, newid) VALUES ('71dc55d8-0fc6-41c1-94e0-85ff2404997d', 1);
 
-ALTER SEQUENCE release_name_id_seq RESTART 3;
+INSERT INTO artist_name (id, name) VALUES (2, 'Various Artists');
+INSERT INTO artist (id, gid, name, sortname)
+    VALUES (2, '7a906020-72db-11de-8a39-0800200c9a66', 2, 2);
+INSERT INTO artist_credit (id, artistcount) VALUES (2, 1);
+INSERT INTO artist_credit_name (artist_credit, artist, name, position, joinphrase) VALUES (2, 2, 2, 1, NULL);
+
+INSERT into release_name (id, name) VALUES (3, 'Various Release');
+INSERT INTO release_group (id, gid, name, artist_credit)
+    VALUES (2, '25b6fe30-ff5b-11de-8a39-0800200c9a66', 3, 2);
+INSERT INTO release (id, gid, name, artist_credit, release_group)
+    VALUES (3, '25b6fe30-ff5b-11de-8a39-0800200c9a66', 3, 2, 2);
+
+INSERT INTO track_name (id, name) VALUES (1, 'Track on recording');
+INSERT INTO tracklist (id, trackcount) VALUES (1, 1);
+INSERT INTO medium (id, tracklist, release, position) VALUES (1, 1, 3, 1);
+INSERT INTO recording (id, artist_credit, name, gid)
+    VALUES (1, 2, 1, 'b43eb990-ff5b-11de-8a39-0800200c9a66');
+INSERT INTO track (id, name, artist_credit, tracklist, position, recording)
+    VALUES (1, 1, 1, 1, 1, 1);
+
+ALTER SEQUENCE release_name_id_seq RESTART 4;
 ALTER SEQUENCE release_group_id_seq RESTART 2;
-ALTER SEQUENCE release_id_seq RESTART 3;
+ALTER SEQUENCE release_id_seq RESTART 4;
 
 COMMIT;

Modified: mb_server/trunk/t/sql/releasegroup.sql
===================================================================
--- mb_server/trunk/t/sql/releasegroup.sql	2010-01-17 15:55:10 UTC (rev 12542)
+++ mb_server/trunk/t/sql/releasegroup.sql	2010-01-17 15:55:41 UTC (rev 12543)
@@ -14,6 +14,11 @@
 TRUNCATE release_group_gid_redirect CASCADE;
 TRUNCATE release_name CASCADE;
 
+TRUNCATE medium CASCADE;
+TRUNCATE track_name CASCADE;
+TRUNCATE tracklist CASCADE;
+TRUNCATE recording CASCADE;
+
 INSERT INTO artist_name (id, name) VALUES (1, 'Name');
 INSERT INTO artist (id, gid, name, sortname)
     VALUES (1, 'a9d99e40-72d7-11de-8a39-0800200c9a66', 1, 1);
@@ -43,7 +48,27 @@
 
 INSERT INTO release_group_gid_redirect (gid, newid) VALUES ('77637e8c-be66-46ea-87b3-73addc722fc9', 1);
 
-ALTER SEQUENCE release_name_id_seq RESTART 4;
-ALTER SEQUENCE release_group_id_seq RESTART 3;
+INSERT INTO artist_name (id, name) VALUES (2, 'Various Artists');
+INSERT INTO artist (id, gid, name, sortname)
+    VALUES (2, '7a906020-72db-11de-8a39-0800200c9a66', 2, 2);
+INSERT INTO artist_credit (id, artistcount) VALUES (2, 1);
+INSERT INTO artist_credit_name (artist_credit, artist, name, position, joinphrase) VALUES (2, 2, 2, 1, NULL);
 
+INSERT into release_name (id, name) VALUES (4, 'Various Release');
+INSERT INTO release_group (id, gid, name, artist_credit)
+    VALUES (3, '25b6fe30-ff5b-11de-8a39-0800200c9a66', 4, 2);
+INSERT INTO release (id, gid, name, artist_credit, release_group)
+    VALUES (3, '25b6fe30-ff5b-11de-8a39-0800200c9a66', 4, 2, 3);
+
+INSERT INTO track_name (id, name) VALUES (1, 'Track on recording');
+INSERT INTO tracklist (id, trackcount) VALUES (1, 1);
+INSERT INTO medium (id, tracklist, release, position) VALUES (1, 1, 3, 1);
+INSERT INTO recording (id, artist_credit, name, gid)
+    VALUES (1, 2, 1, 'b43eb990-ff5b-11de-8a39-0800200c9a66');
+INSERT INTO track (id, name, artist_credit, tracklist, position, recording)
+    VALUES (1, 1, 1, 1, 1, 1);
+
+ALTER SEQUENCE release_name_id_seq RESTART 5;
+ALTER SEQUENCE release_group_id_seq RESTART 4;
+
 COMMIT;




More information about the MusicBrainz-commits mailing list