Skip to content

Commit c47b209

Browse files
authored
MBS-11371: Group members in JSON-LD by date, do not squash (metabrainz#2129)
The code used to squash all "member of" rels between a group and a person into one relationship for JSON-LD, whether that made sense or not (for example, it'd happily squash two relationships into "start date 2020, end date 2010"). We talked to Google people and they said they thought having one role entry per date set was better, so this code does that. We still group several relationships from the same date (to display "guitar, piano" together if the same member played both with the same dates).
1 parent 674151c commit c47b209

File tree

2 files changed

+34
-13
lines changed
  • lib/MusicBrainz/Server/WebService/Serializer/JSON/LD
  • t/lib/t/MusicBrainz/Server/Controller/Artist

2 files changed

+34
-13
lines changed

lib/MusicBrainz/Server/WebService/Serializer/JSON/LD/Artist.pm

+16-10
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,18 @@ around serialize => sub {
4141
if (@members) {
4242
my %seen_members;
4343
for my $member (@members) {
44-
$seen_members{$member->target->gid} = member_relationship($member, $inc, $stash, $seen_members{$member->target->gid});
44+
# We separate different dates, but keep together
45+
# different roles with the same dates
46+
my $key = $member->target->gid;
47+
my $begin_date = $member->link->begin_date;
48+
my $end_date = $member->link->end_date;
49+
if ($begin_date && $begin_date->defined_run) {
50+
$key .= '-begin-' . join('-', $begin_date->defined_run);
51+
}
52+
if ($end_date && $end_date->defined_run) {
53+
$key .= '-end-' . join('-', $end_date->defined_run);
54+
}
55+
$seen_members{$key} = member_relationship($member, $inc, $stash, $seen_members{$key});
4556
}
4657
$ret->{member} = [ map { $seen_members{$_} } sort keys %seen_members ];
4758
}
@@ -83,20 +94,15 @@ sub member_relationship {
8394
$is_new = 1;
8495
}
8596

86-
# XXX: given two rels with different dates, this assumes it should take the
87-
# earliest start date and the latest end date, assuming undef as
88-
# indefinitely in the future. This may not be correct, as different roles
89-
# may have different dates associated with them, but it seems likely to be
90-
# the most accurate representation of the membership dates
91-
if ($relationship->link->begin_date && $relationship->link->begin_date->defined_run) {
97+
if ($is_new && $relationship->link->begin_date && $relationship->link->begin_date->defined_run) {
9298
my @run = $relationship->link->begin_date->defined_run;
9399
my $date = PartialDate->new(year => $run[0], month => $run[1], day => $run[2]);
94-
$ret->{startDate} = $date->format if ($is_new || !$ret->{startDate} || PartialDate->new($ret->{startDate}) > $date);
100+
$ret->{startDate} = $date->format;
95101
}
96-
if ($relationship->link->end_date && $relationship->link->end_date->defined_run) {
102+
if ($is_new && $relationship->link->end_date && $relationship->link->end_date->defined_run) {
97103
my @run = $relationship->link->end_date->defined_run;
98104
my $date = PartialDate->new(year => $run[0], month => $run[1], day => $run[2]);
99-
$ret->{endDate} = $date->format if ($is_new || ($ret->{endDate} && PartialDate->new($ret->{endDate}) < $date));
105+
$ret->{endDate} = $date->format;
100106
}
101107

102108
# XXX: role names are instruments (or, where available, credits), not

t/lib/t/MusicBrainz/Server/Controller/Artist/Show.pm

+18-3
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,15 @@ test 'Embedded JSON-LD `member` property' => sub {
120120
(3, 'efac67ce-33ae-4949-8fc8-3d2aeafcbefb', 'Person B', 'Person B');
121121
122122
INSERT INTO link (id, link_type, begin_date_year, end_date_year)
123-
VALUES (1, 103, 2001, 2002), (2, 103, 1999, 2002);
123+
VALUES (1, 103, 2001, 2002), (2, 103, 1999, 2002),
124+
(3, 103, 1999, 2002), (4, 103, 2005, NULL);
124125
125126
INSERT INTO l_artist_artist (id, link, entity0, entity1, entity0_credit)
126-
VALUES (1, 1, 2, 1, 'A.'), (2, 2, 3, 1, 'B.');
127+
VALUES (1, 1, 2, 1, 'A.'), (2, 2, 3, 1, 'B.'),
128+
(3, 3, 3, 1, 'B.'), (4, 4, 3, 1, 'B.');
129+
130+
INSERT INTO link_attribute (link, attribute_type)
131+
VALUES (2, 229), (3, 125), (4, 229);
127132
EOSQL
128133

129134
$mech->get_ok('/artist/dcb48a49-b17d-49b9-aee5-4f168d8004d9');
@@ -152,7 +157,17 @@ EOSQL
152157
'endDate' => '2002',
153158
'@type' => 'OrganizationRole',
154159
'startDate' => '1999',
155-
'roleName' => []
160+
'roleName' => ['guitar','drums']
161+
},
162+
{
163+
'member' => {
164+
'@id' => 'http://musicbrainz.org/artist/efac67ce-33ae-4949-8fc8-3d2aeafcbefb',
165+
'name' => 'Person B',
166+
'@type' => 'MusicGroup'
167+
},
168+
'@type' => 'OrganizationRole',
169+
'startDate' => '2005',
170+
'roleName' => 'guitar'
156171
}
157172
],
158173
'@context' => 'http://schema.org'

0 commit comments

Comments
 (0)