Alzabo
view release on metacpan or search on metacpan
lib/Alzabo/Runtime/JoinCursor.pm view on Meta::CPAN
package Alzabo::Runtime::JoinCursor;
use strict;
use vars qw($VERSION);
use Alzabo::Exceptions;
use Alzabo::Runtime;
use Params::Validate qw( :all );
Params::Validate::validation_options( on_fail => sub { Alzabo::Exception::Params->throw( error => join '', @_ ) } );
use base qw( Alzabo::Runtime::Cursor );
$VERSION = 2.0;
use constant NEW_SPEC => { statement => { isa => 'Alzabo::DriverStatement' },
tables => { type => ARRAYREF },
};
sub new
{
my $proto = shift;
my $class = ref $proto || $proto;
my %p = validate( @_, NEW_SPEC );
my $self = bless { %p,
count => 0,
}, $class;
return $self;
}
sub next
{
my $self = shift;
my @rows;
my @data = $self->{statement}->next;
return unless @data;
my $i = 0;
foreach my $t ( @{ $self->{tables} } )
{
my %pk;
my $def = 0;
foreach my $c ( $t->primary_key )
{
$pk{ $c->name } = $data[$i];
$def = 1 if defined $data[$i];
$i++;
}
unless ($def)
{
push @rows, undef;
my @pre;
if ( @pre = $t->prefetch )
{
$i += @pre;
}
next;
}
my %prefetch;
{
my @pre;
if ( @pre = $t->prefetch )
{
@prefetch{@pre} = @data[ $i .. ($i + $#pre) ];
$i += @pre;
}
}
my $row = $t->row_by_pk( pk => \%pk,
prefetch => \%prefetch,
@_,
);
( run in 1.468 second using v1.01-cache-2.11-cpan-39bf76dae61 )