Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
GH515: fix download_url version filtering notation parsing (!=, <=, e…
…tc.)
  • Loading branch information
mickeyn committed Sep 1, 2016
1 parent 9a0a95d commit 0aad81b
Showing 1 changed file with 41 additions and 31 deletions.
72 changes: 41 additions & 31 deletions lib/MetaCPAN/Document/File/Set.pm
Expand Up @@ -199,6 +199,8 @@ sub find_download_url {
: !$explicit_version ? { term => { maturity => 'released' } }
: ();

my $version_filters = $self->_version_filters($version);

# filters to be applied to the nested modules
my $module_f = {
nested => {
Expand All @@ -210,8 +212,17 @@ sub find_download_url {
{ term => { 'module.authorized' => 1 } },
{ term => { 'module.indexed' => 1 } },
{ term => { 'module.name' => $module } },
$self->_version_filters($version)
]
(
exists $version_filters->{must}
? @{ $version_filters->{must} }
: ()
)
],
(
exists $version_filters->{must_not}
? ( must_not => [ $version_filters->{must_not} ] )
: ()
)
}
}
}
Expand Down Expand Up @@ -264,7 +275,6 @@ sub find_download_url {

return $self->size(1)->query($query)
->source( [ 'download_url', 'date', 'status' ] )->sort( \@sort );

}

sub _version_filters {
Expand All @@ -273,19 +283,11 @@ sub _version_filters {
return () unless $version;

if ( $version =~ s/^==\s*// ) {
return { term => { 'module.version' => $version }, };
}
elsif ( $version !~ /\s/ ) {
return {
range => {
'module.version_numified' =>
{ 'gte' => $self->_numify($version) }
},
};
return +{ must => [ { term => { 'module.version' => $version } } ] };
}
else {
elsif ( $version =~ /^[<>!]=?\s*/ ) {
my %ops = qw(< lt <= lte > gt >= gte);
my ( %range, @exclusion );
my ( %filters, %range, @exclusion );
my @requirements = split /,\s*/, $version;
for my $r (@requirements) {
if ( $r =~ s/^([<>]=?)\s*// ) {
Expand All @@ -296,27 +298,35 @@ sub _version_filters {
}
}

my @filters
= ( { range => { 'module.version_numified' => \%range } }, );
if ( keys %range ) {
$filters{must}
= [ { range => { 'module.version_numified' => \%range } } ];
}

if (@exclusion) {
push @filters, {
not => {
or => [
map {
+{
term => {
'module.version_numified' =>
$self->_numify($_)
}
}
} @exclusion
]
},
};
$filters{must_not} = [];
push @{ $filters{must_not} }, map {
+{
term => {
'module.version_numified' => $self->_numify($_)
}
}
} @exclusion;
}

return @filters;
return \%filters;
}
elsif ( $version !~ /\s/ ) {
return +{
must => [
{
range => {
'module.version_numified' =>
{ 'gte' => $self->_numify($version) }
},
}
]
};
}
}

Expand Down

0 comments on commit 0aad81b

Please sign in to comment.