From 2ec71886220f04fbda4bf3691ee799e6a715eaf6 Mon Sep 17 00:00:00 2001 From: Marco Vittorini Orgeas Date: Fri, 23 Oct 2015 19:25:30 +0200 Subject: [PATCH 1/2] No backpan: closes #397. --- lib/MetaCPAN/Web/Controller/Author.pm | 11 +++++++- lib/MetaCPAN/Web/Model/API/Release.pm | 40 +++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/lib/MetaCPAN/Web/Controller/Author.pm b/lib/MetaCPAN/Web/Controller/Author.pm index 84da0810ab..e54407908c 100644 --- a/lib/MetaCPAN/Web/Controller/Author.pm +++ b/lib/MetaCPAN/Web/Controller/Author.pm @@ -58,7 +58,16 @@ sub index : Chained('root') PathPart('') Args(0) { = $c->model('API::Favorite')->by_user( $author->{user} )->recv; $took += $faves_data->{took} || 0; - $faves = [ map { $_->{fields} } @{ $faves_data->{hits}->{hits} } ]; + my @all_fav = map { $_->{fields}->{distribution} } + @{ $faves_data->{hits}->{hits} }; + my $noLatest = $c->model('API::Release')->no_latest(@all_fav); + + $faves = [ + map { + my $distro = $_->{fields}->{distribution}; + $noLatest->{$distro} ? () : $_->{fields}; + } @{ $faves_data->{hits}->{hits} } + ]; $self->single_valued_arrayref_to_scalar($faves); $faves = [ sort { $b->{date} cmp $a->{date} } @{$faves} ]; } diff --git a/lib/MetaCPAN/Web/Model/API/Release.pm b/lib/MetaCPAN/Web/Model/API/Release.pm index 8cccdc4624..1f766ba118 100644 --- a/lib/MetaCPAN/Web/Model/API/Release.pm +++ b/lib/MetaCPAN/Web/Model/API/Release.pm @@ -4,6 +4,9 @@ use namespace::autoclean; extends 'MetaCPAN::Web::Model::API'; +use List::Util qw(first); +use List::MoreUtils qw(uniq); + =head1 NAME MetaCPAN::Web::Model::Release - Catalyst Model @@ -440,6 +443,43 @@ sub topuploaders { ); } +sub no_latest { + my ( $self, @distributions ) = @_; + + # If there are no distributions return + return {} unless (@distributions); + + @distributions = uniq @distributions; + my $result = $self->request( + '/release/_search', + { + size => scalar @distributions, + query => { + filtered => { + query => { match_all => {} }, + filter => { + and => [ + { terms => { distribution => \@distributions } }, + { term => { status => 'latest' } } + ] + } + } + }, + fields => [qw(distribution status)] + } + )->recv; + + my @latest + = map { $_->{fields}->{distribution} } @{ $result->{hits}->{hits} }; + + my %no_latest = map { + my $distro = $_; + ( first { $_ eq $distro } @latest ) ? () : ( $distro, 1 ); + } @distributions; + + return \%no_latest; +} + __PACKAGE__->meta->make_immutable; 1; From ac2f6dc43de1338785ad0946173e7178bc6d9f0c Mon Sep 17 00:00:00 2001 From: Marco Vittorini Orgeas Date: Sat, 24 Oct 2015 18:20:47 +0200 Subject: [PATCH 2/2] no_latest: use callback. --- lib/MetaCPAN/Web/Controller/Author.pm | 5 ++-- lib/MetaCPAN/Web/Model/API/Release.pm | 36 ++++++++++++++++++--------- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/lib/MetaCPAN/Web/Controller/Author.pm b/lib/MetaCPAN/Web/Controller/Author.pm index e54407908c..80190a4ad8 100644 --- a/lib/MetaCPAN/Web/Controller/Author.pm +++ b/lib/MetaCPAN/Web/Controller/Author.pm @@ -60,12 +60,13 @@ sub index : Chained('root') PathPart('') Args(0) { my @all_fav = map { $_->{fields}->{distribution} } @{ $faves_data->{hits}->{hits} }; - my $noLatest = $c->model('API::Release')->no_latest(@all_fav); + my $noLatest = $c->model('API::Release')->no_latest(@all_fav)->recv; + $took += $noLatest->{took} || 0; $faves = [ map { my $distro = $_->{fields}->{distribution}; - $noLatest->{$distro} ? () : $_->{fields}; + $noLatest->{no_latest}->{$distro} ? () : $_->{fields}; } @{ $faves_data->{hits}->{hits} } ]; $self->single_valued_arrayref_to_scalar($faves); diff --git a/lib/MetaCPAN/Web/Model/API/Release.pm b/lib/MetaCPAN/Web/Model/API/Release.pm index 1f766ba118..440d7d4d39 100644 --- a/lib/MetaCPAN/Web/Model/API/Release.pm +++ b/lib/MetaCPAN/Web/Model/API/Release.pm @@ -445,12 +445,13 @@ sub topuploaders { sub no_latest { my ( $self, @distributions ) = @_; + my $cv = $self->cv; # If there are no distributions return return {} unless (@distributions); @distributions = uniq @distributions; - my $result = $self->request( + $self->request( '/release/_search', { size => scalar @distributions, @@ -467,17 +468,28 @@ sub no_latest { }, fields => [qw(distribution status)] } - )->recv; - - my @latest - = map { $_->{fields}->{distribution} } @{ $result->{hits}->{hits} }; - - my %no_latest = map { - my $distro = $_; - ( first { $_ eq $distro } @latest ) ? () : ( $distro, 1 ); - } @distributions; - - return \%no_latest; + )->cb( + sub { + my $data = shift->recv; + my @latest + = map { $_->{fields}->{distribution} } + @{ $data->{hits}->{hits} }; + $cv->send( + { + took => $data->{took}, + no_latest => { + map { + my $distro = $_; + ( first { $_ eq $distro } @latest ) + ? () + : ( $distro, 1 ); + } @distributions + } + } + ); + } + ); + return $cv; } __PACKAGE__->meta->make_immutable;