File Coverage

blib/lib/DBIx/QuickORM/Join/Row.pm
Criterion Covered Total %
statement 41 162 25.3
branch 2 8 25.0
condition 1 4 25.0
subroutine 11 67 16.4
pod 0 41 0.0
total 55 282 19.5


line stmt bran cond sub pod time code
1             package DBIx::QuickORM::Join::Row;
2 1     1   7 use strict;
  1         2  
  1         34  
3 1     1   4 use warnings;
  1         1  
  1         80  
4              
5             our $VERSION = '0.000019';
6              
7 1     1   6 use Carp qw/croak/;
  1         2  
  1         66  
8              
9 1     1   6 use constant ROW_DATA => 'row_data';
  1         2  
  1         70  
10              
11 1     1   4 use Role::Tiny::With qw/with/;
  1         3  
  1         66  
12             with 'DBIx::QuickORM::Role::Row';
13              
14 1         11 use DBIx::QuickORM::Util::HashBase qw{
15             +source
16             +connection
17             +by_alias
18             +by_source
19 1     1   5 };
  1         2  
20              
21 1         9 use DBIx::QuickORM::Connection::RowData qw{
22             STORED
23             PENDING
24             DESYNC
25             TRANSACTION
26 1     1   8 };
  1         3  
27              
28             sub init {
29 5     5 0 11 my $self = shift;
30              
31 5 50       23 my $row_data = delete $self->{+ROW_DATA} or croak "No row data";
32 5         17 $self->{+SOURCE} = $row_data->{+SOURCE};
33 5         9 $self->{+CONNECTION} = $row_data->{+CONNECTION};
34              
35 5         15 my $join = $self->source;
36 5         29 my $con = $self->connection;
37              
38 5         10 for my $item (@{$join->fracture($row_data->active->{+STORED})}) {
  5         21  
39 13         27 my $source = $item->{+SOURCE};
40 13         76 my $row = $con->manager->select(source => $source, fetched => $item->{data});
41 13         49 $self->{+BY_ALIAS}->{$item->{as}} = $row;
42 13   50     19 push @{$self->{+BY_SOURCE}->{$source->source_orm_name} //= []} => $row;
  13         38  
43             }
44              
45 5         39 return;
46             }
47              
48 20     20 0 87 sub source { $_[0]->{+SOURCE}->() }
49 5     5 0 15 sub connection { $_[0]->{+CONNECTION}->() }
50 0     0 0 0 sub row_data { croak "Not Implemented" }
51              
52             sub by_alias {
53 15     15 0 14736 my $self = shift;
54 15         42 my ($as) = @_;
55              
56 15 50       49 croak "No subrows with alias '$as'" unless $self->source->components->{$as};
57              
58 15         144 return $self->{+BY_ALIAS}->{$as};
59             }
60              
61             sub by_source {
62 0     0 0   my $self = shift;
63 0           my ($name) = @_;
64              
65 0 0         croak "No subrows for source '$name'" unless $self->source->lookup->{$name};
66              
67 0   0       @{$self->{+BY_SOURCE}->{$name} // []};
  0            
68             }
69              
70             sub _row_map {
71 0     0     my $self = shift;
72 0           my ($cb) = @_;
73              
74 0           return map { local $a = $_; local $b = $self->{+BY_ALIAS}->{$_}; $cb->($a, $b) } keys %{$self->{+BY_ALIAS}};
  0            
  0            
  0            
  0            
75             }
76              
77             sub _row_any {
78 0     0     my $self = shift;
79 0           my ($cb) = @_;
80              
81 0           return !!first { $cb->($_) } values %{$self->{+BY_ALIAS}};
  0            
  0            
82             }
83              
84             sub _row_all {
85 0     0     my $self = shift;
86 0           my ($cb) = @_;
87              
88 0           return !first { !$cb->($_) } values %{$self->{+BY_ALIAS}};
  0            
  0            
89             }
90              
91             #<<<
92 0     0 0   sub stored_data { +{ $_[0]->_row_map(sub { my $d = $b->stored_data; map { ("$a.$_" => $d->{$_}) } keys %{$d} }) } }
  0     0      
  0            
  0            
  0            
93 0     0 0   sub pending_data { +{ $_[0]->_row_map(sub { my $d = $b->pending_data; map { ("$a.$_" => $d->{$_}) } keys %{$d} }) } }
  0     0      
  0            
  0            
  0            
94 0     0 0   sub desynced_data { +{ $_[0]->_row_map(sub { my $d = $b->desynced_data; map { ("$a.$_" => $d->{$_}) } keys %{$d} }) } }
  0     0      
  0            
  0            
  0            
95              
96 0     0 0   sub is_desynced { $_[0]->_row_any(sub { $_->is_desynced }) }
  0     0      
97 0     0 0   sub has_pending { $_[0]->_row_any(sub { $_->has_pending }) }
  0     0      
98 0     0 0   sub in_storage { $_[0]->_row_any(sub { $_->in_storage }) }
  0     0      
99 0     0 0   sub is_stored { $_[0]->_row_any(sub { $_->is_stored }) }
  0     0      
100 0     0 0   sub is_invalid { $_[0]->_row_any(sub { $_->is_invalid }) }
  0     0      
101 0     0 0   sub is_valid { $_[0]->_row_any(sub { $_->is_valid }) }
  0     0      
102             #>>>
103              
104             #####################
105             # {{{ Sanity Checks #
106             #####################
107              
108 0     0 0   sub check_sync { $_[0]->_row_map(sub { $b->check_sync }); $_[0] }
  0     0      
  0            
109              
110             #####################
111             # }}} Sanity Checks #
112             #####################
113              
114             ############################
115             # {{{ Manipulation Methods #
116             ############################
117              
118 0     0 0   sub update { croak "Not Implemented" }
119 0     0 0   sub insert { croak "Not Implemented" }
120 0     0 0   sub insert_or_save { croak "Not Implemented" }
121              
122             #<<<
123 0     0 0   sub force_sync { $_[0]->_row_map(sub {$b->force_sync}); $_[0] }
  0     0      
  0            
124 0     0 0   sub discard { $_[0]->_row_map(sub {$b->discard }); $_[0] }
  0     0      
  0            
125 0     0 0   sub refresh { $_[0]->_row_map(sub {$b->refresh }); $_[0] }
  0     0      
  0            
126 0     0 0   sub save { $_[0]->_row_map(sub {$b->save }); $_[0] }
  0     0      
  0            
127 0     0 0   sub delete { $_[0]->_row_map(sub {$b->delete }); $_[0] }
  0     0      
  0            
128             #>>>
129              
130             ############################
131             # }}} Manipulation Methods #
132             ############################
133              
134             #####################
135             # {{{ Field methods #
136             #####################
137              
138 0 0   0     sub _split_field { split( /\./, (@_ ? $_[0] : $_), 2 ) }
139              
140             #<<<
141 0     0 0   sub field { my $self = shift; my ($as, $f) = _split_field(shift); $self->{+BY_ALIAS}->{$as}->field($f, @_) }
  0            
  0            
142 0     0 0   sub raw_field { my $self = shift; my ($as, $f) = _split_field(shift); $self->{+BY_ALIAS}->{$as}->raw_field($f, @_) }
  0            
  0            
143 0     0 0   sub stored_field { my $self = shift; my ($as, $f) = _split_field(shift); $self->{+BY_ALIAS}->{$as}->stored_field($f, @_) }
  0            
  0            
144 0     0 0   sub pending_field { my $self = shift; my ($as, $f) = _split_field(shift); $self->{+BY_ALIAS}->{$as}->pending_field($f, @_) }
  0            
  0            
145 0     0 0   sub raw_stored_field { my $self = shift; my ($as, $f) = _split_field(shift); $self->{+BY_ALIAS}->{$as}->raw_stored_field($f, @_) }
  0            
  0            
146 0     0 0   sub raw_pending_field { my $self = shift; my ($as, $f) = _split_field(shift); $self->{+BY_ALIAS}->{$as}->raw_pending_field($f, @_) }
  0            
  0            
147 0     0 0   sub field_is_desynced { my $self = shift; my ($as, $f) = _split_field(shift); $self->{+BY_ALIAS}->{$as}->field_is_desynced($f, @_) }
  0            
  0            
148             #>>>
149              
150             #<<<
151 0     0 0   sub fields { my $self = shift; +{ map { my ($as, $f) = _split_field($_); ("$as.$f" => $self->{+BY_ALIAS}->{$as}->field($f)) } @_ }}
  0            
  0            
  0            
152 0     0 0   sub raw_fields { my $self = shift; +{ map { my ($as, $f) = _split_field($_); ("$as.$f" => $self->{+BY_ALIAS}->{$as}->raw_field($f)) } @_ }}
  0            
  0            
  0            
153 0     0 0   sub stored_fields { my $self = shift; +{ map { my ($as, $f) = _split_field($_); ("$as.$f" => $self->{+BY_ALIAS}->{$as}->stored_field($f)) } @_ }}
  0            
  0            
  0            
154 0     0 0   sub pending_fields { my $self = shift; +{ map { my ($as, $f) = _split_field($_); ("$as.$f" => $self->{+BY_ALIAS}->{$as}->pending_field($f)) } @_ }}
  0            
  0            
  0            
155 0     0 0   sub raw_stored_fields { my $self = shift; +{ map { my ($as, $f) = _split_field($_); ("$as.$f" => $self->{+BY_ALIAS}->{$as}->raw_stored_field($f)) } @_ }}
  0            
  0            
  0            
156 0     0 0   sub raw_pending_fields { my $self = shift; +{ map { my ($as, $f) = _split_field($_); ("$as.$f" => $self->{+BY_ALIAS}->{$as}->raw_pending_field($f)) } @_ }}
  0            
  0            
  0            
157             #>>>
158              
159             #####################
160             # }}} Field methods #
161             #####################
162              
163             ####################
164             # {{{ Link methods #
165             ####################
166              
167 0     0 0   sub insert_related { croak "Not Implemented" }
168 0     0 0   sub siblings { croak "Not Implemented" }
169 0     0 0   sub follow { croak "Not Implemented" }
170 0     0 0   sub obtain { croak "Not Implemented" }
171              
172             ####################
173             # }}} Link methods #
174             ####################
175              
176             1;