File Coverage

blib/lib/DBIx/Class/Relationship/BelongsTo.pm
Criterion Covered Total %
statement 42 43 97.6
branch 21 24 87.5
condition 8 9 88.8
subroutine 6 7 85.7
pod 0 1 0.0
total 77 84 91.6


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;