| 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; |