Retire the ASSERT_NO_INTERNAL_WANTARRAY macro
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / ResultSet.pm
1 package DBIx::Class::ResultSet;
2
3 use strict;
4 use warnings;
5
6 use base 'DBIx::Class';
7
8 use DBIx::Class::Carp;
9 use DBIx::Class::ResultSetColumn;
10 use DBIx::Class::ResultClass::HashRefInflator;
11 use Scalar::Util qw( blessed reftype );
12 use SQL::Abstract 'is_literal_value';
13 use DBIx::Class::_Util qw(
14   dbic_internal_try dbic_internal_catch dump_value emit_loud_diag
15   fail_on_internal_call UNRESOLVABLE_CONDITION DUMMY_ALIASPAIR
16 );
17 use DBIx::Class::SQLMaker::Util qw( normalize_sqla_condition extract_equality_conditions );
18 use DBIx::Class::ResultSource::FromSpec::Util 'find_join_path_to_alias';
19
20 BEGIN {
21   # De-duplication in _merge_attr() is disabled, but left in for reference
22   # (the merger is used for other things that ought not to be de-duped)
23   *__HM_DEDUP = sub () { 0 };
24 }
25
26 use namespace::clean;
27
28 use overload
29         '0+'     => "count",
30         'bool'   => "_bool",
31         fallback => 1;
32
33 # this is real - CDBICompat overrides it with insanity
34 # yes, prototype won't matter, but that's for now ;)
35 sub _bool () { 1 }
36
37 __PACKAGE__->mk_group_accessors('simple' => qw/_result_class result_source/);
38
39 =head1 NAME
40
41 DBIx::Class::ResultSet - Represents a query used for fetching a set of results.
42
43 =head1 SYNOPSIS
44
45   my $users_rs = $schema->resultset('User');
46   while( $user = $users_rs->next) {
47     print $user->username;
48   }
49
50   my $registered_users_rs = $schema->resultset('User')->search({ registered => 1 });
51   my @cds_in_2005 = $schema->resultset('CD')->search({ year => 2005 })->all();
52
53 =head1 DESCRIPTION
54
55 A ResultSet is an object which stores a set of conditions representing
56 a query. It is the backbone of DBIx::Class (i.e. the really
57 important/useful bit).
58
59 No SQL is executed on the database when a ResultSet is created, it
60 just stores all the conditions needed to create the query.
61
62 A basic ResultSet representing the data of an entire table is returned
63 by calling C<resultset> on a L<DBIx::Class::Schema> and passing in a
64 L<Source|DBIx::Class::Manual::Glossary/ResultSource> name.
65
66   my $users_rs = $schema->resultset('User');
67
68 A new ResultSet is returned from calling L</search> on an existing
69 ResultSet. The new one will contain all the conditions of the
70 original, plus any new conditions added in the C<search> call.
71
72 A ResultSet also incorporates an implicit iterator. L</next> and L</reset>
73 can be used to walk through all the L<DBIx::Class::Row>s the ResultSet
74 represents.
75
76 The query that the ResultSet represents is B<only> executed against
77 the database when these methods are called:
78 L</find>, L</next>, L</all>, L</first>, L</single>, L</count>.
79
80 If a resultset is used in a numeric context it returns the L</count>.
81 However, if it is used in a boolean context it is B<always> true.  So if
82 you want to check if a resultset has any results, you must use C<if $rs
83 != 0>.
84
85 =head1 EXAMPLES
86
87 =head2 Chaining resultsets
88
89 Let's say you've got a query that needs to be run to return some data
90 to the user. But, you have an authorization system in place that
91 prevents certain users from seeing certain information. So, you want
92 to construct the basic query in one method, but add constraints to it in
93 another.
94
95   sub get_data {
96     my $self = shift;
97     my $request = $self->get_request; # Get a request object somehow.
98     my $schema = $self->result_source->schema;
99
100     my $cd_rs = $schema->resultset('CD')->search({
101       title => $request->param('title'),
102       year => $request->param('year'),
103     });
104
105     $cd_rs = $self->apply_security_policy( $cd_rs );
106
107     return $cd_rs->all();
108   }
109
110   sub apply_security_policy {
111     my $self = shift;
112     my ($rs) = @_;
113
114     return $rs->search({
115       subversive => 0,
116     });
117   }
118
119 =head3 Resolving conditions and attributes
120
121 When a resultset is chained from another resultset (e.g.:
122 C<< my $new_rs = $old_rs->search(\%extra_cond, \%attrs) >>), conditions
123 and attributes with the same keys need resolving.
124
125 If any of L</columns>, L</select>, L</as> are present, they reset the
126 original selection, and start the selection "clean".
127
128 The L</join>, L</prefetch>, L</+columns>, L</+select>, L</+as> attributes
129 are merged into the existing ones from the original resultset.
130
131 The L</where> and L</having> attributes, and any search conditions, are
132 merged with an SQL C<AND> to the existing condition from the original
133 resultset.
134
135 All other attributes are overridden by any new ones supplied in the
136 search attributes.
137
138 =head2 Multiple queries
139
140 Since a resultset just defines a query, you can do all sorts of
141 things with it with the same object.
142
143   # Don't hit the DB yet.
144   my $cd_rs = $schema->resultset('CD')->search({
145     title => 'something',
146     year => 2009,
147   });
148
149   # Each of these hits the DB individually.
150   my $count = $cd_rs->count;
151   my $most_recent = $cd_rs->get_column('date_released')->max();
152   my @records = $cd_rs->all;
153
154 And it's not just limited to SELECT statements.
155
156   $cd_rs->delete();
157
158 This is even cooler:
159
160   $cd_rs->create({ artist => 'Fred' });
161
162 Which is the same as:
163
164   $schema->resultset('CD')->create({
165     title => 'something',
166     year => 2009,
167     artist => 'Fred'
168   });
169
170 See: L</search>, L</count>, L</get_column>, L</all>, L</create>.
171
172 =head2 Custom ResultSet classes
173
174 To add methods to your resultsets, you can subclass L<DBIx::Class::ResultSet>, similar to:
175
176   package MyApp::Schema::ResultSet::User;
177
178   use strict;
179   use warnings;
180
181   use base 'DBIx::Class::ResultSet';
182
183   sub active {
184     my $self = shift;
185     $self->search({ $self->current_source_alias . '.active' => 1 });
186   }
187
188   sub unverified {
189     my $self = shift;
190     $self->search({ $self->current_source_alias . '.verified' => 0 });
191   }
192
193   sub created_n_days_ago {
194     my ($self, $days_ago) = @_;
195     $self->search({
196       $self->current_source_alias . '.create_date' => {
197         '<=',
198       $self->result_source->schema->storage->datetime_parser->format_datetime(
199         DateTime->now( time_zone => 'UTC' )->subtract( days => $days_ago )
200       )}
201     });
202   }
203
204   sub users_to_warn { shift->active->unverified->created_n_days_ago(7) }
205
206   1;
207
208 See L<DBIx::Class::Schema/load_namespaces> on how DBIC can discover and
209 automatically attach L<Result|DBIx::Class::Manual::ResultClass>-specific
210 L<ResulSet|DBIx::Class::ResultSet> classes.
211
212 =head3 ResultSet subclassing with Moose and similar constructor-providers
213
214 Using L<Moose> or L<Moo> in your ResultSet classes is usually overkill, but
215 you may find it useful if your ResultSets contain a lot of business logic
216 (e.g. C<has xml_parser>, C<has json>, etc) or if you just prefer to organize
217 your code via roles.
218
219 In order to write custom ResultSet classes with L<Moo> you need to use the
220 following template. The L<BUILDARGS|Moo/BUILDARGS> is necessary due to the
221 unusual signature of the L<constructor provided by DBIC
222 |DBIx::Class::ResultSet/new> C<< ->new($source, \%args) >>.
223
224   use Moo;
225   extends 'DBIx::Class::ResultSet';
226   sub BUILDARGS { $_[2] } # ::RS::new() expects my ($class, $rsrc, $args) = @_
227
228   ...your code...
229
230   1;
231
232 If you want to build your custom ResultSet classes with L<Moose>, you need
233 a similar, though a little more elaborate template in order to interface the
234 inlining of the L<Moose>-provided
235 L<object constructor|Moose::Manual::Construction/WHERE'S THE CONSTRUCTOR?>,
236 with the DBIC one.
237
238   package MyApp::Schema::ResultSet::User;
239
240   use Moose;
241   use MooseX::NonMoose;
242   extends 'DBIx::Class::ResultSet';
243
244   sub BUILDARGS { $_[2] } # ::RS::new() expects my ($class, $rsrc, $args) = @_
245
246   ...your code...
247
248   __PACKAGE__->meta->make_immutable;
249
250   1;
251
252 The L<MooseX::NonMoose> is necessary so that the L<Moose> constructor does not
253 entirely overwrite the DBIC one (in contrast L<Moo> does this automatically).
254 Alternatively, you can skip L<MooseX::NonMoose> and get by with just L<Moose>
255 instead by doing:
256
257   __PACKAGE__->meta->make_immutable(inline_constructor => 0);
258
259 =head1 METHODS
260
261 =head2 new
262
263 =over 4
264
265 =item Arguments: L<$source|DBIx::Class::ResultSource>, L<\%attrs?|/ATTRIBUTES>
266
267 =item Return Value: L<$resultset|/search>
268
269 =back
270
271 The resultset constructor. Takes a source object (usually a
272 L<DBIx::Class::ResultSourceProxy::Table>) and an attribute hash (see
273 L</ATTRIBUTES> below).  Does not perform any queries -- these are
274 executed as needed by the other methods.
275
276 Generally you never construct a resultset manually. Instead you get one
277 from e.g. a
278 C<< $schema->L<resultset|DBIx::Class::Schema/resultset>('$source_name') >>
279 or C<< $another_resultset->L<search|/search>(...) >> (the later called in
280 scalar context):
281
282   my $rs = $schema->resultset('CD')->search({ title => '100th Window' });
283
284 =over
285
286 =item WARNING
287
288 If called on an object, proxies to L</new_result> instead, so
289
290   my $cd = $schema->resultset('CD')->new({ title => 'Spoon' });
291
292 will return a CD object, not a ResultSet, and is equivalent to:
293
294   my $cd = $schema->resultset('CD')->new_result({ title => 'Spoon' });
295
296 Please also keep in mind that many internals call L</new_result> directly,
297 so overloading this method with the idea of intercepting new result object
298 creation B<will not work>. See also warning pertaining to L</create>.
299
300 =back
301
302 =cut
303
304 sub new {
305   my $class = shift;
306
307   if (ref $class) {
308     DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call;
309     return $class->new_result(@_);
310   }
311
312   my ($source, $attrs) = @_;
313   $source = $source->resolve
314     if $source->isa('DBIx::Class::ResultSourceHandle');
315
316   $attrs = { %{$attrs||{}} };
317   delete @{$attrs}{qw(_last_sqlmaker_alias_map _simple_passthrough_construction)};
318
319   if ($attrs->{page}) {
320     $attrs->{rows} ||= 10;
321   }
322
323   $attrs->{alias} ||= 'me';
324
325   my $self = bless {
326     result_source => $source,
327     cond => $attrs->{where},
328     pager => undef,
329     attrs => $attrs,
330   }, $class;
331
332   # if there is a dark selector, this means we are already in a
333   # chain and the cleanup/sanification was taken care of by
334   # _search_rs already
335   $self->_normalize_selection($attrs)
336     unless $attrs->{_dark_selector};
337
338   $self->result_class(
339     $attrs->{result_class} || $source->result_class
340   );
341
342   $self;
343 }
344
345 =head2 search
346
347 =over 4
348
349 =item Arguments: L<$cond|DBIx::Class::SQLMaker> | undef, L<\%attrs?|/ATTRIBUTES>
350
351 =item Return Value: $resultset (scalar context) | L<@result_objs|DBIx::Class::Manual::ResultClass> (list context)
352
353 =back
354
355   my @cds    = $cd_rs->search({ year => 2001 }); # "... WHERE year = 2001"
356   my $new_rs = $cd_rs->search({ year => 2005 });
357
358   my $new_rs = $cd_rs->search([ { year => 2005 }, { year => 2004 } ]);
359                  # year = 2005 OR year = 2004
360
361 In list context, C<< ->all() >> is called implicitly on the resultset, thus
362 returning a list of L<result|DBIx::Class::Manual::ResultClass> objects instead.
363 To avoid that, use L</search_rs>.
364
365 If you need to pass in additional attributes but no additional condition,
366 call it as C<search(undef, \%attrs)>.
367
368   # "SELECT name, artistid FROM $artist_table"
369   my @all_artists = $schema->resultset('Artist')->search(undef, {
370     columns => [qw/name artistid/],
371   });
372
373 For a list of attributes that can be passed to C<search>, see
374 L</ATTRIBUTES>. For more examples of using this function, see
375 L<Searching|DBIx::Class::Manual::Cookbook/SEARCHING>. For a complete
376 documentation for the first argument, see L<SQL::Abstract/"WHERE CLAUSES">
377 and its extension L<DBIx::Class::SQLMaker>.
378
379 For more help on using joins with search, see L<DBIx::Class::Manual::Joining>.
380
381 =head3 CAVEAT
382
383 Note that L</search> does not process/deflate any of the values passed in the
384 L<SQL::Abstract>-compatible search condition structure. This is unlike other
385 condition-bound methods L</new_result>, L</create> and L</find>. The user must ensure
386 manually that any value passed to this method will stringify to something the
387 RDBMS knows how to deal with. A notable example is the handling of L<DateTime>
388 objects, for more info see:
389 L<DBIx::Class::Manual::Cookbook/Formatting DateTime objects in queries>.
390
391 =cut
392
393 sub search {
394   my $rs = shift->search_rs( @_ );
395
396   return $rs->all
397     if wantarray;
398
399   return $rs
400     if defined wantarray;
401
402   # we can be called by a relationship helper, which in
403   # turn may be called in void context due to some braindead
404   # overload or whatever else the user decided to be clever
405   # at this particular day. Thus limit the exception to
406   # external code calls only
407   $rs->throw_exception ('->search is *not* a mutator, calling it in void context makes no sense')
408     if (caller)[0] !~ /^\QDBIx::Class::/;
409
410   # we are in void ctx here, but just in case
411   return ();
412 }
413
414 =head2 search_rs
415
416 =over 4
417
418 =item Arguments: L<$cond|DBIx::Class::SQLMaker>, L<\%attrs?|/ATTRIBUTES>
419
420 =item Return Value: L<$resultset|/search>
421
422 =back
423
424 This method does the same exact thing as search() except it will
425 always return a resultset, even in list context.
426
427 =cut
428
429 sub search_rs {
430   my $self = shift;
431
432   my $rsrc = $self->result_source;
433   my ($call_cond, $call_attrs);
434
435   # Special-case handling for (undef, undef) or (undef)
436   # Note that (foo => undef) is valid deprecated syntax
437   @_ = () if not scalar grep { defined $_ } @_;
438
439   # just a cond
440   if (@_ == 1) {
441     $call_cond = shift;
442   }
443   # fish out attrs in the ($condref, $attr) case
444   elsif (@_ == 2 and ( ! defined $_[0] or length ref $_[0] ) ) {
445     ($call_cond, $call_attrs) = @_;
446   }
447   elsif (@_ % 2) {
448     $self->throw_exception('Odd number of arguments to search')
449   }
450   # legacy search
451   elsif (@_) {
452     carp_unique 'search( %condition ) is deprecated, use search( \%condition ) instead'
453       unless $rsrc->result_class->isa('DBIx::Class::CDBICompat');
454
455     for my $i (0 .. $#_) {
456       next if $i % 2;
457       $self->throw_exception ('All keys in condition key/value pairs must be plain scalars')
458         if (! defined $_[$i] or length ref $_[$i] );
459     }
460
461     $call_cond = { @_ };
462   }
463
464   # see if we can keep the cache (no $rs changes)
465   my $cache;
466   my %safe = (alias => 1, cache => 1);
467   if ( ! grep { !$safe{$_} } keys %$call_attrs and (
468     ! defined $call_cond
469       or
470     ref $call_cond eq 'HASH' && ! keys %$call_cond
471       or
472     ref $call_cond eq 'ARRAY' && ! @$call_cond
473   )) {
474     $cache = $self->get_cache;
475   }
476
477   my $old_attrs = { %{$self->{attrs}} };
478   my ($old_having, $old_where) = delete @{$old_attrs}{qw(having where)};
479
480   my $new_attrs = { %$old_attrs };
481
482   # take care of call attrs (only if anything is changing)
483   if ($call_attrs and keys %$call_attrs) {
484
485     # copy for _normalize_selection
486     $call_attrs = { %$call_attrs };
487
488     my @selector_attrs = qw/select as columns cols +select +as +columns include_columns/;
489
490     # reset the current selector list if new selectors are supplied
491     delete @{$old_attrs}{(@selector_attrs, '_dark_selector')}
492       if grep { exists $call_attrs->{$_} } qw(columns cols select as);
493
494     # Normalize the new selector list (operates on the passed-in attr structure)
495     # Need to do it on every chain instead of only once on _resolved_attrs, in
496     # order to allow detection of empty vs partial 'as'
497     $call_attrs->{_dark_selector} = $old_attrs->{_dark_selector}
498       if $old_attrs->{_dark_selector};
499     $self->_normalize_selection ($call_attrs);
500
501     # start with blind overwriting merge, exclude selector attrs
502     $new_attrs = { %{$old_attrs}, %{$call_attrs} };
503     delete @{$new_attrs}{@selector_attrs};
504
505     for (@selector_attrs) {
506       $new_attrs->{$_} = $self->_merge_attr($old_attrs->{$_}, $call_attrs->{$_})
507         if ( exists $old_attrs->{$_} or exists $call_attrs->{$_} );
508     }
509
510     # older deprecated name, use only if {columns} is not there
511     if (my $c = delete $new_attrs->{cols}) {
512       carp_unique( "Resultset attribute 'cols' is deprecated, use 'columns' instead" );
513       if ($new_attrs->{columns}) {
514         carp "Resultset specifies both the 'columns' and the legacy 'cols' attributes - ignoring 'cols'";
515       }
516       else {
517         $new_attrs->{columns} = $c;
518       }
519     }
520
521
522     # join/prefetch use their own crazy merging heuristics
523     foreach my $key (qw/join prefetch/) {
524       $new_attrs->{$key} = $self->_merge_joinpref_attr($old_attrs->{$key}, $call_attrs->{$key})
525         if exists $call_attrs->{$key};
526     }
527
528     # stack binds together
529     $new_attrs->{bind} = [ @{ $old_attrs->{bind} || [] }, @{ $call_attrs->{bind} || [] } ];
530   }
531
532
533   for ($old_where, $call_cond) {
534     if (defined $_) {
535       $new_attrs->{where} = $self->_stack_cond (
536         $_, $new_attrs->{where}
537       );
538     }
539   }
540
541   if (defined $old_having) {
542     $new_attrs->{having} = $self->_stack_cond (
543       $old_having, $new_attrs->{having}
544     )
545   }
546
547   my $rs = (ref $self)->new($rsrc, $new_attrs);
548
549   $rs->set_cache($cache) if ($cache);
550
551   return $rs;
552 }
553
554 sub _normalize_selection {
555   my ($self, $attrs) = @_;
556
557   # legacy syntax
558   if ( exists $attrs->{include_columns} ) {
559     carp_unique( "Resultset attribute 'include_columns' is deprecated, use '+columns' instead" );
560     $attrs->{'+columns'} = $self->_merge_attr(
561       $attrs->{'+columns'}, delete $attrs->{include_columns}
562     );
563   }
564
565   # columns are always placed first, however
566
567   # Keep the X vs +X separation until _resolved_attrs time - this allows to
568   # delay the decision on whether to use a default select list ($rsrc->columns)
569   # allowing stuff like the remove_columns helper to work
570   #
571   # select/as +select/+as pairs need special handling - the amount of select/as
572   # elements in each pair does *not* have to be equal (think multicolumn
573   # selectors like distinct(foo, bar) ). If the selector is bare (no 'as'
574   # supplied at all) - try to infer the alias, either from the -as parameter
575   # of the selector spec, or use the parameter whole if it looks like a column
576   # name (ugly legacy heuristic). If all fails - leave the selector bare (which
577   # is ok as well), but make sure no more additions to the 'as' chain take place
578   for my $pref ('', '+') {
579
580     my ($sel, $as) = map {
581       my $key = "${pref}${_}";
582
583       my $val = [ ref $attrs->{$key} eq 'ARRAY'
584         ? @{$attrs->{$key}}
585         : $attrs->{$key} || ()
586       ];
587       delete $attrs->{$key};
588       $val;
589     } qw/select as/;
590
591     if (! @$as and ! @$sel ) {
592       next;
593     }
594     elsif (@$as and ! @$sel) {
595       $self->throw_exception(
596         "Unable to handle ${pref}as specification (@$as) without a corresponding ${pref}select"
597       );
598     }
599     elsif( ! @$as ) {
600       # no as part supplied at all - try to deduce (unless explicit end of named selection is declared)
601       # if any @$as has been supplied we assume the user knows what (s)he is doing
602       # and blindly keep stacking up pieces
603       unless ($attrs->{_dark_selector}) {
604         SELECTOR:
605         for (@$sel) {
606           if ( ref $_ eq 'HASH' and exists $_->{-as} ) {
607             push @$as, $_->{-as};
608           }
609           # assume any plain no-space, no-parenthesis string to be a column spec
610           # FIXME - this is retarded but is necessary to support shit like 'count(foo)'
611           elsif ( ! ref $_ and $_ =~ /^ [^\s\(\)]+ $/x) {
612             push @$as, $_;
613           }
614           # if all else fails - raise a flag that no more aliasing will be allowed
615           else {
616             $attrs->{_dark_selector} = {
617               plus_stage => $pref,
618               string => do {
619                 local $Data::Dumper::Indent = 0;
620                 dump_value $_;
621               },
622             };
623             last SELECTOR;
624           }
625         }
626       }
627     }
628     elsif (@$as < @$sel) {
629       $self->throw_exception(
630         "Unable to handle an ${pref}as specification (@$as) with less elements than the corresponding ${pref}select"
631       );
632     }
633     elsif ($pref and $attrs->{_dark_selector}) {
634       $self->throw_exception(
635         "Unable to process named '+select', resultset contains an unnamed selector $attrs->{_dark_selector}{string}"
636       );
637     }
638
639
640     # merge result
641     $attrs->{"${pref}select"} = $self->_merge_attr($attrs->{"${pref}select"}, $sel);
642     $attrs->{"${pref}as"} = $self->_merge_attr($attrs->{"${pref}as"}, $as);
643   }
644 }
645
646 sub _stack_cond {
647   my ($self, $left, $right) = @_;
648
649   (
650     (ref $_ eq 'ARRAY' and !@$_)
651       or
652     (ref $_ eq 'HASH' and ! keys %$_)
653   ) and $_ = undef for ($left, $right);
654
655   return(
656     # either one of the two undef
657     ( (defined $left) xor (defined $right) )  ? ( defined $left ? $left : $right )
658
659     # both undef
660   : ( ! defined $left )                       ? undef
661
662                                               : { -and => [$left, $right] }
663   );
664 }
665
666 =head2 search_literal
667
668 B<CAVEAT>: C<search_literal> is provided for Class::DBI compatibility and
669 should only be used in that context. C<search_literal> is a convenience
670 method. It is equivalent to calling C<< $schema->search(\[]) >>, but if you
671 want to ensure columns are bound correctly, use L</search>.
672
673 See L<DBIx::Class::Manual::Cookbook/SEARCHING> and
674 L<DBIx::Class::Manual::FAQ/Searching> for searching techniques that do not
675 require C<search_literal>.
676
677 =over 4
678
679 =item Arguments: $sql_fragment, @standalone_bind_values
680
681 =item Return Value: L<$resultset|/search> (scalar context) | L<@result_objs|DBIx::Class::Manual::ResultClass> (list context)
682
683 =back
684
685   my @cds   = $cd_rs->search_literal('year = ? AND title = ?', qw/2001 Reload/);
686   my $newrs = $artist_rs->search_literal('name = ?', 'Metallica');
687
688 Pass a literal chunk of SQL to be added to the conditional part of the
689 resultset query.
690
691 Example of how to use C<search> instead of C<search_literal>
692
693   my @cds = $cd_rs->search_literal('cdid = ? AND (artist = ? OR artist = ?)', (2, 1, 2));
694   my @cds = $cd_rs->search(\[ 'cdid = ? AND (artist = ? OR artist = ?)', [ 'cdid', 2 ], [ 'artist', 1 ], [ 'artist', 2 ] ]);
695
696 =cut
697
698 sub search_literal :DBIC_method_is_indirect_sugar {
699   DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call;
700
701   my ($self, $sql, @bind) = @_;
702   my $attr;
703   if ( @bind && ref($bind[-1]) eq 'HASH' ) {
704     $attr = pop @bind;
705   }
706   return $self->search(\[ $sql, map [ {} => $_ ], @bind ], ($attr || () ));
707 }
708
709 =head2 find
710
711 =over 4
712
713 =item Arguments: \%columns_values | @pk_values, { key => $unique_constraint, L<%attrs|/ATTRIBUTES> }?
714
715 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass> | undef
716
717 =back
718
719 Finds and returns a single row based on supplied criteria. Takes either a
720 hashref with the same format as L</create> (including inference of foreign
721 keys from related objects), or a list of primary key values in the same
722 order as the L<primary columns|DBIx::Class::ResultSource/primary_columns>
723 declaration on the L</result_source>.
724
725 In either case an attempt is made to combine conditions already existing on
726 the resultset with the condition passed to this method.
727
728 To aid with preparing the correct query for the storage you may supply the
729 C<key> attribute, which is the name of a
730 L<unique constraint|DBIx::Class::ResultSource/add_unique_constraint> (the
731 unique constraint corresponding to the
732 L<primary columns|DBIx::Class::ResultSource/primary_columns> is always named
733 C<primary>). If the C<key> attribute has been supplied, and DBIC is unable
734 to construct a query that satisfies the named unique constraint fully (
735 non-NULL values for each column member of the constraint) an exception is
736 thrown.
737
738 If no C<key> is specified, the search is carried over all unique constraints
739 which are fully defined by the available condition.
740
741 If no such constraint is found, C<find> currently defaults to a simple
742 C<< search->(\%column_values) >> which may or may not do what you expect.
743 Note that this fallback behavior may be deprecated in further versions. If
744 you need to search with arbitrary conditions - use L</search>. If the query
745 resulting from this fallback produces more than one row, a warning to the
746 effect is issued, though only the first row is constructed and returned as
747 C<$result_object>.
748
749 In addition to C<key>, L</find> recognizes and applies standard
750 L<resultset attributes|/ATTRIBUTES> in the same way as L</search> does.
751
752 Note that if you have extra concerns about the correctness of the resulting
753 query you need to specify the C<key> attribute and supply the entire condition
754 as an argument to find (since it is not always possible to perform the
755 combination of the resultset condition with the supplied one, especially if
756 the resultset condition contains literal sql).
757
758 For example, to find a row by its primary key:
759
760   my $cd = $schema->resultset('CD')->find(5);
761
762 You can also find a row by a specific unique constraint:
763
764   my $cd = $schema->resultset('CD')->find(
765     {
766       artist => 'Massive Attack',
767       title  => 'Mezzanine',
768     },
769     { key => 'cd_artist_title' }
770   );
771
772 See also L</find_or_create> and L</update_or_create>.
773
774 =cut
775
776 sub find {
777   my $self = shift;
778   my $attrs = (@_ > 1 && ref $_[-1] eq 'HASH' ? pop(@_) : {});
779
780
781   my $constraint_name;
782   if (exists $attrs->{key}) {
783     $constraint_name = defined $attrs->{key}
784       ? $attrs->{key}
785       : $self->throw_exception("An undefined 'key' resultset attribute makes no sense")
786     ;
787   }
788
789   # Parse out the condition from input
790   my $call_cond;
791
792   my $rsrc = $self->result_source;
793
794   if (ref $_[0] eq 'HASH') {
795     $call_cond = { %{$_[0]} };
796   }
797   else {
798     # if only values are supplied we need to default to 'primary'
799     $constraint_name = 'primary' unless defined $constraint_name;
800
801     my @c_cols = $rsrc->unique_constraint_columns($constraint_name);
802
803     $self->throw_exception(
804       "No constraint columns, maybe a malformed '$constraint_name' constraint?"
805     ) unless @c_cols;
806
807     $self->throw_exception (
808       'find() expects either a column/value hashref, or a list of values '
809     . "corresponding to the columns of the specified unique constraint '$constraint_name'"
810     ) unless @c_cols == @_;
811
812     @{$call_cond}{@c_cols} = @_;
813   }
814
815   # process relationship data if any
816   my $rel_list;
817
818   for my $key (keys %$call_cond) {
819     if (
820       # either a structure or a result-ish object
821       length ref($call_cond->{$key})
822         and
823       ( $rel_list ||= { map { $_ => 1 } $rsrc->relationships } )
824         ->{$key}
825         and
826       ! is_literal_value( $call_cond->{$key} )
827         and
828       # implicitly skip has_many's (likely MC), via the delete()
829       ( ref( my $foreign_val = delete $call_cond->{$key} ) ne 'ARRAY' )
830     ) {
831
832       # FIXME: it seems wrong that relationship conditions take precedence...?
833       $call_cond = {
834         %$call_cond,
835
836         %{ $rsrc->resolve_relationship_condition(
837           require_join_free_values => 1,
838           rel_name => $key,
839           foreign_values => (
840             (! defined blessed $foreign_val) ? $foreign_val : do {
841
842               my $f_result_class = $rsrc->related_source($key)->result_class;
843
844               unless( $foreign_val->isa($f_result_class) ) {
845
846                 $self->throw_exception(
847                   'Objects supplied to find() must inherit from '
848                 . "'$DBIx::Class::ResultSource::__expected_result_class_isa'"
849                 ) unless $foreign_val->isa(
850                   $DBIx::Class::ResultSource::__expected_result_class_isa
851                 );
852
853                 carp_unique(
854                   "Objects supplied to find() via '$key' usually should inherit from "
855                 . "the related ResultClass ('$f_result_class'), perhaps you've made "
856                 . 'a mistake?'
857                 );
858               }
859
860               +{ $foreign_val->get_columns };
861             }
862           ),
863
864           # an API where these are optional would be too cumbersome,
865           # instead always pass in some dummy values
866           DUMMY_ALIASPAIR,
867         )->{join_free_values} },
868       };
869     }
870   }
871
872   my $alias = exists $attrs->{alias} ? $attrs->{alias} : $self->{attrs}{alias};
873   my $final_cond;
874   if (defined $constraint_name) {
875     $final_cond = $self->_qualify_cond_columns (
876
877       $rsrc->_minimal_valueset_satisfying_constraint(
878         constraint_name => $constraint_name,
879         values => ($self->_merge_with_rscond($call_cond))[0],
880         carp_on_nulls => 1,
881       ),
882
883       $alias,
884     );
885   }
886   elsif ($self->{attrs}{accessor} and $self->{attrs}{accessor} eq 'single') {
887     # This means that we got here after a merger of relationship conditions
888     # in ::Relationship::Base::search_related (the row method), and furthermore
889     # the relationship is of the 'single' type. This means that the condition
890     # provided by the relationship (already attached to $self) is sufficient,
891     # as there can be only one row in the database that would satisfy the
892     # relationship
893   }
894   else {
895     my (@unique_queries, %seen_column_combinations, $ci, @fc_exceptions);
896
897     # no key was specified - fall down to heuristics mode:
898     # run through all unique queries registered on the resultset, and
899     # 'OR' all qualifying queries together
900     #
901     # always start from 'primary' if it exists at all
902     for my $c_name ( sort {
903         $a eq 'primary' ? -1
904       : $b eq 'primary' ? 1
905       : $a cmp $b
906     } $rsrc->unique_constraint_names) {
907
908       next if $seen_column_combinations{
909         join "\x00", sort $rsrc->unique_constraint_columns($c_name)
910       }++;
911
912       dbic_internal_try {
913         push @unique_queries, $self->_qualify_cond_columns(
914           $rsrc->_minimal_valueset_satisfying_constraint(
915             constraint_name => $c_name,
916             values => ($self->_merge_with_rscond($call_cond))[0],
917             columns_info => ($ci ||= $rsrc->columns_info),
918           ),
919           $alias
920         );
921       }
922       dbic_internal_catch {
923         push @fc_exceptions, $_ if $_ =~ /\bFilterColumn\b/;
924       };
925     }
926
927     $final_cond =
928         @unique_queries   ? \@unique_queries
929       : @fc_exceptions    ? $self->throw_exception(join "; ", map { $_ =~ /(.*) at .+ line \d+$/s } @fc_exceptions )
930       :                     $self->_non_unique_find_fallback ($call_cond, $attrs)
931     ;
932   }
933
934   # Run the query, passing the result_class since it should propagate for find
935   my $rs = $self->search ($final_cond, {result_class => $self->result_class, %$attrs});
936   if ($rs->_resolved_attrs->{collapse}) {
937     my $row = $rs->next;
938     carp "Query returned more than one row" if $rs->next;
939     return $row;
940   }
941   else {
942     return $rs->single;
943   }
944 }
945
946 # This is a stop-gap method as agreed during the discussion on find() cleanup:
947 # http://lists.scsys.co.uk/pipermail/dbix-class/2010-October/009535.html
948 #
949 # It is invoked when find() is called in legacy-mode with insufficiently-unique
950 # condition. It is provided for overrides until a saner way forward is devised
951 #
952 # *NOTE* This is not a public method, and it's *GUARANTEED* to disappear down
953 # the road. Please adjust your tests accordingly to catch this situation early
954 # DBIx::Class::ResultSet->can('_non_unique_find_fallback') is reasonable
955 #
956 # The method will not be removed without an adequately complete replacement
957 # for strict-mode enforcement
958 sub _non_unique_find_fallback {
959   my ($self, $cond, $attrs) = @_;
960
961   return $self->_qualify_cond_columns(
962     $cond,
963     exists $attrs->{alias}
964       ? $attrs->{alias}
965       : $self->{attrs}{alias}
966   );
967 }
968
969
970 sub _qualify_cond_columns {
971   my ($self, $cond, $alias) = @_;
972
973   my %aliased = %$cond;
974   for (keys %aliased) {
975     $aliased{"$alias.$_"} = delete $aliased{$_}
976       if $_ !~ /\./;
977   }
978
979   return \%aliased;
980 }
981
982 sub _build_unique_cond {
983   carp_unique sprintf
984     '_build_unique_cond is a private method, and moreover is about to go '
985   . 'away. Please contact the development team at %s if you believe you '
986   . 'have a genuine use for this method, in order to discuss alternatives.',
987     DBIx::Class::_ENV_::HELP_URL,
988   ;
989
990   my ($self, $constraint_name, $cond, $croak_on_null) = @_;
991
992   $self->result_source->_minimal_valueset_satisfying_constraint(
993     constraint_name => $constraint_name,
994     values => $cond,
995     carp_on_nulls => !$croak_on_null
996   );
997 }
998
999 =head2 search_related
1000
1001 =over 4
1002
1003 =item Arguments: $rel_name, $cond?, L<\%attrs?|/ATTRIBUTES>
1004
1005 =item Return Value: L<$resultset|/search> (scalar context) | L<@result_objs|DBIx::Class::Manual::ResultClass> (list context)
1006
1007 =back
1008
1009   $new_rs = $cd_rs->search_related('artist', {
1010     name => 'Emo-R-Us',
1011   });
1012
1013 Searches the specified relationship, optionally specifying a condition and
1014 attributes for matching records. See L</ATTRIBUTES> for more information.
1015
1016 In list context, C<< ->all() >> is called implicitly on the resultset, thus
1017 returning a list of result objects instead. To avoid that, use L</search_related_rs>.
1018
1019 See also L</search_related_rs>.
1020
1021 =cut
1022
1023 sub search_related :DBIC_method_is_indirect_sugar {
1024   DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call;
1025   return shift->related_resultset(shift)->search(@_);
1026 }
1027
1028 =head2 search_related_rs
1029
1030 This method works exactly the same as search_related, except that
1031 it guarantees a resultset, even in list context.
1032
1033 =cut
1034
1035 sub search_related_rs :DBIC_method_is_indirect_sugar {
1036   DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call;
1037   return shift->related_resultset(shift)->search_rs(@_);
1038 }
1039
1040 =head2 cursor
1041
1042 =over 4
1043
1044 =item Arguments: none
1045
1046 =item Return Value: L<$cursor|DBIx::Class::Cursor>
1047
1048 =back
1049
1050 Returns a storage-driven cursor to the given resultset. See
1051 L<DBIx::Class::Cursor> for more information.
1052
1053 =cut
1054
1055 sub cursor {
1056   my $self = shift;
1057
1058   return $self->{cursor} ||= do {
1059     my $attrs = $self->_resolved_attrs;
1060     $self->result_source->schema->storage->select(
1061       $attrs->{from}, $attrs->{select}, $attrs->{where}, $attrs
1062     );
1063   };
1064 }
1065
1066 =head2 single
1067
1068 =over 4
1069
1070 =item Arguments: L<$cond?|DBIx::Class::SQLMaker>
1071
1072 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass> | undef
1073
1074 =back
1075
1076   my $cd = $schema->resultset('CD')->single({ year => 2001 });
1077
1078 Inflates the first result without creating a cursor if the resultset has
1079 any records in it; if not returns C<undef>. Used by L</find> as a lean version
1080 of L</search>.
1081
1082 While this method can take an optional search condition (just like L</search>)
1083 being a fast-code-path it does not recognize search attributes. If you need to
1084 add extra joins or similar, call L</search> and then chain-call L</single> on the
1085 L<DBIx::Class::ResultSet> returned.
1086
1087 =over
1088
1089 =item B<Note>
1090
1091 As of 0.08100, this method enforces the assumption that the preceding
1092 query returns only one row. If more than one row is returned, you will receive
1093 a warning:
1094
1095   Query returned more than one row
1096
1097 In this case, you should be using L</next> or L</find> instead, or if you really
1098 know what you are doing, use the L</rows> attribute to explicitly limit the size
1099 of the resultset.
1100
1101 This method will also throw an exception if it is called on a resultset prefetching
1102 has_many, as such a prefetch implies fetching multiple rows from the database in
1103 order to assemble the resulting object.
1104
1105 =back
1106
1107 =cut
1108
1109 sub single {
1110   my ($self, $where) = @_;
1111   if(@_ > 2) {
1112       $self->throw_exception('single() only takes search conditions, no attributes. You want ->search( $cond, $attrs )->single()');
1113   }
1114
1115   my $attrs = { %{$self->_resolved_attrs} };
1116
1117   $self->throw_exception(
1118     'single() can not be used on resultsets collapsing a has_many. Use find( \%cond ) or next() instead'
1119   ) if $attrs->{collapse};
1120
1121   if ($where) {
1122     if (defined $attrs->{where}) {
1123       $attrs->{where} = {
1124         '-and' =>
1125             [ map { ref $_ eq 'ARRAY' ? [ -or => $_ ] : $_ }
1126                $where, delete $attrs->{where} ]
1127       };
1128     } else {
1129       $attrs->{where} = $where;
1130     }
1131   }
1132
1133   my $data = [ $self->result_source->schema->storage->select_single(
1134     $attrs->{from}, $attrs->{select},
1135     $attrs->{where}, $attrs
1136   )];
1137
1138   return undef unless @$data;
1139   $self->{_stashed_rows} = [ $data ];
1140   $self->_construct_results->[0];
1141 }
1142
1143 =head2 get_column
1144
1145 =over 4
1146
1147 =item Arguments: L<$cond?|DBIx::Class::SQLMaker>
1148
1149 =item Return Value: L<$resultsetcolumn|DBIx::Class::ResultSetColumn>
1150
1151 =back
1152
1153   my $max_length = $rs->get_column('length')->max;
1154
1155 Returns a L<DBIx::Class::ResultSetColumn> instance for a column of the ResultSet.
1156
1157 =cut
1158
1159 sub get_column {
1160   DBIx::Class::ResultSetColumn->new(@_);
1161 }
1162
1163 =head2 search_like
1164
1165 =over 4
1166
1167 =item Arguments: L<$cond|DBIx::Class::SQLMaker>, L<\%attrs?|/ATTRIBUTES>
1168
1169 =item Return Value: L<$resultset|/search> (scalar context) | L<@result_objs|DBIx::Class::Manual::ResultClass> (list context)
1170
1171 =back
1172
1173   # WHERE title LIKE '%blue%'
1174   $cd_rs = $rs->search_like({ title => '%blue%'});
1175
1176 Performs a search, but uses C<LIKE> instead of C<=> as the condition. Note
1177 that this is simply a convenience method retained for ex Class::DBI users.
1178 You most likely want to use L</search> with specific operators.
1179
1180 For more information, see L<DBIx::Class::Manual::Cookbook>.
1181
1182 This method is deprecated and will be removed in 0.09. Use L<search()|/search>
1183 instead. An example conversion is:
1184
1185   ->search_like({ foo => 'bar' });
1186
1187   # Becomes
1188
1189   ->search({ foo => { like => 'bar' } });
1190
1191 =cut
1192
1193 sub search_like :DBIC_method_is_indirect_sugar {
1194   DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call;
1195
1196   my $class = shift;
1197   carp_unique (
1198     'search_like() is deprecated and will be removed in DBIC version 0.09.'
1199    .' Instead use ->search({ x => { -like => "y%" } })'
1200    .' (note the outer pair of {}s - they are important!)'
1201   );
1202   my $attrs = (@_ > 1 && ref $_[-1] eq 'HASH' ? pop(@_) : {});
1203   my $query = ref $_[0] eq 'HASH' ? { %{shift()} }: {@_};
1204   $query->{$_} = { 'like' => $query->{$_} } for keys %$query;
1205   return $class->search($query, { %$attrs });
1206 }
1207
1208 =head2 slice
1209
1210 =over 4
1211
1212 =item Arguments: $first, $last
1213
1214 =item Return Value: L<$resultset|/search> (scalar context) | L<@result_objs|DBIx::Class::Manual::ResultClass> (list context)
1215
1216 =back
1217
1218 Returns a resultset or object list representing a subset of elements from the
1219 resultset slice is called on. Indexes are from 0, i.e., to get the first
1220 three records, call:
1221
1222   my ($one, $two, $three) = $rs->slice(0, 2);
1223
1224 =cut
1225
1226 sub slice :DBIC_method_is_indirect_sugar {
1227   DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call;
1228
1229   my ($self, $min, $max) = @_;
1230   my $attrs = {}; # = { %{ $self->{attrs} || {} } };
1231   $attrs->{offset} = $self->{attrs}{offset} || 0;
1232   $attrs->{offset} += $min;
1233   $attrs->{rows} = ($max ? ($max - $min + 1) : 1);
1234   return $self->search(undef, $attrs);
1235 }
1236
1237 =head2 next
1238
1239 =over 4
1240
1241 =item Arguments: none
1242
1243 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass> | undef
1244
1245 =back
1246
1247 Returns the next element in the resultset (C<undef> is there is none).
1248
1249 Can be used to efficiently iterate over records in the resultset:
1250
1251   my $rs = $schema->resultset('CD')->search;
1252   while (my $cd = $rs->next) {
1253     print $cd->title;
1254   }
1255
1256 Note that you need to store the resultset object, and call C<next> on it.
1257 Calling C<< resultset('Table')->next >> repeatedly will always return the
1258 first record from the resultset.
1259
1260 =cut
1261
1262 sub next {
1263   my ($self) = @_;
1264
1265   if (my $cache = $self->get_cache) {
1266     $self->{all_cache_position} ||= 0;
1267     return $cache->[$self->{all_cache_position}++];
1268   }
1269
1270   if ($self->{attrs}{cache}) {
1271     delete $self->{pager};
1272     $self->{all_cache_position} = 1;
1273     return ($self->all)[0];
1274   }
1275
1276   return shift(@{$self->{_stashed_results}}) if @{ $self->{_stashed_results}||[] };
1277
1278   $self->{_stashed_results} = $self->_construct_results
1279     or return undef;
1280
1281   return shift @{$self->{_stashed_results}};
1282 }
1283
1284 # Constructs as many results as it can in one pass while respecting
1285 # cursor laziness. Several modes of operation:
1286 #
1287 # * Always builds everything present in @{$self->{_stashed_rows}}
1288 # * If called with $fetch_all true - pulls everything off the cursor and
1289 #   builds all result structures (or objects) in one pass
1290 # * If $self->_resolved_attrs->{collapse} is true, checks the order_by
1291 #   and if the resultset is ordered properly by the left side:
1292 #   * Fetches stuff off the cursor until the "master object" changes,
1293 #     and saves the last extra row (if any) in @{$self->{_stashed_rows}}
1294 #   OR
1295 #   * Just fetches, and collapses/constructs everything as if $fetch_all
1296 #     was requested (there is no other way to collapse except for an
1297 #     eager cursor)
1298 # * If no collapse is requested - just get the next row, construct and
1299 #   return
1300 sub _construct_results {
1301   my ($self, $fetch_all) = @_;
1302
1303   my $rsrc = $self->result_source;
1304   my $attrs = $self->_resolved_attrs;
1305
1306   if (
1307     ! $fetch_all
1308       and
1309     ! $attrs->{order_by}
1310       and
1311     $attrs->{collapse}
1312       and
1313     my @pcols = $rsrc->primary_columns
1314   ) {
1315     # default order for collapsing unless the user asked for something
1316     $attrs->{order_by} = [ map { join '.', $attrs->{alias}, $_} @pcols ];
1317     $attrs->{_ordered_for_collapse} = 1;
1318     $attrs->{_order_is_artificial} = 1;
1319   }
1320
1321   # this will be used as both initial raw-row collector AND as a RV of
1322   # _construct_results. Not regrowing the array twice matters a lot...
1323   # a surprising amount actually
1324   my $rows = delete $self->{_stashed_rows};
1325
1326   my $cursor; # we may not need one at all
1327
1328   my $did_fetch_all = $fetch_all;
1329
1330   if ($fetch_all) {
1331     # FIXME SUBOPTIMAL - we can do better, cursor->next/all (well diff. methods) should return a ref
1332     $rows = [ ($rows ? @$rows : ()), $self->cursor->all ];
1333   }
1334   elsif( $attrs->{collapse} ) {
1335
1336     # a cursor will need to be closed over in case of collapse
1337     $cursor = $self->cursor;
1338
1339     $attrs->{_ordered_for_collapse} = (
1340       (
1341         $attrs->{order_by}
1342           and
1343         $rsrc->schema
1344               ->storage
1345                ->_extract_colinfo_of_stable_main_source_order_by_portion($attrs)
1346       ) ? 1 : 0
1347     ) unless defined $attrs->{_ordered_for_collapse};
1348
1349     if (! $attrs->{_ordered_for_collapse}) {
1350       $did_fetch_all = 1;
1351
1352       # instead of looping over ->next, use ->all in stealth mode
1353       # *without* calling a ->reset afterwards
1354       # FIXME ENCAPSULATION - encapsulation breach, cursor method additions pending
1355       if (! $cursor->{_done}) {
1356         $rows = [ ($rows ? @$rows : ()), $cursor->all ];
1357         $cursor->{_done} = 1;
1358       }
1359     }
1360   }
1361
1362   if (! $did_fetch_all and ! @{$rows||[]} ) {
1363     # FIXME SUBOPTIMAL - we can do better, cursor->next/all (well diff. methods) should return a ref
1364     $cursor ||= $self->cursor;
1365     if (scalar (my @r = $cursor->next) ) {
1366       $rows = [ \@r ];
1367     }
1368   }
1369
1370   return undef unless @{$rows||[]};
1371
1372   # sanity check - people are too clever for their own good
1373   if ($attrs->{collapse} and my $aliastypes = $attrs->{_last_sqlmaker_alias_map} ) {
1374
1375     my $multiplied_selectors;
1376     for my $sel_alias ( grep { $_ ne $attrs->{alias} } keys %{ $aliastypes->{selecting} } ) {
1377       if (
1378         $aliastypes->{multiplying}{$sel_alias}
1379           or
1380         $aliastypes->{premultiplied}{$sel_alias}
1381       ) {
1382         $multiplied_selectors->{$_} = 1 for values %{$aliastypes->{selecting}{$sel_alias}{-seen_columns}}
1383       }
1384     }
1385
1386     for my $i (0 .. $#{$attrs->{as}} ) {
1387       my $sel = $attrs->{select}[$i];
1388
1389       if (ref $sel eq 'SCALAR') {
1390         $sel = $$sel;
1391       }
1392       elsif( ref $sel eq 'REF' and ref $$sel eq 'ARRAY' ) {
1393         $sel = $$sel->[0];
1394       }
1395
1396       $self->throw_exception(
1397         'Result collapse not possible - selection from a has_many source redirected to the main object'
1398       ) if ($multiplied_selectors->{$sel} and $attrs->{as}[$i] !~ /\./);
1399     }
1400   }
1401
1402   # hotspot - skip the setter
1403   my $res_class = $self->_result_class;
1404
1405   my $inflator_cref = $self->{_result_inflator}{cref} ||= do {
1406     $res_class->can ('inflate_result')
1407       or $self->throw_exception("Inflator $res_class does not provide an inflate_result() method");
1408   };
1409
1410   my $infmap = $attrs->{as};
1411
1412   $self->{_result_inflator}{is_core_row} = ( (
1413     $inflator_cref
1414       ==
1415     ( \&DBIx::Class::Row::inflate_result || die "No ::Row::inflate_result() - can't happen" )
1416   ) ? 1 : 0 ) unless defined $self->{_result_inflator}{is_core_row};
1417
1418   $self->{_result_inflator}{is_hri} = ( (
1419     ! $self->{_result_inflator}{is_core_row}
1420       and
1421     $inflator_cref == \&DBIx::Class::ResultClass::HashRefInflator::inflate_result
1422   ) ? 1 : 0 ) unless defined $self->{_result_inflator}{is_hri};
1423
1424
1425   if ($attrs->{_simple_passthrough_construction}) {
1426     # construct a much simpler array->hash folder for the one-table HRI cases right here
1427     if ($self->{_result_inflator}{is_hri}) {
1428       for my $r (@$rows) {
1429         $r = { map { $infmap->[$_] => $r->[$_] } 0..$#$infmap };
1430       }
1431     }
1432     # FIXME SUBOPTIMAL this is a very very very hot spot
1433     # while rather optimal we can *still* do much better, by
1434     # building a smarter Row::inflate_result(), and
1435     # switch to feeding it data via a much leaner interface
1436     #
1437     # crude unscientific benchmarking indicated the shortcut eval is not worth it for
1438     # this particular resultset size
1439     elsif ( $self->{_result_inflator}{is_core_row} and @$rows < 60 ) {
1440       for my $r (@$rows) {
1441         $r = $inflator_cref->($res_class, $rsrc, { map { $infmap->[$_] => $r->[$_] } (0..$#$infmap) } );
1442       }
1443     }
1444     else {
1445       eval sprintf (
1446         ( $self->{_result_inflator}{is_core_row}
1447           ? '$_ = $inflator_cref->($res_class, $rsrc, { %s }) for @$rows'
1448           # a custom inflator may be a multiplier/reductor - put it in direct list ctx
1449           : '@$rows = map { $inflator_cref->($res_class, $rsrc, { %s } ) } @$rows'
1450         ),
1451         ( join (', ', map { "\$infmap->[$_] => \$_->[$_]" } 0..$#$infmap ) )
1452       ) . '; 1' or die;
1453     }
1454   }
1455   else {
1456     my $parser_type =
1457         $self->{_result_inflator}{is_hri}       ? 'hri'
1458       : $self->{_result_inflator}{is_core_row}  ? 'classic_pruning'
1459       :                                           'classic_nonpruning'
1460     ;
1461
1462     unless( $self->{_row_parser}{$parser_type}{cref} ) {
1463
1464       # $args and $attrs to _mk_row_parser are separated to delineate what is
1465       # core collapser stuff and what is dbic $rs specific
1466       $self->{_row_parser}{$parser_type}{src} = $rsrc->_mk_row_parser({
1467         inflate_map => $infmap,
1468         collapse => $attrs->{collapse},
1469         premultiplied => $attrs->{_main_source_premultiplied},
1470         hri_style => $self->{_result_inflator}{is_hri},
1471         prune_null_branches => $self->{_result_inflator}{is_hri} || $self->{_result_inflator}{is_core_row},
1472       }, $attrs);
1473
1474       $self->{_row_parser}{$parser_type}{cref} = do {
1475         package # hide form PAUSE
1476           DBIx::Class::__GENERATED_ROW_PARSER__;
1477
1478         eval $self->{_row_parser}{$parser_type}{src};
1479       } || die $@;
1480     }
1481
1482     # this needs to close over the *current* cursor, hence why it is not cached above
1483     my $next_cref = ($did_fetch_all or ! $attrs->{collapse})
1484       ? undef
1485       : sub {
1486         # FIXME SUBOPTIMAL - we can do better, cursor->next/all (well diff. methods) should return a ref
1487         my @r = $cursor->next or return;
1488         \@r
1489       }
1490     ;
1491
1492     $self->{_row_parser}{$parser_type}{cref}->(
1493       $rows,
1494       $next_cref,
1495       ( $self->{_stashed_rows} = [] ),
1496       ( my $null_violations = {} ),
1497     );
1498
1499     $self->throw_exception(
1500       'Collapse aborted - the following columns are declared (or defaulted to) '
1501     . 'non-nullable within DBIC but NULLs were retrieved from storage: '
1502     . join( ', ', map { "'$infmap->[$_]'" } sort { $a <=> $b } keys %$null_violations )
1503     . ' within data row ' . dump_value({
1504       map {
1505         $infmap->[$_] =>
1506           ( ! defined $self->{_stashed_rows}[0][$_] or length $self->{_stashed_rows}[0][$_] < 50 )
1507             ? $self->{_stashed_rows}[0][$_]
1508             : substr( $self->{_stashed_rows}[0][$_], 0, 50 ) . '...'
1509       } 0 .. $#{$self->{_stashed_rows}[0]}
1510     })
1511     ) if keys %$null_violations;
1512
1513     # simple in-place substitution, does not regrow $rows
1514     if ($self->{_result_inflator}{is_core_row}) {
1515       $_ = $inflator_cref->($res_class, $rsrc, @$_) for @$rows
1516     }
1517     # Special-case multi-object HRI - there is no $inflator_cref pass at all
1518     elsif ( ! $self->{_result_inflator}{is_hri} ) {
1519       # the inflator may be a multiplier/reductor - put it in list ctx
1520       @$rows = map { $inflator_cref->($res_class, $rsrc, @$_) } @$rows;
1521     }
1522   }
1523
1524   # The @$rows check seems odd at first - why wouldn't we want to warn
1525   # regardless? The issue is things like find() etc, where the user
1526   # *knows* only one result will come back. In these cases the ->all
1527   # is not a pessimization, but rather something we actually want
1528   carp_unique(
1529     'Unable to properly collapse has_many results in iterator mode due '
1530   . 'to order criteria - performed an eager cursor slurp underneath. '
1531   . 'Consider using ->all() instead'
1532   ) if ( ! $fetch_all and @$rows > 1 );
1533
1534   return $rows;
1535 }
1536
1537 =head2 result_source
1538
1539 =over 4
1540
1541 =item Arguments: L<$result_source?|DBIx::Class::ResultSource>
1542
1543 =item Return Value: L<$result_source|DBIx::Class::ResultSource>
1544
1545 =back
1546
1547 An accessor for the primary ResultSource object from which this ResultSet
1548 is derived.
1549
1550 =head2 result_class
1551
1552 =over 4
1553
1554 =item Arguments: $result_class?
1555
1556 =item Return Value: $result_class
1557
1558 =back
1559
1560 An accessor for the class to use when creating result objects. Defaults to
1561 C<< result_source->result_class >> - which in most cases is the name of the
1562 L<"table"|DBIx::Class::Manual::Glossary/"ResultSource"> class.
1563
1564 Note that changing the result_class will also remove any components
1565 that were originally loaded in the source class via
1566 L<load_components|Class::C3::Componentised/load_components( @comps )>.
1567 Any overloaded methods in the original source class will not run.
1568
1569 =cut
1570
1571 sub result_class {
1572   my ($self, $result_class) = @_;
1573   if ($result_class) {
1574
1575     # don't fire this for an object
1576     $self->ensure_class_loaded($result_class)
1577       unless ref($result_class);
1578
1579     if ($self->get_cache) {
1580       carp_unique('Changing the result_class of a ResultSet instance with cached results is a noop - the cache contents will not be altered');
1581     }
1582     # FIXME ENCAPSULATION - encapsulation breach, cursor method additions pending
1583     elsif ($self->{cursor} && $self->{cursor}{_pos}) {
1584       $self->throw_exception('Changing the result_class of a ResultSet instance with an active cursor is not supported');
1585     }
1586
1587     $self->_result_class($result_class);
1588
1589     delete $self->{_result_inflator};
1590   }
1591   $self->_result_class;
1592 }
1593
1594 =head2 count
1595
1596 =over 4
1597
1598 =item Arguments: L<$cond|DBIx::Class::SQLMaker>, L<\%attrs?|/ATTRIBUTES>
1599
1600 =item Return Value: $count
1601
1602 =back
1603
1604 Performs an SQL C<COUNT> with the same query as the resultset was built
1605 with to find the number of elements. Passing arguments is equivalent to
1606 C<< $rs->search ($cond, \%attrs)->count >>
1607
1608 =cut
1609
1610 sub count {
1611   my $self = shift;
1612   return $self->search(@_)->count if @_ and defined $_[0];
1613   return scalar @{ $self->get_cache } if $self->get_cache;
1614
1615   my $attrs = { %{ $self->_resolved_attrs } };
1616
1617   # this is a little optimization - it is faster to do the limit
1618   # adjustments in software, instead of a subquery
1619   my ($rows, $offset) = delete @{$attrs}{qw/rows offset/};
1620
1621   my $crs;
1622   if ($self->_has_resolved_attr (qw/collapse group_by/)) {
1623     $crs = $self->_count_subq_rs ($attrs);
1624   }
1625   else {
1626     $crs = $self->_count_rs ($attrs);
1627   }
1628   my $count = $crs->next;
1629
1630   $count -= $offset if $offset;
1631   $count = $rows if $rows and $rows < $count;
1632   $count = 0 if ($count < 0);
1633
1634   return $count;
1635 }
1636
1637 =head2 count_rs
1638
1639 =over 4
1640
1641 =item Arguments: L<$cond|DBIx::Class::SQLMaker>, L<\%attrs?|/ATTRIBUTES>
1642
1643 =item Return Value: L<$count_rs|DBIx::Class::ResultSetColumn>
1644
1645 =back
1646
1647 Same as L</count> but returns a L<DBIx::Class::ResultSetColumn> object.
1648 This can be very handy for subqueries:
1649
1650   ->search( { amount => $some_rs->count_rs->as_query } )
1651
1652 As with regular resultsets the SQL query will be executed only after
1653 the resultset is accessed via L</next> or L</all>. That would return
1654 the same single value obtainable via L</count>.
1655
1656 =cut
1657
1658 sub count_rs {
1659   my $self = shift;
1660   return $self->search(@_)->count_rs if @_;
1661
1662   # this may look like a lack of abstraction (count() does about the same)
1663   # but in fact an _rs *must* use a subquery for the limits, as the
1664   # software based limiting can not be ported if this $rs is to be used
1665   # in a subquery itself (i.e. ->as_query)
1666   if ($self->_has_resolved_attr (qw/collapse group_by offset rows/)) {
1667     return $self->_count_subq_rs($self->{_attrs});
1668   }
1669   else {
1670     return $self->_count_rs($self->{_attrs});
1671   }
1672 }
1673
1674 #
1675 # returns a ResultSetColumn object tied to the count query
1676 #
1677 sub _count_rs {
1678   my ($self, $attrs) = @_;
1679
1680   my $rsrc = $self->result_source;
1681
1682   my $tmp_attrs = { %$attrs };
1683   # take off any limits, record_filter is cdbi, and no point of ordering nor locking a count
1684   delete @{$tmp_attrs}{qw/rows offset order_by record_filter for/};
1685
1686   # overwrite the selector (supplied by the storage)
1687   $rsrc->resultset_class->new($rsrc, {
1688     %$tmp_attrs,
1689     select => $rsrc->schema->storage->_count_select ($rsrc, $attrs),
1690     as => 'count',
1691   })->get_column ('count');
1692 }
1693
1694 #
1695 # same as above but uses a subquery
1696 #
1697 sub _count_subq_rs {
1698   my ($self, $attrs) = @_;
1699
1700   my $rsrc = $self->result_source;
1701
1702   my $sub_attrs = { %$attrs };
1703   # extra selectors do not go in the subquery and there is no point of ordering it, nor locking it
1704   delete @{$sub_attrs}{qw/collapse columns as select order_by for/};
1705
1706   # if we multi-prefetch we group_by something unique, as this is what we would
1707   # get out of the rs via ->next/->all. We *DO WANT* to clobber old group_by regardless
1708   if ( $attrs->{collapse}  ) {
1709     $sub_attrs->{group_by} = [ map { "$attrs->{alias}.$_" } @{
1710       $rsrc->_identifying_column_set || $self->throw_exception(
1711         'Unable to construct a unique group_by criteria properly collapsing the '
1712       . 'has_many prefetch before count()'
1713       );
1714     } ]
1715   }
1716
1717   # Calculate subquery selector
1718   if (my $g = $sub_attrs->{group_by}) {
1719
1720     my $sql_maker = $rsrc->schema->storage->sql_maker;
1721
1722     # necessary as the group_by may refer to aliased functions
1723     my $sel_index;
1724     for my $sel (@{$attrs->{select}}) {
1725       $sel_index->{$sel->{-as}} = $sel
1726         if (ref $sel eq 'HASH' and $sel->{-as});
1727     }
1728
1729     # anything from the original select mentioned on the group-by needs to make it to the inner selector
1730     # also look for named aggregates referred in the having clause
1731     # having often contains scalarrefs - thus parse it out entirely
1732     my @parts = @$g;
1733     if ($attrs->{having}) {
1734       local $sql_maker->{having_bind};
1735       local $sql_maker->{quote_char} = $sql_maker->{quote_char};
1736       local $sql_maker->{name_sep} = $sql_maker->{name_sep};
1737       unless (defined $sql_maker->{quote_char} and length $sql_maker->{quote_char}) {
1738         $sql_maker->{quote_char} = [ "\x00", "\xFF" ];
1739         # if we don't unset it we screw up retarded but unfortunately working
1740         # 'MAX(foo.bar)' => { '>', 3 }
1741         $sql_maker->{name_sep} = '';
1742       }
1743
1744       my ($lquote, $rquote, $sep) = map { quotemeta $_ } ($sql_maker->_quote_chars, $sql_maker->name_sep);
1745
1746       my $having_sql = $sql_maker->_parse_rs_attrs ({ having => $attrs->{having} });
1747       my %seen_having;
1748
1749       # search for both a proper quoted qualified string, for a naive unquoted scalarref
1750       # and if all fails for an utterly naive quoted scalar-with-function
1751       while ($having_sql =~ /
1752         $rquote $sep $lquote (.+?) $rquote
1753           |
1754         [\s,] \w+ \. (\w+) [\s,]
1755           |
1756         [\s,] $lquote (.+?) $rquote [\s,]
1757       /gx) {
1758         my $part = $1 || $2 || $3;  # one of them matched if we got here
1759         unless ($seen_having{$part}++) {
1760           push @parts, $part;
1761         }
1762       }
1763     }
1764
1765     for (@parts) {
1766       my $colpiece = $sel_index->{$_} || $_;
1767
1768       # unqualify join-based group_by's. Arcane but possible query
1769       # also horrible horrible hack to alias a column (not a func.)
1770       # (probably need to introduce SQLA syntax)
1771       if ($colpiece =~ /\./ && $colpiece !~ /^$attrs->{alias}\./) {
1772         my $as = $colpiece;
1773         $as =~ s/\./__/;
1774         $colpiece = \ sprintf ('%s AS %s', map { $sql_maker->_quote ($_) } ($colpiece, $as) );
1775       }
1776       push @{$sub_attrs->{select}}, $colpiece;
1777     }
1778   }
1779   else {
1780     my @pcols = map { "$attrs->{alias}.$_" } ($rsrc->primary_columns);
1781     $sub_attrs->{select} = @pcols ? \@pcols : [ 1 ];
1782   }
1783
1784   return $rsrc->resultset_class
1785                ->new ($rsrc, $sub_attrs)
1786                 ->as_subselect_rs
1787                  ->search ({}, { columns => { count => $rsrc->schema->storage->_count_select ($rsrc, $attrs) } })
1788                   ->get_column ('count');
1789 }
1790
1791
1792 =head2 count_literal
1793
1794 B<CAVEAT>: C<count_literal> is provided for Class::DBI compatibility and
1795 should only be used in that context. See L</search_literal> for further info.
1796
1797 =over 4
1798
1799 =item Arguments: $sql_fragment, @standalone_bind_values
1800
1801 =item Return Value: $count
1802
1803 =back
1804
1805 Counts the results in a literal query. Equivalent to calling L</search_literal>
1806 with the passed arguments, then L</count>.
1807
1808 =cut
1809
1810 sub count_literal :DBIC_method_is_indirect_sugar {
1811   DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call;
1812   shift->search_literal(@_)->count
1813 }
1814
1815 =head2 all
1816
1817 =over 4
1818
1819 =item Arguments: none
1820
1821 =item Return Value: L<@result_objs|DBIx::Class::Manual::ResultClass>
1822
1823 =back
1824
1825 Returns all elements in the resultset.
1826
1827 =cut
1828
1829 sub all {
1830   my $self = shift;
1831   if(@_) {
1832     $self->throw_exception("all() doesn't take any arguments, you probably wanted ->search(...)->all()");
1833   }
1834
1835   delete @{$self}{qw/_stashed_rows _stashed_results/};
1836
1837   if (my $c = $self->get_cache) {
1838     return @$c;
1839   }
1840
1841   $self->cursor->reset;
1842
1843   my $objs = $self->_construct_results('fetch_all') || [];
1844
1845   $self->set_cache($objs) if $self->{attrs}{cache};
1846
1847   return @$objs;
1848 }
1849
1850 =head2 reset
1851
1852 =over 4
1853
1854 =item Arguments: none
1855
1856 =item Return Value: $self
1857
1858 =back
1859
1860 Resets the resultset's cursor, so you can iterate through the elements again.
1861 Implicitly resets the storage cursor, so a subsequent L</next> will trigger
1862 another query.
1863
1864 =cut
1865
1866 sub reset {
1867   my ($self) = @_;
1868
1869   delete @{$self}{qw/_stashed_rows _stashed_results/};
1870   $self->{all_cache_position} = 0;
1871   $self->cursor->reset;
1872   return $self;
1873 }
1874
1875 =head2 first
1876
1877 =over 4
1878
1879 =item Arguments: none
1880
1881 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass> | undef
1882
1883 =back
1884
1885 L<Resets|/reset> the resultset (causing a fresh query to storage) and returns
1886 an object for the first result (or C<undef> if the resultset is empty).
1887
1888 =cut
1889
1890 sub first :DBIC_method_is_indirect_sugar {
1891   DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call;
1892   return $_[0]->reset->next;
1893 }
1894
1895
1896 # _rs_update_delete
1897 #
1898 # Determines whether and what type of subquery is required for the $rs operation.
1899 # If grouping is necessary either supplies its own, or verifies the current one
1900 # After all is done delegates to the proper storage method.
1901
1902 sub _rs_update_delete {
1903   my ($self, $op, $values) = @_;
1904
1905   my $rsrc = $self->result_source;
1906   my $storage = $rsrc->schema->storage;
1907
1908   my $attrs = { %{$self->_resolved_attrs} };
1909
1910   my $join_classifications;
1911   my ($existing_group_by) = delete @{$attrs}{qw(group_by _grouped_by_distinct)};
1912
1913   # do we need a subquery for any reason?
1914   my $needs_subq = (
1915     defined $existing_group_by
1916       or
1917     # if {from} is unparseable wrap a subq
1918     ref($attrs->{from}) ne 'ARRAY'
1919       or
1920     # limits call for a subq
1921     $self->_has_resolved_attr(qw/rows offset/)
1922   );
1923
1924   # simplify the joinmap, so we can further decide if a subq is necessary
1925   if (!$needs_subq and @{$attrs->{from}} > 1) {
1926
1927     ($attrs->{from}, $join_classifications) =
1928       $storage->_prune_unused_joins ($attrs);
1929
1930     # any non-pruneable non-local restricting joins imply subq
1931     $needs_subq = grep { $_ ne $attrs->{alias} } keys %{ $join_classifications->{restricting} || {} };
1932   }
1933
1934   # check if the head is composite (by now all joins are thrown out unless $needs_subq)
1935   $needs_subq ||= (
1936     (ref $attrs->{from}[0]) ne 'HASH'
1937       or
1938     ref $attrs->{from}[0]{ $attrs->{from}[0]{-alias} }
1939   );
1940
1941   my ($cond, $guard);
1942   # do we need anything like a subquery?
1943   if (! $needs_subq) {
1944     # Most databases do not allow aliasing of tables in UPDATE/DELETE. Thus
1945     # a condition containing 'me' or other table prefixes will not work
1946     # at all. Tell SQLMaker to dequalify idents via a gross hack.
1947     $cond = do {
1948       my $sqla = $rsrc->schema->storage->sql_maker;
1949       local $sqla->{_dequalify_idents} = 1;
1950       \[ $sqla->_recurse_where($self->{cond}) ];
1951     };
1952   }
1953   else {
1954     # we got this far - means it is time to wrap a subquery
1955     my $idcols = $rsrc->_identifying_column_set || $self->throw_exception(
1956       sprintf(
1957         "Unable to perform complex resultset %s() without an identifying set of columns on source '%s'",
1958         $op,
1959         $rsrc->source_name,
1960       )
1961     );
1962
1963     # make a new $rs selecting only the PKs (that's all we really need for the subq)
1964     delete $attrs->{$_} for qw/select as collapse/;
1965     $attrs->{columns} = [ map { "$attrs->{alias}.$_" } @$idcols ];
1966
1967     # this will be consumed by the pruner waaaaay down the stack
1968     $attrs->{_force_prune_multiplying_joins} = 1;
1969
1970     my $subrs = (ref $self)->new($rsrc, $attrs);
1971
1972     if (@$idcols == 1) {
1973       $cond = { $idcols->[0] => { -in => $subrs->as_query } };
1974     }
1975     elsif ($storage->_use_multicolumn_in) {
1976       # no syntax for calling this properly yet
1977       # !!! EXPERIMENTAL API !!! WILL CHANGE !!!
1978       $cond = $storage->sql_maker->_where_op_multicolumn_in (
1979         $idcols, # how do I convey a list of idents...? can binds reside on lhs?
1980         $subrs->as_query
1981       ),
1982     }
1983     else {
1984       # if all else fails - get all primary keys and operate over a ORed set
1985       # wrap in a transaction for consistency
1986       # this is where the group_by/multiplication starts to matter
1987       if (
1988         $existing_group_by
1989           or
1990         # we do not need to check pre-multipliers, since if the premulti is there, its
1991         # parent (who is multi) will be there too
1992         keys %{ $join_classifications->{multiplying} || {} }
1993       ) {
1994         # make sure if there is a supplied group_by it matches the columns compiled above
1995         # perfectly. Anything else can not be sanely executed on most databases so croak
1996         # right then and there
1997         if ($existing_group_by) {
1998           my @current_group_by = map
1999             { $_ =~ /\./ ? $_ : "$attrs->{alias}.$_" }
2000             @$existing_group_by
2001           ;
2002
2003           if (
2004             join ("\x00", sort @current_group_by)
2005               ne
2006             join ("\x00", sort @{$attrs->{columns}} )
2007           ) {
2008             $self->throw_exception (
2009               "You have just attempted a $op operation on a resultset which does group_by"
2010               . ' on columns other than the primary keys, while DBIC internally needs to retrieve'
2011               . ' the primary keys in a subselect. All sane RDBMS engines do not support this'
2012               . ' kind of queries. Please retry the operation with a modified group_by or'
2013               . ' without using one at all.'
2014             );
2015           }
2016         }
2017
2018         $subrs = $subrs->search({}, { group_by => $attrs->{columns} });
2019       }
2020
2021       $guard = $storage->txn_scope_guard;
2022
2023       for my $row ($subrs->cursor->all) {
2024         push @$cond, { map
2025           { $idcols->[$_] => $row->[$_] }
2026           (0 .. $#$idcols)
2027         };
2028       }
2029     }
2030   }
2031
2032   my $res = $cond ? $storage->$op (
2033     $rsrc,
2034     $op eq 'update' ? $values : (),
2035     $cond,
2036   ) : '0E0';
2037
2038   $guard->commit if $guard;
2039
2040   return $res;
2041 }
2042
2043 =head2 update
2044
2045 =over 4
2046
2047 =item Arguments: \%values
2048
2049 =item Return Value: $underlying_storage_rv
2050
2051 =back
2052
2053 Sets the specified columns in the resultset to the supplied values in a
2054 single query. Note that this will not run any accessor/set_column/update
2055 triggers, nor will it update any result object instances derived from this
2056 resultset (this includes the contents of the L<resultset cache|/set_cache>
2057 if any). See L</update_all> if you need to execute any on-update
2058 triggers or cascades defined either by you or a
2059 L<result component|DBIx::Class::Manual::Component/WHAT IS A COMPONENT>.
2060
2061 The return value is a pass through of what the underlying
2062 storage backend returned, and may vary. See L<DBI/execute> for the most
2063 common case.
2064
2065 =head3 CAVEAT
2066
2067 Note that L</update> does not process/deflate any of the values passed in.
2068 This is unlike the corresponding L<DBIx::Class::Row/update>. The user must
2069 ensure manually that any value passed to this method will stringify to
2070 something the RDBMS knows how to deal with. A notable example is the
2071 handling of L<DateTime> objects, for more info see:
2072 L<DBIx::Class::Manual::Cookbook/Formatting DateTime objects in queries>.
2073
2074 =cut
2075
2076 sub update {
2077   my ($self, $values) = @_;
2078   $self->throw_exception('Values for update must be a hash')
2079     unless ref $values eq 'HASH';
2080
2081   return $self->_rs_update_delete ('update', $values);
2082 }
2083
2084 =head2 update_all
2085
2086 =over 4
2087
2088 =item Arguments: \%values
2089
2090 =item Return Value: 1
2091
2092 =back
2093
2094 Fetches all objects and updates them one at a time via
2095 L<DBIx::Class::Row/update>. Note that C<update_all> will run DBIC defined
2096 triggers, while L</update> will not.
2097
2098 =cut
2099
2100 sub update_all {
2101   my ($self, $values) = @_;
2102   $self->throw_exception('Values for update_all must be a hash')
2103     unless ref $values eq 'HASH';
2104
2105   my $guard = $self->result_source->schema->txn_scope_guard;
2106   $_->update({%$values}) for $self->all;  # shallow copy - update will mangle it
2107   $guard->commit;
2108   return 1;
2109 }
2110
2111 =head2 delete
2112
2113 =over 4
2114
2115 =item Arguments: none
2116
2117 =item Return Value: $underlying_storage_rv
2118
2119 =back
2120
2121 Deletes the rows matching this resultset in a single query. Note that this
2122 will not run any delete triggers, nor will it alter the
2123 L<in_storage|DBIx::Class::Row/in_storage> status of any result object instances
2124 derived from this resultset (this includes the contents of the
2125 L<resultset cache|/set_cache> if any). See L</delete_all> if you need to
2126 execute any on-delete triggers or cascades defined either by you or a
2127 L<result component|DBIx::Class::Manual::Component/WHAT IS A COMPONENT>.
2128
2129 The return value is a pass through of what the underlying storage backend
2130 returned, and may vary. See L<DBI/execute> for the most common case.
2131
2132 =cut
2133
2134 sub delete {
2135   my $self = shift;
2136   $self->throw_exception('delete does not accept any arguments')
2137     if @_;
2138
2139   return $self->_rs_update_delete ('delete');
2140 }
2141
2142 =head2 delete_all
2143
2144 =over 4
2145
2146 =item Arguments: none
2147
2148 =item Return Value: 1
2149
2150 =back
2151
2152 Fetches all objects and deletes them one at a time via
2153 L<DBIx::Class::Row/delete>. Note that C<delete_all> will run DBIC defined
2154 triggers, while L</delete> will not.
2155
2156 =cut
2157
2158 sub delete_all {
2159   my $self = shift;
2160   $self->throw_exception('delete_all does not accept any arguments')
2161     if @_;
2162
2163   my $guard = $self->result_source->schema->txn_scope_guard;
2164   $_->delete for $self->all;
2165   $guard->commit;
2166   return 1;
2167 }
2168
2169 =head2 populate
2170
2171 =over 4
2172
2173 =item Arguments: [ \@column_list, \@row_values+ ] | [ \%col_data+ ]
2174
2175 =item Return Value: L<\@result_objects|DBIx::Class::Manual::ResultClass> (scalar context) | L<@result_objects|DBIx::Class::Manual::ResultClass> (list context)
2176
2177 =back
2178
2179 Accepts either an arrayref of hashrefs or alternatively an arrayref of
2180 arrayrefs.
2181
2182 =over
2183
2184 =item NOTE
2185
2186 The context of this method call has an important effect on what is
2187 submitted to storage. In void context data is fed directly to fastpath
2188 insertion routines provided by the underlying storage (most often
2189 L<DBI/execute_for_fetch>), bypassing the L<new|DBIx::Class::Row/new> and
2190 L<insert|DBIx::Class::Row/insert> calls on the
2191 L<Result|DBIx::Class::Manual::ResultClass> class, including any
2192 augmentation of these methods provided by components. For example if you
2193 are using something like L<DBIx::Class::UUIDColumns> to create primary
2194 keys for you, you will find that your PKs are empty.  In this case you
2195 will have to explicitly force scalar or list context in order to create
2196 those values.
2197
2198 =back
2199
2200 In non-void (scalar or list) context, this method is simply a wrapper
2201 for L</create>. Depending on list or scalar context either a list of
2202 L<Result|DBIx::Class::Manual::ResultClass> objects or an arrayref
2203 containing these objects is returned.
2204
2205 When supplying data in "arrayref of arrayrefs" invocation style, the
2206 first element should be a list of column names and each subsequent
2207 element should be a data value in the earlier specified column order.
2208 For example:
2209
2210   $schema->resultset("Artist")->populate([
2211     [ qw( artistid name ) ],
2212     [ 100, 'A Formally Unknown Singer' ],
2213     [ 101, 'A singer that jumped the shark two albums ago' ],
2214     [ 102, 'An actually cool singer' ],
2215   ]);
2216
2217 For the arrayref of hashrefs style each hashref should be a structure
2218 suitable for passing to L</create>. Multi-create is also permitted with
2219 this syntax.
2220
2221   $schema->resultset("Artist")->populate([
2222      { artistid => 4, name => 'Manufactured Crap', cds => [
2223         { title => 'My First CD', year => 2006 },
2224         { title => 'Yet More Tweeny-Pop crap', year => 2007 },
2225       ],
2226      },
2227      { artistid => 5, name => 'Angsty-Whiny Girl', cds => [
2228         { title => 'My parents sold me to a record company', year => 2005 },
2229         { title => 'Why Am I So Ugly?', year => 2006 },
2230         { title => 'I Got Surgery and am now Popular', year => 2007 }
2231       ],
2232      },
2233   ]);
2234
2235 If you attempt a void-context multi-create as in the example above (each
2236 Artist also has the related list of CDs), and B<do not> supply the
2237 necessary autoinc foreign key information, this method will proxy to the
2238 less efficient L</create>, and then throw the Result objects away. In this
2239 case there are obviously no benefits to using this method over L</create>.
2240
2241 =cut
2242
2243 sub populate {
2244   my $self = shift;
2245
2246   # this is naive and just a quick check
2247   # the types will need to be checked more thoroughly when the
2248   # multi-source populate gets added
2249   my $data = (
2250     ref $_[0] eq 'ARRAY'
2251       and
2252     ( @{$_[0]} or return )
2253       and
2254     ( ref $_[0][0] eq 'HASH' or ref $_[0][0] eq 'ARRAY' )
2255       and
2256     $_[0]
2257   ) or $self->throw_exception('Populate expects an arrayref of hashrefs or arrayref of arrayrefs');
2258
2259   # FIXME - no cref handling
2260   # At this point assume either hashes or arrays
2261
2262   my $rsrc = $self->result_source;
2263   my $storage = $rsrc->schema->storage;
2264
2265   if(defined wantarray) {
2266     my (@results, $guard);
2267
2268     if (ref $data->[0] eq 'ARRAY') {
2269       # column names only, nothing to do
2270       return if @$data == 1;
2271
2272       $guard = $storage->txn_scope_guard
2273         if @$data > 2;
2274
2275       @results = map
2276         { my $vals = $_; $self->new_result({ map { $data->[0][$_] => $vals->[$_] } 0..$#{$data->[0]} })->insert }
2277         @{$data}[1 .. $#$data]
2278       ;
2279     }
2280     else {
2281
2282       $guard = $storage->txn_scope_guard
2283         if @$data > 1;
2284
2285       @results = map { $self->new_result($_)->insert } @$data;
2286     }
2287
2288     $guard->commit if $guard;
2289     return wantarray ? @results : \@results;
2290   }
2291
2292   # we have to deal with *possibly incomplete* related data
2293   # this means we have to walk the data structure twice
2294   # whether we want this or not
2295   # jnap, I hate you ;)
2296   my $rel_info = { map { $_ => $rsrc->relationship_info($_) } $rsrc->relationships };
2297
2298   my ($colinfo, $colnames, $slices_with_rels);
2299   my $data_start = 0;
2300
2301   DATA_SLICE:
2302   for my $i (0 .. $#$data) {
2303
2304     my $current_slice_seen_rel_infos;
2305
2306 ### Determine/Supplement collists
2307 ### BEWARE - This is a hot piece of code, a lot of weird idioms were used
2308     if( ref $data->[$i] eq 'ARRAY' ) {
2309
2310       # positional(!) explicit column list
2311       if ($i == 0) {
2312         # column names only, nothing to do
2313         return if @$data == 1;
2314
2315         $colinfo->{$data->[0][$_]} = { pos => $_, name => $data->[0][$_] } and push @$colnames, $data->[0][$_]
2316           for 0 .. $#{$data->[0]};
2317
2318         $data_start = 1;
2319
2320         next DATA_SLICE;
2321       }
2322       else {
2323         for (values %$colinfo) {
2324           if ($_->{is_rel} ||= (
2325             $rel_info->{$_->{name}}
2326               and
2327             (
2328               ref $data->[$i][$_->{pos}] eq 'ARRAY'
2329                 or
2330               ref $data->[$i][$_->{pos}] eq 'HASH'
2331                 or
2332               (
2333                 defined blessed $data->[$i][$_->{pos}]
2334                   and
2335                 $data->[$i][$_->{pos}]->isa(
2336                   $DBIx::Class::ResultSource::__expected_result_class_isa
2337                     ||
2338                   emit_loud_diag(
2339                     confess => 1,
2340                     msg => 'Global $DBIx::Class::ResultSource::__expected_result_class_isa unexpectedly unset...'
2341                   )
2342                 )
2343               )
2344             )
2345               and
2346             1
2347           )) {
2348
2349             # moar sanity check... sigh
2350             for ( ref $data->[$i][$_->{pos}] eq 'ARRAY' ? @{$data->[$i][$_->{pos}]} : $data->[$i][$_->{pos}] ) {
2351               if (
2352                 defined blessed $_
2353                   and
2354                 $_->isa(
2355                   $DBIx::Class::ResultSource::__expected_result_class_isa
2356                     ||
2357                   emit_loud_diag(
2358                     confess => 1,
2359                     msg => 'Global $DBIx::Class::ResultSource::__expected_result_class_isa unexpectedly unset...'
2360                   )
2361                 )
2362               ) {
2363                 carp_unique("Fast-path populate() with supplied related objects is not possible - falling back to regular create()");
2364                 return my $throwaway = $self->populate(@_);
2365               }
2366             }
2367
2368             push @$current_slice_seen_rel_infos, $rel_info->{$_->{name}};
2369           }
2370         }
2371       }
2372
2373      if ($current_slice_seen_rel_infos) {
2374         push @$slices_with_rels, { map { $colnames->[$_] => $data->[$i][$_] } 0 .. $#$colnames };
2375
2376         # this is needed further down to decide whether or not to fallback to create()
2377         $colinfo->{$colnames->[$_]}{seen_null} ||= ! defined $data->[$i][$_]
2378           for 0 .. $#$colnames;
2379       }
2380     }
2381     elsif( ref $data->[$i] eq 'HASH' ) {
2382
2383       for ( sort keys %{$data->[$i]} ) {
2384
2385         $colinfo->{$_} ||= do {
2386
2387           $self->throw_exception("Column '$_' must be present in supplied explicit column list")
2388             if $data_start; # it will be 0 on AoH, 1 on AoA
2389
2390           push @$colnames, $_;
2391
2392           # RV
2393           { pos => $#$colnames, name => $_ }
2394         };
2395
2396         if ($colinfo->{$_}{is_rel} ||= (
2397           $rel_info->{$_}
2398             and
2399           (
2400             ref $data->[$i]{$_} eq 'ARRAY'
2401               or
2402             ref $data->[$i]{$_} eq 'HASH'
2403               or
2404             (
2405               defined blessed $data->[$i]{$_}
2406                 and
2407               $data->[$i]{$_}->isa(
2408                 $DBIx::Class::ResultSource::__expected_result_class_isa
2409                   ||
2410                 emit_loud_diag(
2411                   confess => 1,
2412                   msg => 'Global $DBIx::Class::ResultSource::__expected_result_class_isa unexpectedly unset...'
2413                 )
2414               )
2415             )
2416           )
2417             and
2418           1
2419         )) {
2420
2421           # moar sanity check... sigh
2422           for ( ref $data->[$i]{$_} eq 'ARRAY' ? @{$data->[$i]{$_}} : $data->[$i]{$_} ) {
2423             if (
2424               defined blessed $_
2425                 and
2426               $_->isa(
2427                 $DBIx::Class::ResultSource::__expected_result_class_isa
2428                   ||
2429                 emit_loud_diag(
2430                   confess => 1,
2431                   msg => 'Global $DBIx::Class::ResultSource::__expected_result_class_isa unexpectedly unset...'
2432                 )
2433               )
2434             ) {
2435               carp_unique("Fast-path populate() with supplied related objects is not possible - falling back to regular create()");
2436               return my $throwaway = $self->populate(@_);
2437             }
2438           }
2439
2440           push @$current_slice_seen_rel_infos, $rel_info->{$_};
2441         }
2442       }
2443
2444       if ($current_slice_seen_rel_infos) {
2445         push @$slices_with_rels, $data->[$i];
2446
2447         # this is needed further down to decide whether or not to fallback to create()
2448         $colinfo->{$_}{seen_null} ||= ! defined $data->[$i]{$_}
2449           for keys %{$data->[$i]};
2450       }
2451     }
2452     else {
2453       $self->throw_exception('Unexpected populate() data structure member type: ' . ref $data->[$i] );
2454     }
2455
2456     if ( grep
2457       { $_->{attrs}{is_depends_on} }
2458       @{ $current_slice_seen_rel_infos || [] }
2459     ) {
2460       carp_unique("Fast-path populate() of belongs_to relationship data is not possible - falling back to regular create()");
2461       return my $throwaway = $self->populate(@_);
2462     }
2463   }
2464
2465   if( $slices_with_rels ) {
2466
2467     # need to exclude the rel "columns"
2468     $colnames = [ grep { ! $colinfo->{$_}{is_rel} } @$colnames ];
2469
2470     # extra sanity check - ensure the main source is in fact identifiable
2471     # the localizing of nullability is insane, but oh well... the use-case is legit
2472     my $ci = $rsrc->columns_info($colnames);
2473
2474     $ci->{$_} = { %{$ci->{$_}}, is_nullable => 0 }
2475       for grep { ! $colinfo->{$_}{seen_null} } keys %$ci;
2476
2477     unless( $rsrc->_identifying_column_set($ci) ) {
2478       carp_unique("Fast-path populate() of non-uniquely identifiable rows with related data is not possible - falling back to regular create()");
2479       return my $throwaway = $self->populate(@_);
2480     }
2481   }
2482
2483 ### inherit the data locked in the conditions of the resultset
2484   my ($rs_data) = $self->_merge_with_rscond({});
2485   delete @{$rs_data}{@$colnames};  # passed-in stuff takes precedence
2486
2487   # if anything left - decompose rs_data
2488   my $rs_data_vals;
2489   if (keys %$rs_data) {
2490      push @$rs_data_vals, $rs_data->{$_}
2491       for sort keys %$rs_data;
2492   }
2493
2494 ### start work
2495   my $guard;
2496   $guard = $storage->txn_scope_guard
2497     if $slices_with_rels;
2498
2499 ### main source data
2500   # FIXME - need to switch entirely to a coderef-based thing,
2501   # so that large sets aren't copied several times... I think
2502   $storage->_insert_bulk(
2503     $rsrc,
2504     [ @$colnames, sort keys %$rs_data ],
2505     [ map {
2506       ref $data->[$_] eq 'ARRAY'
2507       ? (
2508           $slices_with_rels ? [ @{$data->[$_]}[0..$#$colnames], @{$rs_data_vals||[]} ]  # the collist changed
2509         : $rs_data_vals     ? [ @{$data->[$_]}, @$rs_data_vals ]
2510         :                     $data->[$_]
2511       )
2512       : [ @{$data->[$_]}{@$colnames}, @{$rs_data_vals||[]} ]
2513     } $data_start .. $#$data ],
2514   );
2515
2516 ### do the children relationships
2517   if ( $slices_with_rels ) {
2518     my @rels = grep { $colinfo->{$_}{is_rel} } keys %$colinfo
2519       or die 'wtf... please report a bug with DBIC_TRACE=1 output (stacktrace)';
2520
2521     for my $sl (@$slices_with_rels) {
2522
2523       my ($main_proto, $main_proto_rs);
2524       for my $rel (@rels) {
2525         next unless defined $sl->{$rel};
2526
2527         $main_proto ||= {
2528           %$rs_data,
2529           (map { $_ => $sl->{$_} } @$colnames),
2530         };
2531
2532         unless (defined $colinfo->{$rel}{rs}) {
2533
2534           $colinfo->{$rel}{rs} = $rsrc->related_source($rel)->resultset;
2535
2536           $colinfo->{$rel}{fk_map} = { reverse %{ $rsrc->resolve_relationship_condition(
2537             rel_name => $rel,
2538
2539             # an API where these are optional would be too cumbersome,
2540             # instead always pass in some dummy values
2541             DUMMY_ALIASPAIR,
2542           )->{identity_map} || {} } };
2543
2544         }
2545
2546         $colinfo->{$rel}{rs}->search({ map # only so that we inherit them values properly, no actual search
2547           {
2548             $_ => { '=' =>
2549               ( $main_proto_rs ||= $rsrc->resultset->search($main_proto) )
2550                 ->get_column( $colinfo->{$rel}{fk_map}{$_} )
2551                  ->as_query
2552             }
2553           }
2554           keys %{$colinfo->{$rel}{fk_map}}
2555         })->populate( ref $sl->{$rel} eq 'ARRAY' ? $sl->{$rel} : [ $sl->{$rel} ] );
2556
2557         1;
2558       }
2559     }
2560   }
2561
2562   $guard->commit if $guard;
2563 }
2564
2565 =head2 pager
2566
2567 =over 4
2568
2569 =item Arguments: none
2570
2571 =item Return Value: L<$pager|Data::Page>
2572
2573 =back
2574
2575 Returns a L<Data::Page> object for the current resultset. Only makes
2576 sense for queries with a C<page> attribute.
2577
2578 To get the full count of entries for a paged resultset, call
2579 C<total_entries> on the L<Data::Page> object.
2580
2581 =cut
2582
2583 sub pager {
2584   my ($self) = @_;
2585
2586   return $self->{pager} if $self->{pager};
2587
2588   my $attrs = $self->{attrs};
2589   if (!defined $attrs->{page}) {
2590     $self->throw_exception("Can't create pager for non-paged rs");
2591   }
2592   elsif ($attrs->{page} <= 0) {
2593     $self->throw_exception('Invalid page number (page-numbers are 1-based)');
2594   }
2595   $attrs->{rows} ||= 10;
2596
2597   # throw away the paging flags and re-run the count (possibly
2598   # with a subselect) to get the real total count
2599   my $count_attrs = { %$attrs };
2600   delete @{$count_attrs}{qw/rows offset page pager/};
2601
2602   my $total_rs = (ref $self)->new($self->result_source, $count_attrs);
2603
2604   require DBIx::Class::ResultSet::Pager;
2605   return $self->{pager} = DBIx::Class::ResultSet::Pager->new(
2606     sub { $total_rs->count },  #lazy-get the total
2607     $attrs->{rows},
2608     $self->{attrs}{page},
2609   );
2610 }
2611
2612 =head2 page
2613
2614 =over 4
2615
2616 =item Arguments: $page_number
2617
2618 =item Return Value: L<$resultset|/search>
2619
2620 =back
2621
2622 Returns a resultset for the $page_number page of the resultset on which page
2623 is called, where each page contains a number of rows equal to the 'rows'
2624 attribute set on the resultset (10 by default).
2625
2626 =cut
2627
2628 sub page {
2629   my ($self, $page) = @_;
2630   return (ref $self)->new($self->result_source, { %{$self->{attrs}}, page => $page });
2631 }
2632
2633 =head2 new_result
2634
2635 =over 4
2636
2637 =item Arguments: \%col_data
2638
2639 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
2640
2641 =back
2642
2643 Creates a new result object in the resultset's result class and returns
2644 it. The row is not inserted into the database at this point, call
2645 L<DBIx::Class::Row/insert> to do that. Calling L<DBIx::Class::Row/in_storage>
2646 will tell you whether the result object has been inserted or not.
2647
2648 Passes the hashref of input on to L<DBIx::Class::Row/new>.
2649
2650 =cut
2651
2652 sub new_result {
2653   my ($self, $values) = @_;
2654
2655   $self->throw_exception( "Result object instantiation requires a single hashref argument" )
2656     if @_ > 2 or ref $values ne 'HASH';
2657
2658   my ($merged_cond, $cols_from_relations) = $self->_merge_with_rscond($values);
2659
2660   my $new = $self->result_class->new({
2661     %$merged_cond,
2662     ( @$cols_from_relations
2663       ? (-cols_from_relations => $cols_from_relations)
2664       : ()
2665     ),
2666     -result_source => $self->result_source, # DO NOT REMOVE THIS, REQUIRED
2667   });
2668
2669   if (
2670     reftype($new) eq 'HASH'
2671       and
2672     ! keys %$new
2673       and
2674     blessed($new)
2675   ) {
2676     carp_unique (sprintf (
2677       "%s->new returned a blessed empty hashref - a strong indicator something is wrong with its inheritance chain",
2678       $self->result_class,
2679     ));
2680   }
2681
2682   $new;
2683 }
2684
2685 # _merge_with_rscond
2686 #
2687 # Takes a simple hash of K/V data and returns its copy merged with the
2688 # condition already present on the resultset. Additionally returns an
2689 # arrayref of value/condition names, which were inferred from related
2690 # objects (this is needed for in-memory related objects)
2691 sub _merge_with_rscond {
2692   my ($self, $data) = @_;
2693
2694   my ($implied_data, @cols_from_relations);
2695
2696   my $alias = $self->{attrs}{alias};
2697
2698   if (! defined $self->{cond}) {
2699     # just massage $data below
2700   }
2701   elsif ($self->{cond} eq UNRESOLVABLE_CONDITION) {
2702     $implied_data = $self->{attrs}{related_objects};  # nothing might have been inserted yet
2703     @cols_from_relations = keys %{ $implied_data || {} };
2704   }
2705   else {
2706     my $eqs = extract_equality_conditions( $self->{cond}, 'consider_nulls' );
2707     $implied_data = { map {
2708       ( ($eqs->{$_}||'') eq UNRESOLVABLE_CONDITION ) ? () : ( $_ => $eqs->{$_} )
2709     } keys %$eqs };
2710   }
2711
2712   return (
2713     { map
2714       { %{ $self->_remove_alias($_, $alias) } }
2715       # precedence must be given to passed values over values inherited from
2716       # the cond, so the order here is important.
2717       ( $implied_data||(), $data)
2718     },
2719     \@cols_from_relations
2720   );
2721 }
2722
2723 # _has_resolved_attr
2724 #
2725 # determines if the resultset defines at least one
2726 # of the attributes supplied
2727 #
2728 # used to determine if a subquery is necessary
2729 #
2730 # supports some virtual attributes:
2731 #   -join
2732 #     This will scan for any joins being present on the resultset.
2733 #     It is not a mere key-search but a deep inspection of {from}
2734 #
2735
2736 sub _has_resolved_attr {
2737   my ($self, @attr_names) = @_;
2738
2739   my $attrs = $self->_resolved_attrs;
2740
2741   my %extra_checks;
2742
2743   for my $n (@attr_names) {
2744     if (grep { $n eq $_ } (qw/-join/) ) {
2745       $extra_checks{$n}++;
2746       next;
2747     }
2748
2749     my $attr =  $attrs->{$n};
2750
2751     next if not defined $attr;
2752
2753     if (ref $attr eq 'HASH') {
2754       return 1 if keys %$attr;
2755     }
2756     elsif (ref $attr eq 'ARRAY') {
2757       return 1 if @$attr;
2758     }
2759     else {
2760       return 1 if $attr;
2761     }
2762   }
2763
2764   # a resolved join is expressed as a multi-level from
2765   return 1 if (
2766     $extra_checks{-join}
2767       and
2768     ref $attrs->{from} eq 'ARRAY'
2769       and
2770     @{$attrs->{from}} > 1
2771   );
2772
2773   return 0;
2774 }
2775
2776 # _remove_alias
2777 #
2778 # Remove the specified alias from the specified query hash. A copy is made so
2779 # the original query is not modified.
2780
2781 sub _remove_alias {
2782   my ($self, $query, $alias) = @_;
2783
2784   my %orig = %{ $query || {} };
2785   my %unaliased;
2786
2787   foreach my $key (keys %orig) {
2788     if ($key !~ /\./) {
2789       $unaliased{$key} = $orig{$key};
2790       next;
2791     }
2792     $unaliased{$1} = $orig{$key}
2793       if $key =~ m/^(?:\Q$alias\E\.)?([^.]+)$/;
2794   }
2795
2796   return \%unaliased;
2797 }
2798
2799 =head2 as_query
2800
2801 =over 4
2802
2803 =item Arguments: none
2804
2805 =item Return Value: \[ $sql, L<@bind_values|/DBIC BIND VALUES> ]
2806
2807 =back
2808
2809 Returns the SQL query and bind vars associated with the invocant.
2810
2811 This is generally used as the RHS for a subquery.
2812
2813 =cut
2814
2815 sub as_query {
2816   my $self = shift;
2817
2818   my $attrs = { %{ $self->_resolved_attrs } };
2819
2820   my $aq = $self->result_source->schema->storage->_select_args_to_query (
2821     $attrs->{from}, $attrs->{select}, $attrs->{where}, $attrs
2822   );
2823
2824   $aq;
2825 }
2826
2827 =head2 find_or_new
2828
2829 =over 4
2830
2831 =item Arguments: \%col_data, { key => $unique_constraint, L<%attrs|/ATTRIBUTES> }?
2832
2833 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
2834
2835 =back
2836
2837   my $artist = $schema->resultset('Artist')->find_or_new(
2838     { artist => 'fred' }, { key => 'artists' });
2839
2840   $cd->cd_to_producer->find_or_new({ producer => $producer },
2841                                    { key => 'primary' });
2842
2843 Find an existing record from this resultset using L</find>. if none exists,
2844 instantiate a new result object and return it. The object will not be saved
2845 into your storage until you call L<DBIx::Class::Row/insert> on it.
2846
2847 You most likely want this method when looking for existing rows using a unique
2848 constraint that is not the primary key, or looking for related rows.
2849
2850 If you want objects to be saved immediately, use L</find_or_create> instead.
2851
2852 B<Note>: Make sure to read the documentation of L</find> and understand the
2853 significance of the C<key> attribute, as its lack may skew your search, and
2854 subsequently result in spurious new objects.
2855
2856 B<Note>: Take care when using C<find_or_new> with a table having
2857 columns with default values that you intend to be automatically
2858 supplied by the database (e.g. an auto_increment primary key column).
2859 In normal usage, the value of such columns should NOT be included at
2860 all in the call to C<find_or_new>, even when set to C<undef>.
2861
2862 =cut
2863
2864 sub find_or_new {
2865   my $self     = shift;
2866   my $attrs    = (@_ > 1 && ref $_[-1] eq 'HASH' ? pop(@_) : {});
2867   my $hash     = ref $_[0] eq 'HASH' ? shift : {@_};
2868   if (keys %$hash and my $row = $self->find($hash, $attrs) ) {
2869     return $row;
2870   }
2871   return $self->new_result($hash);
2872 }
2873
2874 =head2 create
2875
2876 =over 4
2877
2878 =item Arguments: \%col_data
2879
2880 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
2881
2882 =back
2883
2884 Attempt to create a single new row or a row with multiple related rows
2885 in the table represented by the resultset (and related tables). This
2886 will not check for duplicate rows before inserting, use
2887 L</find_or_create> to do that.
2888
2889 To create one row for this resultset, pass a hashref of key/value
2890 pairs representing the columns of the table and the values you wish to
2891 store. If the appropriate relationships are set up, foreign key fields
2892 can also be passed an object representing the foreign row, and the
2893 value will be set to its primary key.
2894
2895 To create related objects, pass a hashref of related-object column values
2896 B<keyed on the relationship name>. If the relationship is of type C<multi>
2897 (L<DBIx::Class::Relationship/has_many>) - pass an arrayref of hashrefs.
2898 The process will correctly identify columns holding foreign keys, and will
2899 transparently populate them from the keys of the corresponding relation.
2900 This can be applied recursively, and will work correctly for a structure
2901 with an arbitrary depth and width, as long as the relationships actually
2902 exists and the correct column data has been supplied.
2903
2904 Instead of hashrefs of plain related data (key/value pairs), you may
2905 also pass new or inserted objects. New objects (not inserted yet, see
2906 L</new_result>), will be inserted into their appropriate tables.
2907
2908 Effectively a shortcut for C<< ->new_result(\%col_data)->insert >>.
2909
2910 Example of creating a new row.
2911
2912   $person_rs->create({
2913     name=>"Some Person",
2914     email=>"somebody@someplace.com"
2915   });
2916
2917 Example of creating a new row and also creating rows in a related C<has_many>
2918 or C<has_one> resultset.  Note Arrayref.
2919
2920   $artist_rs->create(
2921      { artistid => 4, name => 'Manufactured Crap', cds => [
2922         { title => 'My First CD', year => 2006 },
2923         { title => 'Yet More Tweeny-Pop crap', year => 2007 },
2924       ],
2925      },
2926   );
2927
2928 Example of creating a new row and also creating a row in a related
2929 C<belongs_to> resultset. Note Hashref.
2930
2931   $cd_rs->create({
2932     title=>"Music for Silly Walks",
2933     year=>2000,
2934     artist => {
2935       name=>"Silly Musician",
2936     }
2937   });
2938
2939 =over
2940
2941 =item WARNING
2942
2943 When subclassing ResultSet never attempt to override this method. Since
2944 it is a simple shortcut for C<< $self->new_result($attrs)->insert >>, a
2945 lot of the internals simply never call it, so your override will be
2946 bypassed more often than not. Override either L<DBIx::Class::Row/new>
2947 or L<DBIx::Class::Row/insert> depending on how early in the
2948 L</create> process you need to intervene. See also warning pertaining to
2949 L</new>.
2950
2951 =back
2952
2953 =cut
2954
2955 sub create :DBIC_method_is_indirect_sugar {
2956   #my ($self, $col_data) = @_;
2957   DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call;
2958   return shift->new_result(shift)->insert;
2959 }
2960
2961 =head2 find_or_create
2962
2963 =over 4
2964
2965 =item Arguments: \%col_data, { key => $unique_constraint, L<%attrs|/ATTRIBUTES> }?
2966
2967 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
2968
2969 =back
2970
2971   $cd->cd_to_producer->find_or_create({ producer => $producer },
2972                                       { key => 'primary' });
2973
2974 Tries to find a record based on its primary key or unique constraints; if none
2975 is found, creates one and returns that instead.
2976
2977   my $cd = $schema->resultset('CD')->find_or_create({
2978     cdid   => 5,
2979     artist => 'Massive Attack',
2980     title  => 'Mezzanine',
2981     year   => 2005,
2982   });
2983
2984 Also takes an optional C<key> attribute, to search by a specific key or unique
2985 constraint. For example:
2986
2987   my $cd = $schema->resultset('CD')->find_or_create(
2988     {
2989       artist => 'Massive Attack',
2990       title  => 'Mezzanine',
2991     },
2992     { key => 'cd_artist_title' }
2993   );
2994
2995 B<Note>: Make sure to read the documentation of L</find> and understand the
2996 significance of the C<key> attribute, as its lack may skew your search, and
2997 subsequently result in spurious row creation.
2998
2999 B<Note>: Because find_or_create() reads from the database and then
3000 possibly inserts based on the result, this method is subject to a race
3001 condition. Another process could create a record in the table after
3002 the find has completed and before the create has started. To avoid
3003 this problem, use find_or_create() inside a transaction.
3004
3005 B<Note>: Take care when using C<find_or_create> with a table having
3006 columns with default values that you intend to be automatically
3007 supplied by the database (e.g. an auto_increment primary key column).
3008 In normal usage, the value of such columns should NOT be included at
3009 all in the call to C<find_or_create>, even when set to C<undef>.
3010
3011 See also L</find> and L</update_or_create>. For information on how to declare
3012 unique constraints, see L<DBIx::Class::ResultSource/add_unique_constraint>.
3013
3014 If you need to know if an existing row was found or a new one created use
3015 L</find_or_new> and L<DBIx::Class::Row/in_storage> instead. Don't forget
3016 to call L<DBIx::Class::Row/insert> to save the newly created row to the
3017 database!
3018
3019   my $cd = $schema->resultset('CD')->find_or_new({
3020     cdid   => 5,
3021     artist => 'Massive Attack',
3022     title  => 'Mezzanine',
3023     year   => 2005,
3024   });
3025
3026   if( !$cd->in_storage ) {
3027       # do some stuff
3028       $cd->insert;
3029   }
3030
3031 =cut
3032
3033 sub find_or_create {
3034   my $self     = shift;
3035   my $attrs    = (@_ > 1 && ref $_[-1] eq 'HASH' ? pop(@_) : {});
3036   my $hash     = ref $_[0] eq 'HASH' ? shift : {@_};
3037   if (keys %$hash and my $row = $self->find($hash, $attrs) ) {
3038     return $row;
3039   }
3040   return $self->new_result($hash)->insert;
3041 }
3042
3043 =head2 update_or_create
3044
3045 =over 4
3046
3047 =item Arguments: \%col_data, { key => $unique_constraint, L<%attrs|/ATTRIBUTES> }?
3048
3049 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
3050
3051 =back
3052
3053   $resultset->update_or_create({ col => $val, ... });
3054
3055 Like L</find_or_create>, but if a row is found it is immediately updated via
3056 C<< $found_row->update (\%col_data) >>.
3057
3058
3059 Takes an optional C<key> attribute to search on a specific unique constraint.
3060 For example:
3061
3062   # In your application
3063   my $cd = $schema->resultset('CD')->update_or_create(
3064     {
3065       artist => 'Massive Attack',
3066       title  => 'Mezzanine',
3067       year   => 1998,
3068     },
3069     { key => 'cd_artist_title' }
3070   );
3071
3072   $cd->cd_to_producer->update_or_create({
3073     producer => $producer,
3074     name => 'harry',
3075   }, {
3076     key => 'primary',
3077   });
3078
3079 B<Note>: Make sure to read the documentation of L</find> and understand the
3080 significance of the C<key> attribute, as its lack may skew your search, and
3081 subsequently result in spurious row creation.
3082
3083 B<Note>: Take care when using C<update_or_create> with a table having
3084 columns with default values that you intend to be automatically
3085 supplied by the database (e.g. an auto_increment primary key column).
3086 In normal usage, the value of such columns should NOT be included at
3087 all in the call to C<update_or_create>, even when set to C<undef>.
3088
3089 See also L</find> and L</find_or_create>. For information on how to declare
3090 unique constraints, see L<DBIx::Class::ResultSource/add_unique_constraint>.
3091
3092 If you need to know if an existing row was updated or a new one created use
3093 L</update_or_new> and L<DBIx::Class::Row/in_storage> instead. Don't forget
3094 to call L<DBIx::Class::Row/insert> to save the newly created row to the
3095 database!
3096
3097 =cut
3098
3099 sub update_or_create {
3100   my $self = shift;
3101   my $attrs = (@_ > 1 && ref $_[-1] eq 'HASH' ? pop(@_) : {});
3102   my $cond = ref $_[0] eq 'HASH' ? shift : {@_};
3103
3104   my $row = $self->find($cond, $attrs);
3105   if (defined $row) {
3106     $row->update($cond);
3107     return $row;
3108   }
3109
3110   return $self->new_result($cond)->insert;
3111 }
3112
3113 =head2 update_or_new
3114
3115 =over 4
3116
3117 =item Arguments: \%col_data, { key => $unique_constraint, L<%attrs|/ATTRIBUTES> }?
3118
3119 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
3120
3121 =back
3122
3123   $resultset->update_or_new({ col => $val, ... });
3124
3125 Like L</find_or_new> but if a row is found it is immediately updated via
3126 C<< $found_row->update (\%col_data) >>.
3127
3128 For example:
3129
3130   # In your application
3131   my $cd = $schema->resultset('CD')->update_or_new(
3132     {
3133       artist => 'Massive Attack',
3134       title  => 'Mezzanine',
3135       year   => 1998,
3136     },
3137     { key => 'cd_artist_title' }
3138   );
3139
3140   if ($cd->in_storage) {
3141       # the cd was updated
3142   }
3143   else {
3144       # the cd is not yet in the database, let's insert it
3145       $cd->insert;
3146   }
3147
3148 B<Note>: Make sure to read the documentation of L</find> and understand the
3149 significance of the C<key> attribute, as its lack may skew your search, and
3150 subsequently result in spurious new objects.
3151
3152 B<Note>: Take care when using C<update_or_new> with a table having
3153 columns with default values that you intend to be automatically
3154 supplied by the database (e.g. an auto_increment primary key column).
3155 In normal usage, the value of such columns should NOT be included at
3156 all in the call to C<update_or_new>, even when set to C<undef>.
3157
3158 See also L</find>, L</find_or_create> and L</find_or_new>.
3159
3160 =cut
3161
3162 sub update_or_new {
3163     my $self  = shift;
3164     my $attrs = ( @_ > 1 && ref $_[-1] eq 'HASH' ? pop(@_) : {} );
3165     my $cond  = ref $_[0] eq 'HASH' ? shift : {@_};
3166
3167     my $row = $self->find( $cond, $attrs );
3168     if ( defined $row ) {
3169         $row->update($cond);
3170         return $row;
3171     }
3172
3173     return $self->new_result($cond);
3174 }
3175
3176 =head2 get_cache
3177
3178 =over 4
3179
3180 =item Arguments: none
3181
3182 =item Return Value: L<\@result_objs|DBIx::Class::Manual::ResultClass> | undef
3183
3184 =back
3185
3186 Gets the contents of the cache for the resultset, if the cache is set.
3187
3188 The cache is populated either by using the L</prefetch> attribute to
3189 L</search> or by calling L</set_cache>.
3190
3191 =cut
3192
3193 sub get_cache {
3194   shift->{all_cache};
3195 }
3196
3197 =head2 set_cache
3198
3199 =over 4
3200
3201 =item Arguments: L<\@result_objs|DBIx::Class::Manual::ResultClass>
3202
3203 =item Return Value: L<\@result_objs|DBIx::Class::Manual::ResultClass>
3204
3205 =back
3206
3207 Sets the contents of the cache for the resultset. Expects an arrayref
3208 of objects of the same class as those produced by the resultset. Note that
3209 if the cache is set, the resultset will return the cached objects rather
3210 than re-querying the database even if the cache attr is not set.
3211
3212 The contents of the cache can also be populated by using the
3213 L</prefetch> attribute to L</search>.
3214
3215 =cut
3216
3217 sub set_cache {
3218   my ( $self, $data ) = @_;
3219   $self->throw_exception("set_cache requires an arrayref")
3220       if defined($data) && (ref $data ne 'ARRAY');
3221   $self->{all_cache} = $data;
3222 }
3223
3224 =head2 clear_cache
3225
3226 =over 4
3227
3228 =item Arguments: none
3229
3230 =item Return Value: undef
3231
3232 =back
3233
3234 Clears the cache for the resultset.
3235
3236 =cut
3237
3238 sub clear_cache {
3239   shift->set_cache(undef);
3240 }
3241
3242 =head2 is_paged
3243
3244 =over 4
3245
3246 =item Arguments: none
3247
3248 =item Return Value: true, if the resultset has been paginated
3249
3250 =back
3251
3252 =cut
3253
3254 sub is_paged {
3255   my ($self) = @_;
3256   return !!$self->{attrs}{page};
3257 }
3258
3259 =head2 is_ordered
3260
3261 =over 4
3262
3263 =item Arguments: none
3264
3265 =item Return Value: true, if the resultset has been ordered with C<order_by>.
3266
3267 =back
3268
3269 =cut
3270
3271 sub is_ordered {
3272   my ($self) = @_;
3273   return scalar $self->result_source->schema->storage->_extract_order_criteria($self->{attrs}{order_by});
3274 }
3275
3276 =head2 related_resultset
3277
3278 =over 4
3279
3280 =item Arguments: $rel_name
3281
3282 =item Return Value: L<$resultset|/search>
3283
3284 =back
3285
3286 Returns a related resultset for the supplied relationship name.
3287
3288   $artist_rs = $schema->resultset('CD')->related_resultset('Artist');
3289
3290 =cut
3291
3292 sub related_resultset {
3293   $_[0]->throw_exception(
3294     'Extra arguments to $rs->related_resultset() were always quietly '
3295   . 'discarded without consideration, you need to switch to '
3296   . '...->related_resultset( $relname )->search_rs( $search, $args ) instead.'
3297   ) if @_ > 2;
3298
3299   return $_[0]->{related_resultsets}{$_[1]}
3300     if defined $_[0]->{related_resultsets}{$_[1]};
3301
3302   my ($self, $rel) = @_;
3303
3304   return $self->{related_resultsets}{$rel} = do {
3305     my $rsrc = $self->result_source;
3306     my $rel_info = $rsrc->relationship_info($rel);
3307
3308     $self->throw_exception(
3309       "search_related: result source '" . $rsrc->source_name .
3310         "' has no such relationship $rel")
3311       unless $rel_info;
3312
3313     my $attrs = $self->_chain_relationship($rel);
3314
3315     # Previously this atribute was deleted (instead of being set as it is now)
3316     # Doing so seems to be harmless in all available test permutations
3317     # See also 01d59a6a6 and mst's comment below
3318     #
3319     $attrs->{alias} = $rsrc->schema->storage->relname_to_table_alias(
3320       $rel,
3321       $attrs->{seen_join}{$rel}
3322     );
3323
3324     # since this is search_related, and we already slid the select window inwards
3325     # (the select/as attrs were deleted in the beginning), we need to flip all
3326     # left joins to inner, so we get the expected results
3327     #
3328     # The DBIC relationship chaining implementation is pretty simple - every
3329     # new related_relationship is pushed onto the {from} stack, and the {select}
3330     # window simply slides further in. This means that when we count somewhere
3331     # in the middle, we got to make sure that everything in the join chain is an
3332     # actual inner join, otherwise the count will come back with unpredictable
3333     # results (a resultset may be generated with _some_ rows regardless of if
3334     # the relation which the $rs currently selects has rows or not). E.g.
3335     # $artist_rs->cds->count - normally generates:
3336     # SELECT COUNT( * ) FROM artist me LEFT JOIN cd cds ON cds.artist = me.artistid
3337     # which actually returns the number of artists * (number of cds || 1)
3338     #
3339     # So what we do here is crawl {from}, determine if the current alias is at
3340     # the top of the stack, and if not - make sure the chain is inner-joined down
3341     # to the root.
3342     #
3343     my $switch_branch = find_join_path_to_alias(
3344       $attrs->{from},
3345       $attrs->{alias},
3346     );
3347
3348     if ( @{ $switch_branch || [] } ) {
3349
3350       # So it looks like we will have to switch some stuff around.
3351       # local() is useless here as we will be leaving the scope
3352       # anyway, and deep cloning is just too fucking expensive
3353       # So replace the first hashref in the node arrayref manually
3354       my @new_from = $attrs->{from}[0];
3355       my $sw_idx = { map { (values %$_), 1 } @$switch_branch }; #there's one k/v per join-path
3356
3357       for my $j ( @{$attrs->{from}}[ 1 .. $#{$attrs->{from}} ] ) {
3358         my $jalias = $j->[0]{-alias};
3359
3360         if ($sw_idx->{$jalias}) {
3361           my %attrs = %{$j->[0]};
3362           delete $attrs{-join_type};
3363           push @new_from, [
3364             \%attrs,
3365             @{$j}[ 1 .. $#$j ],
3366           ];
3367         }
3368         else {
3369           push @new_from, $j;
3370         }
3371       }
3372
3373       $attrs->{from} = \@new_from;
3374     }
3375
3376
3377     #XXX - temp fix for result_class bug. There likely is a more elegant fix -groditi
3378     delete $attrs->{result_class};
3379
3380     my $new = do {
3381
3382       # The reason we do this now instead of passing the alias to the
3383       # search_rs below is that if you wrap/overload resultset on the
3384       # source you need to know what alias it's -going- to have for things
3385       # to work sanely (e.g. RestrictWithObject wants to be able to add
3386       # extra query restrictions, and these may need to be $alias.)
3387       #                                       -- mst ~ 2007 (01d59a6a6)
3388       #
3389       # FIXME - this seems to be no longer neccessary (perhaps due to the
3390       # advances in relcond resolution. Testing DBIC::S::RWO and its only
3391       # dependent (as of Jun 2015 ) does not yield any difference with or
3392       # without this line. Nevertheless keep it as is for now, to minimize
3393       # churn, there is enough potential for breakage in 0.0829xx as it is
3394       #                                       -- ribasushi Jun 2015
3395       #
3396       my $rel_source = $rsrc->related_source($rel);
3397       local $rel_source->resultset_attributes->{alias} = $attrs->{alias};
3398
3399       $rel_source->resultset->search_rs( undef, $attrs );
3400     };
3401
3402     if (my $cache = $self->get_cache) {
3403       my @related_cache = map
3404         { $_->related_resultset($rel)->get_cache || () }
3405         @$cache
3406       ;
3407
3408       $new->set_cache([ map @$_, @related_cache ]) if @related_cache == @$cache;
3409     }
3410
3411     $new;
3412   };
3413 }
3414
3415 =head2 current_source_alias
3416
3417 =over 4
3418
3419 =item Arguments: none
3420
3421 =item Return Value: $source_alias
3422
3423 =back
3424
3425 Returns the current table alias for the result source this resultset is built
3426 on, that will be used in the SQL query. Usually it is C<me>.
3427
3428 Currently the source alias that refers to the result set returned by a
3429 L</search>/L</find> family method depends on how you got to the resultset: it's
3430 C<me> by default, but eg. L</search_related> aliases it to the related result
3431 source name (and keeps C<me> referring to the original result set). The long
3432 term goal is to make L<DBIx::Class> always alias the current resultset as C<me>
3433 (and make this method unnecessary).
3434
3435 Thus it's currently necessary to use this method in predefined queries (see
3436 L<DBIx::Class::Manual::Cookbook/Predefined searches>) when referring to the
3437 source alias of the current result set:
3438
3439   # in a result set class
3440   sub modified_by {
3441     my ($self, $user) = @_;
3442
3443     my $me = $self->current_source_alias;
3444
3445     return $self->search({
3446       "$me.modified" => $user->id,
3447     });
3448   }
3449
3450 The alias of L<newly created resultsets|/search> can be altered by the
3451 L<alias attribute|/alias>.
3452
3453 =cut
3454
3455 sub current_source_alias {
3456   return (shift->{attrs} || {})->{alias} || 'me';
3457 }
3458
3459 =head2 as_subselect_rs
3460
3461 =over 4
3462
3463 =item Arguments: none
3464
3465 =item Return Value: L<$resultset|/search>
3466
3467 =back
3468
3469 Act as a barrier to SQL symbols.  The resultset provided will be made into a
3470 "virtual view" by including it as a subquery within the from clause.  From this
3471 point on, any joined tables are inaccessible to ->search on the resultset (as if
3472 it were simply where-filtered without joins).  For example:
3473
3474  my $rs = $schema->resultset('Bar')->search({'x.name' => 'abc'},{ join => 'x' });
3475
3476  # 'x' now pollutes the query namespace
3477
3478  # So the following works as expected
3479  my $ok_rs = $rs->search({'x.other' => 1});
3480
3481  # But this doesn't: instead of finding a 'Bar' related to two x rows (abc and
3482  # def) we look for one row with contradictory terms and join in another table
3483  # (aliased 'x_2') which we never use
3484  my $broken_rs = $rs->search({'x.name' => 'def'});
3485
3486  my $rs2 = $rs->as_subselect_rs;
3487
3488  # doesn't work - 'x' is no longer accessible in $rs2, having been sealed away
3489  my $not_joined_rs = $rs2->search({'x.other' => 1});
3490
3491  # works as expected: finds a 'table' row related to two x rows (abc and def)
3492  my $correctly_joined_rs = $rs2->search({'x.name' => 'def'});
3493
3494 Another example of when one might use this would be to select a subset of
3495 columns in a group by clause:
3496
3497  my $rs = $schema->resultset('Bar')->search(undef, {
3498    group_by => [qw{ id foo_id baz_id }],
3499  })->as_subselect_rs->search(undef, {
3500    columns => [qw{ id foo_id }]
3501  });
3502
3503 In the above example normally columns would have to be equal to the group by,
3504 but because we isolated the group by into a subselect the above works.
3505
3506 =cut
3507
3508 sub as_subselect_rs {
3509
3510   # FIXME - remove at some point in the future (2018-ish)
3511   wantarray
3512     and
3513   carp_unique(
3514     'Starting with DBIC@0.082900 as_subselect_rs() always returns a ResultSet '
3515   . 'instance regardless of calling context. Please force scalar() context to '
3516   . 'silence this warning'
3517   );
3518
3519   my $self = shift;
3520
3521   my $alias = $self->current_source_alias;
3522
3523   my $fresh_rs = (ref $self)->new (
3524     $self->result_source
3525   );
3526
3527   # these pieces will be locked in the subquery
3528   delete $fresh_rs->{cond};
3529   delete @{$fresh_rs->{attrs}}{qw/where bind/};
3530
3531   $fresh_rs->search_rs( {}, {
3532     from => [{
3533       $alias => $self->as_query,
3534       -alias  => $alias,
3535       -rsrc   => $self->result_source,
3536     }],
3537     alias => $alias,
3538   });
3539 }
3540
3541 # This code is called by search_related, and makes sure there
3542 # is clear separation between the joins before, during, and
3543 # after the relationship. This information is needed later
3544 # in order to properly resolve prefetch aliases (any alias
3545 # with a relation_chain_depth less than the depth of the
3546 # current prefetch is not considered)
3547 #
3548 # The increments happen twice per join. An even number means a
3549 # relationship specified via a search_related, whereas an odd
3550 # number indicates a join/prefetch added via attributes
3551 #
3552 # Also this code will wrap the current resultset (the one we
3553 # chain to) in a subselect IFF it contains limiting attributes
3554 sub _chain_relationship {
3555   my ($self, $rel) = @_;
3556   my $source = $self->result_source;
3557   my $attrs = { %{$self->{attrs}||{}} };
3558
3559   # we need to take the prefetch the attrs into account before we
3560   # ->_resolve_join as otherwise they get lost - captainL
3561   my $join = $self->_merge_joinpref_attr( $attrs->{join}, $attrs->{prefetch} );
3562
3563   delete @{$attrs}{qw/join prefetch collapse group_by distinct _grouped_by_distinct select as columns +select +as +columns/};
3564
3565   my $seen = { %{ (delete $attrs->{seen_join}) || {} } };
3566
3567   my $from;
3568   my @force_subq_attrs = qw/offset rows group_by having/;
3569
3570   if (
3571     ($attrs->{from} && ref $attrs->{from} ne 'ARRAY')
3572       ||
3573     $self->_has_resolved_attr (@force_subq_attrs)
3574   ) {
3575     # Nuke the prefetch (if any) before the new $rs attrs
3576     # are resolved (prefetch is useless - we are wrapping
3577     # a subquery anyway).
3578     my $rs_copy = $self->search;
3579     $rs_copy->{attrs}{join} = $self->_merge_joinpref_attr (
3580       $rs_copy->{attrs}{join},
3581       delete $rs_copy->{attrs}{prefetch},
3582     );
3583
3584     $from = [{
3585       -rsrc   => $source,
3586       -alias  => $attrs->{alias},
3587       $attrs->{alias} => $rs_copy->as_query,
3588     }];
3589     delete @{$attrs}{@force_subq_attrs, qw/where bind/};
3590     $seen->{-relation_chain_depth} = 0;
3591   }
3592   elsif ($attrs->{from}) {  #shallow copy suffices
3593     $from = [ @{$attrs->{from}} ];
3594   }
3595   else {
3596     $from = [{
3597       -rsrc  => $source,
3598       -alias => $attrs->{alias},
3599       $attrs->{alias} => $source->from,
3600     }];
3601   }
3602
3603   my $jpath = ($seen->{-relation_chain_depth})
3604     ? $from->[-1][0]{-join_path}
3605     : [];
3606
3607   my @requested_joins = $source->_resolve_join(
3608     $join,
3609     $attrs->{alias},
3610     $seen,
3611     $jpath,
3612   );
3613
3614   push @$from, @requested_joins;
3615
3616   $seen->{-relation_chain_depth}++;
3617
3618   # if $self already had a join/prefetch specified on it, the requested
3619   # $rel might very well be already included. What we do in this case
3620   # is effectively a no-op (except that we bump up the chain_depth on
3621   # the join in question so we could tell it *is* the search_related)
3622   my $already_joined;
3623
3624   # we consider the last one thus reverse
3625   for my $j (reverse @requested_joins) {
3626     my ($last_j) = keys %{$j->[0]{-join_path}[-1]};
3627     if ($rel eq $last_j) {
3628       $j->[0]{-relation_chain_depth}++;
3629       $already_joined++;
3630       last;
3631     }
3632   }
3633
3634   unless ($already_joined) {
3635     push @$from, $source->_resolve_join(
3636       $rel,
3637       $attrs->{alias},
3638       $seen,
3639       $jpath,
3640     );
3641   }
3642
3643   $seen->{-relation_chain_depth}++;
3644
3645   return {%$attrs, from => $from, seen_join => $seen};
3646 }
3647
3648 sub _resolved_attrs {
3649   my $self = shift;
3650   return $self->{_attrs} if $self->{_attrs};
3651
3652   my $attrs  = { %{ $self->{attrs} || {} } };
3653   my $source = $attrs->{result_source} = $self->result_source;
3654   my $alias  = $attrs->{alias};
3655
3656   $self->throw_exception("Specifying distinct => 1 in conjunction with collapse => 1 is unsupported")
3657     if $attrs->{collapse} and $attrs->{distinct};
3658
3659
3660   # Sanity check the paging attributes
3661   # SQLMaker does it too, but in case of a software_limit we'll never get there
3662   if (defined $attrs->{offset}) {
3663     $self->throw_exception('A supplied offset attribute must be a non-negative integer')
3664       if ( $attrs->{offset} =~ /[^0-9]/ or $attrs->{offset} < 0 );
3665   }
3666   if (defined $attrs->{rows}) {
3667     $self->throw_exception("The rows attribute must be a positive integer if present")
3668       if ( $attrs->{rows} =~ /[^0-9]/ or $attrs->{rows} <= 0 );
3669   }
3670
3671   # normalize where condition
3672   $attrs->{where} = normalize_sqla_condition( $attrs->{where} )
3673     if $attrs->{where};
3674
3675   # default selection list
3676   $attrs->{columns} = [ $source->columns ]
3677     unless grep { exists $attrs->{$_} } qw/columns cols select as/;
3678
3679   # merge selectors together
3680   for (qw/columns select as/) {
3681     $attrs->{$_} = $self->_merge_attr($attrs->{$_}, delete $attrs->{"+$_"})
3682       if $attrs->{$_} or $attrs->{"+$_"};
3683   }
3684
3685   # disassemble columns
3686   my (@sel, @as);
3687   if (my $cols = delete $attrs->{columns}) {
3688     for my $c (ref $cols eq 'ARRAY' ? @$cols : $cols) {
3689       if (ref $c eq 'HASH') {
3690         for my $as (sort keys %$c) {
3691           push @sel, $c->{$as};
3692           push @as, $as;
3693         }
3694       }
3695       else {
3696         push @sel, $c;
3697         push @as, $c;
3698       }
3699     }
3700   }
3701
3702   # when trying to weed off duplicates later do not go past this point -
3703   # everything added from here on is unbalanced "anyone's guess" stuff
3704   my $dedup_stop_idx = $#as;
3705
3706   push @as, @{ ref $attrs->{as} eq 'ARRAY' ? $attrs->{as} : [ $attrs->{as} ] }
3707     if $attrs->{as};
3708   push @sel, @{ ref $attrs->{select} eq 'ARRAY' ? $attrs->{select} : [ $attrs->{select} ] }
3709     if $attrs->{select};
3710
3711   # assume all unqualified selectors to apply to the current alias (legacy stuff)
3712   $_ = (ref $_ or $_ =~ /\./) ? $_ : "$alias.$_" for @sel;
3713
3714   # disqualify all $alias.col as-bits (inflate-map mandated)
3715   $_ = ($_ =~ /^\Q$alias.\E(.+)$/) ? $1 : $_ for @as;
3716
3717   # de-duplicate the result (remove *identical* select/as pairs)
3718   # and also die on duplicate {as} pointing to different {select}s
3719   # not using a c-style for as the condition is prone to shrinkage
3720   my $seen;
3721   my $i = 0;
3722   while ($i <= $dedup_stop_idx) {
3723     if ($seen->{"$sel[$i] \x00\x00 $as[$i]"}++) {
3724       splice @sel, $i, 1;
3725       splice @as, $i, 1;
3726       $dedup_stop_idx--;
3727     }
3728     elsif ($seen->{$as[$i]}++) {
3729       $self->throw_exception(
3730         "inflate_result() alias '$as[$i]' specified twice with different SQL-side {select}-ors"
3731       );
3732     }
3733     else {
3734       $i++;
3735     }
3736   }
3737
3738   $attrs->{select} = \@sel;
3739   $attrs->{as} = \@as;
3740
3741   $attrs->{from} ||= [{
3742     -rsrc   => $source,
3743     -alias  => $self->{attrs}{alias},
3744     $self->{attrs}{alias} => $source->from,
3745   }];
3746
3747   if ( $attrs->{join} || $attrs->{prefetch} ) {
3748
3749     $self->throw_exception ('join/prefetch can not be used with a custom {from}')
3750       if ref $attrs->{from} ne 'ARRAY';
3751
3752     my $join = (delete $attrs->{join}) || {};
3753
3754     if ( defined $attrs->{prefetch} ) {
3755       $join = $self->_merge_joinpref_attr( $join, $attrs->{prefetch} );
3756     }
3757
3758     $attrs->{from} =    # have to copy here to avoid corrupting the original
3759       [
3760         @{ $attrs->{from} },
3761         $source->_resolve_join(
3762           $join,
3763           $alias,
3764           { %{ $attrs->{seen_join} || {} } },
3765           ( $attrs->{seen_join} && keys %{$attrs->{seen_join}})
3766             ? $attrs->{from}[-1][0]{-join_path}
3767             : []
3768           ,
3769         )
3770       ];
3771   }
3772
3773
3774   for my $attr (qw(order_by group_by)) {
3775
3776     if ( defined $attrs->{$attr} ) {
3777       $attrs->{$attr} = (
3778         ref( $attrs->{$attr} ) eq 'ARRAY'
3779         ? [ @{ $attrs->{$attr} } ]
3780         : [ $attrs->{$attr} || () ]
3781       );
3782
3783       delete $attrs->{$attr} unless @{$attrs->{$attr}};
3784     }
3785   }
3786
3787
3788   # set collapse default based on presence of prefetch
3789   my $prefetch;
3790   if (
3791     defined $attrs->{prefetch}
3792       and
3793     $prefetch = $self->_merge_joinpref_attr( {}, delete $attrs->{prefetch} )
3794   ) {
3795     $self->throw_exception("Specifying prefetch in conjunction with an explicit collapse => 0 is unsupported")
3796       if defined $attrs->{collapse} and ! $attrs->{collapse};
3797
3798     $attrs->{collapse} = 1;
3799   }
3800
3801
3802   # run through the resulting joinstructure (starting from our current slot)
3803   # and unset collapse if proven unnecessary
3804   #
3805   # also while we are at it find out if the current root source has
3806   # been premultiplied by previous related_source chaining
3807   #
3808   # this allows to predict whether a root object with all other relation
3809   # data set to NULL is in fact unique
3810   if ($attrs->{collapse}) {
3811
3812     if (ref $attrs->{from} eq 'ARRAY') {
3813
3814       if (@{$attrs->{from}} == 1) {
3815         # no joins - no collapse
3816         $attrs->{collapse} = 0;
3817       }
3818       else {
3819         # find where our table-spec starts
3820         my @fromlist = @{$attrs->{from}};
3821         while (@fromlist) {
3822           my $t = shift @fromlist;
3823
3824           my $is_multi;
3825           # me vs join from-spec distinction - a ref means non-root
3826           if (ref $t eq 'ARRAY') {
3827             $t = $t->[0];
3828             $is_multi ||= ! $t->{-is_single};
3829           }
3830           last if ($t->{-alias} && $t->{-alias} eq $alias);
3831           $attrs->{_main_source_premultiplied} ||= $is_multi;
3832         }
3833
3834         # no non-singles remaining, nor any premultiplication - nothing to collapse
3835         if (
3836           ! $attrs->{_main_source_premultiplied}
3837             and
3838           ! grep { ! $_->[0]{-is_single} } @fromlist
3839         ) {
3840           $attrs->{collapse} = 0;
3841         }
3842       }
3843     }
3844
3845     else {
3846       # if we can not analyze the from - err on the side of safety
3847       $attrs->{_main_source_premultiplied} = 1;
3848     }
3849   }
3850
3851
3852   # generate the distinct induced group_by before injecting the prefetched select/as parts
3853   if (delete $attrs->{distinct}) {
3854     if ($attrs->{group_by}) {
3855       carp_unique ("Useless use of distinct on a grouped resultset ('distinct' is ignored when a 'group_by' is present)");
3856     }
3857     else {
3858       $attrs->{_grouped_by_distinct} = 1;
3859       # distinct affects only the main selection part, not what prefetch may add below
3860       ($attrs->{group_by}, my $new_order) = $source->schema->storage->_group_over_selection($attrs);
3861
3862       # FIXME possibly ignore a rewritten order_by (may turn out to be an issue)
3863       # The thinking is: if we are collapsing the subquerying prefetch engine will
3864       # rip stuff apart for us anyway, and we do not want to have a potentially
3865       # function-converted external order_by
3866       # ( there is an explicit if ( collapse && _grouped_by_distinct ) check in DBIHacks )
3867       $attrs->{order_by} = $new_order unless $attrs->{collapse};
3868     }
3869   }
3870
3871
3872   # generate selections based on the prefetch helper
3873   if ($prefetch) {
3874
3875     $self->throw_exception("Unable to prefetch, resultset contains an unnamed selector $attrs->{_dark_selector}{string}")
3876       if $attrs->{_dark_selector};
3877
3878     # this is a separate structure (we don't look in {from} directly)
3879     # as the resolver needs to shift things off the lists to work
3880     # properly (identical-prefetches on different branches)
3881     my $joined_node_aliases_map = {};
3882     if (ref $attrs->{from} eq 'ARRAY') {
3883
3884       my $start_depth = $attrs->{seen_join}{-relation_chain_depth} || 0;
3885
3886       for my $j ( @{$attrs->{from}}[1 .. $#{$attrs->{from}} ] ) {
3887         next unless $j->[0]{-alias};
3888         next unless $j->[0]{-join_path};
3889         next if ($j->[0]{-relation_chain_depth} || 0) < $start_depth;
3890
3891         my @jpath = map { keys %$_ } @{$j->[0]{-join_path}};
3892
3893         my $p = $joined_node_aliases_map;
3894         $p = $p->{$_} ||= {} for @jpath[ ($start_depth/2) .. $#jpath]; #only even depths are actual jpath boundaries
3895         push @{$p->{-join_aliases} }, $j->[0]{-alias};
3896       }
3897     }
3898
3899     ( push @{$attrs->{select}}, $_->[0] ) and ( push @{$attrs->{as}}, $_->[1] )
3900       for $source->_resolve_selection_from_prefetch( $prefetch, $joined_node_aliases_map );
3901   }
3902
3903
3904   $attrs->{_simple_passthrough_construction} = !(
3905     $attrs->{collapse}
3906       or
3907     grep { $_ =~ /\./ } @{$attrs->{as}}
3908   );
3909
3910
3911   # if both page and offset are specified, produce a combined offset
3912   # even though it doesn't make much sense, this is what pre 081xx has
3913   # been doing
3914   if (my $page = delete $attrs->{page}) {
3915     $attrs->{offset} =
3916       ($attrs->{rows} * ($page - 1))
3917             +
3918       ($attrs->{offset} || 0)
3919     ;
3920   }
3921
3922   return $self->{_attrs} = $attrs;
3923 }
3924
3925 sub _rollout_attr {
3926   my ($self, $attr) = @_;
3927
3928   if (ref $attr eq 'HASH') {
3929     return $self->_rollout_hash($attr);
3930   } elsif (ref $attr eq 'ARRAY') {
3931     return $self->_rollout_array($attr);
3932   } else {
3933     return [$attr];
3934   }
3935 }
3936
3937 sub _rollout_array {
3938   my ($self, $attr) = @_;
3939
3940   my @rolled_array;
3941   foreach my $element (@{$attr}) {
3942     if (ref $element eq 'HASH') {
3943       push( @rolled_array, @{ $self->_rollout_hash( $element ) } );
3944     } elsif (ref $element eq 'ARRAY') {
3945       #  XXX - should probably recurse here
3946       push( @rolled_array, @{$self->_rollout_array($element)} );
3947     } else {
3948       push( @rolled_array, $element );
3949     }
3950   }
3951   return \@rolled_array;
3952 }
3953
3954 sub _rollout_hash {
3955   my ($self, $attr) = @_;
3956
3957   my @rolled_array;
3958   foreach my $key (keys %{$attr}) {
3959     push( @rolled_array, { $key => $attr->{$key} } );
3960   }
3961   return \@rolled_array;
3962 }
3963
3964 sub _calculate_score {
3965   my ($self, $a, $b) = @_;
3966
3967   if (defined $a xor defined $b) {
3968     return 0;
3969   }
3970   elsif (not defined $a) {
3971     return 1;
3972   }
3973
3974   if (ref $b eq 'HASH') {
3975     my ($b_key) = keys %{$b};
3976     $b_key = '' if ! defined $b_key;
3977     if (ref $a eq 'HASH') {
3978       my ($a_key) = keys %{$a};
3979       $a_key = '' if ! defined $a_key;
3980       if ($a_key eq $b_key) {
3981         return (1 + $self->_calculate_score( $a->{$a_key}, $b->{$b_key} ));
3982       } else {
3983         return 0;
3984       }
3985     } else {
3986       return ($a eq $b_key) ? 1 : 0;
3987     }
3988   } else {
3989     if (ref $a eq 'HASH') {
3990       my ($a_key) = keys %{$a};
3991       return ($b eq $a_key) ? 1 : 0;
3992     } else {
3993       return ($b eq $a) ? 1 : 0;
3994     }
3995   }
3996 }
3997
3998 sub _merge_joinpref_attr {
3999   my ($self, $orig, $import) = @_;
4000
4001   return $import unless defined($orig);
4002   return $orig unless defined($import);
4003
4004   $orig = $self->_rollout_attr($orig);
4005   $import = $self->_rollout_attr($import);
4006
4007   my $seen_keys;
4008   foreach my $import_element ( @{$import} ) {
4009     # find best candidate from $orig to merge $b_element into
4010     my $best_candidate = { position => undef, score => 0 }; my $position = 0;
4011     foreach my $orig_element ( @{$orig} ) {
4012       my $score = $self->_calculate_score( $orig_element, $import_element );
4013       if ($score > $best_candidate->{score}) {
4014         $best_candidate->{position} = $position;
4015         $best_candidate->{score} = $score;
4016       }
4017       $position++;
4018     }
4019     my ($import_key) = ( ref $import_element eq 'HASH' ) ? keys %{$import_element} : ($import_element);
4020     $import_key = '' if not defined $import_key;
4021
4022     if ($best_candidate->{score} == 0 || exists $seen_keys->{$import_key}) {
4023       push( @{$orig}, $import_element );
4024     } else {
4025       my $orig_best = $orig->[$best_candidate->{position}];
4026       # merge orig_best and b_element together and replace original with merged
4027       if (ref $orig_best ne 'HASH') {
4028         $orig->[$best_candidate->{position}] = $import_element;
4029       } elsif (ref $import_element eq 'HASH') {
4030         my ($key) = keys %{$orig_best};
4031         $orig->[$best_candidate->{position}] = { $key => $self->_merge_joinpref_attr($orig_best->{$key}, $import_element->{$key}) };
4032       }
4033     }
4034     $seen_keys->{$import_key} = 1; # don't merge the same key twice
4035   }
4036
4037   return @$orig ? $orig : ();
4038 }
4039
4040 {
4041   my $hm;
4042
4043   sub _merge_attr {
4044     $hm ||= do {
4045       require Hash::Merge;
4046       my $hm = Hash::Merge->new;
4047
4048       $hm->specify_behavior({
4049         SCALAR => {
4050           SCALAR => sub {
4051             my ($defl, $defr) = map { defined $_ } (@_[0,1]);
4052
4053             if ($defl xor $defr) {
4054               return [ $defl ? $_[0] : $_[1] ];
4055             }
4056             elsif (! $defl) {
4057               return [];
4058             }
4059             elsif (__HM_DEDUP and $_[0] eq $_[1]) {
4060               return [ $_[0] ];
4061             }
4062             else {
4063               return [$_[0], $_[1]];
4064             }
4065           },
4066           ARRAY => sub {
4067             return $_[1] if !defined $_[0];
4068             return $_[1] if __HM_DEDUP and grep { $_ eq $_[0] } @{$_[1]};
4069             return [$_[0], @{$_[1]}]
4070           },
4071           HASH  => sub {
4072             return [] if !defined $_[0] and !keys %{$_[1]};
4073             return [ $_[1] ] if !defined $_[0];
4074             return [ $_[0] ] if !keys %{$_[1]};
4075             return [$_[0], $_[1]]
4076           },
4077         },
4078         ARRAY => {
4079           SCALAR => sub {
4080             return $_[0] if !defined $_[1];
4081             return $_[0] if __HM_DEDUP and grep { $_ eq $_[1] } @{$_[0]};
4082             return [@{$_[0]}, $_[1]]
4083           },
4084           ARRAY => sub {
4085             my @ret = @{$_[0]} or return $_[1];
4086             return [ @ret, @{$_[1]} ] unless __HM_DEDUP;
4087             my %idx = map { $_ => 1 } @ret;
4088             push @ret, grep { ! defined $idx{$_} } (@{$_[1]});
4089             \@ret;
4090           },
4091           HASH => sub {
4092             return [ $_[1] ] if ! @{$_[0]};
4093             return $_[0] if !keys %{$_[1]};
4094             return $_[0] if __HM_DEDUP and grep { $_ eq $_[1] } @{$_[0]};
4095             return [ @{$_[0]}, $_[1] ];
4096           },
4097         },
4098         HASH => {
4099           SCALAR => sub {
4100             return [] if !keys %{$_[0]} and !defined $_[1];
4101             return [ $_[0] ] if !defined $_[1];
4102             return [ $_[1] ] if !keys %{$_[0]};
4103             return [$_[0], $_[1]]
4104           },
4105           ARRAY => sub {
4106             return [] if !keys %{$_[0]} and !@{$_[1]};
4107             return [ $_[0] ] if !@{$_[1]};
4108             return $_[1] if !keys %{$_[0]};
4109             return $_[1] if __HM_DEDUP and grep { $_ eq $_[0] } @{$_[1]};
4110             return [ $_[0], @{$_[1]} ];
4111           },
4112           HASH => sub {
4113             return [] if !keys %{$_[0]} and !keys %{$_[1]};
4114             return [ $_[0] ] if !keys %{$_[1]};
4115             return [ $_[1] ] if !keys %{$_[0]};
4116             return [ $_[0] ] if $_[0] eq $_[1];
4117             return [ $_[0], $_[1] ];
4118           },
4119         }
4120       } => 'DBIC_RS_ATTR_MERGER');
4121       $hm;
4122     };
4123
4124     return $hm->merge ($_[1], $_[2]);
4125   }
4126 }
4127
4128 sub STORABLE_freeze {
4129   my ($self, $cloning) = @_;
4130   my $to_serialize = { %$self };
4131
4132   # A cursor in progress can't be serialized (and would make little sense anyway)
4133   # the parser can be regenerated (and can't be serialized)
4134   delete @{$to_serialize}{qw/cursor _row_parser _result_inflator/};
4135
4136   # nor is it sensical to store a not-yet-fired-count pager
4137   if ($to_serialize->{pager} and ref $to_serialize->{pager}{total_entries} eq 'CODE') {
4138     delete $to_serialize->{pager};
4139   }
4140
4141   Storable::nfreeze($to_serialize);
4142 }
4143
4144 # need this hook for symmetry
4145 sub STORABLE_thaw {
4146   my ($self, $cloning, $serialized) = @_;
4147
4148   %$self = %{ Storable::thaw($serialized) };
4149
4150   $self;
4151 }
4152
4153
4154 =head2 throw_exception
4155
4156 See L<DBIx::Class::Schema/throw_exception> for details.
4157
4158 =cut
4159
4160 sub throw_exception {
4161   my $self=shift;
4162
4163   if (ref $self and my $rsrc = $self->result_source) {
4164     $rsrc->throw_exception(@_)
4165   }
4166   else {
4167     DBIx::Class::Exception->throw(@_);
4168   }
4169 }
4170
4171 1;
4172
4173 __END__
4174
4175 # XXX: FIXME: Attributes docs need clearing up
4176
4177 =head1 ATTRIBUTES
4178
4179 Attributes are used to refine a ResultSet in various ways when
4180 searching for data. They can be passed to any method which takes an
4181 C<\%attrs> argument. See L</search>, L</search_rs>, L</find>,
4182 L</count>.
4183
4184 Default attributes can be set on the result class using
4185 L<DBIx::Class::ResultSource/resultset_attributes>.  (Please read
4186 the CAVEATS on that feature before using it!)
4187
4188 These are in no particular order:
4189
4190 =head2 order_by
4191
4192 =over 4
4193
4194 =item Value: ( $order_by | \@order_by | \%order_by )
4195
4196 =back
4197
4198 Which column(s) to order the results by.
4199
4200 [The full list of suitable values is documented in
4201 L<SQL::Abstract/"ORDER BY CLAUSES">; the following is a summary of
4202 common options.]
4203
4204 If a single column name, or an arrayref of names is supplied, the
4205 argument is passed through directly to SQL. The hashref syntax allows
4206 for connection-agnostic specification of ordering direction:
4207
4208  For descending order:
4209
4210   order_by => { -desc => [qw/col1 col2 col3/] }
4211
4212  For explicit ascending order:
4213
4214   order_by => { -asc => 'col' }
4215
4216 The old scalarref syntax (i.e. order_by => \'year DESC') is still
4217 supported, although you are strongly encouraged to use the hashref
4218 syntax as outlined above.
4219
4220 =head2 columns
4221
4222 =over 4
4223
4224 =item Value: \@columns | \%columns | $column
4225
4226 =back
4227
4228 Shortcut to request a particular set of columns to be retrieved. Each
4229 column spec may be a string (a table column name), or a hash (in which
4230 case the key is the C<as> value, and the value is used as the C<select>
4231 expression). Adds the L</current_source_alias> onto the start of any column without a C<.> in
4232 it and sets C<select> from that, then auto-populates C<as> from
4233 C<select> as normal. (You may also use the C<cols> attribute, as in
4234 earlier versions of DBIC, but this is deprecated)
4235
4236 Essentially C<columns> does the same as L</select> and L</as>.
4237
4238     columns => [ 'some_column', { dbic_slot => 'another_column' } ]
4239
4240 is the same as
4241
4242     select => [qw(some_column another_column)],
4243     as     => [qw(some_column dbic_slot)]
4244
4245 If you want to individually retrieve related columns (in essence perform
4246 manual L</prefetch>) you have to make sure to specify the correct inflation slot
4247 chain such that it matches existing relationships:
4248
4249     my $rs = $schema->resultset('Artist')->search({}, {
4250         # required to tell DBIC to collapse has_many relationships
4251         collapse => 1,
4252         join     => { cds => 'tracks' },
4253         '+columns'  => {
4254           'cds.cdid'         => 'cds.cdid',
4255           'cds.tracks.title' => 'tracks.title',
4256         },
4257     });
4258
4259 Like elsewhere, literal SQL or literal values can be included by using a
4260 scalar reference or a literal bind value, and these values will be available
4261 in the result with C<get_column> (see also
4262 L<SQL::Abstract/Literal SQL and value type operators>):
4263
4264     # equivalent SQL: SELECT 1, 'a string', IF(my_column,?,?) ...
4265     # bind values: $true_value, $false_value
4266     columns => [
4267         {
4268             foo => \1,
4269             bar => \q{'a string'},
4270             baz => \[ 'IF(my_column,?,?)', $true_value, $false_value ],
4271         }
4272     ]
4273
4274 =head2 +columns
4275
4276 B<NOTE:> You B<MUST> explicitly quote C<'+columns'> when using this attribute.
4277 Not doing so causes Perl to incorrectly interpret C<+columns> as a bareword
4278 with a unary plus operator before it, which is the same as simply C<columns>.
4279
4280 =over 4
4281
4282 =item Value: \@extra_columns
4283
4284 =back
4285
4286 Indicates additional columns to be selected from storage. Works the same as
4287 L</columns> but adds columns to the current selection. (You may also use the
4288 C<include_columns> attribute, as in earlier versions of DBIC, but this is
4289 deprecated)
4290
4291   $schema->resultset('CD')->search(undef, {
4292     '+columns' => ['artist.name'],
4293     join => ['artist']
4294   });
4295
4296 would return all CDs and include a 'name' column to the information
4297 passed to object inflation. Note that the 'artist' is the name of the
4298 column (or relationship) accessor, and 'name' is the name of the column
4299 accessor in the related table.
4300
4301 =head2 select
4302
4303 =over 4
4304
4305 =item Value: \@select_columns
4306
4307 =back
4308
4309 Indicates which columns should be selected from the storage. You can use
4310 column names, or in the case of RDBMS back ends, function or stored procedure
4311 names:
4312
4313   $rs = $schema->resultset('Employee')->search(undef, {
4314     select => [
4315       'name',
4316       { count => 'employeeid' },
4317       { max => { length => 'name' }, -as => 'longest_name' }
4318     ]
4319   });
4320
4321   # Equivalent SQL
4322   SELECT name, COUNT( employeeid ), MAX( LENGTH( name ) ) AS longest_name FROM employee
4323
4324 B<NOTE:> You will almost always need a corresponding L</as> attribute when you
4325 use L</select>, to instruct DBIx::Class how to store the result of the column.
4326
4327 Also note that the L</as> attribute has B<nothing to do> with the SQL-side
4328 C<AS> identifier aliasing. You B<can> alias a function (so you can use it e.g.
4329 in an C<ORDER BY> clause), however this is done via the C<-as> B<select
4330 function attribute> supplied as shown in the example above.
4331
4332 =head2 +select
4333
4334 B<NOTE:> You B<MUST> explicitly quote C<'+select'> when using this attribute.
4335 Not doing so causes Perl to incorrectly interpret C<+select> as a bareword
4336 with a unary plus operator before it, which is the same as simply C<select>.
4337
4338 =over 4
4339
4340 =item Value: \@extra_select_columns
4341
4342 =back
4343
4344 Indicates additional columns to be selected from storage.  Works the same as
4345 L</select> but adds columns to the current selection, instead of specifying
4346 a new explicit list.
4347
4348 =head2 as
4349
4350 =over 4
4351
4352 =item Value: \@inflation_names
4353
4354 =back
4355
4356 Indicates DBIC-side names for object inflation. That is L</as> indicates the
4357 slot name in which the column value will be stored within the
4358 L<Row|DBIx::Class::Row> object. The value will then be accessible via this
4359 identifier by the C<get_column> method (or via the object accessor B<if one
4360 with the same name already exists>) as shown below.
4361
4362 The L</as> attribute has B<nothing to do> with the SQL-side identifier
4363 aliasing C<AS>. See L</select> for details.
4364
4365   $rs = $schema->resultset('Employee')->search(undef, {
4366     select => [
4367       'name',
4368       { count => 'employeeid' },
4369       { max => { length => 'name' }, -as => 'longest_name' }
4370     ],
4371     as => [qw/
4372       name
4373       employee_count
4374       max_name_length
4375     /],
4376   });
4377
4378 If the object against which the search is performed already has an accessor
4379 matching a column name specified in C<as>, the value can be retrieved using
4380 the accessor as normal:
4381
4382   my $name = $employee->name();
4383
4384 If on the other hand an accessor does not exist in the object, you need to
4385 use C<get_column> instead:
4386
4387   my $employee_count = $employee->get_column('employee_count');
4388
4389 You can create your own accessors if required - see
4390 L<DBIx::Class::Manual::Cookbook> for details.
4391
4392 =head2 +as
4393
4394 B<NOTE:> You B<MUST> explicitly quote C<'+as'> when using this attribute.
4395 Not doing so causes Perl to incorrectly interpret C<+as> as a bareword
4396 with a unary plus operator before it, which is the same as simply C<as>.
4397
4398 =over 4
4399
4400 =item Value: \@extra_inflation_names
4401
4402 =back
4403
4404 Indicates additional inflation names for selectors added via L</+select>. See L</as>.
4405
4406 =head2 join
4407
4408 =over 4
4409
4410 =item Value: ($rel_name | \@rel_names | \%rel_names)
4411
4412 =back
4413
4414 Contains a list of relationships that should be joined for this query.  For
4415 example:
4416
4417   # Get CDs by Nine Inch Nails
4418   my $rs = $schema->resultset('CD')->search(
4419     { 'artist.name' => 'Nine Inch Nails' },
4420     { join => 'artist' }
4421   );
4422
4423 Can also contain a hash reference to refer to the other relation's relations.
4424 For example:
4425
4426   package MyApp::Schema::Track;
4427   use base qw/DBIx::Class/;
4428   __PACKAGE__->table('track');
4429   __PACKAGE__->add_columns(qw/trackid cd position title/);
4430   __PACKAGE__->set_primary_key('trackid');
4431   __PACKAGE__->belongs_to(cd => 'MyApp::Schema::CD');
4432   1;
4433
4434   # In your application
4435   my $rs = $schema->resultset('Artist')->search(
4436     { 'track.title' => 'Teardrop' },
4437     {
4438       join     => { cd => 'track' },
4439       order_by => 'artist.name',
4440     }
4441   );
4442
4443 You need to use the relationship (not the table) name in  conditions,
4444 because they are aliased as such. The current table is aliased as "me", so
4445 you need to use me.column_name in order to avoid ambiguity. For example:
4446
4447   # Get CDs from 1984 with a 'Foo' track
4448   my $rs = $schema->resultset('CD')->search(
4449     {
4450       'me.year' => 1984,
4451       'tracks.name' => 'Foo'
4452     },
4453     { join => 'tracks' }
4454   );
4455
4456 If the same join is supplied twice, it will be aliased to <rel>_2 (and
4457 similarly for a third time). For e.g.
4458
4459   my $rs = $schema->resultset('Artist')->search({
4460     'cds.title'   => 'Down to Earth',
4461     'cds_2.title' => 'Popular',
4462   }, {
4463     join => [ qw/cds cds/ ],
4464   });
4465
4466 will return a set of all artists that have both a cd with title 'Down
4467 to Earth' and a cd with title 'Popular'.
4468
4469 If you want to fetch related objects from other tables as well, see L</prefetch>
4470 below.
4471
4472  NOTE: An internal join-chain pruner will discard certain joins while
4473  constructing the actual SQL query, as long as the joins in question do not
4474  affect the retrieved result. This for example includes 1:1 left joins
4475  that are not part of the restriction specification (WHERE/HAVING) nor are
4476  a part of the query selection.
4477
4478 For more help on using joins with search, see L<DBIx::Class::Manual::Joining>.
4479
4480 =head2 collapse
4481
4482 =over 4
4483
4484 =item Value: (0 | 1)
4485
4486 =back
4487
4488 When set to a true value, indicates that any rows fetched from joined has_many
4489 relationships are to be aggregated into the corresponding "parent" object. For
4490 example, the resultset:
4491
4492   my $rs = $schema->resultset('CD')->search({}, {
4493     '+columns' => [ qw/ tracks.title tracks.position / ],
4494     join => 'tracks',
4495     collapse => 1,
4496   });
4497
4498 While executing the following query:
4499
4500   SELECT me.*, tracks.title, tracks.position
4501     FROM cd me
4502     LEFT JOIN track tracks
4503       ON tracks.cdid = me.cdid
4504
4505 Will return only as many objects as there are rows in the CD source, even
4506 though the result of the query may span many rows. Each of these CD objects
4507 will in turn have multiple "Track" objects hidden behind the has_many
4508 generated accessor C<tracks>. Without C<< collapse => 1 >>, the return values
4509 of this resultset would be as many CD objects as there are tracks (a "Cartesian
4510 product"), with each CD object containing exactly one of all fetched Track data.
4511
4512 When a collapse is requested on a non-ordered resultset, an order by some
4513 unique part of the main source (the left-most table) is inserted automatically.
4514 This is done so that the resultset is allowed to be "lazy" - calling
4515 L<< $rs->next|/next >> will fetch only as many rows as it needs to build the next
4516 object with all of its related data.
4517
4518 If an L</order_by> is already declared, and orders the resultset in a way that
4519 makes collapsing as described above impossible (e.g. C<< ORDER BY
4520 has_many_rel.column >> or C<ORDER BY RANDOM()>), DBIC will automatically
4521 switch to "eager" mode and slurp the entire resultset before constructing the
4522 first object returned by L</next>.
4523
4524 Setting this attribute on a resultset that does not join any has_many
4525 relations is a no-op.
4526
4527 For a more in-depth discussion, see L</PREFETCHING>.
4528
4529 =head2 prefetch
4530
4531 =over 4
4532
4533 =item Value: ($rel_name | \@rel_names | \%rel_names)
4534
4535 =back
4536
4537 This attribute is a shorthand for specifying a L</join> spec, adding all
4538 columns from the joined related sources as L</+columns> and setting
4539 L</collapse> to a true value. It can be thought of as a rough B<superset>
4540 of the L</join> attribute.
4541
4542 For example, the following two queries are equivalent:
4543
4544   my $rs = $schema->resultset('Artist')->search({}, {
4545     prefetch => { cds => ['genre', 'tracks' ] },
4546   });
4547
4548 and
4549
4550   my $rs = $schema->resultset('Artist')->search({}, {
4551     join => { cds => ['genre', 'tracks' ] },
4552     collapse => 1,
4553     '+columns' => [
4554       (map
4555         { +{ "cds.$_" => "cds.$_" } }
4556         $schema->source('Artist')->related_source('cds')->columns
4557       ),
4558       (map
4559         { +{ "cds.genre.$_" => "genre.$_" } }
4560         $schema->source('Artist')->related_source('cds')->related_source('genre')->columns
4561       ),
4562       (map
4563         { +{ "cds.tracks.$_" => "tracks.$_" } }
4564         $schema->source('Artist')->related_source('cds')->related_source('tracks')->columns
4565       ),
4566     ],
4567   });
4568
4569 Both producing the following SQL:
4570
4571   SELECT  me.artistid, me.name, me.rank, me.charfield,
4572           cds.cdid, cds.artist, cds.title, cds.year, cds.genreid, cds.single_track,
4573           genre.genreid, genre.name,
4574           tracks.trackid, tracks.cd, tracks.position, tracks.title, tracks.last_updated_on, tracks.last_updated_at
4575     FROM artist me
4576     LEFT JOIN cd cds
4577       ON cds.artist = me.artistid
4578     LEFT JOIN genre genre
4579       ON genre.genreid = cds.genreid
4580     LEFT JOIN track tracks
4581       ON tracks.cd = cds.cdid
4582   ORDER BY me.artistid
4583
4584 While L</prefetch> implies a L</join>, it is ok to mix the two together, as
4585 the arguments are properly merged and generally do the right thing. For
4586 example, you may want to do the following:
4587
4588   my $artists_and_cds_without_genre = $schema->resultset('Artist')->search(
4589     { 'genre.genreid' => undef },
4590     {
4591       join => { cds => 'genre' },
4592       prefetch => 'cds',
4593     }
4594   );
4595
4596 Which generates the following SQL:
4597
4598   SELECT  me.artistid, me.name, me.rank, me.charfield,
4599           cds.cdid, cds.artist, cds.title, cds.year, cds.genreid, cds.single_track
4600     FROM artist me
4601     LEFT JOIN cd cds
4602       ON cds.artist = me.artistid
4603     LEFT JOIN genre genre
4604       ON genre.genreid = cds.genreid
4605   WHERE genre.genreid IS NULL
4606   ORDER BY me.artistid
4607
4608 For a more in-depth discussion, see L</PREFETCHING>.
4609
4610 =head2 alias
4611
4612 =over 4
4613
4614 =item Value: $source_alias
4615
4616 =back
4617
4618 Sets the source alias for the query.  Normally, this defaults to C<me>, but
4619 nested search queries (sub-SELECTs) might need specific aliases set to
4620 reference inner queries.  For example:
4621
4622    my $q = $rs
4623       ->related_resultset('CDs')
4624       ->related_resultset('Tracks')
4625       ->search({
4626          'track.id' => { -ident => 'none_search.id' },
4627       })
4628       ->as_query;
4629
4630    my $ids = $self->search({
4631       -not_exists => $q,
4632    }, {
4633       alias    => 'none_search',
4634       group_by => 'none_search.id',
4635    })->get_column('id')->as_query;
4636
4637    $self->search({ id => { -in => $ids } })
4638
4639 This attribute is directly tied to L</current_source_alias>.
4640
4641 =head2 page
4642
4643 =over 4
4644
4645 =item Value: $page
4646
4647 =back
4648
4649 Makes the resultset paged and specifies the page to retrieve. Effectively
4650 identical to creating a non-pages resultset and then calling ->page($page)
4651 on it.
4652
4653 If L</rows> attribute is not specified it defaults to 10 rows per page.
4654
4655 When you have a paged resultset, L</count> will only return the number
4656 of rows in the page. To get the total, use the L</pager> and call
4657 C<total_entries> on it.
4658
4659 =head2 rows
4660
4661 =over 4
4662
4663 =item Value: $rows
4664
4665 =back
4666
4667 Specifies the maximum number of rows for direct retrieval or the number of
4668 rows per page if the page attribute or method is used.
4669
4670 =head2 offset
4671
4672 =over 4
4673
4674 =item Value: $offset
4675
4676 =back
4677
4678 Specifies the (zero-based) row number for the  first row to be returned, or the
4679 of the first row of the first page if paging is used.
4680
4681 =head2 software_limit
4682
4683 =over 4
4684
4685 =item Value: (0 | 1)
4686
4687 =back
4688
4689 When combined with L</rows> and/or L</offset> the generated SQL will not
4690 include any limit dialect stanzas. Instead the entire result will be selected
4691 as if no limits were specified, and DBIC will perform the limit locally, by
4692 artificially advancing and finishing the resulting L</cursor>.
4693
4694 This is the recommended way of performing resultset limiting when no sane RDBMS
4695 implementation is available (e.g.
4696 L<Sybase ASE|DBIx::Class::Storage::DBI::Sybase::ASE> using the
4697 L<Generic Sub Query|DBIx::Class::SQLMaker::LimitDialects/GenericSubQ> hack)
4698
4699 =head2 group_by
4700
4701 =over 4
4702
4703 =item Value: \@columns
4704
4705 =back
4706
4707 A arrayref of columns to group by. Can include columns of joined tables.
4708
4709   group_by => [qw/ column1 column2 ... /]
4710
4711 =head2 having
4712
4713 =over 4
4714
4715 =item Value: $condition
4716
4717 =back
4718
4719 The HAVING operator specifies a B<secondary> condition applied to the set
4720 after the grouping calculations have been done. In other words it is a
4721 constraint just like L</where> (and accepting the same
4722 L<SQL::Abstract syntax|SQL::Abstract/WHERE CLAUSES>) applied to the data
4723 as it exists after GROUP BY has taken place. Specifying L</having> without
4724 L</group_by> is a logical mistake, and a fatal error on most RDBMS engines.
4725
4726 E.g.
4727
4728   having => { 'count_employee' => { '>=', 100 } }
4729
4730 or with an in-place function in which case literal SQL is required:
4731
4732   having => \[ 'count(employee) >= ?', 100 ]
4733
4734 =head2 distinct
4735
4736 =over 4
4737
4738 =item Value: (0 | 1)
4739
4740 =back
4741
4742 Set to 1 to automatically generate a L</group_by> clause based on the selection
4743 (including intelligent handling of L</order_by> contents). Note that the group
4744 criteria calculation takes place over the B<final> selection. This includes
4745 any L</+columns>, L</+select> or L</order_by> additions in subsequent
4746 L</search> calls, and standalone columns selected via
4747 L<DBIx::Class::ResultSetColumn> (L</get_column>). A notable exception are the
4748 extra selections specified via L</prefetch> - such selections are explicitly
4749 excluded from group criteria calculations.
4750
4751 If the final ResultSet also explicitly defines a L</group_by> attribute, this
4752 setting is ignored and an appropriate warning is issued.
4753
4754 =head2 where
4755
4756 Adds extra conditions to the resultset, combined with the preexisting C<WHERE>
4757 conditions, same as the B<first> argument to the L<search operator|/search>
4758
4759   # only return rows WHERE deleted IS NULL for all searches
4760   __PACKAGE__->resultset_attributes({ where => { deleted => undef } });
4761
4762 Note that the above example is
4763 L<strongly discouraged|DBIx::Class::ResultSource/resultset_attributes>.
4764
4765 =head2 cache
4766
4767 Set to 1 to cache search results. This prevents extra SQL queries if you
4768 revisit rows in your ResultSet:
4769
4770   my $resultset = $schema->resultset('Artist')->search( undef, { cache => 1 } );
4771
4772   while( my $artist = $resultset->next ) {
4773     ... do stuff ...
4774   }
4775
4776   $resultset->first; # without cache, this would issue a query
4777
4778 By default, searches are not cached.
4779
4780 For more examples of using these attributes, see
4781 L<DBIx::Class::Manual::Cookbook>.
4782
4783 =head2 for
4784
4785 =over 4
4786
4787 =item Value: ( 'update' | 'shared' | \$scalar )
4788
4789 =back
4790
4791 Set to 'update' for a SELECT ... FOR UPDATE or 'shared' for a SELECT
4792 ... FOR SHARED. If \$scalar is passed, this is taken directly and embedded in the
4793 query.
4794
4795 =head1 PREFETCHING
4796
4797 DBIx::Class supports arbitrary related data prefetching from multiple related
4798 sources. Any combination of relationship types and column sets are supported.
4799 If L<collapsing|/collapse> is requested, there is an additional requirement of
4800 selecting enough data to make every individual object uniquely identifiable.
4801
4802 Here are some more involved examples, based on the following relationship map:
4803
4804   # Assuming:
4805   My::Schema::CD->belongs_to( artist      => 'My::Schema::Artist'     );
4806   My::Schema::CD->might_have( liner_note  => 'My::Schema::LinerNotes' );
4807   My::Schema::CD->has_many(   tracks      => 'My::Schema::Track'      );
4808
4809   My::Schema::Artist->belongs_to( record_label => 'My::Schema::RecordLabel' );
4810
4811   My::Schema::Track->has_many( guests => 'My::Schema::Guest' );
4812
4813
4814
4815   my $rs = $schema->resultset('Tag')->search(
4816     undef,
4817     {
4818       prefetch => {
4819         cd => 'artist'
4820       }
4821     }
4822   );
4823
4824 The initial search results in SQL like the following:
4825
4826   SELECT tag.*, cd.*, artist.* FROM tag
4827   JOIN cd ON tag.cd = cd.cdid
4828   JOIN artist ON cd.artist = artist.artistid
4829
4830 L<DBIx::Class> has no need to go back to the database when we access the
4831 C<cd> or C<artist> relationships, which saves us two SQL statements in this
4832 case.
4833
4834 Simple prefetches will be joined automatically, so there is no need
4835 for a C<join> attribute in the above search.
4836
4837 The L</prefetch> attribute can be used with any of the relationship types
4838 and multiple prefetches can be specified together. Below is a more complex
4839 example that prefetches a CD's artist, its liner notes (if present),
4840 the cover image, the tracks on that CD, and the guests on those
4841 tracks.
4842
4843   my $rs = $schema->resultset('CD')->search(
4844     undef,
4845     {
4846       prefetch => [
4847         { artist => 'record_label'},  # belongs_to => belongs_to
4848         'liner_note',                 # might_have
4849         'cover_image',                # has_one
4850         { tracks => 'guests' },       # has_many => has_many
4851       ]
4852     }
4853   );
4854
4855 This will produce SQL like the following:
4856
4857   SELECT cd.*, artist.*, record_label.*, liner_note.*, cover_image.*,
4858          tracks.*, guests.*
4859     FROM cd me
4860     JOIN artist artist
4861       ON artist.artistid = me.artistid
4862     JOIN record_label record_label
4863       ON record_label.labelid = artist.labelid
4864     LEFT JOIN track tracks
4865       ON tracks.cdid = me.cdid
4866     LEFT JOIN guest guests
4867       ON guests.trackid = track.trackid
4868     LEFT JOIN liner_notes liner_note
4869       ON liner_note.cdid = me.cdid
4870     JOIN cd_artwork cover_image
4871       ON cover_image.cdid = me.cdid
4872   ORDER BY tracks.cd
4873
4874 Now the C<artist>, C<record_label>, C<liner_note>, C<cover_image>,
4875 C<tracks>, and C<guests> of the CD will all be available through the
4876 relationship accessors without the need for additional queries to the
4877 database.
4878
4879 =head3 CAVEATS
4880
4881 Prefetch does a lot of deep magic. As such, it may not behave exactly
4882 as you might expect.
4883
4884 =over 4
4885
4886 =item *
4887
4888 Prefetch uses the L</cache> to populate the prefetched relationships. This
4889 may or may not be what you want.
4890
4891 =item *
4892
4893 If you specify a condition on a prefetched relationship, ONLY those
4894 rows that match the prefetched condition will be fetched into that relationship.
4895 This means that adding prefetch to a search() B<may alter> what is returned by
4896 traversing a relationship. So, if you have C<< Artist->has_many(CDs) >> and you do
4897
4898   my $artist_rs = $schema->resultset('Artist')->search({
4899       'cds.year' => 2008,
4900   }, {
4901       join => 'cds',
4902   });
4903
4904   my $count = $artist_rs->first->cds->count;
4905
4906   my $artist_rs_prefetch = $artist_rs->search( {}, { prefetch => 'cds' } );
4907
4908   my $prefetch_count = $artist_rs_prefetch->first->cds->count;
4909
4910   cmp_ok( $count, '==', $prefetch_count, "Counts should be the same" );
4911
4912 That cmp_ok() may or may not pass depending on the datasets involved. In other
4913 words the C<WHERE> condition would apply to the entire dataset, just like
4914 it would in regular SQL. If you want to add a condition only to the "right side"
4915 of a C<LEFT JOIN> - consider declaring and using a L<relationship with a custom
4916 condition|DBIx::Class::Relationship::Base/condition>
4917
4918 =back
4919
4920 =head1 DBIC BIND VALUES
4921
4922 Because DBIC may need more information to bind values than just the column name
4923 and value itself, it uses a special format for both passing and receiving bind
4924 values.  Each bind value should be composed of an arrayref of
4925 C<< [ \%args => $val ] >>.  The format of C<< \%args >> is currently:
4926
4927 =over 4
4928
4929 =item dbd_attrs
4930
4931 If present (in any form), this is what is being passed directly to bind_param.
4932 Note that different DBD's expect different bind args.  (e.g. DBD::SQLite takes
4933 a single numerical type, while DBD::Pg takes a hashref if bind options.)
4934
4935 If this is specified, all other bind options described below are ignored.
4936
4937 =item sqlt_datatype
4938
4939 If present, this is used to infer the actual bind attribute by passing to
4940 C<< $resolved_storage->bind_attribute_by_data_type() >>.  Defaults to the
4941 "data_type" from the L<add_columns column info|DBIx::Class::ResultSource/add_columns>.
4942
4943 Note that the data type is somewhat freeform (hence the sqlt_ prefix);
4944 currently drivers are expected to "Do the Right Thing" when given a common
4945 datatype name.  (Not ideal, but that's what we got at this point.)
4946
4947 =item sqlt_size
4948
4949 Currently used to correctly allocate buffers for bind_param_inout().
4950 Defaults to "size" from the L<add_columns column info|DBIx::Class::ResultSource/add_columns>,
4951 or to a sensible value based on the "data_type".
4952
4953 =item dbic_colname
4954
4955 Used to fill in missing sqlt_datatype and sqlt_size attributes (if they are
4956 explicitly specified they are never overridden).  Also used by some weird DBDs,
4957 where the column name should be available at bind_param time (e.g. Oracle).
4958
4959 =back
4960
4961 For backwards compatibility and convenience, the following shortcuts are
4962 supported:
4963
4964   [ $name => $val ] === [ { dbic_colname => $name }, $val ]
4965   [ \$dt  => $val ] === [ { sqlt_datatype => $dt }, $val ]
4966   [ undef,   $val ] === [ {}, $val ]
4967   $val              === [ {}, $val ]
4968
4969 =head1 FURTHER QUESTIONS?
4970
4971 Check the list of L<additional DBIC resources|DBIx::Class/GETTING HELP/SUPPORT>.
4972
4973 =head1 COPYRIGHT AND LICENSE
4974
4975 This module is free software L<copyright|DBIx::Class/COPYRIGHT AND LICENSE>
4976 by the L<DBIx::Class (DBIC) authors|DBIx::Class/AUTHORS>. You can
4977 redistribute it and/or modify it under the same terms as the
4978 L<DBIx::Class library|DBIx::Class/COPYRIGHT AND LICENSE>.
4979
4980 =cut