[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 '—' %]</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