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