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