| KiokuDB documentation | Contained in the KiokuDB distribution. |
KiokuDB::Role::Scan - A role for entry scanning.
package My::Entry::Processor;
use Moose;
with 'KiokuDB::Role::Scan' => { result_class => "My::Entry::Processor::Results" };
sub process_block {
my ( $self, %args ) = @_;
$args{results}; # intermediate results
foreach my $entry ( @{ $args{block} } ) {
}
}
my $scan = My::Entry::Processor->new(
backend => $some_backend,
);
my $res = $scan->results;
$res->foo;
$scan->foo; # delegates to result
This role is used by classes like KiokuDB::LinkChecker to scan the whole database and computing summary results.
The class of the results.
Will be used when creating the results initially by calling new and also
sets up an attribute with delegations.
| KiokuDB documentation | Contained in the KiokuDB distribution. |
#!/usr/bin/perl package KiokuDB::Role::Scan; use MooseX::Role::Parameterized; use namespace::clean -except => 'meta'; parameter result_class => ( isa => "Str", is => "ro", required => 1, ); role { my $meta = shift; my $result_class = $meta->result_class; with qw(KiokuDB::Role::Verbosity); has backend => ( does => "KiokuDB::Backend::Role::Scan", is => "ro", required => 1, ); has scan_all => ( isa => "Bool", is => "ro", default => 1, ); has scan_ids => ( isa => "Bool", is => "ro", ); has entries => ( does => "Data::Stream::Bulk", is => "ro", lazy_build => 1, ); sub _build_entries { my $self = shift; my $backend = $self->backend; my $set = $self->scan_all ? "all" : "root"; my $type = $self->scan_ids ? "entry_ids" : "entries"; my $method = join("_", $set, $type); $backend->$method; } has [qw(block_callback entry_callback)] => ( isa => "CodeRef|Str", is => "ro", ); has results => ( isa => $result_class, is => "ro", handles => qr/.*/, lazy_build => 1, ); requires "process_block"; method _build_results => sub { my $self = shift; my $res = $result_class->new; my $i = my $j = 0; while ( my $next = $self->entries->next ) { $i += @$next; $j += @$next; if ( $j > 13 ) { # luv primes $j = 0; $self->v("\rscanning... $i"); } $self->process_block( block => $next, results => $res ); } $self->v("\rscanned $i entries \n"); return $res; } }; __PACKAGE__ __END__