Skip to content

Commit 737bfea

Browse files
committed
MBS-11305: Report for erroneous looking trailing join phrases
This looks for ACs which end in a "feat." style link phrase, or end with a comma, semicolon or colon. Both of these cases are almost always errors.
1 parent 31ac3aa commit 737bfea

10 files changed

+206
-0
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
@@ -100,6 +101,7 @@ use MusicBrainz::Server::PagedReport;
100101

101102
use MusicBrainz::Server::Report::ASINsWithMultipleReleases;
102103
use MusicBrainz::Server::Report::AnnotationReports;
104+
use MusicBrainz::Server::Report::ArtistCreditsWithDubiousTrailingPhrases;
103105
use MusicBrainz::Server::Report::ArtistsContainingDisambiguationComments;
104106
use MusicBrainz::Server::Report::ArtistsDisambiguationSameName;
105107
use MusicBrainz::Server::Report::ArtistsThatMayBeGroups;
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
@@ -149,6 +149,7 @@ module.exports = {
149149
'report/AnnotationsReleases': require('../report/AnnotationsReleases'),
150150
'report/AnnotationsSeries': require('../report/AnnotationsSeries'),
151151
'report/AnnotationsWorks': require('../report/AnnotationsWorks'),
152+
'report/ArtistCreditsWithDubiousTrailingPhrases': require('../report/ArtistCreditsWithDubiousTrailingPhrases'),
152153
'report/ArtistsContainingDisambiguationComments': require('../report/ArtistsContainingDisambiguationComments'),
153154
'report/ArtistsDisambiguationSameName': require('../report/ArtistsDisambiguationSameName'),
154155
'report/ArtistsThatMayBeGroups': require('../report/ArtistsThatMayBeGroups'),

0 commit comments

Comments
 (0)