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
|
|
175295
|
use strict; |
|
379
|
|
|
|
|
1278
|
|
|
379
|
|
|
|
|
11195
|
|
8
|
379
|
|
|
379
|
|
2096
|
use warnings; |
|
379
|
|
|
|
|
1113
|
|
|
379
|
|
|
|
|
8945
|
|
9
|
379
|
|
|
379
|
|
1995
|
use Try::Tiny; |
|
379
|
|
|
|
|
1097
|
|
|
379
|
|
|
|
|
18529
|
|
10
|
379
|
|
|
379
|
|
2497
|
use namespace::clean; |
|
379
|
|
|
|
|
1161
|
|
|
379
|
|
|
|
|
2334
|
|
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
|
521105
|
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
|
|
|
|
49004
|
if not exists $attrs->{is_foreign_key_constraint}; |
23
|
|
|
|
|
|
|
$attrs->{undef_on_null_fk} = 1 |
24
|
13768
|
100
|
|
|
|
36938
|
if not exists $attrs->{undef_on_null_fk}; |
25
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
# no join condition or just a column name |
27
|
13768
|
100
|
|
|
|
36097
|
if (!ref $cond) { |
28
|
|
|
|
|
|
|
|
29
|
8519
|
|
|
|
|
15034
|
my ($f_key, $guess); |
30
|
8519
|
100
|
66
|
|
|
34143
|
if (defined $cond and length $cond) { |
31
|
5896
|
|
|
|
|
11197
|
$f_key = $cond; |
32
|
5896
|
|
|
|
|
14794
|
$guess = "caller specified foreign key '$f_key'"; |
33
|
|
|
|
|
|
|
} |
34
|
|
|
|
|
|
|
else { |
35
|
2623
|
|
|
|
|
5289
|
$f_key = $rel; |
36
|
2623
|
|
|
|
|
8164
|
$guess = "using given relationship name '$rel' as foreign key column name"; |
37
|
|
|
|
|
|
|
} |
38
|
|
|
|
|
|
|
|
39
|
8519
|
50
|
|
|
|
225047
|
$class->throw_exception( |
40
|
|
|
|
|
|
|
"No such column '$f_key' declared yet on ${class} ($guess)" |
41
|
|
|
|
|
|
|
) unless $class->has_column($f_key); |
42
|
|
|
|
|
|
|
|
43
|
8519
|
|
|
|
|
59859
|
$class->ensure_class_loaded($f_class); |
44
|
|
|
|
|
|
|
my $f_rsrc = try { |
45
|
8519
|
|
|
8519
|
|
715817
|
$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
|
|
|
|
|
159765
|
}; |
53
|
|
|
|
|
|
|
|
54
|
8519
|
|
|
|
|
326137
|
my $pri = $f_rsrc->_single_pri_col_or_die; |
55
|
|
|
|
|
|
|
|
56
|
8519
|
|
|
|
|
38067
|
$cond = { "foreign.${pri}" => "self.${f_key}" }; |
57
|
|
|
|
|
|
|
|
58
|
|
|
|
|
|
|
} |
59
|
|
|
|
|
|
|
# explicit join condition |
60
|
|
|
|
|
|
|
else { |
61
|
5249
|
100
|
|
|
|
16915
|
if (ref $cond eq 'HASH') { # ARRAY is also valid |
62
|
3936
|
|
|
|
|
6855
|
my $cond_rel; |
63
|
|
|
|
|
|
|
# FIXME This loop is ridiculously incomplete and dangerous |
64
|
|
|
|
|
|
|
# staving off changes until implmentation of the swindon consensus |
65
|
3936
|
|
|
|
|
14112
|
for (keys %$cond) { |
66
|
3936
|
100
|
|
|
|
15711
|
if (m/\./) { # Explicit join condition |
67
|
3935
|
|
|
|
|
7442
|
$cond_rel = $cond; |
68
|
3935
|
|
|
|
|
8619
|
last; |
69
|
|
|
|
|
|
|
} |
70
|
1
|
|
|
|
|
8
|
$cond_rel->{"foreign.$_"} = "self.".$cond->{$_}; |
71
|
|
|
|
|
|
|
} |
72
|
3936
|
|
|
|
|
9190
|
$cond = $cond_rel; |
73
|
|
|
|
|
|
|
} |
74
|
|
|
|
|
|
|
} |
75
|
|
|
|
|
|
|
|
76
|
13768
|
100
|
100
|
|
|
362785
|
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
|
|
|
68314
|
? { map { $_ =~ /^self\.(.+)/ ? ( $1 => 1 ) : () } (values %$cond ) } |
|
8521
|
100
|
|
|
|
57548
|
|
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
|
|
|
|
40208
|
%{$attrs || {}} |
|
13768
|
50
|
|
|
|
179280
|
|
98
|
|
|
|
|
|
|
} |
99
|
|
|
|
|
|
|
); |
100
|
|
|
|
|
|
|
|
101
|
13768
|
|
|
|
|
50064
|
return 1; |
102
|
|
|
|
|
|
|
} |
103
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
1; |