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 )