File Coverage

blib/lib/Alzabo/Runtime/JoinCursor.pm
Criterion Covered Total %
statement 21 61 34.4
branch 0 10 0.0
condition 0 3 0.0
subroutine 7 10 70.0
pod 3 3 100.0
total 31 87 35.6


line stmt bran cond sub pod time code
1             package Alzabo::Runtime::JoinCursor;
2              
3 11     11   76 use strict;
  11         97  
  11         573  
4 11     11   142 use vars qw($VERSION);
  11         24  
  11         484  
5              
6 11     11   60 use Alzabo::Exceptions;
  11         27  
  11         81  
7 11     11   61 use Alzabo::Runtime;
  11         20  
  11         382  
8              
9 11     11   57 use Params::Validate qw( :all );
  11         23  
  11         3333  
10             Params::Validate::validation_options( on_fail => sub { Alzabo::Exception::Params->throw( error => join '', @_ ) } );
11              
12 11     11   69 use base qw( Alzabo::Runtime::Cursor );
  11         21  
  11         7579  
13              
14             $VERSION = 2.0;
15              
16 11         5413 use constant NEW_SPEC => { statement => { isa => 'Alzabo::DriverStatement' },
17             tables => { type => ARRAYREF },
18 11     11   68 };
  11         24  
19              
20             sub new
21             {
22 0     0 1   my $proto = shift;
23 0   0       my $class = ref $proto || $proto;
24              
25 0           my %p = validate( @_, NEW_SPEC );
26              
27 0           my $self = bless { %p,
28             count => 0,
29             }, $class;
30              
31 0           return $self;
32             }
33              
34             sub next
35             {
36 0     0 1   my $self = shift;
37              
38 0           my @rows;
39              
40 0           my @data = $self->{statement}->next;
41              
42 0 0         return unless @data;
43              
44 0           my $i = 0;
45 0           foreach my $t ( @{ $self->{tables} } )
  0            
46             {
47              
48 0           my %pk;
49 0           my $def = 0;
50 0           foreach my $c ( $t->primary_key )
51             {
52 0           $pk{ $c->name } = $data[$i];
53              
54 0 0         $def = 1 if defined $data[$i];
55              
56 0           $i++;
57             }
58              
59 0 0         unless ($def)
60             {
61 0           push @rows, undef;
62              
63 0           my @pre;
64 0 0         if ( @pre = $t->prefetch )
65             {
66 0           $i += @pre;
67             }
68              
69 0           next;
70             }
71              
72 0           my %prefetch;
73             {
74 0           my @pre;
  0            
75 0 0         if ( @pre = $t->prefetch )
76             {
77 0           @prefetch{@pre} = @data[ $i .. ($i + $#pre) ];
78 0           $i += @pre;
79             }
80             }
81              
82 0           my $row = $t->row_by_pk( pk => \%pk,
83             prefetch => \%prefetch,
84             @_,
85             );
86              
87 0           push @rows, $row;
88             }
89              
90 0           $self->{count}++;
91              
92 0           return @rows;
93             }
94              
95             sub all_rows
96             {
97 0     0 1   my $self = shift;
98              
99 0           my @all;
100 0           while ( my @rows = $self->next )
101             {
102 0           push @all, [@rows];
103             }
104              
105 0           $self->{count} = scalar @all;
106              
107 0           return @all;
108             }
109              
110             1;
111              
112             __END__