/usr/share/perl5/MetaCPAN/Client/Scroll.pm is in libmetacpan-client-perl 2.023000-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 | use strict;
use warnings;
package MetaCPAN::Client::Scroll;
# ABSTRACT: A MetaCPAN::Client scroller
$MetaCPAN::Client::Scroll::VERSION = '2.023000';
use Moo;
use Carp;
use Ref::Util qw< is_hashref >;
use JSON::MaybeXS qw< decode_json encode_json >;
use MetaCPAN::Client::Types qw< Str Int Time ArrayRef HashRef Bool >;
has ua => (
is => 'ro',
required => 1,
);
has size => (
is => 'ro',
isa => Str,
);
has time => (
is => 'ro',
isa => Time,
);
has base_url => (
is => 'ro',
isa => Str,
required => 1,
);
has type => (
is => 'ro',
isa => Str,
required => 1,
);
has body => (
is => 'ro',
isa => HashRef,
required => 1,
);
has _id => (
is => 'ro',
isa => Str,
);
has _buffer => (
is => 'ro',
isa => ArrayRef,
default => sub { [] },
);
has _done => (
is => 'rw',
isa => Bool,
default => sub { 0 },
);
has total => (
is => 'ro',
isa => Int,
);
has aggregations => (
is => 'ro',
isa => HashRef,
default => sub { +{} },
);
sub BUILDARGS {
my ( $class, %args ) = @_;
$args{time} //= '5m';
$args{size} //= '100';
my ( $ua, $base_url, $type, $body, $time, $size ) =
@args{qw< ua base_url type body time size >};
# fetch scroller from server
my $res = $ua->post(
sprintf( '%s/%s/_search?scroll=%s&size=%s', $base_url, $type, $time, $size ),
{ content => encode_json $body }
);
if ( $res->{status} != 200 ) {
my $msg = "failed to create a scrolled search";
$args{debug} and $msg .= "\n(" . $res->{content} . ")";
croak $msg;
}
my $content = decode_json $res->{content};
# read response content --> object params
$args{_id} = $content->{_scroll_id};
$args{total} = $content->{hits}{total};
$args{_buffer} = $content->{hits}{hits};
$args{aggregations} = $content->{aggregations}
if $content->{aggregations} and is_hashref( $content->{aggregations} );
return \%args;
}
sub next {
my $self = shift;
my $buffer = $self->_buffer;
# We're exhausted and will do no more.
return if $self->_done;
# Refill the buffer if it's empty.
@$buffer = @{ $self->_fetch_next }
unless @$buffer;
# Grab the next result from the buffer. If there's no result, then that's
# all, folks!
my $next = shift @$buffer;
$self->_done(1) unless $next;
return $next;
}
sub _fetch_next {
my $self = shift;
my $res = $self->ua->post(
sprintf( '%s/_search/scroll?scroll=%s&size=%s', $self->base_url, $self->time, $self->size ),
{ content => $self->_id }
);
croak "failed to fetch next scolled batch"
unless $res->{status} == 200;
my $content = decode_json $res->{content};
return $content->{hits}{hits};
}
sub DEMOLISH {
my $self = shift;
$self->ua->delete(
sprintf( '%s/_search/scroll?scroll=%s', $self->base_url, $self->time ),
{ content => $self->_id }
);
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
MetaCPAN::Client::Scroll - A MetaCPAN::Client scroller
=head1 VERSION
version 2.023000
=head1 METHODS
=head2 next
get next matched document.
=head2 BUILDARGS
=head2 DEMOLISH
=head1 ATTRIBUTES
=head2 aggregations
The returned aggregations structure from agg
requests.
=head2 base_url
The base URL for sending server requests.
=head2 body
The request body.
=head2 size
The number of docs to pull from each shard per request.
=head2 time
The lifetime of the scroller on the server.
=head2 total
The total number of matches.
=head2 type
The Elasticsearch type to query.
=head2 ua
The user agent object for running requests.
=head1 AUTHORS
=over 4
=item *
Sawyer X <xsawyerx@cpan.org>
=item *
Mickey Nasriachi <mickey@cpan.org>
=back
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2016 by Sawyer X.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut
|