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