Still do null-branch pruning when we are using our own inflate_result()
[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   # CDBI compat stuff
1444   if ($attrs->{record_filter}) {
1445     $_ = $attrs->{record_filter}->($_) for @$rows;
1446   }
1447
1448   return $rows;
1449 }
1450
1451 =head2 result_source
1452
1453 =over 4
1454
1455 =item Arguments: L<$result_source?|DBIx::Class::ResultSource>
1456
1457 =item Return Value: L<$result_source|DBIx::Class::ResultSource>
1458
1459 =back
1460
1461 An accessor for the primary ResultSource object from which this ResultSet
1462 is derived.
1463
1464 =head2 result_class
1465
1466 =over 4
1467
1468 =item Arguments: $result_class?
1469
1470 =item Return Value: $result_class
1471
1472 =back
1473
1474 An accessor for the class to use when creating result objects. Defaults to
1475 C<< result_source->result_class >> - which in most cases is the name of the
1476 L<"table"|DBIx::Class::Manual::Glossary/"ResultSource"> class.
1477
1478 Note that changing the result_class will also remove any components
1479 that were originally loaded in the source class via
1480 L<DBIx::Class::ResultSource/load_components>. Any overloaded methods
1481 in the original source class will not run.
1482
1483 =cut
1484
1485 sub result_class {
1486   my ($self, $result_class) = @_;
1487   if ($result_class) {
1488
1489     # don't fire this for an object
1490     $self->ensure_class_loaded($result_class)
1491       unless ref($result_class);
1492
1493     if ($self->get_cache) {
1494       carp_unique('Changing the result_class of a ResultSet instance with cached results is a noop - the cache contents will not be altered');
1495     }
1496     # FIXME ENCAPSULATION - encapsulation breach, cursor method additions pending
1497     elsif ($self->{cursor} && $self->{cursor}{_pos}) {
1498       $self->throw_exception('Changing the result_class of a ResultSet instance with an active cursor is not supported');
1499     }
1500
1501     $self->_result_class($result_class);
1502
1503     delete $self->{_result_inflator};
1504   }
1505   $self->_result_class;
1506 }
1507
1508 =head2 count
1509
1510 =over 4
1511
1512 =item Arguments: L<$cond|DBIx::Class::SQLMaker>, L<\%attrs?|/ATTRIBUTES>
1513
1514 =item Return Value: $count
1515
1516 =back
1517
1518 Performs an SQL C<COUNT> with the same query as the resultset was built
1519 with to find the number of elements. Passing arguments is equivalent to
1520 C<< $rs->search ($cond, \%attrs)->count >>
1521
1522 =cut
1523
1524 sub count {
1525   my $self = shift;
1526   return $self->search(@_)->count if @_ and defined $_[0];
1527   return scalar @{ $self->get_cache } if $self->get_cache;
1528
1529   my $attrs = { %{ $self->_resolved_attrs } };
1530
1531   # this is a little optimization - it is faster to do the limit
1532   # adjustments in software, instead of a subquery
1533   my ($rows, $offset) = delete @{$attrs}{qw/rows offset/};
1534
1535   my $crs;
1536   if ($self->_has_resolved_attr (qw/collapse group_by/)) {
1537     $crs = $self->_count_subq_rs ($attrs);
1538   }
1539   else {
1540     $crs = $self->_count_rs ($attrs);
1541   }
1542   my $count = $crs->next;
1543
1544   $count -= $offset if $offset;
1545   $count = $rows if $rows and $rows < $count;
1546   $count = 0 if ($count < 0);
1547
1548   return $count;
1549 }
1550
1551 =head2 count_rs
1552
1553 =over 4
1554
1555 =item Arguments: L<$cond|DBIx::Class::SQLMaker>, L<\%attrs?|/ATTRIBUTES>
1556
1557 =item Return Value: L<$count_rs|DBIx::Class::ResultSetColumn>
1558
1559 =back
1560
1561 Same as L</count> but returns a L<DBIx::Class::ResultSetColumn> object.
1562 This can be very handy for subqueries:
1563
1564   ->search( { amount => $some_rs->count_rs->as_query } )
1565
1566 As with regular resultsets the SQL query will be executed only after
1567 the resultset is accessed via L</next> or L</all>. That would return
1568 the same single value obtainable via L</count>.
1569
1570 =cut
1571
1572 sub count_rs {
1573   my $self = shift;
1574   return $self->search(@_)->count_rs if @_;
1575
1576   # this may look like a lack of abstraction (count() does about the same)
1577   # but in fact an _rs *must* use a subquery for the limits, as the
1578   # software based limiting can not be ported if this $rs is to be used
1579   # in a subquery itself (i.e. ->as_query)
1580   if ($self->_has_resolved_attr (qw/collapse group_by offset rows/)) {
1581     return $self->_count_subq_rs;
1582   }
1583   else {
1584     return $self->_count_rs;
1585   }
1586 }
1587
1588 #
1589 # returns a ResultSetColumn object tied to the count query
1590 #
1591 sub _count_rs {
1592   my ($self, $attrs) = @_;
1593
1594   my $rsrc = $self->result_source;
1595   $attrs ||= $self->_resolved_attrs;
1596
1597   my $tmp_attrs = { %$attrs };
1598   # take off any limits, record_filter is cdbi, and no point of ordering nor locking a count
1599   delete @{$tmp_attrs}{qw/rows offset order_by record_filter for/};
1600
1601   # overwrite the selector (supplied by the storage)
1602   $tmp_attrs->{select} = $rsrc->storage->_count_select ($rsrc, $attrs);
1603   $tmp_attrs->{as} = 'count';
1604
1605   my $tmp_rs = $rsrc->resultset_class->new($rsrc, $tmp_attrs)->get_column ('count');
1606
1607   return $tmp_rs;
1608 }
1609
1610 #
1611 # same as above but uses a subquery
1612 #
1613 sub _count_subq_rs {
1614   my ($self, $attrs) = @_;
1615
1616   my $rsrc = $self->result_source;
1617   $attrs ||= $self->_resolved_attrs;
1618
1619   my $sub_attrs = { %$attrs };
1620   # extra selectors do not go in the subquery and there is no point of ordering it, nor locking it
1621   delete @{$sub_attrs}{qw/collapse columns as select _prefetch_selector_range order_by for/};
1622
1623   # if we multi-prefetch we group_by something unique, as this is what we would
1624   # get out of the rs via ->next/->all. We *DO WANT* to clobber old group_by regardless
1625   if ( $attrs->{collapse}  ) {
1626     $sub_attrs->{group_by} = [ map { "$attrs->{alias}.$_" } @{
1627       $rsrc->_identifying_column_set || $self->throw_exception(
1628         'Unable to construct a unique group_by criteria properly collapsing the '
1629       . 'has_many prefetch before count()'
1630       );
1631     } ]
1632   }
1633
1634   # Calculate subquery selector
1635   if (my $g = $sub_attrs->{group_by}) {
1636
1637     my $sql_maker = $rsrc->storage->sql_maker;
1638
1639     # necessary as the group_by may refer to aliased functions
1640     my $sel_index;
1641     for my $sel (@{$attrs->{select}}) {
1642       $sel_index->{$sel->{-as}} = $sel
1643         if (ref $sel eq 'HASH' and $sel->{-as});
1644     }
1645
1646     # anything from the original select mentioned on the group-by needs to make it to the inner selector
1647     # also look for named aggregates referred in the having clause
1648     # having often contains scalarrefs - thus parse it out entirely
1649     my @parts = @$g;
1650     if ($attrs->{having}) {
1651       local $sql_maker->{having_bind};
1652       local $sql_maker->{quote_char} = $sql_maker->{quote_char};
1653       local $sql_maker->{name_sep} = $sql_maker->{name_sep};
1654       unless (defined $sql_maker->{quote_char} and length $sql_maker->{quote_char}) {
1655         $sql_maker->{quote_char} = [ "\x00", "\xFF" ];
1656         # if we don't unset it we screw up retarded but unfortunately working
1657         # 'MAX(foo.bar)' => { '>', 3 }
1658         $sql_maker->{name_sep} = '';
1659       }
1660
1661       my ($lquote, $rquote, $sep) = map { quotemeta $_ } ($sql_maker->_quote_chars, $sql_maker->name_sep);
1662
1663       my $having_sql = $sql_maker->_parse_rs_attrs ({ having => $attrs->{having} });
1664       my %seen_having;
1665
1666       # search for both a proper quoted qualified string, for a naive unquoted scalarref
1667       # and if all fails for an utterly naive quoted scalar-with-function
1668       while ($having_sql =~ /
1669         $rquote $sep $lquote (.+?) $rquote
1670           |
1671         [\s,] \w+ \. (\w+) [\s,]
1672           |
1673         [\s,] $lquote (.+?) $rquote [\s,]
1674       /gx) {
1675         my $part = $1 || $2 || $3;  # one of them matched if we got here
1676         unless ($seen_having{$part}++) {
1677           push @parts, $part;
1678         }
1679       }
1680     }
1681
1682     for (@parts) {
1683       my $colpiece = $sel_index->{$_} || $_;
1684
1685       # unqualify join-based group_by's. Arcane but possible query
1686       # also horrible horrible hack to alias a column (not a func.)
1687       # (probably need to introduce SQLA syntax)
1688       if ($colpiece =~ /\./ && $colpiece !~ /^$attrs->{alias}\./) {
1689         my $as = $colpiece;
1690         $as =~ s/\./__/;
1691         $colpiece = \ sprintf ('%s AS %s', map { $sql_maker->_quote ($_) } ($colpiece, $as) );
1692       }
1693       push @{$sub_attrs->{select}}, $colpiece;
1694     }
1695   }
1696   else {
1697     my @pcols = map { "$attrs->{alias}.$_" } ($rsrc->primary_columns);
1698     $sub_attrs->{select} = @pcols ? \@pcols : [ 1 ];
1699   }
1700
1701   return $rsrc->resultset_class
1702                ->new ($rsrc, $sub_attrs)
1703                 ->as_subselect_rs
1704                  ->search ({}, { columns => { count => $rsrc->storage->_count_select ($rsrc, $attrs) } })
1705                   ->get_column ('count');
1706 }
1707
1708
1709 =head2 count_literal
1710
1711 B<CAVEAT>: C<count_literal> is provided for Class::DBI compatibility and
1712 should only be used in that context. See L</search_literal> for further info.
1713
1714 =over 4
1715
1716 =item Arguments: $sql_fragment, @standalone_bind_values
1717
1718 =item Return Value: $count
1719
1720 =back
1721
1722 Counts the results in a literal query. Equivalent to calling L</search_literal>
1723 with the passed arguments, then L</count>.
1724
1725 =cut
1726
1727 sub count_literal { shift->search_literal(@_)->count; }
1728
1729 =head2 all
1730
1731 =over 4
1732
1733 =item Arguments: none
1734
1735 =item Return Value: L<@result_objs|DBIx::Class::Manual::ResultClass>
1736
1737 =back
1738
1739 Returns all elements in the resultset.
1740
1741 =cut
1742
1743 sub all {
1744   my $self = shift;
1745   if(@_) {
1746     $self->throw_exception("all() doesn't take any arguments, you probably wanted ->search(...)->all()");
1747   }
1748
1749   delete @{$self}{qw/_stashed_rows _stashed_results/};
1750
1751   if (my $c = $self->get_cache) {
1752     return @$c;
1753   }
1754
1755   $self->cursor->reset;
1756
1757   my $objs = $self->_construct_results('fetch_all') || [];
1758
1759   $self->set_cache($objs) if $self->{attrs}{cache};
1760
1761   return @$objs;
1762 }
1763
1764 =head2 reset
1765
1766 =over 4
1767
1768 =item Arguments: none
1769
1770 =item Return Value: $self
1771
1772 =back
1773
1774 Resets the resultset's cursor, so you can iterate through the elements again.
1775 Implicitly resets the storage cursor, so a subsequent L</next> will trigger
1776 another query.
1777
1778 =cut
1779
1780 sub reset {
1781   my ($self) = @_;
1782
1783   delete @{$self}{qw/_stashed_rows _stashed_results/};
1784   $self->{all_cache_position} = 0;
1785   $self->cursor->reset;
1786   return $self;
1787 }
1788
1789 =head2 first
1790
1791 =over 4
1792
1793 =item Arguments: none
1794
1795 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass> | undef
1796
1797 =back
1798
1799 L<Resets|/reset> the resultset (causing a fresh query to storage) and returns
1800 an object for the first result (or C<undef> if the resultset is empty).
1801
1802 =cut
1803
1804 sub first {
1805   return $_[0]->reset->next;
1806 }
1807
1808
1809 # _rs_update_delete
1810 #
1811 # Determines whether and what type of subquery is required for the $rs operation.
1812 # If grouping is necessary either supplies its own, or verifies the current one
1813 # After all is done delegates to the proper storage method.
1814
1815 sub _rs_update_delete {
1816   my ($self, $op, $values) = @_;
1817
1818   my $rsrc = $self->result_source;
1819   my $storage = $rsrc->schema->storage;
1820
1821   my $attrs = { %{$self->_resolved_attrs} };
1822
1823   my $join_classifications;
1824   my $existing_group_by = delete $attrs->{group_by};
1825
1826   # do we need a subquery for any reason?
1827   my $needs_subq = (
1828     defined $existing_group_by
1829       or
1830     # if {from} is unparseable wrap a subq
1831     ref($attrs->{from}) ne 'ARRAY'
1832       or
1833     # limits call for a subq
1834     $self->_has_resolved_attr(qw/rows offset/)
1835   );
1836
1837   # simplify the joinmap, so we can further decide if a subq is necessary
1838   if (!$needs_subq and @{$attrs->{from}} > 1) {
1839     $attrs->{from} = $storage->_prune_unused_joins ($attrs->{from}, $attrs->{select}, $self->{cond}, $attrs);
1840
1841     # check if there are any joins left after the prune
1842     if ( @{$attrs->{from}} > 1 ) {
1843       $join_classifications = $storage->_resolve_aliastypes_from_select_args (
1844         [ @{$attrs->{from}}[1 .. $#{$attrs->{from}}] ],
1845         $attrs->{select},
1846         $self->{cond},
1847         $attrs
1848       );
1849
1850       # any non-pruneable joins imply subq
1851       $needs_subq = scalar keys %{ $join_classifications->{restricting} || {} };
1852     }
1853   }
1854
1855   # check if the head is composite (by now all joins are thrown out unless $needs_subq)
1856   $needs_subq ||= (
1857     (ref $attrs->{from}[0]) ne 'HASH'
1858       or
1859     ref $attrs->{from}[0]{ $attrs->{from}[0]{-alias} }
1860   );
1861
1862   my ($cond, $guard);
1863   # do we need anything like a subquery?
1864   if (! $needs_subq) {
1865     # Most databases do not allow aliasing of tables in UPDATE/DELETE. Thus
1866     # a condition containing 'me' or other table prefixes will not work
1867     # at all. Tell SQLMaker to dequalify idents via a gross hack.
1868     $cond = do {
1869       my $sqla = $rsrc->storage->sql_maker;
1870       local $sqla->{_dequalify_idents} = 1;
1871       \[ $sqla->_recurse_where($self->{cond}) ];
1872     };
1873   }
1874   else {
1875     # we got this far - means it is time to wrap a subquery
1876     my $idcols = $rsrc->_identifying_column_set || $self->throw_exception(
1877       sprintf(
1878         "Unable to perform complex resultset %s() without an identifying set of columns on source '%s'",
1879         $op,
1880         $rsrc->source_name,
1881       )
1882     );
1883
1884     # make a new $rs selecting only the PKs (that's all we really need for the subq)
1885     delete $attrs->{$_} for qw/collapse select _prefetch_selector_range as/;
1886     $attrs->{columns} = [ map { "$attrs->{alias}.$_" } @$idcols ];
1887     $attrs->{group_by} = \ '';  # FIXME - this is an evil hack, it causes the optimiser to kick in and throw away the LEFT joins
1888     my $subrs = (ref $self)->new($rsrc, $attrs);
1889
1890     if (@$idcols == 1) {
1891       $cond = { $idcols->[0] => { -in => $subrs->as_query } };
1892     }
1893     elsif ($storage->_use_multicolumn_in) {
1894       # no syntax for calling this properly yet
1895       # !!! EXPERIMENTAL API !!! WILL CHANGE !!!
1896       $cond = $storage->sql_maker->_where_op_multicolumn_in (
1897         $idcols, # how do I convey a list of idents...? can binds reside on lhs?
1898         $subrs->as_query
1899       ),
1900     }
1901     else {
1902       # if all else fails - get all primary keys and operate over a ORed set
1903       # wrap in a transaction for consistency
1904       # this is where the group_by/multiplication starts to matter
1905       if (
1906         $existing_group_by
1907           or
1908         keys %{ $join_classifications->{multiplying} || {} }
1909       ) {
1910         # make sure if there is a supplied group_by it matches the columns compiled above
1911         # perfectly. Anything else can not be sanely executed on most databases so croak
1912         # right then and there
1913         if ($existing_group_by) {
1914           my @current_group_by = map
1915             { $_ =~ /\./ ? $_ : "$attrs->{alias}.$_" }
1916             @$existing_group_by
1917           ;
1918
1919           if (
1920             join ("\x00", sort @current_group_by)
1921               ne
1922             join ("\x00", sort @{$attrs->{columns}} )
1923           ) {
1924             $self->throw_exception (
1925               "You have just attempted a $op operation on a resultset which does group_by"
1926               . ' on columns other than the primary keys, while DBIC internally needs to retrieve'
1927               . ' the primary keys in a subselect. All sane RDBMS engines do not support this'
1928               . ' kind of queries. Please retry the operation with a modified group_by or'
1929               . ' without using one at all.'
1930             );
1931           }
1932         }
1933
1934         $subrs = $subrs->search({}, { group_by => $attrs->{columns} });
1935       }
1936
1937       $guard = $storage->txn_scope_guard;
1938
1939       $cond = [];
1940       for my $row ($subrs->cursor->all) {
1941         push @$cond, { map
1942           { $idcols->[$_] => $row->[$_] }
1943           (0 .. $#$idcols)
1944         };
1945       }
1946     }
1947   }
1948
1949   my $res = $storage->$op (
1950     $rsrc,
1951     $op eq 'update' ? $values : (),
1952     $cond,
1953   );
1954
1955   $guard->commit if $guard;
1956
1957   return $res;
1958 }
1959
1960 =head2 update
1961
1962 =over 4
1963
1964 =item Arguments: \%values
1965
1966 =item Return Value: $underlying_storage_rv
1967
1968 =back
1969
1970 Sets the specified columns in the resultset to the supplied values in a
1971 single query. Note that this will not run any accessor/set_column/update
1972 triggers, nor will it update any result object instances derived from this
1973 resultset (this includes the contents of the L<resultset cache|/set_cache>
1974 if any). See L</update_all> if you need to execute any on-update
1975 triggers or cascades defined either by you or a
1976 L<result component|DBIx::Class::Manual::Component/WHAT IS A COMPONENT>.
1977
1978 The return value is a pass through of what the underlying
1979 storage backend returned, and may vary. See L<DBI/execute> for the most
1980 common case.
1981
1982 =head3 CAVEAT
1983
1984 Note that L</update> does not process/deflate any of the values passed in.
1985 This is unlike the corresponding L<DBIx::Class::Row/update>. The user must
1986 ensure manually that any value passed to this method will stringify to
1987 something the RDBMS knows how to deal with. A notable example is the
1988 handling of L<DateTime> objects, for more info see:
1989 L<DBIx::Class::Manual::Cookbook/Formatting DateTime objects in queries>.
1990
1991 =cut
1992
1993 sub update {
1994   my ($self, $values) = @_;
1995   $self->throw_exception('Values for update must be a hash')
1996     unless ref $values eq 'HASH';
1997
1998   return $self->_rs_update_delete ('update', $values);
1999 }
2000
2001 =head2 update_all
2002
2003 =over 4
2004
2005 =item Arguments: \%values
2006
2007 =item Return Value: 1
2008
2009 =back
2010
2011 Fetches all objects and updates them one at a time via
2012 L<DBIx::Class::Row/update>. Note that C<update_all> will run DBIC defined
2013 triggers, while L</update> will not.
2014
2015 =cut
2016
2017 sub update_all {
2018   my ($self, $values) = @_;
2019   $self->throw_exception('Values for update_all must be a hash')
2020     unless ref $values eq 'HASH';
2021
2022   my $guard = $self->result_source->schema->txn_scope_guard;
2023   $_->update({%$values}) for $self->all;  # shallow copy - update will mangle it
2024   $guard->commit;
2025   return 1;
2026 }
2027
2028 =head2 delete
2029
2030 =over 4
2031
2032 =item Arguments: none
2033
2034 =item Return Value: $underlying_storage_rv
2035
2036 =back
2037
2038 Deletes the rows matching this resultset in a single query. Note that this
2039 will not run any delete triggers, nor will it alter the
2040 L<in_storage|DBIx::Class::Row/in_storage> status of any result object instances
2041 derived from this resultset (this includes the contents of the
2042 L<resultset cache|/set_cache> if any). See L</delete_all> if you need to
2043 execute any on-delete triggers or cascades defined either by you or a
2044 L<result component|DBIx::Class::Manual::Component/WHAT IS A COMPONENT>.
2045
2046 The return value is a pass through of what the underlying storage backend
2047 returned, and may vary. See L<DBI/execute> for the most common case.
2048
2049 =cut
2050
2051 sub delete {
2052   my $self = shift;
2053   $self->throw_exception('delete does not accept any arguments')
2054     if @_;
2055
2056   return $self->_rs_update_delete ('delete');
2057 }
2058
2059 =head2 delete_all
2060
2061 =over 4
2062
2063 =item Arguments: none
2064
2065 =item Return Value: 1
2066
2067 =back
2068
2069 Fetches all objects and deletes them one at a time via
2070 L<DBIx::Class::Row/delete>. Note that C<delete_all> will run DBIC defined
2071 triggers, while L</delete> will not.
2072
2073 =cut
2074
2075 sub delete_all {
2076   my $self = shift;
2077   $self->throw_exception('delete_all does not accept any arguments')
2078     if @_;
2079
2080   my $guard = $self->result_source->schema->txn_scope_guard;
2081   $_->delete for $self->all;
2082   $guard->commit;
2083   return 1;
2084 }
2085
2086 =head2 populate
2087
2088 =over 4
2089
2090 =item Arguments: [ \@column_list, \@row_values+ ] | [ \%col_data+ ]
2091
2092 =item Return Value: L<\@result_objects|DBIx::Class::Manual::ResultClass> (scalar context) | L<@result_objects|DBIx::Class::Manual::ResultClass> (list context)
2093
2094 =back
2095
2096 Accepts either an arrayref of hashrefs or alternatively an arrayref of
2097 arrayrefs.
2098
2099 =over
2100
2101 =item NOTE
2102
2103 The context of this method call has an important effect on what is
2104 submitted to storage. In void context data is fed directly to fastpath
2105 insertion routines provided by the underlying storage (most often
2106 L<DBI/execute_for_fetch>), bypassing the L<new|DBIx::Class::Row/new> and
2107 L<insert|DBIx::Class::Row/insert> calls on the
2108 L<Result|DBIx::Class::Manual::ResultClass> class, including any
2109 augmentation of these methods provided by components. For example if you
2110 are using something like L<DBIx::Class::UUIDColumns> to create primary
2111 keys for you, you will find that your PKs are empty.  In this case you
2112 will have to explicitly force scalar or list context in order to create
2113 those values.
2114
2115 =back
2116
2117 In non-void (scalar or list) context, this method is simply a wrapper
2118 for L</create>. Depending on list or scalar context either a list of
2119 L<Result|DBIx::Class::Manual::ResultClass> objects or an arrayref
2120 containing these objects is returned.
2121
2122 When supplying data in "arrayref of arrayrefs" invocation style, the
2123 first element should be a list of column names and each subsequent
2124 element should be a data value in the earlier specified column order.
2125 For example:
2126
2127   $Arstist_rs->populate([
2128     [ qw( artistid name ) ],
2129     [ 100, 'A Formally Unknown Singer' ],
2130     [ 101, 'A singer that jumped the shark two albums ago' ],
2131     [ 102, 'An actually cool singer' ],
2132   ]);
2133
2134 For the arrayref of hashrefs style each hashref should be a structure
2135 suitable for passing to L</create>. Multi-create is also permitted with
2136 this syntax.
2137
2138   $schema->resultset("Artist")->populate([
2139      { artistid => 4, name => 'Manufactured Crap', cds => [
2140         { title => 'My First CD', year => 2006 },
2141         { title => 'Yet More Tweeny-Pop crap', year => 2007 },
2142       ],
2143      },
2144      { artistid => 5, name => 'Angsty-Whiny Girl', cds => [
2145         { title => 'My parents sold me to a record company', year => 2005 },
2146         { title => 'Why Am I So Ugly?', year => 2006 },
2147         { title => 'I Got Surgery and am now Popular', year => 2007 }
2148       ],
2149      },
2150   ]);
2151
2152 If you attempt a void-context multi-create as in the example above (each
2153 Artist also has the related list of CDs), and B<do not> supply the
2154 necessary autoinc foreign key information, this method will proxy to the
2155 less efficient L</create>, and then throw the Result objects away. In this
2156 case there are obviously no benefits to using this method over L</create>.
2157
2158 =cut
2159
2160 sub populate {
2161   my $self = shift;
2162
2163   # cruft placed in standalone method
2164   my $data = $self->_normalize_populate_args(@_);
2165
2166   return unless @$data;
2167
2168   if(defined wantarray) {
2169     my @created = map { $self->create($_) } @$data;
2170     return wantarray ? @created : \@created;
2171   }
2172   else {
2173     my $first = $data->[0];
2174
2175     # if a column is a registered relationship, and is a non-blessed hash/array, consider
2176     # it relationship data
2177     my (@rels, @columns);
2178     my $rsrc = $self->result_source;
2179     my $rels = { map { $_ => $rsrc->relationship_info($_) } $rsrc->relationships };
2180     for (keys %$first) {
2181       my $ref = ref $first->{$_};
2182       $rels->{$_} && ($ref eq 'ARRAY' or $ref eq 'HASH')
2183         ? push @rels, $_
2184         : push @columns, $_
2185       ;
2186     }
2187
2188     my @pks = $rsrc->primary_columns;
2189
2190     ## do the belongs_to relationships
2191     foreach my $index (0..$#$data) {
2192
2193       # delegate to create() for any dataset without primary keys with specified relationships
2194       if (grep { !defined $data->[$index]->{$_} } @pks ) {
2195         for my $r (@rels) {
2196           if (grep { ref $data->[$index]{$r} eq $_ } qw/HASH ARRAY/) {  # a related set must be a HASH or AoH
2197             my @ret = $self->populate($data);
2198             return;
2199           }
2200         }
2201       }
2202
2203       foreach my $rel (@rels) {
2204         next unless ref $data->[$index]->{$rel} eq "HASH";
2205         my $result = $self->related_resultset($rel)->create($data->[$index]->{$rel});
2206         my ($reverse_relname, $reverse_relinfo) = %{$rsrc->reverse_relationship_info($rel)};
2207         my $related = $result->result_source->_resolve_condition(
2208           $reverse_relinfo->{cond},
2209           $self,
2210           $result,
2211           $rel,
2212         );
2213
2214         delete $data->[$index]->{$rel};
2215         $data->[$index] = {%{$data->[$index]}, %$related};
2216
2217         push @columns, keys %$related if $index == 0;
2218       }
2219     }
2220
2221     ## inherit the data locked in the conditions of the resultset
2222     my ($rs_data) = $self->_merge_with_rscond({});
2223     delete @{$rs_data}{@columns};
2224
2225     ## do bulk insert on current row
2226     $rsrc->storage->insert_bulk(
2227       $rsrc,
2228       [@columns, keys %$rs_data],
2229       [ map { [ @$_{@columns}, values %$rs_data ] } @$data ],
2230     );
2231
2232     ## do the has_many relationships
2233     foreach my $item (@$data) {
2234
2235       my $main_row;
2236
2237       foreach my $rel (@rels) {
2238         next unless ref $item->{$rel} eq "ARRAY" && @{ $item->{$rel} };
2239
2240         $main_row ||= $self->new_result({map { $_ => $item->{$_} } @pks});
2241
2242         my $child = $main_row->$rel;
2243
2244         my $related = $child->result_source->_resolve_condition(
2245           $rels->{$rel}{cond},
2246           $child,
2247           $main_row,
2248           $rel,
2249         );
2250
2251         my @rows_to_add = ref $item->{$rel} eq 'ARRAY' ? @{$item->{$rel}} : ($item->{$rel});
2252         my @populate = map { {%$_, %$related} } @rows_to_add;
2253
2254         $child->populate( \@populate );
2255       }
2256     }
2257   }
2258 }
2259
2260
2261 # populate() argumnets went over several incarnations
2262 # What we ultimately support is AoH
2263 sub _normalize_populate_args {
2264   my ($self, $arg) = @_;
2265
2266   if (ref $arg eq 'ARRAY') {
2267     if (!@$arg) {
2268       return [];
2269     }
2270     elsif (ref $arg->[0] eq 'HASH') {
2271       return $arg;
2272     }
2273     elsif (ref $arg->[0] eq 'ARRAY') {
2274       my @ret;
2275       my @colnames = @{$arg->[0]};
2276       foreach my $values (@{$arg}[1 .. $#$arg]) {
2277         push @ret, { map { $colnames[$_] => $values->[$_] } (0 .. $#colnames) };
2278       }
2279       return \@ret;
2280     }
2281   }
2282
2283   $self->throw_exception('Populate expects an arrayref of hashrefs or arrayref of arrayrefs');
2284 }
2285
2286 =head2 pager
2287
2288 =over 4
2289
2290 =item Arguments: none
2291
2292 =item Return Value: L<$pager|Data::Page>
2293
2294 =back
2295
2296 Returns a L<Data::Page> object for the current resultset. Only makes
2297 sense for queries with a C<page> attribute.
2298
2299 To get the full count of entries for a paged resultset, call
2300 C<total_entries> on the L<Data::Page> object.
2301
2302 =cut
2303
2304 sub pager {
2305   my ($self) = @_;
2306
2307   return $self->{pager} if $self->{pager};
2308
2309   my $attrs = $self->{attrs};
2310   if (!defined $attrs->{page}) {
2311     $self->throw_exception("Can't create pager for non-paged rs");
2312   }
2313   elsif ($attrs->{page} <= 0) {
2314     $self->throw_exception('Invalid page number (page-numbers are 1-based)');
2315   }
2316   $attrs->{rows} ||= 10;
2317
2318   # throw away the paging flags and re-run the count (possibly
2319   # with a subselect) to get the real total count
2320   my $count_attrs = { %$attrs };
2321   delete @{$count_attrs}{qw/rows offset page pager/};
2322
2323   my $total_rs = (ref $self)->new($self->result_source, $count_attrs);
2324
2325   require DBIx::Class::ResultSet::Pager;
2326   return $self->{pager} = DBIx::Class::ResultSet::Pager->new(
2327     sub { $total_rs->count },  #lazy-get the total
2328     $attrs->{rows},
2329     $self->{attrs}{page},
2330   );
2331 }
2332
2333 =head2 page
2334
2335 =over 4
2336
2337 =item Arguments: $page_number
2338
2339 =item Return Value: L<$resultset|/search>
2340
2341 =back
2342
2343 Returns a resultset for the $page_number page of the resultset on which page
2344 is called, where each page contains a number of rows equal to the 'rows'
2345 attribute set on the resultset (10 by default).
2346
2347 =cut
2348
2349 sub page {
2350   my ($self, $page) = @_;
2351   return (ref $self)->new($self->result_source, { %{$self->{attrs}}, page => $page });
2352 }
2353
2354 =head2 new_result
2355
2356 =over 4
2357
2358 =item Arguments: \%col_data
2359
2360 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
2361
2362 =back
2363
2364 Creates a new result object in the resultset's result class and returns
2365 it. The row is not inserted into the database at this point, call
2366 L<DBIx::Class::Row/insert> to do that. Calling L<DBIx::Class::Row/in_storage>
2367 will tell you whether the result object has been inserted or not.
2368
2369 Passes the hashref of input on to L<DBIx::Class::Row/new>.
2370
2371 =cut
2372
2373 sub new_result {
2374   my ($self, $values) = @_;
2375
2376   $self->throw_exception( "new_result takes only one argument - a hashref of values" )
2377     if @_ > 2;
2378
2379   $self->throw_exception( "new_result expects a hashref" )
2380     unless (ref $values eq 'HASH');
2381
2382   my ($merged_cond, $cols_from_relations) = $self->_merge_with_rscond($values);
2383
2384   my $new = $self->result_class->new({
2385     %$merged_cond,
2386     ( @$cols_from_relations
2387       ? (-cols_from_relations => $cols_from_relations)
2388       : ()
2389     ),
2390     -result_source => $self->result_source, # DO NOT REMOVE THIS, REQUIRED
2391   });
2392
2393   if (
2394     reftype($new) eq 'HASH'
2395       and
2396     ! keys %$new
2397       and
2398     blessed($new)
2399   ) {
2400     carp_unique (sprintf (
2401       "%s->new returned a blessed empty hashref - a strong indicator something is wrong with its inheritance chain",
2402       $self->result_class,
2403     ));
2404   }
2405
2406   $new;
2407 }
2408
2409 # _merge_with_rscond
2410 #
2411 # Takes a simple hash of K/V data and returns its copy merged with the
2412 # condition already present on the resultset. Additionally returns an
2413 # arrayref of value/condition names, which were inferred from related
2414 # objects (this is needed for in-memory related objects)
2415 sub _merge_with_rscond {
2416   my ($self, $data) = @_;
2417
2418   my (%new_data, @cols_from_relations);
2419
2420   my $alias = $self->{attrs}{alias};
2421
2422   if (! defined $self->{cond}) {
2423     # just massage $data below
2424   }
2425   elsif ($self->{cond} eq $DBIx::Class::ResultSource::UNRESOLVABLE_CONDITION) {
2426     %new_data = %{ $self->{attrs}{related_objects} || {} };  # nothing might have been inserted yet
2427     @cols_from_relations = keys %new_data;
2428   }
2429   elsif (ref $self->{cond} ne 'HASH') {
2430     $self->throw_exception(
2431       "Can't abstract implicit construct, resultset condition not a hash"
2432     );
2433   }
2434   else {
2435     # precendence must be given to passed values over values inherited from
2436     # the cond, so the order here is important.
2437     my $collapsed_cond = $self->_collapse_cond($self->{cond});
2438     my %implied = %{$self->_remove_alias($collapsed_cond, $alias)};
2439
2440     while ( my($col, $value) = each %implied ) {
2441       my $vref = ref $value;
2442       if (
2443         $vref eq 'HASH'
2444           and
2445         keys(%$value) == 1
2446           and
2447         (keys %$value)[0] eq '='
2448       ) {
2449         $new_data{$col} = $value->{'='};
2450       }
2451       elsif( !$vref or $vref eq 'SCALAR' or blessed($value) ) {
2452         $new_data{$col} = $value;
2453       }
2454     }
2455   }
2456
2457   %new_data = (
2458     %new_data,
2459     %{ $self->_remove_alias($data, $alias) },
2460   );
2461
2462   return (\%new_data, \@cols_from_relations);
2463 }
2464
2465 # _has_resolved_attr
2466 #
2467 # determines if the resultset defines at least one
2468 # of the attributes supplied
2469 #
2470 # used to determine if a subquery is neccessary
2471 #
2472 # supports some virtual attributes:
2473 #   -join
2474 #     This will scan for any joins being present on the resultset.
2475 #     It is not a mere key-search but a deep inspection of {from}
2476 #
2477
2478 sub _has_resolved_attr {
2479   my ($self, @attr_names) = @_;
2480
2481   my $attrs = $self->_resolved_attrs;
2482
2483   my %extra_checks;
2484
2485   for my $n (@attr_names) {
2486     if (grep { $n eq $_ } (qw/-join/) ) {
2487       $extra_checks{$n}++;
2488       next;
2489     }
2490
2491     my $attr =  $attrs->{$n};
2492
2493     next if not defined $attr;
2494
2495     if (ref $attr eq 'HASH') {
2496       return 1 if keys %$attr;
2497     }
2498     elsif (ref $attr eq 'ARRAY') {
2499       return 1 if @$attr;
2500     }
2501     else {
2502       return 1 if $attr;
2503     }
2504   }
2505
2506   # a resolved join is expressed as a multi-level from
2507   return 1 if (
2508     $extra_checks{-join}
2509       and
2510     ref $attrs->{from} eq 'ARRAY'
2511       and
2512     @{$attrs->{from}} > 1
2513   );
2514
2515   return 0;
2516 }
2517
2518 # _collapse_cond
2519 #
2520 # Recursively collapse the condition.
2521
2522 sub _collapse_cond {
2523   my ($self, $cond, $collapsed) = @_;
2524
2525   $collapsed ||= {};
2526
2527   if (ref $cond eq 'ARRAY') {
2528     foreach my $subcond (@$cond) {
2529       next unless ref $subcond;  # -or
2530       $collapsed = $self->_collapse_cond($subcond, $collapsed);
2531     }
2532   }
2533   elsif (ref $cond eq 'HASH') {
2534     if (keys %$cond and (keys %$cond)[0] eq '-and') {
2535       foreach my $subcond (@{$cond->{-and}}) {
2536         $collapsed = $self->_collapse_cond($subcond, $collapsed);
2537       }
2538     }
2539     else {
2540       foreach my $col (keys %$cond) {
2541         my $value = $cond->{$col};
2542         $collapsed->{$col} = $value;
2543       }
2544     }
2545   }
2546
2547   return $collapsed;
2548 }
2549
2550 # _remove_alias
2551 #
2552 # Remove the specified alias from the specified query hash. A copy is made so
2553 # the original query is not modified.
2554
2555 sub _remove_alias {
2556   my ($self, $query, $alias) = @_;
2557
2558   my %orig = %{ $query || {} };
2559   my %unaliased;
2560
2561   foreach my $key (keys %orig) {
2562     if ($key !~ /\./) {
2563       $unaliased{$key} = $orig{$key};
2564       next;
2565     }
2566     $unaliased{$1} = $orig{$key}
2567       if $key =~ m/^(?:\Q$alias\E\.)?([^.]+)$/;
2568   }
2569
2570   return \%unaliased;
2571 }
2572
2573 =head2 as_query
2574
2575 =over 4
2576
2577 =item Arguments: none
2578
2579 =item Return Value: \[ $sql, L<@bind_values|/DBIC BIND VALUES> ]
2580
2581 =back
2582
2583 Returns the SQL query and bind vars associated with the invocant.
2584
2585 This is generally used as the RHS for a subquery.
2586
2587 =cut
2588
2589 sub as_query {
2590   my $self = shift;
2591
2592   my $attrs = { %{ $self->_resolved_attrs } };
2593
2594   # For future use:
2595   #
2596   # in list ctx:
2597   # my ($sql, \@bind, \%dbi_bind_attrs) = _select_args_to_query (...)
2598   # $sql also has no wrapping parenthesis in list ctx
2599   #
2600   my $sqlbind = $self->result_source->storage
2601     ->_select_args_to_query ($attrs->{from}, $attrs->{select}, $attrs->{where}, $attrs);
2602
2603   return $sqlbind;
2604 }
2605
2606 =head2 find_or_new
2607
2608 =over 4
2609
2610 =item Arguments: \%col_data, { key => $unique_constraint, L<%attrs|/ATTRIBUTES> }?
2611
2612 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
2613
2614 =back
2615
2616   my $artist = $schema->resultset('Artist')->find_or_new(
2617     { artist => 'fred' }, { key => 'artists' });
2618
2619   $cd->cd_to_producer->find_or_new({ producer => $producer },
2620                                    { key => 'primary });
2621
2622 Find an existing record from this resultset using L</find>. if none exists,
2623 instantiate a new result object and return it. The object will not be saved
2624 into your storage until you call L<DBIx::Class::Row/insert> on it.
2625
2626 You most likely want this method when looking for existing rows using a unique
2627 constraint that is not the primary key, or looking for related rows.
2628
2629 If you want objects to be saved immediately, use L</find_or_create> instead.
2630
2631 B<Note>: Make sure to read the documentation of L</find> and understand the
2632 significance of the C<key> attribute, as its lack may skew your search, and
2633 subsequently result in spurious new objects.
2634
2635 B<Note>: Take care when using C<find_or_new> with a table having
2636 columns with default values that you intend to be automatically
2637 supplied by the database (e.g. an auto_increment primary key column).
2638 In normal usage, the value of such columns should NOT be included at
2639 all in the call to C<find_or_new>, even when set to C<undef>.
2640
2641 =cut
2642
2643 sub find_or_new {
2644   my $self     = shift;
2645   my $attrs    = (@_ > 1 && ref $_[$#_] eq 'HASH' ? pop(@_) : {});
2646   my $hash     = ref $_[0] eq 'HASH' ? shift : {@_};
2647   if (keys %$hash and my $row = $self->find($hash, $attrs) ) {
2648     return $row;
2649   }
2650   return $self->new_result($hash);
2651 }
2652
2653 =head2 create
2654
2655 =over 4
2656
2657 =item Arguments: \%col_data
2658
2659 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
2660
2661 =back
2662
2663 Attempt to create a single new row or a row with multiple related rows
2664 in the table represented by the resultset (and related tables). This
2665 will not check for duplicate rows before inserting, use
2666 L</find_or_create> to do that.
2667
2668 To create one row for this resultset, pass a hashref of key/value
2669 pairs representing the columns of the table and the values you wish to
2670 store. If the appropriate relationships are set up, foreign key fields
2671 can also be passed an object representing the foreign row, and the
2672 value will be set to its primary key.
2673
2674 To create related objects, pass a hashref of related-object column values
2675 B<keyed on the relationship name>. If the relationship is of type C<multi>
2676 (L<DBIx::Class::Relationship/has_many>) - pass an arrayref of hashrefs.
2677 The process will correctly identify columns holding foreign keys, and will
2678 transparently populate them from the keys of the corresponding relation.
2679 This can be applied recursively, and will work correctly for a structure
2680 with an arbitrary depth and width, as long as the relationships actually
2681 exists and the correct column data has been supplied.
2682
2683 Instead of hashrefs of plain related data (key/value pairs), you may
2684 also pass new or inserted objects. New objects (not inserted yet, see
2685 L</new_result>), will be inserted into their appropriate tables.
2686
2687 Effectively a shortcut for C<< ->new_result(\%col_data)->insert >>.
2688
2689 Example of creating a new row.
2690
2691   $person_rs->create({
2692     name=>"Some Person",
2693     email=>"somebody@someplace.com"
2694   });
2695
2696 Example of creating a new row and also creating rows in a related C<has_many>
2697 or C<has_one> resultset.  Note Arrayref.
2698
2699   $artist_rs->create(
2700      { artistid => 4, name => 'Manufactured Crap', cds => [
2701         { title => 'My First CD', year => 2006 },
2702         { title => 'Yet More Tweeny-Pop crap', year => 2007 },
2703       ],
2704      },
2705   );
2706
2707 Example of creating a new row and also creating a row in a related
2708 C<belongs_to> resultset. Note Hashref.
2709
2710   $cd_rs->create({
2711     title=>"Music for Silly Walks",
2712     year=>2000,
2713     artist => {
2714       name=>"Silly Musician",
2715     }
2716   });
2717
2718 =over
2719
2720 =item WARNING
2721
2722 When subclassing ResultSet never attempt to override this method. Since
2723 it is a simple shortcut for C<< $self->new_result($attrs)->insert >>, a
2724 lot of the internals simply never call it, so your override will be
2725 bypassed more often than not. Override either L<DBIx::Class::Row/new>
2726 or L<DBIx::Class::Row/insert> depending on how early in the
2727 L</create> process you need to intervene. See also warning pertaining to
2728 L</new>.
2729
2730 =back
2731
2732 =cut
2733
2734 sub create {
2735   my ($self, $attrs) = @_;
2736   $self->throw_exception( "create needs a hashref" )
2737     unless ref $attrs eq 'HASH';
2738   return $self->new_result($attrs)->insert;
2739 }
2740
2741 =head2 find_or_create
2742
2743 =over 4
2744
2745 =item Arguments: \%col_data, { key => $unique_constraint, L<%attrs|/ATTRIBUTES> }?
2746
2747 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
2748
2749 =back
2750
2751   $cd->cd_to_producer->find_or_create({ producer => $producer },
2752                                       { key => 'primary' });
2753
2754 Tries to find a record based on its primary key or unique constraints; if none
2755 is found, creates one and returns that instead.
2756
2757   my $cd = $schema->resultset('CD')->find_or_create({
2758     cdid   => 5,
2759     artist => 'Massive Attack',
2760     title  => 'Mezzanine',
2761     year   => 2005,
2762   });
2763
2764 Also takes an optional C<key> attribute, to search by a specific key or unique
2765 constraint. For example:
2766
2767   my $cd = $schema->resultset('CD')->find_or_create(
2768     {
2769       artist => 'Massive Attack',
2770       title  => 'Mezzanine',
2771     },
2772     { key => 'cd_artist_title' }
2773   );
2774
2775 B<Note>: Make sure to read the documentation of L</find> and understand the
2776 significance of the C<key> attribute, as its lack may skew your search, and
2777 subsequently result in spurious row creation.
2778
2779 B<Note>: Because find_or_create() reads from the database and then
2780 possibly inserts based on the result, this method is subject to a race
2781 condition. Another process could create a record in the table after
2782 the find has completed and before the create has started. To avoid
2783 this problem, use find_or_create() inside a transaction.
2784
2785 B<Note>: Take care when using C<find_or_create> with a table having
2786 columns with default values that you intend to be automatically
2787 supplied by the database (e.g. an auto_increment primary key column).
2788 In normal usage, the value of such columns should NOT be included at
2789 all in the call to C<find_or_create>, even when set to C<undef>.
2790
2791 See also L</find> and L</update_or_create>. For information on how to declare
2792 unique constraints, see L<DBIx::Class::ResultSource/add_unique_constraint>.
2793
2794 If you need to know if an existing row was found or a new one created use
2795 L</find_or_new> and L<DBIx::Class::Row/in_storage> instead. Don't forget
2796 to call L<DBIx::Class::Row/insert> to save the newly created row to the
2797 database!
2798
2799   my $cd = $schema->resultset('CD')->find_or_new({
2800     cdid   => 5,
2801     artist => 'Massive Attack',
2802     title  => 'Mezzanine',
2803     year   => 2005,
2804   });
2805
2806   if( !$cd->in_storage ) {
2807       # do some stuff
2808       $cd->insert;
2809   }
2810
2811 =cut
2812
2813 sub find_or_create {
2814   my $self     = shift;
2815   my $attrs    = (@_ > 1 && ref $_[$#_] eq 'HASH' ? pop(@_) : {});
2816   my $hash     = ref $_[0] eq 'HASH' ? shift : {@_};
2817   if (keys %$hash and my $row = $self->find($hash, $attrs) ) {
2818     return $row;
2819   }
2820   return $self->create($hash);
2821 }
2822
2823 =head2 update_or_create
2824
2825 =over 4
2826
2827 =item Arguments: \%col_data, { key => $unique_constraint, L<%attrs|/ATTRIBUTES> }?
2828
2829 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
2830
2831 =back
2832
2833   $resultset->update_or_create({ col => $val, ... });
2834
2835 Like L</find_or_create>, but if a row is found it is immediately updated via
2836 C<< $found_row->update (\%col_data) >>.
2837
2838
2839 Takes an optional C<key> attribute to search on a specific unique constraint.
2840 For example:
2841
2842   # In your application
2843   my $cd = $schema->resultset('CD')->update_or_create(
2844     {
2845       artist => 'Massive Attack',
2846       title  => 'Mezzanine',
2847       year   => 1998,
2848     },
2849     { key => 'cd_artist_title' }
2850   );
2851
2852   $cd->cd_to_producer->update_or_create({
2853     producer => $producer,
2854     name => 'harry',
2855   }, {
2856     key => 'primary',
2857   });
2858
2859 B<Note>: Make sure to read the documentation of L</find> and understand the
2860 significance of the C<key> attribute, as its lack may skew your search, and
2861 subsequently result in spurious row creation.
2862
2863 B<Note>: Take care when using C<update_or_create> with a table having
2864 columns with default values that you intend to be automatically
2865 supplied by the database (e.g. an auto_increment primary key column).
2866 In normal usage, the value of such columns should NOT be included at
2867 all in the call to C<update_or_create>, even when set to C<undef>.
2868
2869 See also L</find> and L</find_or_create>. For information on how to declare
2870 unique constraints, see L<DBIx::Class::ResultSource/add_unique_constraint>.
2871
2872 If you need to know if an existing row was updated or a new one created use
2873 L</update_or_new> and L<DBIx::Class::Row/in_storage> instead. Don't forget
2874 to call L<DBIx::Class::Row/insert> to save the newly created row to the
2875 database!
2876
2877 =cut
2878
2879 sub update_or_create {
2880   my $self = shift;
2881   my $attrs = (@_ > 1 && ref $_[$#_] eq 'HASH' ? pop(@_) : {});
2882   my $cond = ref $_[0] eq 'HASH' ? shift : {@_};
2883
2884   my $row = $self->find($cond, $attrs);
2885   if (defined $row) {
2886     $row->update($cond);
2887     return $row;
2888   }
2889
2890   return $self->create($cond);
2891 }
2892
2893 =head2 update_or_new
2894
2895 =over 4
2896
2897 =item Arguments: \%col_data, { key => $unique_constraint, L<%attrs|/ATTRIBUTES> }?
2898
2899 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
2900
2901 =back
2902
2903   $resultset->update_or_new({ col => $val, ... });
2904
2905 Like L</find_or_new> but if a row is found it is immediately updated via
2906 C<< $found_row->update (\%col_data) >>.
2907
2908 For example:
2909
2910   # In your application
2911   my $cd = $schema->resultset('CD')->update_or_new(
2912     {
2913       artist => 'Massive Attack',
2914       title  => 'Mezzanine',
2915       year   => 1998,
2916     },
2917     { key => 'cd_artist_title' }
2918   );
2919
2920   if ($cd->in_storage) {
2921       # the cd was updated
2922   }
2923   else {
2924       # the cd is not yet in the database, let's insert it
2925       $cd->insert;
2926   }
2927
2928 B<Note>: Make sure to read the documentation of L</find> and understand the
2929 significance of the C<key> attribute, as its lack may skew your search, and
2930 subsequently result in spurious new objects.
2931
2932 B<Note>: Take care when using C<update_or_new> with a table having
2933 columns with default values that you intend to be automatically
2934 supplied by the database (e.g. an auto_increment primary key column).
2935 In normal usage, the value of such columns should NOT be included at
2936 all in the call to C<update_or_new>, even when set to C<undef>.
2937
2938 See also L</find>, L</find_or_create> and L</find_or_new>.
2939
2940 =cut
2941
2942 sub update_or_new {
2943     my $self  = shift;
2944     my $attrs = ( @_ > 1 && ref $_[$#_] eq 'HASH' ? pop(@_) : {} );
2945     my $cond  = ref $_[0] eq 'HASH' ? shift : {@_};
2946
2947     my $row = $self->find( $cond, $attrs );
2948     if ( defined $row ) {
2949         $row->update($cond);
2950         return $row;
2951     }
2952
2953     return $self->new_result($cond);
2954 }
2955
2956 =head2 get_cache
2957
2958 =over 4
2959
2960 =item Arguments: none
2961
2962 =item Return Value: L<\@result_objs|DBIx::Class::Manual::ResultClass> | undef
2963
2964 =back
2965
2966 Gets the contents of the cache for the resultset, if the cache is set.
2967
2968 The cache is populated either by using the L</prefetch> attribute to
2969 L</search> or by calling L</set_cache>.
2970
2971 =cut
2972
2973 sub get_cache {
2974   shift->{all_cache};
2975 }
2976
2977 =head2 set_cache
2978
2979 =over 4
2980
2981 =item Arguments: L<\@result_objs|DBIx::Class::Manual::ResultClass>
2982
2983 =item Return Value: L<\@result_objs|DBIx::Class::Manual::ResultClass>
2984
2985 =back
2986
2987 Sets the contents of the cache for the resultset. Expects an arrayref
2988 of objects of the same class as those produced by the resultset. Note that
2989 if the cache is set, the resultset will return the cached objects rather
2990 than re-querying the database even if the cache attr is not set.
2991
2992 The contents of the cache can also be populated by using the
2993 L</prefetch> attribute to L</search>.
2994
2995 =cut
2996
2997 sub set_cache {
2998   my ( $self, $data ) = @_;
2999   $self->throw_exception("set_cache requires an arrayref")
3000       if defined($data) && (ref $data ne 'ARRAY');
3001   $self->{all_cache} = $data;
3002 }
3003
3004 =head2 clear_cache
3005
3006 =over 4
3007
3008 =item Arguments: none
3009
3010 =item Return Value: undef
3011
3012 =back
3013
3014 Clears the cache for the resultset.
3015
3016 =cut
3017
3018 sub clear_cache {
3019   shift->set_cache(undef);
3020 }
3021
3022 =head2 is_paged
3023
3024 =over 4
3025
3026 =item Arguments: none
3027
3028 =item Return Value: true, if the resultset has been paginated
3029
3030 =back
3031
3032 =cut
3033
3034 sub is_paged {
3035   my ($self) = @_;
3036   return !!$self->{attrs}{page};
3037 }
3038
3039 =head2 is_ordered
3040
3041 =over 4
3042
3043 =item Arguments: none
3044
3045 =item Return Value: true, if the resultset has been ordered with C<order_by>.
3046
3047 =back
3048
3049 =cut
3050
3051 sub is_ordered {
3052   my ($self) = @_;
3053   return scalar $self->result_source->storage->_extract_order_criteria($self->{attrs}{order_by});
3054 }
3055
3056 =head2 related_resultset
3057
3058 =over 4
3059
3060 =item Arguments: $rel_name
3061
3062 =item Return Value: L<$resultset|/search>
3063
3064 =back
3065
3066 Returns a related resultset for the supplied relationship name.
3067
3068   $artist_rs = $schema->resultset('CD')->related_resultset('Artist');
3069
3070 =cut
3071
3072 sub related_resultset {
3073   my ($self, $rel) = @_;
3074
3075   return $self->{related_resultsets}{$rel} ||= do {
3076     my $rsrc = $self->result_source;
3077     my $rel_info = $rsrc->relationship_info($rel);
3078
3079     $self->throw_exception(
3080       "search_related: result source '" . $rsrc->source_name .
3081         "' has no such relationship $rel")
3082       unless $rel_info;
3083
3084     my $attrs = $self->_chain_relationship($rel);
3085
3086     my $join_count = $attrs->{seen_join}{$rel};
3087
3088     my $alias = $self->result_source->storage
3089         ->relname_to_table_alias($rel, $join_count);
3090
3091     # since this is search_related, and we already slid the select window inwards
3092     # (the select/as attrs were deleted in the beginning), we need to flip all
3093     # left joins to inner, so we get the expected results
3094     # read the comment on top of the actual function to see what this does
3095     $attrs->{from} = $rsrc->schema->storage->_inner_join_to_node ($attrs->{from}, $alias);
3096
3097
3098     #XXX - temp fix for result_class bug. There likely is a more elegant fix -groditi
3099     delete @{$attrs}{qw(result_class alias)};
3100
3101     my $related_cache;
3102
3103     if (my $cache = $self->get_cache) {
3104       $related_cache = [ map
3105         { @{$_->related_resultset($rel)->get_cache||[]} }
3106         @$cache
3107       ];
3108     }
3109
3110     my $rel_source = $rsrc->related_source($rel);
3111
3112     my $new = do {
3113
3114       # The reason we do this now instead of passing the alias to the
3115       # search_rs below is that if you wrap/overload resultset on the
3116       # source you need to know what alias it's -going- to have for things
3117       # to work sanely (e.g. RestrictWithObject wants to be able to add
3118       # extra query restrictions, and these may need to be $alias.)
3119
3120       my $rel_attrs = $rel_source->resultset_attributes;
3121       local $rel_attrs->{alias} = $alias;
3122
3123       $rel_source->resultset
3124                  ->search_rs(
3125                      undef, {
3126                        %$attrs,
3127                        where => $attrs->{where},
3128                    });
3129     };
3130     $new->set_cache($related_cache) if $related_cache;
3131     $new;
3132   };
3133 }
3134
3135 =head2 current_source_alias
3136
3137 =over 4
3138
3139 =item Arguments: none
3140
3141 =item Return Value: $source_alias
3142
3143 =back
3144
3145 Returns the current table alias for the result source this resultset is built
3146 on, that will be used in the SQL query. Usually it is C<me>.
3147
3148 Currently the source alias that refers to the result set returned by a
3149 L</search>/L</find> family method depends on how you got to the resultset: it's
3150 C<me> by default, but eg. L</search_related> aliases it to the related result
3151 source name (and keeps C<me> referring to the original result set). The long
3152 term goal is to make L<DBIx::Class> always alias the current resultset as C<me>
3153 (and make this method unnecessary).
3154
3155 Thus it's currently necessary to use this method in predefined queries (see
3156 L<DBIx::Class::Manual::Cookbook/Predefined searches>) when referring to the
3157 source alias of the current result set:
3158
3159   # in a result set class
3160   sub modified_by {
3161     my ($self, $user) = @_;
3162
3163     my $me = $self->current_source_alias;
3164
3165     return $self->search({
3166       "$me.modified" => $user->id,
3167     });
3168   }
3169
3170 =cut
3171
3172 sub current_source_alias {
3173   return (shift->{attrs} || {})->{alias} || 'me';
3174 }
3175
3176 =head2 as_subselect_rs
3177
3178 =over 4
3179
3180 =item Arguments: none
3181
3182 =item Return Value: L<$resultset|/search>
3183
3184 =back
3185
3186 Act as a barrier to SQL symbols.  The resultset provided will be made into a
3187 "virtual view" by including it as a subquery within the from clause.  From this
3188 point on, any joined tables are inaccessible to ->search on the resultset (as if
3189 it were simply where-filtered without joins).  For example:
3190
3191  my $rs = $schema->resultset('Bar')->search({'x.name' => 'abc'},{ join => 'x' });
3192
3193  # 'x' now pollutes the query namespace
3194
3195  # So the following works as expected
3196  my $ok_rs = $rs->search({'x.other' => 1});
3197
3198  # But this doesn't: instead of finding a 'Bar' related to two x rows (abc and
3199  # def) we look for one row with contradictory terms and join in another table
3200  # (aliased 'x_2') which we never use
3201  my $broken_rs = $rs->search({'x.name' => 'def'});
3202
3203  my $rs2 = $rs->as_subselect_rs;
3204
3205  # doesn't work - 'x' is no longer accessible in $rs2, having been sealed away
3206  my $not_joined_rs = $rs2->search({'x.other' => 1});
3207
3208  # works as expected: finds a 'table' row related to two x rows (abc and def)
3209  my $correctly_joined_rs = $rs2->search({'x.name' => 'def'});
3210
3211 Another example of when one might use this would be to select a subset of
3212 columns in a group by clause:
3213
3214  my $rs = $schema->resultset('Bar')->search(undef, {
3215    group_by => [qw{ id foo_id baz_id }],
3216  })->as_subselect_rs->search(undef, {
3217    columns => [qw{ id foo_id }]
3218  });
3219
3220 In the above example normally columns would have to be equal to the group by,
3221 but because we isolated the group by into a subselect the above works.
3222
3223 =cut
3224
3225 sub as_subselect_rs {
3226   my $self = shift;
3227
3228   my $attrs = $self->_resolved_attrs;
3229
3230   my $fresh_rs = (ref $self)->new (
3231     $self->result_source
3232   );
3233
3234   # these pieces will be locked in the subquery
3235   delete $fresh_rs->{cond};
3236   delete @{$fresh_rs->{attrs}}{qw/where bind/};
3237
3238   return $fresh_rs->search( {}, {
3239     from => [{
3240       $attrs->{alias} => $self->as_query,
3241       -alias  => $attrs->{alias},
3242       -rsrc   => $self->result_source,
3243     }],
3244     alias => $attrs->{alias},
3245   });
3246 }
3247
3248 # This code is called by search_related, and makes sure there
3249 # is clear separation between the joins before, during, and
3250 # after the relationship. This information is needed later
3251 # in order to properly resolve prefetch aliases (any alias
3252 # with a relation_chain_depth less than the depth of the
3253 # current prefetch is not considered)
3254 #
3255 # The increments happen twice per join. An even number means a
3256 # relationship specified via a search_related, whereas an odd
3257 # number indicates a join/prefetch added via attributes
3258 #
3259 # Also this code will wrap the current resultset (the one we
3260 # chain to) in a subselect IFF it contains limiting attributes
3261 sub _chain_relationship {
3262   my ($self, $rel) = @_;
3263   my $source = $self->result_source;
3264   my $attrs = { %{$self->{attrs}||{}} };
3265
3266   # we need to take the prefetch the attrs into account before we
3267   # ->_resolve_join as otherwise they get lost - captainL
3268   my $join = $self->_merge_joinpref_attr( $attrs->{join}, $attrs->{prefetch} );
3269
3270   delete @{$attrs}{qw/join prefetch collapse group_by distinct select as columns +select +as +columns/};
3271
3272   my $seen = { %{ (delete $attrs->{seen_join}) || {} } };
3273
3274   my $from;
3275   my @force_subq_attrs = qw/offset rows group_by having/;
3276
3277   if (
3278     ($attrs->{from} && ref $attrs->{from} ne 'ARRAY')
3279       ||
3280     $self->_has_resolved_attr (@force_subq_attrs)
3281   ) {
3282     # Nuke the prefetch (if any) before the new $rs attrs
3283     # are resolved (prefetch is useless - we are wrapping
3284     # a subquery anyway).
3285     my $rs_copy = $self->search;
3286     $rs_copy->{attrs}{join} = $self->_merge_joinpref_attr (
3287       $rs_copy->{attrs}{join},
3288       delete $rs_copy->{attrs}{prefetch},
3289     );
3290
3291     $from = [{
3292       -rsrc   => $source,
3293       -alias  => $attrs->{alias},
3294       $attrs->{alias} => $rs_copy->as_query,
3295     }];
3296     delete @{$attrs}{@force_subq_attrs, qw/where bind/};
3297     $seen->{-relation_chain_depth} = 0;
3298   }
3299   elsif ($attrs->{from}) {  #shallow copy suffices
3300     $from = [ @{$attrs->{from}} ];
3301   }
3302   else {
3303     $from = [{
3304       -rsrc  => $source,
3305       -alias => $attrs->{alias},
3306       $attrs->{alias} => $source->from,
3307     }];
3308   }
3309
3310   my $jpath = ($seen->{-relation_chain_depth})
3311     ? $from->[-1][0]{-join_path}
3312     : [];
3313
3314   my @requested_joins = $source->_resolve_join(
3315     $join,
3316     $attrs->{alias},
3317     $seen,
3318     $jpath,
3319   );
3320
3321   push @$from, @requested_joins;
3322
3323   $seen->{-relation_chain_depth}++;
3324
3325   # if $self already had a join/prefetch specified on it, the requested
3326   # $rel might very well be already included. What we do in this case
3327   # is effectively a no-op (except that we bump up the chain_depth on
3328   # the join in question so we could tell it *is* the search_related)
3329   my $already_joined;
3330
3331   # we consider the last one thus reverse
3332   for my $j (reverse @requested_joins) {
3333     my ($last_j) = keys %{$j->[0]{-join_path}[-1]};
3334     if ($rel eq $last_j) {
3335       $j->[0]{-relation_chain_depth}++;
3336       $already_joined++;
3337       last;
3338     }
3339   }
3340
3341   unless ($already_joined) {
3342     push @$from, $source->_resolve_join(
3343       $rel,
3344       $attrs->{alias},
3345       $seen,
3346       $jpath,
3347     );
3348   }
3349
3350   $seen->{-relation_chain_depth}++;
3351
3352   return {%$attrs, from => $from, seen_join => $seen};
3353 }
3354
3355 sub _resolved_attrs {
3356   my $self = shift;
3357   return $self->{_attrs} if $self->{_attrs};
3358
3359   my $attrs  = { %{ $self->{attrs} || {} } };
3360   my $source = $self->result_source;
3361   my $alias  = $attrs->{alias};
3362
3363   # default selection list
3364   $attrs->{columns} = [ $source->columns ]
3365     unless List::Util::first { exists $attrs->{$_} } qw/columns cols select as/;
3366
3367   # merge selectors together
3368   for (qw/columns select as/) {
3369     $attrs->{$_} = $self->_merge_attr($attrs->{$_}, delete $attrs->{"+$_"})
3370       if $attrs->{$_} or $attrs->{"+$_"};
3371   }
3372
3373   # disassemble columns
3374   my (@sel, @as);
3375   if (my $cols = delete $attrs->{columns}) {
3376     for my $c (ref $cols eq 'ARRAY' ? @$cols : $cols) {
3377       if (ref $c eq 'HASH') {
3378         for my $as (sort keys %$c) {
3379           push @sel, $c->{$as};
3380           push @as, $as;
3381         }
3382       }
3383       else {
3384         push @sel, $c;
3385         push @as, $c;
3386       }
3387     }
3388   }
3389
3390   # when trying to weed off duplicates later do not go past this point -
3391   # everything added from here on is unbalanced "anyone's guess" stuff
3392   my $dedup_stop_idx = $#as;
3393
3394   push @as, @{ ref $attrs->{as} eq 'ARRAY' ? $attrs->{as} : [ $attrs->{as} ] }
3395     if $attrs->{as};
3396   push @sel, @{ ref $attrs->{select} eq 'ARRAY' ? $attrs->{select} : [ $attrs->{select} ] }
3397     if $attrs->{select};
3398
3399   # assume all unqualified selectors to apply to the current alias (legacy stuff)
3400   $_ = (ref $_ or $_ =~ /\./) ? $_ : "$alias.$_" for @sel;
3401
3402   # disqualify all $alias.col as-bits (inflate-map mandated)
3403   $_ = ($_ =~ /^\Q$alias.\E(.+)$/) ? $1 : $_ for @as;
3404
3405   # de-duplicate the result (remove *identical* select/as pairs)
3406   # and also die on duplicate {as} pointing to different {select}s
3407   # not using a c-style for as the condition is prone to shrinkage
3408   my $seen;
3409   my $i = 0;
3410   while ($i <= $dedup_stop_idx) {
3411     if ($seen->{"$sel[$i] \x00\x00 $as[$i]"}++) {
3412       splice @sel, $i, 1;
3413       splice @as, $i, 1;
3414       $dedup_stop_idx--;
3415     }
3416     elsif ($seen->{$as[$i]}++) {
3417       $self->throw_exception(
3418         "inflate_result() alias '$as[$i]' specified twice with different SQL-side {select}-ors"
3419       );
3420     }
3421     else {
3422       $i++;
3423     }
3424   }
3425
3426   $attrs->{select} = \@sel;
3427   $attrs->{as} = \@as;
3428
3429   $attrs->{from} ||= [{
3430     -rsrc   => $source,
3431     -alias  => $self->{attrs}{alias},
3432     $self->{attrs}{alias} => $source->from,
3433   }];
3434
3435   if ( $attrs->{join} || $attrs->{prefetch} ) {
3436
3437     $self->throw_exception ('join/prefetch can not be used with a custom {from}')
3438       if ref $attrs->{from} ne 'ARRAY';
3439
3440     my $join = (delete $attrs->{join}) || {};
3441
3442     if ( defined $attrs->{prefetch} ) {
3443       $join = $self->_merge_joinpref_attr( $join, $attrs->{prefetch} );
3444     }
3445
3446     $attrs->{from} =    # have to copy here to avoid corrupting the original
3447       [
3448         @{ $attrs->{from} },
3449         $source->_resolve_join(
3450           $join,
3451           $alias,
3452           { %{ $attrs->{seen_join} || {} } },
3453           ( $attrs->{seen_join} && keys %{$attrs->{seen_join}})
3454             ? $attrs->{from}[-1][0]{-join_path}
3455             : []
3456           ,
3457         )
3458       ];
3459   }
3460
3461   if ( defined $attrs->{order_by} ) {
3462     $attrs->{order_by} = (
3463       ref( $attrs->{order_by} ) eq 'ARRAY'
3464       ? [ @{ $attrs->{order_by} } ]
3465       : [ $attrs->{order_by} || () ]
3466     );
3467   }
3468
3469   if ($attrs->{group_by} and ref $attrs->{group_by} ne 'ARRAY') {
3470     $attrs->{group_by} = [ $attrs->{group_by} ];
3471   }
3472
3473   # generate the distinct induced group_by early, as prefetch will be carried via a
3474   # subquery (since a group_by is present)
3475   if (delete $attrs->{distinct}) {
3476     if ($attrs->{group_by}) {
3477       carp_unique ("Useless use of distinct on a grouped resultset ('distinct' is ignored when a 'group_by' is present)");
3478     }
3479     else {
3480       # distinct affects only the main selection part, not what prefetch may
3481       # add below.
3482       $attrs->{group_by} = $source->storage->_group_over_selection (
3483         $attrs->{from},
3484         $attrs->{select},
3485         $attrs->{order_by},
3486       );
3487     }
3488   }
3489
3490   # generate selections based on the prefetch helper
3491   my $prefetch;
3492   $prefetch = $self->_merge_joinpref_attr( {}, delete $attrs->{prefetch} )
3493     if defined $attrs->{prefetch};
3494
3495   if ($prefetch) {
3496
3497     $self->throw_exception("Unable to prefetch, resultset contains an unnamed selector $attrs->{_dark_selector}{string}")
3498       if $attrs->{_dark_selector};
3499
3500     $attrs->{collapse} = 1;
3501
3502     # this is a separate structure (we don't look in {from} directly)
3503     # as the resolver needs to shift things off the lists to work
3504     # properly (identical-prefetches on different branches)
3505     my $join_map = {};
3506     if (ref $attrs->{from} eq 'ARRAY') {
3507
3508       my $start_depth = $attrs->{seen_join}{-relation_chain_depth} || 0;
3509
3510       for my $j ( @{$attrs->{from}}[1 .. $#{$attrs->{from}} ] ) {
3511         next unless $j->[0]{-alias};
3512         next unless $j->[0]{-join_path};
3513         next if ($j->[0]{-relation_chain_depth} || 0) < $start_depth;
3514
3515         my @jpath = map { keys %$_ } @{$j->[0]{-join_path}};
3516
3517         my $p = $join_map;
3518         $p = $p->{$_} ||= {} for @jpath[ ($start_depth/2) .. $#jpath]; #only even depths are actual jpath boundaries
3519         push @{$p->{-join_aliases} }, $j->[0]{-alias};
3520       }
3521     }
3522
3523     my @prefetch = $source->_resolve_prefetch( $prefetch, $alias, $join_map );
3524
3525     # we need to somehow mark which columns came from prefetch
3526     if (@prefetch) {
3527       my $sel_end = $#{$attrs->{select}};
3528       $attrs->{_prefetch_selector_range} = [ $sel_end + 1, $sel_end + @prefetch ];
3529     }
3530
3531     push @{ $attrs->{select} }, (map { $_->[0] } @prefetch);
3532     push @{ $attrs->{as} }, (map { $_->[1] } @prefetch);
3533   }
3534
3535   if ( defined List::Util::first { $_ =~ /\./ } @{$attrs->{as}} ) {
3536     $attrs->{_related_results_construction} = 1;
3537   }
3538   else {
3539     $attrs->{collapse} = 0;
3540   }
3541
3542   # run through the resulting joinstructure (starting from our current slot)
3543   # and unset collapse if proven unnesessary
3544   #
3545   # also while we are at it find out if the current root source has
3546   # been premultiplied by previous related_source chaining
3547   #
3548   # this allows to predict whether a root object with all other relation
3549   # data set to NULL is in fact unique
3550   if ($attrs->{collapse}) {
3551
3552     if (ref $attrs->{from} eq 'ARRAY') {
3553
3554       if (@{$attrs->{from}} <= 1) {
3555         # no joins - no collapse
3556         $attrs->{collapse} = 0;
3557       }
3558       else {
3559         # find where our table-spec starts
3560         my @fromlist = @{$attrs->{from}};
3561         while (@fromlist) {
3562           my $t = shift @fromlist;
3563
3564           my $is_multi;
3565           # me vs join from-spec distinction - a ref means non-root
3566           if (ref $t eq 'ARRAY') {
3567             $t = $t->[0];
3568             $is_multi ||= ! $t->{-is_single};
3569           }
3570           last if ($t->{-alias} && $t->{-alias} eq $alias);
3571           $attrs->{_main_source_premultiplied} ||= $is_multi;
3572         }
3573
3574         # no non-singles remaining, nor any premultiplication - nothing to collapse
3575         if (
3576           ! $attrs->{_main_source_premultiplied}
3577             and
3578           ! List::Util::first { ! $_->[0]{-is_single} } @fromlist
3579         ) {
3580           $attrs->{collapse} = 0;
3581         }
3582       }
3583     }
3584
3585     else {
3586       # if we can not analyze the from - err on the side of safety
3587       $attrs->{_main_source_premultiplied} = 1;
3588     }
3589   }
3590
3591   # if both page and offset are specified, produce a combined offset
3592   # even though it doesn't make much sense, this is what pre 081xx has
3593   # been doing
3594   if (my $page = delete $attrs->{page}) {
3595     $attrs->{offset} =
3596       ($attrs->{rows} * ($page - 1))
3597             +
3598       ($attrs->{offset} || 0)
3599     ;
3600   }
3601
3602   return $self->{_attrs} = $attrs;
3603 }
3604
3605 sub _rollout_attr {
3606   my ($self, $attr) = @_;
3607
3608   if (ref $attr eq 'HASH') {
3609     return $self->_rollout_hash($attr);
3610   } elsif (ref $attr eq 'ARRAY') {
3611     return $self->_rollout_array($attr);
3612   } else {
3613     return [$attr];
3614   }
3615 }
3616
3617 sub _rollout_array {
3618   my ($self, $attr) = @_;
3619
3620   my @rolled_array;
3621   foreach my $element (@{$attr}) {
3622     if (ref $element eq 'HASH') {
3623       push( @rolled_array, @{ $self->_rollout_hash( $element ) } );
3624     } elsif (ref $element eq 'ARRAY') {
3625       #  XXX - should probably recurse here
3626       push( @rolled_array, @{$self->_rollout_array($element)} );
3627     } else {
3628       push( @rolled_array, $element );
3629     }
3630   }
3631   return \@rolled_array;
3632 }
3633
3634 sub _rollout_hash {
3635   my ($self, $attr) = @_;
3636
3637   my @rolled_array;
3638   foreach my $key (keys %{$attr}) {
3639     push( @rolled_array, { $key => $attr->{$key} } );
3640   }
3641   return \@rolled_array;
3642 }
3643
3644 sub _calculate_score {
3645   my ($self, $a, $b) = @_;
3646
3647   if (defined $a xor defined $b) {
3648     return 0;
3649   }
3650   elsif (not defined $a) {
3651     return 1;
3652   }
3653
3654   if (ref $b eq 'HASH') {
3655     my ($b_key) = keys %{$b};
3656     if (ref $a eq 'HASH') {
3657       my ($a_key) = keys %{$a};
3658       if ($a_key eq $b_key) {
3659         return (1 + $self->_calculate_score( $a->{$a_key}, $b->{$b_key} ));
3660       } else {
3661         return 0;
3662       }
3663     } else {
3664       return ($a eq $b_key) ? 1 : 0;
3665     }
3666   } else {
3667     if (ref $a eq 'HASH') {
3668       my ($a_key) = keys %{$a};
3669       return ($b eq $a_key) ? 1 : 0;
3670     } else {
3671       return ($b eq $a) ? 1 : 0;
3672     }
3673   }
3674 }
3675
3676 sub _merge_joinpref_attr {
3677   my ($self, $orig, $import) = @_;
3678
3679   return $import unless defined($orig);
3680   return $orig unless defined($import);
3681
3682   $orig = $self->_rollout_attr($orig);
3683   $import = $self->_rollout_attr($import);
3684
3685   my $seen_keys;
3686   foreach my $import_element ( @{$import} ) {
3687     # find best candidate from $orig to merge $b_element into
3688     my $best_candidate = { position => undef, score => 0 }; my $position = 0;
3689     foreach my $orig_element ( @{$orig} ) {
3690       my $score = $self->_calculate_score( $orig_element, $import_element );
3691       if ($score > $best_candidate->{score}) {
3692         $best_candidate->{position} = $position;
3693         $best_candidate->{score} = $score;
3694       }
3695       $position++;
3696     }
3697     my ($import_key) = ( ref $import_element eq 'HASH' ) ? keys %{$import_element} : ($import_element);
3698     $import_key = '' if not defined $import_key;
3699
3700     if ($best_candidate->{score} == 0 || exists $seen_keys->{$import_key}) {
3701       push( @{$orig}, $import_element );
3702     } else {
3703       my $orig_best = $orig->[$best_candidate->{position}];
3704       # merge orig_best and b_element together and replace original with merged
3705       if (ref $orig_best ne 'HASH') {
3706         $orig->[$best_candidate->{position}] = $import_element;
3707       } elsif (ref $import_element eq 'HASH') {
3708         my ($key) = keys %{$orig_best};
3709         $orig->[$best_candidate->{position}] = { $key => $self->_merge_joinpref_attr($orig_best->{$key}, $import_element->{$key}) };
3710       }
3711     }
3712     $seen_keys->{$import_key} = 1; # don't merge the same key twice
3713   }
3714
3715   return @$orig ? $orig : ();
3716 }
3717
3718 {
3719   my $hm;
3720
3721   sub _merge_attr {
3722     $hm ||= do {
3723       require Hash::Merge;
3724       my $hm = Hash::Merge->new;
3725
3726       $hm->specify_behavior({
3727         SCALAR => {
3728           SCALAR => sub {
3729             my ($defl, $defr) = map { defined $_ } (@_[0,1]);
3730
3731             if ($defl xor $defr) {
3732               return [ $defl ? $_[0] : $_[1] ];
3733             }
3734             elsif (! $defl) {
3735               return [];
3736             }
3737             elsif (__HM_DEDUP and $_[0] eq $_[1]) {
3738               return [ $_[0] ];
3739             }
3740             else {
3741               return [$_[0], $_[1]];
3742             }
3743           },
3744           ARRAY => sub {
3745             return $_[1] if !defined $_[0];
3746             return $_[1] if __HM_DEDUP and List::Util::first { $_ eq $_[0] } @{$_[1]};
3747             return [$_[0], @{$_[1]}]
3748           },
3749           HASH  => sub {
3750             return [] if !defined $_[0] and !keys %{$_[1]};
3751             return [ $_[1] ] if !defined $_[0];
3752             return [ $_[0] ] if !keys %{$_[1]};
3753             return [$_[0], $_[1]]
3754           },
3755         },
3756         ARRAY => {
3757           SCALAR => sub {
3758             return $_[0] if !defined $_[1];
3759             return $_[0] if __HM_DEDUP and List::Util::first { $_ eq $_[1] } @{$_[0]};
3760             return [@{$_[0]}, $_[1]]
3761           },
3762           ARRAY => sub {
3763             my @ret = @{$_[0]} or return $_[1];
3764             return [ @ret, @{$_[1]} ] unless __HM_DEDUP;
3765             my %idx = map { $_ => 1 } @ret;
3766             push @ret, grep { ! defined $idx{$_} } (@{$_[1]});
3767             \@ret;
3768           },
3769           HASH => sub {
3770             return [ $_[1] ] if ! @{$_[0]};
3771             return $_[0] if !keys %{$_[1]};
3772             return $_[0] if __HM_DEDUP and List::Util::first { $_ eq $_[1] } @{$_[0]};
3773             return [ @{$_[0]}, $_[1] ];
3774           },
3775         },
3776         HASH => {
3777           SCALAR => sub {
3778             return [] if !keys %{$_[0]} and !defined $_[1];
3779             return [ $_[0] ] if !defined $_[1];
3780             return [ $_[1] ] if !keys %{$_[0]};
3781             return [$_[0], $_[1]]
3782           },
3783           ARRAY => sub {
3784             return [] if !keys %{$_[0]} and !@{$_[1]};
3785             return [ $_[0] ] if !@{$_[1]};
3786             return $_[1] if !keys %{$_[0]};
3787             return $_[1] if __HM_DEDUP and List::Util::first { $_ eq $_[0] } @{$_[1]};
3788             return [ $_[0], @{$_[1]} ];
3789           },
3790           HASH => sub {
3791             return [] if !keys %{$_[0]} and !keys %{$_[1]};
3792             return [ $_[0] ] if !keys %{$_[1]};
3793             return [ $_[1] ] if !keys %{$_[0]};
3794             return [ $_[0] ] if $_[0] eq $_[1];
3795             return [ $_[0], $_[1] ];
3796           },
3797         }
3798       } => 'DBIC_RS_ATTR_MERGER');
3799       $hm;
3800     };
3801
3802     return $hm->merge ($_[1], $_[2]);
3803   }
3804 }
3805
3806 sub STORABLE_freeze {
3807   my ($self, $cloning) = @_;
3808   my $to_serialize = { %$self };
3809
3810   # A cursor in progress can't be serialized (and would make little sense anyway)
3811   # the parser can be regenerated (and can't be serialized)
3812   delete @{$to_serialize}{qw/cursor _row_parser _result_inflator/};
3813
3814   # nor is it sensical to store a not-yet-fired-count pager
3815   if ($to_serialize->{pager} and ref $to_serialize->{pager}{total_entries} eq 'CODE') {
3816     delete $to_serialize->{pager};
3817   }
3818
3819   Storable::nfreeze($to_serialize);
3820 }
3821
3822 # need this hook for symmetry
3823 sub STORABLE_thaw {
3824   my ($self, $cloning, $serialized) = @_;
3825
3826   %$self = %{ Storable::thaw($serialized) };
3827
3828   $self;
3829 }
3830
3831
3832 =head2 throw_exception
3833
3834 See L<DBIx::Class::Schema/throw_exception> for details.
3835
3836 =cut
3837
3838 sub throw_exception {
3839   my $self=shift;
3840
3841   if (ref $self and my $rsrc = $self->result_source) {
3842     $rsrc->throw_exception(@_)
3843   }
3844   else {
3845     DBIx::Class::Exception->throw(@_);
3846   }
3847 }
3848
3849 1;
3850
3851 __END__
3852
3853 # XXX: FIXME: Attributes docs need clearing up
3854
3855 =head1 ATTRIBUTES
3856
3857 Attributes are used to refine a ResultSet in various ways when
3858 searching for data. They can be passed to any method which takes an
3859 C<\%attrs> argument. See L</search>, L</search_rs>, L</find>,
3860 L</count>.
3861
3862 Default attributes can be set on the result class using
3863 L<DBIx::Class::ResultSource/resultset_attributes>.  (Please read
3864 the CAVEATS on that feature before using it!)
3865
3866 These are in no particular order:
3867
3868 =head2 order_by
3869
3870 =over 4
3871
3872 =item Value: ( $order_by | \@order_by | \%order_by )
3873
3874 =back
3875
3876 Which column(s) to order the results by.
3877
3878 [The full list of suitable values is documented in
3879 L<SQL::Abstract/"ORDER BY CLAUSES">; the following is a summary of
3880 common options.]
3881
3882 If a single column name, or an arrayref of names is supplied, the
3883 argument is passed through directly to SQL. The hashref syntax allows
3884 for connection-agnostic specification of ordering direction:
3885
3886  For descending order:
3887
3888   order_by => { -desc => [qw/col1 col2 col3/] }
3889
3890  For explicit ascending order:
3891
3892   order_by => { -asc => 'col' }
3893
3894 The old scalarref syntax (i.e. order_by => \'year DESC') is still
3895 supported, although you are strongly encouraged to use the hashref
3896 syntax as outlined above.
3897
3898 =head2 columns
3899
3900 =over 4
3901
3902 =item Value: \@columns | \%columns | $column
3903
3904 =back
3905
3906 Shortcut to request a particular set of columns to be retrieved. Each
3907 column spec may be a string (a table column name), or a hash (in which
3908 case the key is the C<as> value, and the value is used as the C<select>
3909 expression). Adds C<me.> onto the start of any column without a C<.> in
3910 it and sets C<select> from that, then auto-populates C<as> from
3911 C<select> as normal. (You may also use the C<cols> attribute, as in
3912 earlier versions of DBIC.)
3913
3914 Essentially C<columns> does the same as L</select> and L</as>.
3915
3916     columns => [ 'foo', { bar => 'baz' } ]
3917
3918 is the same as
3919
3920     select => [qw/foo baz/],
3921     as => [qw/foo bar/]
3922
3923 =head2 +columns
3924
3925 =over 4
3926
3927 =item Value: \@columns
3928
3929 =back
3930
3931 Indicates additional columns to be selected from storage. Works the same
3932 as L</columns> but adds columns to the selection. (You may also use the
3933 C<include_columns> attribute, as in earlier versions of DBIC). For
3934 example:-
3935
3936   $schema->resultset('CD')->search(undef, {
3937     '+columns' => ['artist.name'],
3938     join => ['artist']
3939   });
3940
3941 would return all CDs and include a 'name' column to the information
3942 passed to object inflation. Note that the 'artist' is the name of the
3943 column (or relationship) accessor, and 'name' is the name of the column
3944 accessor in the related table.
3945
3946 B<NOTE:> You need to explicitly quote '+columns' when defining the attribute.
3947 Not doing so causes Perl to incorrectly interpret +columns as a bareword with a
3948 unary plus operator before it.
3949
3950 =head2 include_columns
3951
3952 =over 4
3953
3954 =item Value: \@columns
3955
3956 =back
3957
3958 Deprecated.  Acts as a synonym for L</+columns> for backward compatibility.
3959
3960 =head2 select
3961
3962 =over 4
3963
3964 =item Value: \@select_columns
3965
3966 =back
3967
3968 Indicates which columns should be selected from the storage. You can use
3969 column names, or in the case of RDBMS back ends, function or stored procedure
3970 names:
3971
3972   $rs = $schema->resultset('Employee')->search(undef, {
3973     select => [
3974       'name',
3975       { count => 'employeeid' },
3976       { max => { length => 'name' }, -as => 'longest_name' }
3977     ]
3978   });
3979
3980   # Equivalent SQL
3981   SELECT name, COUNT( employeeid ), MAX( LENGTH( name ) ) AS longest_name FROM employee
3982
3983 B<NOTE:> You will almost always need a corresponding L</as> attribute when you
3984 use L</select>, to instruct DBIx::Class how to store the result of the column.
3985 Also note that the L</as> attribute has nothing to do with the SQL-side 'AS'
3986 identifier aliasing. You can however alias a function, so you can use it in
3987 e.g. an C<ORDER BY> clause. This is done via the C<-as> B<select function
3988 attribute> supplied as shown in the example above.
3989
3990 B<NOTE:> You need to explicitly quote '+select'/'+as' when defining the attributes.
3991 Not doing so causes Perl to incorrectly interpret them as a bareword with a
3992 unary plus operator before it.
3993
3994 =head2 +select
3995
3996 =over 4
3997
3998 Indicates additional columns to be selected from storage.  Works the same as
3999 L</select> but adds columns to the default selection, instead of specifying
4000 an explicit list.
4001
4002 =back
4003
4004 =head2 as
4005
4006 =over 4
4007
4008 =item Value: \@inflation_names
4009
4010 =back
4011
4012 Indicates column names for object inflation. That is L</as> indicates the
4013 slot name in which the column value will be stored within the
4014 L<Row|DBIx::Class::Row> object. The value will then be accessible via this
4015 identifier by the C<get_column> method (or via the object accessor B<if one
4016 with the same name already exists>) as shown below. The L</as> attribute has
4017 B<nothing to do> with the SQL-side C<AS>. See L</select> for details.
4018
4019   $rs = $schema->resultset('Employee')->search(undef, {
4020     select => [
4021       'name',
4022       { count => 'employeeid' },
4023       { max => { length => 'name' }, -as => 'longest_name' }
4024     ],
4025     as => [qw/
4026       name
4027       employee_count
4028       max_name_length
4029     /],
4030   });
4031
4032 If the object against which the search is performed already has an accessor
4033 matching a column name specified in C<as>, the value can be retrieved using
4034 the accessor as normal:
4035
4036   my $name = $employee->name();
4037
4038 If on the other hand an accessor does not exist in the object, you need to
4039 use C<get_column> instead:
4040
4041   my $employee_count = $employee->get_column('employee_count');
4042
4043 You can create your own accessors if required - see
4044 L<DBIx::Class::Manual::Cookbook> for details.
4045
4046 =head2 +as
4047
4048 =over 4
4049
4050 Indicates additional column names for those added via L</+select>. See L</as>.
4051
4052 =back
4053
4054 =head2 join
4055
4056 =over 4
4057
4058 =item Value: ($rel_name | \@rel_names | \%rel_names)
4059
4060 =back
4061
4062 Contains a list of relationships that should be joined for this query.  For
4063 example:
4064
4065   # Get CDs by Nine Inch Nails
4066   my $rs = $schema->resultset('CD')->search(
4067     { 'artist.name' => 'Nine Inch Nails' },
4068     { join => 'artist' }
4069   );
4070
4071 Can also contain a hash reference to refer to the other relation's relations.
4072 For example:
4073
4074   package MyApp::Schema::Track;
4075   use base qw/DBIx::Class/;
4076   __PACKAGE__->table('track');
4077   __PACKAGE__->add_columns(qw/trackid cd position title/);
4078   __PACKAGE__->set_primary_key('trackid');
4079   __PACKAGE__->belongs_to(cd => 'MyApp::Schema::CD');
4080   1;
4081
4082   # In your application
4083   my $rs = $schema->resultset('Artist')->search(
4084     { 'track.title' => 'Teardrop' },
4085     {
4086       join     => { cd => 'track' },
4087       order_by => 'artist.name',
4088     }
4089   );
4090
4091 You need to use the relationship (not the table) name in  conditions,
4092 because they are aliased as such. The current table is aliased as "me", so
4093 you need to use me.column_name in order to avoid ambiguity. For example:
4094
4095   # Get CDs from 1984 with a 'Foo' track
4096   my $rs = $schema->resultset('CD')->search(
4097     {
4098       'me.year' => 1984,
4099       'tracks.name' => 'Foo'
4100     },
4101     { join => 'tracks' }
4102   );
4103
4104 If the same join is supplied twice, it will be aliased to <rel>_2 (and
4105 similarly for a third time). For e.g.
4106
4107   my $rs = $schema->resultset('Artist')->search({
4108     'cds.title'   => 'Down to Earth',
4109     'cds_2.title' => 'Popular',
4110   }, {
4111     join => [ qw/cds cds/ ],
4112   });
4113
4114 will return a set of all artists that have both a cd with title 'Down
4115 to Earth' and a cd with title 'Popular'.
4116
4117 If you want to fetch related objects from other tables as well, see L</prefetch>
4118 below.
4119
4120  NOTE: An internal join-chain pruner will discard certain joins while
4121  constructing the actual SQL query, as long as the joins in question do not
4122  affect the retrieved result. This for example includes 1:1 left joins
4123  that are not part of the restriction specification (WHERE/HAVING) nor are
4124  a part of the query selection.
4125
4126 For more help on using joins with search, see L<DBIx::Class::Manual::Joining>.
4127
4128 =head2 collapse
4129
4130 =over 4
4131
4132 =item Value: (0 | 1)
4133
4134 =back
4135
4136 When set to a true value, indicates that any rows fetched from joined has_many
4137 relationships are to be aggregated into the corresponding "parent" object. For
4138 example, the resultset:
4139
4140   my $rs = $schema->resultset('CD')->search({}, {
4141     '+columns' => [ qw/ tracks.title tracks.position / ],
4142     join => 'tracks',
4143     collapse => 1,
4144   });
4145
4146 While executing the following query:
4147
4148   SELECT me.*, tracks.title, tracks.position
4149     FROM cd me
4150     LEFT JOIN track tracks
4151       ON tracks.cdid = me.cdid
4152
4153 Will return only as many objects as there are rows in the CD source, even
4154 though the result of the query may span many rows. Each of these CD objects
4155 will in turn have multiple "Track" objects hidden behind the has_many
4156 generated accessor C<tracks>. Without C<< collapse => 1 >>, the return values
4157 of this resultset would be as many CD objects as there are tracks (a "Cartesian
4158 product"), with each CD object containing exactly one of all fetched Track data.
4159
4160 When a collapse is requested on a non-ordered resultset, an order by some
4161 unique part of the main source (the left-most table) is inserted automatically.
4162 This is done so that the resultset is allowed to be "lazy" - calling
4163 L<< $rs->next|/next >> will fetch only as many rows as it needs to build the next
4164 object with all of its related data.
4165
4166 If an L</order_by> is already declared, and orders the resultset in a way that
4167 makes collapsing as described above impossible (e.g. C<< ORDER BY
4168 has_many_rel.column >> or C<ORDER BY RANDOM()>), DBIC will automatically
4169 switch to "eager" mode and slurp the entire resultset before consturcting the
4170 first object returned by L</next>.
4171
4172 Setting this attribute on a resultset that does not join any has_many
4173 relations is a no-op.
4174
4175 For a more in-depth discussion, see L</PREFETCHING>.
4176
4177 =head2 prefetch
4178
4179 =over 4
4180
4181 =item Value: ($rel_name | \@rel_names | \%rel_names)
4182
4183 =back
4184
4185 This attribute is a shorthand for specifying a L</join> spec, adding all
4186 columns from the joined related sources as L</+columns> and setting
4187 L</collapse> to a true value. For example, the following two queries are
4188 equivalent:
4189
4190   my $rs = $schema->resultset('Artist')->search({}, {
4191     prefetch => { cds => ['genre', 'tracks' ] },
4192   });
4193
4194 and
4195
4196   my $rs = $schema->resultset('Artist')->search({}, {
4197     join => { cds => ['genre', 'tracks' ] },
4198     collapse => 1,
4199     '+columns' => [
4200       (map
4201         { +{ "cds.$_" => "cds.$_" } }
4202         $schema->source('Artist')->related_source('cds')->columns
4203       ),
4204       (map
4205         { +{ "cds.genre.$_" => "genre.$_" } }
4206         $schema->source('Artist')->related_source('cds')->related_source('genre')->columns
4207       ),
4208       (map
4209         { +{ "cds.tracks.$_" => "tracks.$_" } }
4210         $schema->source('Artist')->related_source('cds')->related_source('tracks')->columns
4211       ),
4212     ],
4213   });
4214
4215 Both producing the following SQL:
4216
4217   SELECT  me.artistid, me.name, me.rank, me.charfield,
4218           cds.cdid, cds.artist, cds.title, cds.year, cds.genreid, cds.single_track,
4219           genre.genreid, genre.name,
4220           tracks.trackid, tracks.cd, tracks.position, tracks.title, tracks.last_updated_on, tracks.last_updated_at
4221     FROM artist me
4222     LEFT JOIN cd cds
4223       ON cds.artist = me.artistid
4224     LEFT JOIN genre genre
4225       ON genre.genreid = cds.genreid
4226     LEFT JOIN track tracks
4227       ON tracks.cd = cds.cdid
4228   ORDER BY me.artistid
4229
4230 While L</prefetch> implies a L</join>, it is ok to mix the two together, as
4231 the arguments are properly merged and generally do the right thing. For
4232 example, you may want to do the following:
4233
4234   my $artists_and_cds_without_genre = $schema->resultset('Artist')->search(
4235     { 'genre.genreid' => undef },
4236     {
4237       join => { cds => 'genre' },
4238       prefetch => 'cds',
4239     }
4240   );
4241
4242 Which generates the following SQL:
4243
4244   SELECT  me.artistid, me.name, me.rank, me.charfield,
4245           cds.cdid, cds.artist, cds.title, cds.year, cds.genreid, cds.single_track
4246     FROM artist me
4247     LEFT JOIN cd cds
4248       ON cds.artist = me.artistid
4249     LEFT JOIN genre genre
4250       ON genre.genreid = cds.genreid
4251   WHERE genre.genreid IS NULL
4252   ORDER BY me.artistid
4253
4254 For a more in-depth discussion, see L</PREFETCHING>.
4255
4256 =head2 alias
4257
4258 =over 4
4259
4260 =item Value: $source_alias
4261
4262 =back
4263
4264 Sets the source alias for the query.  Normally, this defaults to C<me>, but
4265 nested search queries (sub-SELECTs) might need specific aliases set to
4266 reference inner queries.  For example:
4267
4268    my $q = $rs
4269       ->related_resultset('CDs')
4270       ->related_resultset('Tracks')
4271       ->search({
4272          'track.id' => { -ident => 'none_search.id' },
4273       })
4274       ->as_query;
4275
4276    my $ids = $self->search({
4277       -not_exists => $q,
4278    }, {
4279       alias    => 'none_search',
4280       group_by => 'none_search.id',
4281    })->get_column('id')->as_query;
4282
4283    $self->search({ id => { -in => $ids } })
4284
4285 This attribute is directly tied to L</current_source_alias>.
4286
4287 =head2 page
4288
4289 =over 4
4290
4291 =item Value: $page
4292
4293 =back
4294
4295 Makes the resultset paged and specifies the page to retrieve. Effectively
4296 identical to creating a non-pages resultset and then calling ->page($page)
4297 on it.
4298
4299 If L</rows> attribute is not specified it defaults to 10 rows per page.
4300
4301 When you have a paged resultset, L</count> will only return the number
4302 of rows in the page. To get the total, use the L</pager> and call
4303 C<total_entries> on it.
4304
4305 =head2 rows
4306
4307 =over 4
4308
4309 =item Value: $rows
4310
4311 =back
4312
4313 Specifies the maximum number of rows for direct retrieval or the number of
4314 rows per page if the page attribute or method is used.
4315
4316 =head2 offset
4317
4318 =over 4
4319
4320 =item Value: $offset
4321
4322 =back
4323
4324 Specifies the (zero-based) row number for the  first row to be returned, or the
4325 of the first row of the first page if paging is used.
4326
4327 =head2 software_limit
4328
4329 =over 4
4330
4331 =item Value: (0 | 1)
4332
4333 =back
4334
4335 When combined with L</rows> and/or L</offset> the generated SQL will not
4336 include any limit dialect stanzas. Instead the entire result will be selected
4337 as if no limits were specified, and DBIC will perform the limit locally, by
4338 artificially advancing and finishing the resulting L</cursor>.
4339
4340 This is the recommended way of performing resultset limiting when no sane RDBMS
4341 implementation is available (e.g.
4342 L<Sybase ASE|DBIx::Class::Storage::DBI::Sybase::ASE> using the
4343 L<Generic Sub Query|DBIx::Class::SQLMaker::LimitDialects/GenericSubQ> hack)
4344
4345 =head2 group_by
4346
4347 =over 4
4348
4349 =item Value: \@columns
4350
4351 =back
4352
4353 A arrayref of columns to group by. Can include columns of joined tables.
4354
4355   group_by => [qw/ column1 column2 ... /]
4356
4357 =head2 having
4358
4359 =over 4
4360
4361 =item Value: $condition
4362
4363 =back
4364
4365 HAVING is a select statement attribute that is applied between GROUP BY and
4366 ORDER BY. It is applied to the after the grouping calculations have been
4367 done.
4368
4369   having => { 'count_employee' => { '>=', 100 } }
4370
4371 or with an in-place function in which case literal SQL is required:
4372
4373   having => \[ 'count(employee) >= ?', [ count => 100 ] ]
4374
4375 =head2 distinct
4376
4377 =over 4
4378
4379 =item Value: (0 | 1)
4380
4381 =back
4382
4383 Set to 1 to group by all columns. If the resultset already has a group_by
4384 attribute, this setting is ignored and an appropriate warning is issued.
4385
4386 =head2 where
4387
4388 =over 4
4389
4390 Adds to the WHERE clause.
4391
4392   # only return rows WHERE deleted IS NULL for all searches
4393   __PACKAGE__->resultset_attributes({ where => { deleted => undef } });
4394
4395 Can be overridden by passing C<< { where => undef } >> as an attribute
4396 to a resultset.
4397
4398 For more complicated where clauses see L<SQL::Abstract/WHERE CLAUSES>.
4399
4400 =back
4401
4402 =head2 cache
4403
4404 Set to 1 to cache search results. This prevents extra SQL queries if you
4405 revisit rows in your ResultSet:
4406
4407   my $resultset = $schema->resultset('Artist')->search( undef, { cache => 1 } );
4408
4409   while( my $artist = $resultset->next ) {
4410     ... do stuff ...
4411   }
4412
4413   $rs->first; # without cache, this would issue a query
4414
4415 By default, searches are not cached.
4416
4417 For more examples of using these attributes, see
4418 L<DBIx::Class::Manual::Cookbook>.
4419
4420 =head2 for
4421
4422 =over 4
4423
4424 =item Value: ( 'update' | 'shared' | \$scalar )
4425
4426 =back
4427
4428 Set to 'update' for a SELECT ... FOR UPDATE or 'shared' for a SELECT
4429 ... FOR SHARED. If \$scalar is passed, this is taken directly and embedded in the
4430 query.
4431
4432 =head1 PREFETCHING
4433
4434 DBIx::Class supports arbitrary related data prefetching from multiple related
4435 sources. Any combination of relationship types and column sets are supported.
4436 If L<collapsing|/collapse> is requested, there is an additional requirement of
4437 selecting enough data to make every individual object uniquely identifiable.
4438
4439 Here are some more involved examples, based on the following relationship map:
4440
4441   # Assuming:
4442   My::Schema::CD->belongs_to( artist      => 'My::Schema::Artist'     );
4443   My::Schema::CD->might_have( liner_note  => 'My::Schema::LinerNotes' );
4444   My::Schema::CD->has_many(   tracks      => 'My::Schema::Track'      );
4445
4446   My::Schema::Artist->belongs_to( record_label => 'My::Schema::RecordLabel' );
4447
4448   My::Schema::Track->has_many( guests => 'My::Schema::Guest' );
4449
4450
4451
4452   my $rs = $schema->resultset('Tag')->search(
4453     undef,
4454     {
4455       prefetch => {
4456         cd => 'artist'
4457       }
4458     }
4459   );
4460
4461 The initial search results in SQL like the following:
4462
4463   SELECT tag.*, cd.*, artist.* FROM tag
4464   JOIN cd ON tag.cd = cd.cdid
4465   JOIN artist ON cd.artist = artist.artistid
4466
4467 L<DBIx::Class> has no need to go back to the database when we access the
4468 C<cd> or C<artist> relationships, which saves us two SQL statements in this
4469 case.
4470
4471 Simple prefetches will be joined automatically, so there is no need
4472 for a C<join> attribute in the above search.
4473
4474 The L</prefetch> attribute can be used with any of the relationship types
4475 and multiple prefetches can be specified together. Below is a more complex
4476 example that prefetches a CD's artist, its liner notes (if present),
4477 the cover image, the tracks on that CD, and the guests on those
4478 tracks.
4479
4480   my $rs = $schema->resultset('CD')->search(
4481     undef,
4482     {
4483       prefetch => [
4484         { artist => 'record_label'},  # belongs_to => belongs_to
4485         'liner_note',                 # might_have
4486         'cover_image',                # has_one
4487         { tracks => 'guests' },       # has_many => has_many
4488       ]
4489     }
4490   );
4491
4492 This will produce SQL like the following:
4493
4494   SELECT cd.*, artist.*, record_label.*, liner_note.*, cover_image.*,
4495          tracks.*, guests.*
4496     FROM cd me
4497     JOIN artist artist
4498       ON artist.artistid = me.artistid
4499     JOIN record_label record_label
4500       ON record_label.labelid = artist.labelid
4501     LEFT JOIN track tracks
4502       ON tracks.cdid = me.cdid
4503     LEFT JOIN guest guests
4504       ON guests.trackid = track.trackid
4505     LEFT JOIN liner_notes liner_note
4506       ON liner_note.cdid = me.cdid
4507     JOIN cd_artwork cover_image
4508       ON cover_image.cdid = me.cdid
4509   ORDER BY tracks.cd
4510
4511 Now the C<artist>, C<record_label>, C<liner_note>, C<cover_image>,
4512 C<tracks>, and C<guests> of the CD will all be available through the
4513 relationship accessors without the need for additional queries to the
4514 database.
4515
4516 =head3 CAVEATS
4517
4518 Prefetch does a lot of deep magic. As such, it may not behave exactly
4519 as you might expect.
4520
4521 =over 4
4522
4523 =item *
4524
4525 Prefetch uses the L</cache> to populate the prefetched relationships. This
4526 may or may not be what you want.
4527
4528 =item *
4529
4530 If you specify a condition on a prefetched relationship, ONLY those
4531 rows that match the prefetched condition will be fetched into that relationship.
4532 This means that adding prefetch to a search() B<may alter> what is returned by
4533 traversing a relationship. So, if you have C<< Artist->has_many(CDs) >> and you do
4534
4535   my $artist_rs = $schema->resultset('Artist')->search({
4536       'cds.year' => 2008,
4537   }, {
4538       join => 'cds',
4539   });
4540
4541   my $count = $artist_rs->first->cds->count;
4542
4543   my $artist_rs_prefetch = $artist_rs->search( {}, { prefetch => 'cds' } );
4544
4545   my $prefetch_count = $artist_rs_prefetch->first->cds->count;
4546
4547   cmp_ok( $count, '==', $prefetch_count, "Counts should be the same" );
4548
4549 That cmp_ok() may or may not pass depending on the datasets involved. In other
4550 words the C<WHERE> condition would apply to the entire dataset, just like
4551 it would in regular SQL. If you want to add a condition only to the "right side"
4552 of a C<LEFT JOIN> - consider declaring and using a L<relationship with a custom
4553 condition|DBIx::Class::Relationship::Base/condition>
4554
4555 =back
4556
4557 =head1 DBIC BIND VALUES
4558
4559 Because DBIC may need more information to bind values than just the column name
4560 and value itself, it uses a special format for both passing and receiving bind
4561 values.  Each bind value should be composed of an arrayref of
4562 C<< [ \%args => $val ] >>.  The format of C<< \%args >> is currently:
4563
4564 =over 4
4565
4566 =item dbd_attrs
4567
4568 If present (in any form), this is what is being passed directly to bind_param.
4569 Note that different DBD's expect different bind args.  (e.g. DBD::SQLite takes
4570 a single numerical type, while DBD::Pg takes a hashref if bind options.)
4571
4572 If this is specified, all other bind options described below are ignored.
4573
4574 =item sqlt_datatype
4575
4576 If present, this is used to infer the actual bind attribute by passing to
4577 C<< $resolved_storage->bind_attribute_by_data_type() >>.  Defaults to the
4578 "data_type" from the L<add_columns column info|DBIx::Class::ResultSource/add_columns>.
4579
4580 Note that the data type is somewhat freeform (hence the sqlt_ prefix);
4581 currently drivers are expected to "Do the Right Thing" when given a common
4582 datatype name.  (Not ideal, but that's what we got at this point.)
4583
4584 =item sqlt_size
4585
4586 Currently used to correctly allocate buffers for bind_param_inout().
4587 Defaults to "size" from the L<add_columns column info|DBIx::Class::ResultSource/add_columns>,
4588 or to a sensible value based on the "data_type".
4589
4590 =item dbic_colname
4591
4592 Used to fill in missing sqlt_datatype and sqlt_size attributes (if they are
4593 explicitly specified they are never overriden).  Also used by some weird DBDs,
4594 where the column name should be available at bind_param time (e.g. Oracle).
4595
4596 =back
4597
4598 For backwards compatibility and convenience, the following shortcuts are
4599 supported:
4600
4601   [ $name => $val ] === [ { dbic_colname => $name }, $val ]
4602   [ \$dt  => $val ] === [ { sqlt_datatype => $dt }, $val ]
4603   [ undef,   $val ] === [ {}, $val ]
4604
4605 =head1 AUTHOR AND CONTRIBUTORS
4606
4607 See L<AUTHOR|DBIx::Class/AUTHOR> and L<CONTRIBUTORS|DBIx::Class/CONTRIBUTORS> in DBIx::Class
4608
4609 =head1 LICENSE
4610
4611 You may distribute this code under the same terms as Perl itself.
4612