line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package # hide from PAUSE |
2
|
|
|
|
|
|
|
DBIx::Class::Relationship::BelongsTo; |
3
|
|
|
|
|
|
|
|
4
|
|
|
|
|
|
|
# Documentation for these methods can be found in |
5
|
|
|
|
|
|
|
# DBIx::Class::Relationship |
6
|
|
|
|
|
|
|
|
7
|
379
|
|
|
379
|
|
163231
|
use strict; |
|
379
|
|
|
|
|
819
|
|
|
379
|
|
|
|
|
10231
|
|
8
|
379
|
|
|
379
|
|
1514
|
use warnings; |
|
379
|
|
|
|
|
677
|
|
|
379
|
|
|
|
|
8578
|
|
9
|
379
|
|
|
379
|
|
1454
|
use Try::Tiny; |
|
379
|
|
|
|
|
638
|
|
|
379
|
|
|
|
|
17669
|
|
10
|
379
|
|
|
379
|
|
1772
|
use namespace::clean; |
|
379
|
|
|
|
|
679
|
|
|
379
|
|
|
|
|
2167
|
|
11
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
our %_pod_inherit_config = |
13
|
|
|
|
|
|
|
( |
14
|
|
|
|
|
|
|
class_map => { 'DBIx::Class::Relationship::BelongsTo' => 'DBIx::Class::Relationship' } |
15
|
|
|
|
|
|
|
); |
16
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
sub belongs_to { |
18
|
13768
|
|
|
13768
|
0
|
427591
|
my ($class, $rel, $f_class, $cond, $attrs) = @_; |
19
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
# assume a foreign key constraint unless defined otherwise |
21
|
|
|
|
|
|
|
$attrs->{is_foreign_key_constraint} = 1 |
22
|
13768
|
100
|
|
|
|
42842
|
if not exists $attrs->{is_foreign_key_constraint}; |
23
|
|
|
|
|
|
|
$attrs->{undef_on_null_fk} = 1 |
24
|
13768
|
100
|
|
|
|
30555
|
if not exists $attrs->{undef_on_null_fk}; |
25
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
# no join condition or just a column name |
27
|
13768
|
100
|
|
|
|
28881
|
if (!ref $cond) { |
28
|
|
|
|
|
|
|
|
29
|
8519
|
|
|
|
|
8096
|
my ($f_key, $guess); |
30
|
8519
|
100
|
66
|
|
|
35012
|
if (defined $cond and length $cond) { |
31
|
5896
|
|
|
|
|
8866
|
$f_key = $cond; |
32
|
5896
|
|
|
|
|
11152
|
$guess = "caller specified foreign key '$f_key'"; |
33
|
|
|
|
|
|
|
} |
34
|
|
|
|
|
|
|
else { |
35
|
2623
|
|
|
|
|
4023
|
$f_key = $rel; |
36
|
2623
|
|
|
|
|
6056
|
$guess = "using given relationship name '$rel' as foreign key column name"; |
37
|
|
|
|
|
|
|
} |
38
|
|
|
|
|
|
|
|
39
|
8519
|
50
|
|
|
|
212900
|
$class->throw_exception( |
40
|
|
|
|
|
|
|
"No such column '$f_key' declared yet on ${class} ($guess)" |
41
|
|
|
|
|
|
|
) unless $class->has_column($f_key); |
42
|
|
|
|
|
|
|
|
43
|
8519
|
|
|
|
|
54226
|
$class->ensure_class_loaded($f_class); |
44
|
|
|
|
|
|
|
my $f_rsrc = try { |
45
|
8519
|
|
|
8519
|
|
560603
|
$f_class->result_source_instance; |
46
|
|
|
|
|
|
|
} |
47
|
|
|
|
|
|
|
catch { |
48
|
0
|
|
|
0
|
|
0
|
$class->throw_exception( |
49
|
|
|
|
|
|
|
"Foreign class '$f_class' does not seem to be a Result class " |
50
|
|
|
|
|
|
|
. "(or it simply did not load entirely due to a circular relation chain)" |
51
|
|
|
|
|
|
|
); |
52
|
8519
|
|
|
|
|
127372
|
}; |
53
|
|
|
|
|
|
|
|
54
|
8519
|
|
|
|
|
247147
|
my $pri = $f_rsrc->_single_pri_col_or_die; |
55
|
|
|
|
|
|
|
|
56
|
8519
|
|
|
|
|
34213
|
$cond = { "foreign.${pri}" => "self.${f_key}" }; |
57
|
|
|
|
|
|
|
|
58
|
|
|
|
|
|
|
} |
59
|
|
|
|
|
|
|
# explicit join condition |
60
|
|
|
|
|
|
|
else { |
61
|
5249
|
100
|
|
|
|
16432
|
if (ref $cond eq 'HASH') { # ARRAY is also valid |
62
|
3936
|
|
|
|
|
4988
|
my $cond_rel; |
63
|
|
|
|
|
|
|
# FIXME This loop is ridiculously incomplete and dangerous |
64
|
|
|
|
|
|
|
# staving off changes until implmentation of the swindon consensus |
65
|
3936
|
|
|
|
|
10465
|
for (keys %$cond) { |
66
|
3936
|
100
|
|
|
|
13369
|
if (m/\./) { # Explicit join condition |
67
|
3935
|
|
|
|
|
4667
|
$cond_rel = $cond; |
68
|
3935
|
|
|
|
|
5424
|
last; |
69
|
|
|
|
|
|
|
} |
70
|
1
|
|
|
|
|
8
|
$cond_rel->{"foreign.$_"} = "self.".$cond->{$_}; |
71
|
|
|
|
|
|
|
} |
72
|
3936
|
|
|
|
|
6921
|
$cond = $cond_rel; |
73
|
|
|
|
|
|
|
} |
74
|
|
|
|
|
|
|
} |
75
|
|
|
|
|
|
|
|
76
|
13768
|
100
|
100
|
|
|
361409
|
my $acc_type = ( |
77
|
|
|
|
|
|
|
ref $cond eq 'HASH' |
78
|
|
|
|
|
|
|
and |
79
|
|
|
|
|
|
|
keys %$cond == 1 |
80
|
|
|
|
|
|
|
and |
81
|
|
|
|
|
|
|
(keys %$cond)[0] =~ /^foreign\./ |
82
|
|
|
|
|
|
|
and |
83
|
|
|
|
|
|
|
$class->has_column($rel) |
84
|
|
|
|
|
|
|
) ? 'filter' : 'single'; |
85
|
|
|
|
|
|
|
|
86
|
|
|
|
|
|
|
my $fk_columns = ($acc_type eq 'single' and ref $cond eq 'HASH') |
87
|
13768
|
50
|
100
|
|
|
64746
|
? { map { $_ =~ /^self\.(.+)/ ? ( $1 => 1 ) : () } (values %$cond ) } |
|
8521
|
100
|
|
|
|
53855
|
|
88
|
|
|
|
|
|
|
: undef |
89
|
|
|
|
|
|
|
; |
90
|
|
|
|
|
|
|
|
91
|
|
|
|
|
|
|
$class->add_relationship($rel, $f_class, |
92
|
|
|
|
|
|
|
$cond, |
93
|
|
|
|
|
|
|
{ |
94
|
|
|
|
|
|
|
is_depends_on => 1, |
95
|
|
|
|
|
|
|
accessor => $acc_type, |
96
|
|
|
|
|
|
|
$fk_columns ? ( fk_columns => $fk_columns ) : (), |
97
|
13768
|
100
|
|
|
|
34163
|
%{$attrs || {}} |
|
13768
|
50
|
|
|
|
164391
|
|
98
|
|
|
|
|
|
|
} |
99
|
|
|
|
|
|
|
); |
100
|
|
|
|
|
|
|
|
101
|
13768
|
|
|
|
|
37348
|
return 1; |
102
|
|
|
|
|
|
|
} |
103
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
1; |