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