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