Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
refactor inflate out of extract
  • Loading branch information
ranguard committed May 13, 2017
1 parent f4972f8 commit a9d14ca
Showing 1 changed file with 39 additions and 38 deletions.
77 changes: 39 additions & 38 deletions lib/MetaCPAN/Model/Search.pm
Expand Up @@ -111,8 +111,9 @@ sub _search_expanded {
# Everything after this will fail (slowly and silently) without results.
return {} unless @distributions;

my $results
= $self->_extract_and_inflate_results( $es_results, \@distributions );
my $results = $self->_extract_results($es_results);

$results = $self->_inflate_results($results);

return {

Expand Down Expand Up @@ -211,12 +212,9 @@ sub _search_collapsed {
);
my $es_dist_results = $self->run_query( file => $es_query );

my $results
= $self->_extract_and_inflate_results( $es_dist_results,
\@distributions );

# Would be nice to do this before the _extract which has overhead
my $results = $self->_extract_results($es_dist_results);
$results = $self->_collapse_results($results);
$results = $self->_inflate_results($results);

return {
results => $results,
Expand Down Expand Up @@ -323,28 +321,28 @@ sub run_query {
}

sub _build_search_descriptions_query {
my ( $self, @ids ) = @_;
my ( $self, $ids ) = @_;
my $es_query = {
query => {
bool => {
should => {
terms => {
id => \@ids,
id => $ids,
}
}
}
},
fields => [qw(description id)],
size => scalar @ids,
size => scalar @{$ids},
};
return $es_query;
}

sub search_descriptions {
my ( $self, @ids ) = @_;
return {} unless @ids;
my ( $self, $ids ) = @_;
return {} unless @{$ids};

my $es_query = $self->_build_search_descriptions_query(@ids);
my $es_query = $self->_build_search_descriptions_query($ids);
my $es_results = $self->run_query( file => $es_query );

my $results = {
Expand All @@ -359,15 +357,15 @@ sub search_descriptions {
}

sub _build_search_favorites_query {
my ( $self, @distributions ) = @_;
my ( $self, $distributions ) = @_;

my $es_query = {
size => 0,
query => {
bool => {
should => {
terms => {
distribution => \@distributions,
distribution => $distributions,
}
}
}
Expand All @@ -376,7 +374,7 @@ sub _build_search_favorites_query {
favorites => {
terms => {
field => 'distribution',
size => scalar @distributions,
size => scalar @{$distributions},
},
},
}
Expand All @@ -385,18 +383,17 @@ sub _build_search_favorites_query {
return $es_query;
}

# NOTE: assumes $distributions is uniq already
sub search_favorites {
my ( $self, @distributions ) = @_;
my ( $self, $distributions ) = @_;

my $favorites = {};

# If there are no distributions this will build a query with an empty
# filter and ES will return a parser error... so just skip it.
return $favorites unless @distributions;

@distributions = uniq @distributions;
return $favorites unless @{$distributions};

my $es_query = $self->_build_search_favorites_query(@distributions);
my $es_query = $self->_build_search_favorites_query($distributions);
my $es_results = $self->run_query( favorite => $es_query );

if ( $es_results->{hits}->{total} ) {
Expand All @@ -410,36 +407,40 @@ sub search_favorites {
return $favorites;
}

sub _extract_and_inflate_results {
my ( $self, $results, $distributions ) = @_;

my $favorites = $self->search_favorites( @{$distributions} );

my @ids = map {
single_valued_arrayref_to_scalar( $_->{fields} );
$_->{fields}->{id}
} @{ $results->{hits}->{hits} };

my $descriptions = $self->search_descriptions(@ids);
sub _extract_results {
my ( $self, $results ) = @_;

return [
map {
my $res = $_;
single_valued_arrayref_to_scalar( $res->{fields} );
my $dist = $res->{fields}{distribution};
+{
%{ $res->{fields} },
%{ $res->{_source} },
abstract => $res->{fields}{'abstract.analyzed'},
score => $res->{_score},
favorites => $favorites->{$dist} || 0,
description =>
$descriptions->{results}->{ $res->{fields}->{id} },
abstract => $res->{fields}->{'abstract.analyzed'},
score => $res->{_score},
}
} @{ $results->{hits}{hits} }
];
}

sub _inflate_results {
my ( $self, $results ) = @_;

my @distributions = uniq map { $_->{distribution} } @{$results};
my $favorites = $self->search_favorites( \@distributions );

my @ids = uniq map { $_->{id} } @{$results};
my $descriptions = $self->search_descriptions( \@ids );

map {
$_->{description} = $descriptions->{results}->{ $_->{id} };
$_->{favorites} = $favorites->{ $_->{distribution} };
} @{$results};

return $results;
}

1;

## THIS IS THE QUERY and we fill in the gaps
Expand Down

0 comments on commit a9d14ca

Please sign in to comment.