diff --git a/lib/MusicBrainz/Server/Controller/Search.pm b/lib/MusicBrainz/Server/Controller/Search.pm index 3b474eca80c..86cd3a78615 100644 --- a/lib/MusicBrainz/Server/Controller/Search.pm +++ b/lib/MusicBrainz/Server/Controller/Search.pm @@ -188,6 +188,7 @@ sub direct : Private when ('series') { $c->model('SeriesType')->load(@entities); $c->model('SeriesOrderingType')->load(@entities); + $c->model('Series')->load_entity_count(@entities); } when ('event') { $c->model('Event')->load_related_info(@entities); diff --git a/lib/MusicBrainz/Server/Data/Search.pm b/lib/MusicBrainz/Server/Data/Search.pm index 21f08387df9..fac43937285 100644 --- a/lib/MusicBrainz/Server/Data/Search.pm +++ b/lib/MusicBrainz/Server/Data/Search.pm @@ -396,13 +396,29 @@ my %mapping = ( 'title' => 'name', 'artist-credit' => 'artist_credit', 'label-code' => 'label_code', + 'type-id' => 'type_id', ); sub schema_fixup_type { my ($self, $data, $type) = @_; + + my $type_gid = delete $data->{type_id}; + if (defined $data->{type} && $type ~~ [ entities_with(['type', 'simple']) ]) { + my $item_entity_type; + if ($type eq 'series') { + # This is needed to query the number of entities later + $item_entity_type = $self->c->sql->select_single_value( + 'SELECT entity_type FROM series_type WHERE gid = ?', + $type_gid + ); + } my $model = 'MusicBrainz::Server::Entity::' . type_to_model($type) . 'Type'; - $data->{type} = $model->new( name => $data->{type} ); + $data->{type} = $model->new( + name => $data->{type}, + gid => $type_gid, + defined $item_entity_type ? (item_entity_type => $item_entity_type) : (), + ); } return $data; } @@ -955,6 +971,13 @@ sub external_search $self->c->model('Artwork')->load_for_release_groups(@entities); } + if ($type eq 'series') + { + my @entities = map { $_->entity } @results; + $self->c->model('Series')->load_ids(@entities); + $self->c->model('Series')->load_entity_count(@entities); + } + my $pager = Data::Page->new; $pager->current_page($page); $pager->entries_per_page($limit); diff --git a/lib/MusicBrainz/Server/Data/Series.pm b/lib/MusicBrainz/Server/Data/Series.pm index 1524623aace..94e0c07ede8 100644 --- a/lib/MusicBrainz/Server/Data/Series.pm +++ b/lib/MusicBrainz/Server/Data/Series.pm @@ -12,6 +12,7 @@ use MusicBrainz::Server::Data::Utils qw( merge_table_attributes load_subobjects order_by + placeholders ); use MusicBrainz::Server::Data::Utils::Cleanup qw( used_in_relationship ); use MusicBrainz::Server::Data::Utils::Uniqueness qw( assert_uniqueness_conserved ); @@ -122,6 +123,31 @@ sub _merge_impl { return 1; } +=method load_ids + +Load internal IDs for event objects that only have GIDs. + +=cut + +sub load_ids +{ + my ($self, @series) = @_; + + my @gids = map { $_->gid } @series; + return () unless @gids; + + my $query = ' + SELECT gid, id FROM series + WHERE gid IN (' . placeholders(@gids) . ') + '; + my %map = map { $_->[0] => $_->[1] } + @{ $self->sql->select_list_of_lists($query, @gids) }; + + for my $series (@series) { + $series->id($map{$series->gid}) if exists $map{$series->gid}; + } +} + sub load { my ($self, @objs) = @_; diff --git a/root/search/components/SeriesResults.js b/root/search/components/SeriesResults.js index c2ecd17060a..1bda0cfb4a0 100644 --- a/root/search/components/SeriesResults.js +++ b/root/search/components/SeriesResults.js @@ -36,6 +36,9 @@ function buildResult( ? lp_attributes(series.typeName, 'series_type') : null} +