Skip to content

Commit 63367a4

Browse files
authored
Merge pull request metabrainz#1862 from reosarevok/MBS-11305
MBS-11305: Report for erroneous looking trailing join phrases
2 parents b80aa88 + 737bfea commit 63367a4

15 files changed

+280
-17
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package MusicBrainz::Server::Report::ArtistCreditReport;
2+
use Moose::Role;
3+
use MusicBrainz::Server::Entity::Util::JSON qw( to_json_object );
4+
5+
with 'MusicBrainz::Server::Report::QueryReport';
6+
7+
around inflate_rows => sub {
8+
my $orig = shift;
9+
my $self = shift;
10+
11+
my $items = $self->$orig(@_);
12+
13+
my $artist_credits = $self->c->model('ArtistCredit')->get_by_ids(
14+
map { $_->{artist_credit_id} } @$items
15+
);
16+
17+
return [
18+
map +{
19+
%$_,
20+
artist_credit => to_json_object($artist_credits->{ $_->{artist_credit_id} }),
21+
}, @$items
22+
];
23+
};
24+
25+
1;
26+
27+
=head1 COPYRIGHT AND LICENSE
28+
29+
Copyright (C) 2021 MetaBrainz Foundation
30+
31+
This file is part of MusicBrainz, the open internet music database,
32+
and is licensed under the GPL version 2, or (at your option) any
33+
later version: http://www.gnu.org/licenses/gpl-2.0.txt
34+
35+
=cut
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package MusicBrainz::Server::Report::ArtistCreditsWithDubiousTrailingPhrases;
2+
use Moose;
3+
4+
with 'MusicBrainz::Server::Report::ArtistCreditReport',
5+
'MusicBrainz::Server::Report::FilterForEditor::ArtistCreditID';
6+
7+
sub query {<<~'EOSQL'}
8+
SELECT ac.id AS artist_credit_id, ac.name,
9+
row_number() OVER (ORDER BY ac.id)
10+
FROM artist_credit ac
11+
JOIN artist_credit_name acn ON acn.artist_credit = ac.id
12+
WHERE acn.position = (ac.artist_count - 1)
13+
AND acn.join_phrase ~* '(?:ft\.?|feat\.?|[;:,])\s*$'
14+
EOSQL
15+
16+
__PACKAGE__->meta->make_immutable;
17+
no Moose;
18+
1;
19+
20+
=head1 COPYRIGHT AND LICENSE
21+
22+
Copyright (C) 2021 MetaBrainz Foundation
23+
24+
This file is part of MusicBrainz, the open internet music database,
25+
and is licensed under the GPL version 2, or (at your option) any
26+
later version: http://www.gnu.org/licenses/gpl-2.0.txt
27+
28+
=cut
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package MusicBrainz::Server::Report::FilterForEditor::ArtistCreditID;
2+
use Moose::Role;
3+
4+
with 'MusicBrainz::Server::Report::FilterForEditor';
5+
6+
sub filter_sql {
7+
my ($self, $editor_id) = @_;
8+
9+
my $filter_query = <<~'EOSQL';
10+
JOIN artist_credit_name ON artist_credit_id = artist_credit_name.artist_credit
11+
JOIN editor_subscribe_artist esa ON esa.artist = artist_credit_name.artist
12+
WHERE esa.editor = ?
13+
EOSQL
14+
15+
return ($filter_query, $editor_id);
16+
}
17+
18+
1;
19+
20+
=head1 COPYRIGHT AND LICENSE
21+
22+
Copyright (C) 2021 MetaBrainz Foundation
23+
24+
This file is part of MusicBrainz, the open internet music database,
25+
and is licensed under the GPL version 2, or (at your option) any
26+
later version: http://www.gnu.org/licenses/gpl-2.0.txt
27+
28+
=cut

lib/MusicBrainz/Server/ReportFactory.pm

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use MusicBrainz::Server::PagedReport;
1313
AnnotationsReleaseGroups
1414
AnnotationsSeries
1515
AnnotationsWorks
16+
ArtistCreditsWithDubiousTrailingPhrases
1617
ArtistsContainingDisambiguationComments
1718
ArtistsDisambiguationSameName
1819
ArtistsWithMultipleOccurrencesInArtistCredits
@@ -102,6 +103,7 @@ use MusicBrainz::Server::PagedReport;
102103

103104
use MusicBrainz::Server::Report::ASINsWithMultipleReleases;
104105
use MusicBrainz::Server::Report::AnnotationReports;
106+
use MusicBrainz::Server::Report::ArtistCreditsWithDubiousTrailingPhrases;
105107
use MusicBrainz::Server::Report::ArtistsContainingDisambiguationComments;
106108
use MusicBrainz::Server::Report::ArtistsDisambiguationSameName;
107109
use MusicBrainz::Server::Report::ArtistsThatMayBeGroups;

root/artist_credit/ArtistCreditIndex.js

+7-5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import * as React from 'react';
1111

1212
import ENTITIES from '../../entities';
13+
import ArtistCreditUsageLink
14+
from '../static/scripts/common/components/ArtistCreditUsageLink';
1315
import DescriptiveLink
1416
from '../static/scripts/common/components/DescriptiveLink';
1517
import EntityLink
@@ -43,8 +45,6 @@ function buildSection(
4345
}
4446

4547
const entityUrlFragment = ENTITIES[entityType].url;
46-
const url = '/artist-credit/' + props.artistCredit.id +
47-
'/' + entityUrlFragment;
4848

4949
return (
5050
<React.Fragment key={entityType}>
@@ -62,12 +62,14 @@ function buildSection(
6262
{entities.count > entities.entities.length ? (
6363
<li key="see-all">
6464
<em>
65-
<a href={url}>
66-
{expand2text(
65+
<ArtistCreditUsageLink
66+
artistCredit={props.artistCredit}
67+
content={expand2text(
6768
seeAllMessage(entities.count),
6869
{num: formatCount(props.$c, entities.count)},
6970
)}
70-
</a>
71+
subPath={entityUrlFragment}
72+
/>
7173
</em>
7274
</li>
7375
) : null}

root/artist_credit/ArtistCreditLayout.js

+11-6
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import * as React from 'react';
1111

1212
import Tabs from '../components/Tabs';
1313
import Layout from '../layout';
14+
import ArtistCreditUsageLink
15+
from '../static/scripts/common/components/ArtistCreditUsageLink';
1416
import {reduceArtistCredit}
1517
from '../static/scripts/common/immutable-entities';
1618

@@ -54,19 +56,22 @@ const ArtistCreditLayout = ({
5456
>
5557
<div id="content">
5658
<h1>
57-
<a href={'/artist-credit/' + artistCredit.id}>
58-
{texp.l(
59+
<ArtistCreditUsageLink
60+
artistCredit={artistCredit}
61+
content={texp.l(
5962
'Artist credit “{artist_credit}”',
6063
{artist_credit: reduceArtistCredit(artistCredit)},
6164
)}
62-
</a>
65+
/>
6366
</h1>
6467
<Tabs>
6568
{tabLinks.map(link => (
6669
<li className={page === link[0] ? 'sel' : ''} key={link[0]}>
67-
<a href={'/artist-credit/' + artistCredit.id + link[0]}>
68-
{link[1]()}
69-
</a>
70+
<ArtistCreditUsageLink
71+
artistCredit={artistCredit}
72+
content={link[1]()}
73+
subPath={link[0].replace(/^\//, '')}
74+
/>
7075
</li>
7176
))}
7277
</Tabs>

root/components/Aliases/ArtistCreditList.js

+6-3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import * as React from 'react';
1111

1212
import ArtistCreditLink
1313
from '../../static/scripts/common/components/ArtistCreditLink';
14+
import ArtistCreditUsageLink
15+
from '../../static/scripts/common/components/ArtistCreditUsageLink';
1416
import EntityLink from '../../static/scripts/common/components/EntityLink';
1517
import bracketed from '../../static/scripts/common/utility/bracketed';
1618
import loopParity from '../../utility/loopParity';
@@ -62,9 +64,10 @@ const ArtistCreditList = ({
6264
{' '}
6365
<span className="small">
6466
{bracketed(
65-
<a href={`/artist-credit/${credit.id}`}>
66-
{l('see uses')}
67-
</a>,
67+
<ArtistCreditUsageLink
68+
artistCredit={credit}
69+
content={l('see uses')}
70+
/>,
6871
)}
6972
</span>
7073
</td>

root/edit/details/EditArtistCredit.js

+8-3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
import * as React from 'react';
1111

12+
import ArtistCreditUsageLink
13+
from '../../static/scripts/common/components/ArtistCreditUsageLink';
1214
import ExpandedArtistCredit from
1315
'../../static/scripts/common/components/ExpandedArtistCredit';
1416

@@ -42,9 +44,12 @@ const EditArtistCredit = ({edit}: Props): React.Element<'table'> => {
4244
<tr>
4345
<th />
4446
<td colSpan="2">
45-
<a href={`/artist-credit/${display.artist_credit.old.id}`}>
46-
{l('See all uses of the artist credit being changed.')}
47-
</a>
47+
<ArtistCreditUsageLink
48+
artistCredit={display.artist_credit.old}
49+
content={l(
50+
'See all uses of the artist credit being changed.',
51+
)}
52+
/>
4853
</td>
4954
</tr>
5055
) : null}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* @flow strict-local
3+
* Copyright (C) 2021 MetaBrainz Foundation
4+
*
5+
* This file is part of MusicBrainz, the open internet music database,
6+
* and is licensed under the GPL version 2, or (at your option) any
7+
* later version: http://www.gnu.org/licenses/gpl-2.0.txt
8+
*/
9+
10+
import * as React from 'react';
11+
12+
import ArtistCreditList from './components/ArtistCreditList';
13+
import ReportLayout from './components/ReportLayout';
14+
import type {ReportArtistCreditT, ReportDataT} from './types';
15+
16+
const ArtistCreditsWithDubiousTrailingPhrases = ({
17+
canBeFiltered,
18+
filtered,
19+
generated,
20+
items,
21+
pager,
22+
}: ReportDataT<ReportArtistCreditT>): React.Element<typeof ReportLayout> => (
23+
<ReportLayout
24+
canBeFiltered={canBeFiltered}
25+
description={l(
26+
`This report lists artist credits that have a trailing join phrase
27+
that looks like it might have been left behind in error, such as
28+
a trailing comma or “feat.”.`,
29+
)}
30+
entityType="artist_credit"
31+
filtered={filtered}
32+
generated={generated}
33+
title={l('Artist credits with dubious trailing join phrases')}
34+
totalEntries={pager.total_entries}
35+
>
36+
<ArtistCreditList items={items} pager={pager} />
37+
</ReportLayout>
38+
);
39+
40+
export default ArtistCreditsWithDubiousTrailingPhrases;

root/report/ReportsIndex.js

+9
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,15 @@ const ReportsIndex = ({$c}: Props): React.Element<typeof Layout> => (
113113
/>
114114
</ul>
115115

116+
<h2>{l('Artist credits')}</h2>
117+
118+
<ul>
119+
<ReportsIndexEntry
120+
content={l('Artist credits with dubious trailing join phrases')}
121+
reportName="ArtistCreditsWithDubiousTrailingPhrases"
122+
/>
123+
</ul>
124+
116125
{isAccountAdmin($c.user) ? (
117126
<>
118127
<h2>{l('Editors')}</h2>
+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* @flow strict-local
3+
* Copyright (C) 2021 MetaBrainz Foundation
4+
*
5+
* This file is part of MusicBrainz, the open internet music database,
6+
* and is licensed under the GPL version 2, or (at your option) any
7+
* later version: http://www.gnu.org/licenses/gpl-2.0.txt
8+
*/
9+
10+
import * as React from 'react';
11+
12+
import PaginatedResults from '../../components/PaginatedResults';
13+
import ArtistCreditUsageLink
14+
from '../../static/scripts/common/components/ArtistCreditUsageLink';
15+
import loopParity from '../../utility/loopParity';
16+
import type {ReportArtistCreditT} from '../types';
17+
18+
type Props = {
19+
+items: $ReadOnlyArray<ReportArtistCreditT>,
20+
+pager: PagerT,
21+
};
22+
23+
const ArtistCreditList = ({
24+
items,
25+
pager,
26+
}: Props): React.Element<typeof PaginatedResults> => (
27+
<PaginatedResults pager={pager}>
28+
<table className="tbl">
29+
<thead>
30+
<tr>
31+
<th>{l('Artist Credit')}</th>
32+
</tr>
33+
</thead>
34+
<tbody>
35+
{items.map((item, index) => (
36+
<tr className={loopParity(index)} key={item.artist_credit_id}>
37+
{item.artist_credit ? (
38+
<>
39+
<td>
40+
<ArtistCreditUsageLink artistCredit={item.artist_credit} />
41+
</td>
42+
</>
43+
) : (
44+
<td>
45+
{l('This artist credit no longer exists.')}
46+
</td>
47+
)}
48+
</tr>
49+
))}
50+
</tbody>
51+
</table>
52+
</PaginatedResults>
53+
);
54+
55+
export default ArtistCreditList;

root/report/components/ReportLayout.js

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import FilterLink from '../FilterLink';
1717

1818
const countTextPicker = {
1919
artist: N_l('Total artists found: {count}'),
20+
artist_credit: N_l('Total artist credits found: {count}'),
2021
discId: N_l('Total discIDs found: {count}'),
2122
editor: N_l('Total editors found: {count}'),
2223
event: N_l('Total events found: {count}'),

root/report/types.js

+7
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,13 @@ export type ReportArtistAnnotationT = {
1616
+text: string,
1717
};
1818

19+
export type ReportArtistCreditT = {
20+
+artist_credit: ?ArtistCreditT,
21+
+artist_credit_id: number,
22+
+key?: string,
23+
+row_number: number,
24+
};
25+
1926
export type ReportArtistRelationshipT = {
2027
+artist: ?ArtistT,
2128
+artist_id: number,

root/server/components.js

+1
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ module.exports = {
150150
'report/AnnotationsReleases': require('../report/AnnotationsReleases'),
151151
'report/AnnotationsSeries': require('../report/AnnotationsSeries'),
152152
'report/AnnotationsWorks': require('../report/AnnotationsWorks'),
153+
'report/ArtistCreditsWithDubiousTrailingPhrases': require('../report/ArtistCreditsWithDubiousTrailingPhrases'),
153154
'report/ArtistsContainingDisambiguationComments': require('../report/ArtistsContainingDisambiguationComments'),
154155
'report/ArtistsDisambiguationSameName': require('../report/ArtistsDisambiguationSameName'),
155156
'report/ArtistsThatMayBeGroups': require('../report/ArtistsThatMayBeGroups'),

0 commit comments

Comments
 (0)