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