Catmandu-MediaHaven
view release on metacpan or search on metacpan
lib/Catmandu/Store/File/MediaHaven/Searcher.pm view on Meta::CPAN
has sort => (is => 'ro', required => 0);
has total => (is => 'ro');
sub generator {
my ($self) = @_;
my $mh = $self->bag->store->mh;
my $query = $self->query;
my $index = $self->start // 0;
my $limit = $self->limit;
my $sort = $self->sort;
my $res = $mh->search($query, start => $index, num => $limit, sort => $sort);
sub {
state $results = $res->{mediaDataList};
state $num_of_results = $res->{totalNrOfResults};
state $total = $self->total;
if (defined $total) {
return unless $total;
}
if (defined($total) && defined($limit) && $limit > $total) {
$limit = $total;
}
if (@$results > 0) {
my $hit = shift @$results;
$index++;
$total-- if defined($total);
return $self->hit2rec($hit);
}
elsif ($index < $num_of_results) {
my $res = $mh->search($query, start => $index, num => $limit, sort => $sort);
$results = $res->{mediaDataList};
$total-- if defined($total);
$index++;
my $hit = shift @$results;
return $self->hit2rec($hit);
}
return undef;
};
}
sub hit2rec {
my ($self,$hit) = @_;
if ($self->bag->store->id_fixer) {
return $self->bag->store->id_fixer->fix($hit);
}
else {
my $id = $hit->{fragmentId};
return +{_id => $id};
}
}
sub slice {
my ($self, $start, $total) = @_;
$start //= 0;
$self->new(
bag => $self->bag,
query => $self->query,
start => $self->start + $start,
limit => $self->limit,
sort => $self->sort,
total => $total,
);
}
sub count {
my ($self) = @_;
my $mh = $self->bag->store->mh;
my $query = $self->query;
my $res = $mh->search($query);
$res->{totalNrOfResults};
}
1;
( run in 0.591 second using v1.01-cache-2.11-cpan-364913b4093 )