Filename | /usr/share/perl5/DBIx/Class/Relationship/ManyToMany.pm |
Statements | Executed 0 statements in 0s |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
12 | 12 | 9 | 1.43ms | 7.20ms | many_to_many | DBIx::Class::Relationship::ManyToMany::
1 | 1 | 1 | 14µs | 21µs | BEGIN@4 | DBIx::Class::Relationship::ManyToMany::
1 | 1 | 1 | 14µs | 28µs | BEGIN@10 | DBIx::Class::Relationship::ManyToMany::
1 | 1 | 1 | 10µs | 26µs | BEGIN@9 | DBIx::Class::Relationship::ManyToMany::
1 | 1 | 1 | 9µs | 31µs | BEGIN@8 | DBIx::Class::Relationship::ManyToMany::
1 | 1 | 1 | 9µs | 16µs | BEGIN@30 | DBIx::Class::Relationship::ManyToMany::
1 | 1 | 1 | 8µs | 114µs | BEGIN@11 | DBIx::Class::Relationship::ManyToMany::
1 | 1 | 1 | 8µs | 23µs | BEGIN@31 | DBIx::Class::Relationship::ManyToMany::
1 | 1 | 1 | 7µs | 36µs | BEGIN@7 | DBIx::Class::Relationship::ManyToMany::
1 | 1 | 1 | 7µs | 11µs | BEGIN@5 | DBIx::Class::Relationship::ManyToMany::
0 | 0 | 0 | 0s | 0s | __ANON__[:109] | DBIx::Class::Relationship::ManyToMany::
0 | 0 | 0 | 0s | 0s | __ANON__[:127] | DBIx::Class::Relationship::ManyToMany::
0 | 0 | 0 | 0s | 0s | __ANON__[:146] | DBIx::Class::Relationship::ManyToMany::
0 | 0 | 0 | 0s | 0s | __ANON__[:70] | DBIx::Class::Relationship::ManyToMany::
0 | 0 | 0 | 0s | 0s | __ANON__[:78] | DBIx::Class::Relationship::ManyToMany::
0 | 0 | 0 | 0s | 0s | add_to_borrowernumbers | Koha::Schema::Result::Aqbasket::
0 | 0 | 0 | 0s | 0s | borrowernumbers | Koha::Schema::Result::Aqbasket::
0 | 0 | 0 | 0s | 0s | borrowernumbers_rs | Koha::Schema::Result::Aqbasket::
0 | 0 | 0 | 0s | 0s | remove_from_borrowernumbers | Koha::Schema::Result::Aqbasket::
0 | 0 | 0 | 0s | 0s | set_borrowernumbers | Koha::Schema::Result::Aqbasket::
0 | 0 | 0 | 0s | 0s | add_to_borrowernumbers | Koha::Schema::Result::Aqbudget::
0 | 0 | 0 | 0s | 0s | borrowernumbers | Koha::Schema::Result::Aqbudget::
0 | 0 | 0 | 0s | 0s | borrowernumbers_rs | Koha::Schema::Result::Aqbudget::
0 | 0 | 0 | 0s | 0s | remove_from_borrowernumbers | Koha::Schema::Result::Aqbudget::
0 | 0 | 0 | 0s | 0s | set_borrowernumbers | Koha::Schema::Result::Aqbudget::
0 | 0 | 0 | 0s | 0s | add_to_borrowernumbers | Koha::Schema::Result::Aqorder::
0 | 0 | 0 | 0s | 0s | borrowernumbers | Koha::Schema::Result::Aqorder::
0 | 0 | 0 | 0s | 0s | borrowernumbers_rs | Koha::Schema::Result::Aqorder::
0 | 0 | 0 | 0s | 0s | remove_from_borrowernumbers | Koha::Schema::Result::Aqorder::
0 | 0 | 0 | 0s | 0s | set_borrowernumbers | Koha::Schema::Result::Aqorder::
0 | 0 | 0 | 0s | 0s | add_to_basketnoes | Koha::Schema::Result::Borrower::
0 | 0 | 0 | 0s | 0s | add_to_budgets | Koha::Schema::Result::Borrower::
0 | 0 | 0 | 0s | 0s | add_to_courses | Koha::Schema::Result::Borrower::
0 | 0 | 0 | 0s | 0s | add_to_ordernumbers | Koha::Schema::Result::Borrower::
0 | 0 | 0 | 0s | 0s | basketnoes | Koha::Schema::Result::Borrower::
0 | 0 | 0 | 0s | 0s | basketnoes_rs | Koha::Schema::Result::Borrower::
0 | 0 | 0 | 0s | 0s | budgets | Koha::Schema::Result::Borrower::
0 | 0 | 0 | 0s | 0s | budgets_rs | Koha::Schema::Result::Borrower::
0 | 0 | 0 | 0s | 0s | courses | Koha::Schema::Result::Borrower::
0 | 0 | 0 | 0s | 0s | courses_rs | Koha::Schema::Result::Borrower::
0 | 0 | 0 | 0s | 0s | ordernumbers | Koha::Schema::Result::Borrower::
0 | 0 | 0 | 0s | 0s | ordernumbers_rs | Koha::Schema::Result::Borrower::
0 | 0 | 0 | 0s | 0s | remove_from_basketnoes | Koha::Schema::Result::Borrower::
0 | 0 | 0 | 0s | 0s | remove_from_budgets | Koha::Schema::Result::Borrower::
0 | 0 | 0 | 0s | 0s | remove_from_courses | Koha::Schema::Result::Borrower::
0 | 0 | 0 | 0s | 0s | remove_from_ordernumbers | Koha::Schema::Result::Borrower::
0 | 0 | 0 | 0s | 0s | set_basketnoes | Koha::Schema::Result::Borrower::
0 | 0 | 0 | 0s | 0s | set_budgets | Koha::Schema::Result::Borrower::
0 | 0 | 0 | 0s | 0s | set_courses | Koha::Schema::Result::Borrower::
0 | 0 | 0 | 0s | 0s | set_ordernumbers | Koha::Schema::Result::Borrower::
0 | 0 | 0 | 0s | 0s | add_to_message_transport_types | Koha::Schema::Result::BorrowerMessagePreference::
0 | 0 | 0 | 0s | 0s | message_transport_types | Koha::Schema::Result::BorrowerMessagePreference::
0 | 0 | 0 | 0s | 0s | message_transport_types_rs | Koha::Schema::Result::BorrowerMessagePreference::
0 | 0 | 0 | 0s | 0s | remove_from_message_transport_types | Koha::Schema::Result::BorrowerMessagePreference::
0 | 0 | 0 | 0s | 0s | set_message_transport_types | Koha::Schema::Result::BorrowerMessagePreference::
0 | 0 | 0 | 0s | 0s | add_to_categorycodes | Koha::Schema::Result::Branch::
0 | 0 | 0 | 0s | 0s | categorycodes | Koha::Schema::Result::Branch::
0 | 0 | 0 | 0s | 0s | categorycodes_rs | Koha::Schema::Result::Branch::
0 | 0 | 0 | 0s | 0s | remove_from_categorycodes | Koha::Schema::Result::Branch::
0 | 0 | 0 | 0s | 0s | set_categorycodes | Koha::Schema::Result::Branch::
0 | 0 | 0 | 0s | 0s | add_to_branchcodes | Koha::Schema::Result::Branchcategory::
0 | 0 | 0 | 0s | 0s | branchcodes | Koha::Schema::Result::Branchcategory::
0 | 0 | 0 | 0s | 0s | branchcodes_rs | Koha::Schema::Result::Branchcategory::
0 | 0 | 0 | 0s | 0s | remove_from_branchcodes | Koha::Schema::Result::Branchcategory::
0 | 0 | 0 | 0s | 0s | set_branchcodes | Koha::Schema::Result::Branchcategory::
0 | 0 | 0 | 0s | 0s | add_to_borrowernumbers | Koha::Schema::Result::Course::
0 | 0 | 0 | 0s | 0s | borrowernumbers | Koha::Schema::Result::Course::
0 | 0 | 0 | 0s | 0s | borrowernumbers_rs | Koha::Schema::Result::Course::
0 | 0 | 0 | 0s | 0s | remove_from_borrowernumbers | Koha::Schema::Result::Course::
0 | 0 | 0 | 0s | 0s | set_borrowernumbers | Koha::Schema::Result::Course::
0 | 0 | 0 | 0s | 0s | add_to_borrower_message_preferences | Koha::Schema::Result::MessageTransportType::
0 | 0 | 0 | 0s | 0s | borrower_message_preferences | Koha::Schema::Result::MessageTransportType::
0 | 0 | 0 | 0s | 0s | borrower_message_preferences_rs | Koha::Schema::Result::MessageTransportType::
0 | 0 | 0 | 0s | 0s | remove_from_borrower_message_preferences | Koha::Schema::Result::MessageTransportType::
0 | 0 | 0 | 0s | 0s | set_borrower_message_preferences | Koha::Schema::Result::MessageTransportType::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package # hide from PAUSE | ||||
2 | DBIx::Class::Relationship::ManyToMany; | ||||
3 | |||||
4 | 2 | 27µs | # spent 21µs (14+7) within DBIx::Class::Relationship::ManyToMany::BEGIN@4 which was called:
# once (14µs+7µs) by Class::C3::Componentised::ensure_class_loaded at line 4 # spent 21µs making 1 call to DBIx::Class::Relationship::ManyToMany::BEGIN@4
# spent 7µs making 1 call to strict::import | ||
5 | 2 | 16µs | # spent 11µs (7+4) within DBIx::Class::Relationship::ManyToMany::BEGIN@5 which was called:
# once (7µs+4µs) by Class::C3::Componentised::ensure_class_loaded at line 5 # spent 11µs making 1 call to DBIx::Class::Relationship::ManyToMany::BEGIN@5
# spent 4µs making 1 call to warnings::import | ||
6 | |||||
7 | 2 | 64µs | # spent 36µs (7+29) within DBIx::Class::Relationship::ManyToMany::BEGIN@7 which was called:
# once (7µs+29µs) by Class::C3::Componentised::ensure_class_loaded at line 7 # spent 36µs making 1 call to DBIx::Class::Relationship::ManyToMany::BEGIN@7
# spent 29µs making 1 call to DBIx::Class::Carp::import | ||
8 | 2 | 52µs | # spent 31µs (9+21) within DBIx::Class::Relationship::ManyToMany::BEGIN@8 which was called:
# once (9µs+21µs) by Class::C3::Componentised::ensure_class_loaded at line 8 # spent 31µs making 1 call to DBIx::Class::Relationship::ManyToMany::BEGIN@8
# spent 21µs making 1 call to Exporter::import | ||
9 | 2 | 43µs | # spent 26µs (10+17) within DBIx::Class::Relationship::ManyToMany::BEGIN@9 which was called:
# once (10µs+17µs) by Class::C3::Componentised::ensure_class_loaded at line 9 # spent 26µs making 1 call to DBIx::Class::Relationship::ManyToMany::BEGIN@9
# spent 17µs making 1 call to Exporter::import | ||
10 | 2 | 43µs | # spent 28µs (14+15) within DBIx::Class::Relationship::ManyToMany::BEGIN@10 which was called:
# once (14µs+15µs) by Class::C3::Componentised::ensure_class_loaded at line 10 # spent 28µs making 1 call to DBIx::Class::Relationship::ManyToMany::BEGIN@10
# spent 15µs making 1 call to Exporter::import | ||
11 | 2 | 220µs | # spent 114µs (8+106) within DBIx::Class::Relationship::ManyToMany::BEGIN@11 which was called:
# once (8µs+106µs) by Class::C3::Componentised::ensure_class_loaded at line 11 # spent 114µs making 1 call to DBIx::Class::Relationship::ManyToMany::BEGIN@11
# spent 106µs making 1 call to namespace::clean::import | ||
12 | |||||
13 | our %_pod_inherit_config = | ||||
14 | ( | ||||
15 | class_map => { 'DBIx::Class::Relationship::ManyToMany' => 'DBIx::Class::Relationship' } | ||||
16 | ); | ||||
17 | |||||
18 | # spent 7.20ms (1.43+5.77) within DBIx::Class::Relationship::ManyToMany::many_to_many which was called 12 times, avg 600µs/call:
# once (678µs+4.90ms) by Class::C3::Componentised::ensure_class_loaded at line 1156 of Koha/Schema/Result/Borrower.pm
# once (90µs+85µs) by Class::C3::Componentised::ensure_class_loaded at line 513 of Koha/Schema/Result/Branch.pm
# once (81µs+80µs) by Class::C3::Componentised::ensure_class_loaded at line 268 of Koha/Schema/Result/Aqbudget.pm
# once (68µs+90µs) by Class::C3::Componentised::ensure_class_loaded at line 1166 of Koha/Schema/Result/Borrower.pm
# once (78µs+73µs) by Class::C3::Componentised::ensure_class_loaded at line 108 of Koha/Schema/Result/Branchcategory.pm
# once (66µs+84µs) by Class::C3::Componentised::ensure_class_loaded at line 1146 of Koha/Schema/Result/Borrower.pm
# once (63µs+84µs) by Class::C3::Componentised::ensure_class_loaded at line 146 of Koha/Schema/Result/MessageTransportType.pm
# once (71µs+72µs) by Class::C3::Componentised::ensure_class_loaded at line 274 of Koha/Schema/Result/Aqbasket.pm
# once (64µs+78µs) by Class::C3::Componentised::ensure_class_loaded at line 181 of Koha/Schema/Result/Course.pm
# once (62µs+79µs) by Class::C3::Componentised::ensure_class_loaded at line 185 of Koha/Schema/Result/BorrowerMessagePreference.pm
# once (68µs+71µs) by Class::C3::Componentised::ensure_class_loaded at line 492 of Koha/Schema/Result/Aqorder.pm
# once (43µs+74µs) by Class::C3::Componentised::ensure_class_loaded at line 1176 of Koha/Schema/Result/Borrower.pm | ||||
19 | my ($class, $meth, $rel, $f_rel, $rel_attrs) = @_; | ||||
20 | |||||
21 | $class->throw_exception( | ||||
22 | "missing relation in many-to-many" | ||||
23 | ) unless $rel; | ||||
24 | |||||
25 | $class->throw_exception( | ||||
26 | "missing foreign relation in many-to-many" | ||||
27 | ) unless $f_rel; | ||||
28 | |||||
29 | { | ||||
30 | 2 | 22µs | # spent 16µs (9+7) within DBIx::Class::Relationship::ManyToMany::BEGIN@30 which was called:
# once (9µs+7µs) by Class::C3::Componentised::ensure_class_loaded at line 30 # spent 16µs making 1 call to DBIx::Class::Relationship::ManyToMany::BEGIN@30
# spent 7µs making 1 call to strict::unimport | ||
31 | 2 | 38µs | # spent 23µs (8+15) within DBIx::Class::Relationship::ManyToMany::BEGIN@31 which was called:
# once (8µs+15µs) by Class::C3::Componentised::ensure_class_loaded at line 31 # spent 23µs making 1 call to DBIx::Class::Relationship::ManyToMany::BEGIN@31
# spent 15µs making 1 call to warnings::unimport | ||
32 | |||||
33 | my $add_meth = "add_to_${meth}"; | ||||
34 | my $remove_meth = "remove_from_${meth}"; | ||||
35 | my $set_meth = "set_${meth}"; | ||||
36 | my $rs_meth = "${meth}_rs"; | ||||
37 | |||||
38 | for ($add_meth, $remove_meth, $set_meth, $rs_meth) { | ||||
39 | 48 | 697µs | if ( $class->can ($_) ) { # spent 697µs making 48 calls to UNIVERSAL::can, avg 15µs/call | ||
40 | carp (<<"EOW") unless $ENV{DBIC_OVERWRITE_HELPER_METHODS_OK}; | ||||
41 | |||||
42 | *************************************************************************** | ||||
43 | The many-to-many relationship '$meth' is trying to create a utility method | ||||
44 | called $_. | ||||
45 | This will completely overwrite one such already existing method on class | ||||
46 | $class. | ||||
47 | |||||
48 | You almost certainly want to rename your method or the many-to-many | ||||
49 | relationship, as the functionality of the original method will not be | ||||
50 | accessible anymore. | ||||
51 | |||||
52 | To disable this warning set to a true value the environment variable | ||||
53 | DBIC_OVERWRITE_HELPER_METHODS_OK | ||||
54 | |||||
55 | *************************************************************************** | ||||
56 | EOW | ||||
57 | } | ||||
58 | } | ||||
59 | |||||
60 | $rel_attrs->{alias} ||= $f_rel; | ||||
61 | |||||
62 | my $rs_meth_name = join '::', $class, $rs_meth; | ||||
63 | *$rs_meth_name = subname $rs_meth_name, sub { | ||||
64 | my $self = shift; | ||||
65 | my $attrs = @_ > 1 && ref $_[$#_] eq 'HASH' ? pop(@_) : {}; | ||||
66 | my $rs = $self->search_related($rel)->search_related( | ||||
67 | $f_rel, @_ > 0 ? @_ : undef, { %{$rel_attrs||{}}, %$attrs } | ||||
68 | ); | ||||
69 | return $rs; | ||||
70 | 12 | 58µs | }; # spent 58µs making 12 calls to Sub::Name::subname, avg 5µs/call | ||
71 | |||||
72 | my $meth_name = join '::', $class, $meth; | ||||
73 | *$meth_name = subname $meth_name, sub { | ||||
74 | DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_WANTARRAY and my $sog = fail_on_internal_wantarray; | ||||
75 | my $self = shift; | ||||
76 | my $rs = $self->$rs_meth( @_ ); | ||||
77 | return (wantarray ? $rs->all : $rs); | ||||
78 | 12 | 48µs | }; # spent 48µs making 12 calls to Sub::Name::subname, avg 4µs/call | ||
79 | |||||
80 | my $add_meth_name = join '::', $class, $add_meth; | ||||
81 | *$add_meth_name = subname $add_meth_name, sub { | ||||
82 | my $self = shift; | ||||
83 | @_ > 0 or $self->throw_exception( | ||||
84 | "${add_meth} needs an object or hashref" | ||||
85 | ); | ||||
86 | my $source = $self->result_source; | ||||
87 | my $schema = $source->schema; | ||||
88 | my $rel_source_name = $source->relationship_info($rel)->{source}; | ||||
89 | my $rel_source = $schema->resultset($rel_source_name)->result_source; | ||||
90 | my $f_rel_source_name = $rel_source->relationship_info($f_rel)->{source}; | ||||
91 | my $f_rel_rs = $schema->resultset($f_rel_source_name)->search({}, $rel_attrs||{}); | ||||
92 | |||||
93 | my $obj; | ||||
94 | if (ref $_[0]) { | ||||
95 | if (ref $_[0] eq 'HASH') { | ||||
96 | $obj = $f_rel_rs->find_or_create($_[0]); | ||||
97 | } else { | ||||
98 | $obj = $_[0]; | ||||
99 | } | ||||
100 | } else { | ||||
101 | $obj = $f_rel_rs->find_or_create({@_}); | ||||
102 | } | ||||
103 | |||||
104 | my $link_vals = @_ > 1 && ref $_[$#_] eq 'HASH' ? pop(@_) : {}; | ||||
105 | my $link = $self->search_related($rel)->new_result($link_vals); | ||||
106 | $link->set_from_related($f_rel, $obj); | ||||
107 | $link->insert(); | ||||
108 | return $obj; | ||||
109 | 12 | 4.77ms | }; # spent 4.77ms making 12 calls to Sub::Name::subname, avg 398µs/call | ||
110 | |||||
111 | my $set_meth_name = join '::', $class, $set_meth; | ||||
112 | *$set_meth_name = subname $set_meth_name, sub { | ||||
113 | my $self = shift; | ||||
114 | @_ > 0 or $self->throw_exception( | ||||
115 | "{$set_meth} needs a list of objects or hashrefs" | ||||
116 | ); | ||||
117 | my @to_set = (ref($_[0]) eq 'ARRAY' ? @{ $_[0] } : @_); | ||||
118 | # if there is a where clause in the attributes, ensure we only delete | ||||
119 | # rows that are within the where restriction | ||||
120 | if ($rel_attrs && $rel_attrs->{where}) { | ||||
121 | $self->search_related( $rel, $rel_attrs->{where},{join => $f_rel})->delete; | ||||
122 | } else { | ||||
123 | $self->search_related( $rel, {} )->delete; | ||||
124 | } | ||||
125 | # add in the set rel objects | ||||
126 | $self->$add_meth($_, ref($_[1]) ? $_[1] : {}) for (@to_set); | ||||
127 | 12 | 141µs | }; # spent 141µs making 12 calls to Sub::Name::subname, avg 12µs/call | ||
128 | |||||
129 | my $remove_meth_name = join '::', $class, $remove_meth; | ||||
130 | *$remove_meth_name = subname $remove_meth_name, sub { | ||||
131 | my ($self, $obj) = @_; | ||||
132 | $self->throw_exception("${remove_meth} needs an object") | ||||
133 | unless blessed ($obj); | ||||
134 | my $rel_source = $self->search_related($rel)->result_source; | ||||
135 | my $cond = $rel_source->relationship_info($f_rel)->{cond}; | ||||
136 | my ($link_cond, $crosstable) = $rel_source->_resolve_condition( | ||||
137 | $cond, $obj, $f_rel, $f_rel | ||||
138 | ); | ||||
139 | |||||
140 | $self->throw_exception( | ||||
141 | "Relationship '$rel' does not resolve to a join-free condition, " | ||||
142 | ."unable to use with the ManyToMany helper '$f_rel'" | ||||
143 | ) if $crosstable; | ||||
144 | |||||
145 | $self->search_related($rel, $link_cond)->delete; | ||||
146 | 12 | 47µs | }; # spent 47µs making 12 calls to Sub::Name::subname, avg 4µs/call | ||
147 | |||||
148 | } | ||||
149 | } | ||||
150 | |||||
151 | 1 | 166µs | 1; # spent 166µs making 1 call to B::Hooks::EndOfScope::XS::__ANON__ |