25fda373af4b8067e7d2b4604dc95d43a5aba850
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / ResultSource.pm
1 package DBIx::Class::ResultSource;
2
3 use strict;
4 use warnings;
5
6 use DBIx::Class::ResultSet;
7 use DBIx::Class::ResultSourceHandle;
8
9 use DBIx::Class::Exception;
10 use Carp::Clan qw/^DBIx::Class/;
11 use Try::Tiny;
12 use List::Util 'first';
13 use namespace::clean;
14
15 use base qw/DBIx::Class/;
16
17 __PACKAGE__->mk_group_accessors('simple' => qw/_ordered_columns
18   _columns _primaries _unique_constraints name resultset_attributes
19   schema from _relationships column_info_from_storage source_info
20   source_name sqlt_deploy_callback/);
21
22 __PACKAGE__->mk_group_accessors('component_class' => qw/resultset_class
23   result_class/);
24
25 =head1 NAME
26
27 DBIx::Class::ResultSource - Result source object
28
29 =head1 SYNOPSIS
30
31   # Create a table based result source, in a result class.
32
33   package MyDB::Schema::Result::Artist;
34   use base qw/DBIx::Class::Core/;
35
36   __PACKAGE__->table('artist');
37   __PACKAGE__->add_columns(qw/ artistid name /);
38   __PACKAGE__->set_primary_key('artistid');
39   __PACKAGE__->has_many(cds => 'MyDB::Schema::Result::CD');
40
41   1;
42
43   # Create a query (view) based result source, in a result class
44   package MyDB::Schema::Result::Year2000CDs;
45   use base qw/DBIx::Class::Core/;
46
47   __PACKAGE__->load_components('InflateColumn::DateTime');
48   __PACKAGE__->table_class('DBIx::Class::ResultSource::View');
49
50   __PACKAGE__->table('year2000cds');
51   __PACKAGE__->result_source_instance->is_virtual(1);
52   __PACKAGE__->result_source_instance->view_definition(
53       "SELECT cdid, artist, title FROM cd WHERE year ='2000'"
54       );
55
56
57 =head1 DESCRIPTION
58
59 A ResultSource is an object that represents a source of data for querying.
60
61 This class is a base class for various specialised types of result
62 sources, for example L<DBIx::Class::ResultSource::Table>. Table is the
63 default result source type, so one is created for you when defining a
64 result class as described in the synopsis above.
65
66 More specifically, the L<DBIx::Class::Core> base class pulls in the
67 L<DBIx::Class::ResultSourceProxy::Table> component, which defines
68 the L<table|DBIx::Class::ResultSourceProxy::Table/table> method.
69 When called, C<table> creates and stores an instance of
70 L<DBIx::Class::ResultSoure::Table>. Luckily, to use tables as result
71 sources, you don't need to remember any of this.
72
73 Result sources representing select queries, or views, can also be
74 created, see L<DBIx::Class::ResultSource::View> for full details.
75
76 =head2 Finding result source objects
77
78 As mentioned above, a result source instance is created and stored for
79 you when you define a L<Result Class|DBIx::Class::Manual::Glossary/Result Class>.
80
81 You can retrieve the result source at runtime in the following ways:
82
83 =over
84
85 =item From a Schema object:
86
87    $schema->source($source_name);
88
89 =item From a Row object:
90
91    $row->result_source;
92
93 =item From a ResultSet object:
94
95    $rs->result_source;
96
97 =back
98
99 =head1 METHODS
100
101 =pod
102
103 =cut
104
105 sub new {
106   my ($class, $attrs) = @_;
107   $class = ref $class if ref $class;
108
109   my $new = bless { %{$attrs || {}} }, $class;
110   $new->{resultset_class} ||= 'DBIx::Class::ResultSet';
111   $new->{resultset_attributes} = { %{$new->{resultset_attributes} || {}} };
112   $new->{_ordered_columns} = [ @{$new->{_ordered_columns}||[]}];
113   $new->{_columns} = { %{$new->{_columns}||{}} };
114   $new->{_relationships} = { %{$new->{_relationships}||{}} };
115   $new->{name} ||= "!!NAME NOT SET!!";
116   $new->{_columns_info_loaded} ||= 0;
117   $new->{sqlt_deploy_callback} ||= "default_sqlt_deploy_hook";
118   return $new;
119 }
120
121 =pod
122
123 =head2 add_columns
124
125 =over
126
127 =item Arguments: @columns
128
129 =item Return value: The ResultSource object
130
131 =back
132
133   $source->add_columns(qw/col1 col2 col3/);
134
135   $source->add_columns('col1' => \%col1_info, 'col2' => \%col2_info, ...);
136
137 Adds columns to the result source. If supplied colname => hashref
138 pairs, uses the hashref as the L</column_info> for that column. Repeated
139 calls of this method will add more columns, not replace them.
140
141 The column names given will be created as accessor methods on your
142 L<DBIx::Class::Row> objects. You can change the name of the accessor
143 by supplying an L</accessor> in the column_info hash.
144
145 If a column name beginning with a plus sign ('+col1') is provided, the
146 attributes provided will be merged with any existing attributes for the
147 column, with the new attributes taking precedence in the case that an
148 attribute already exists. Using this without a hashref
149 (C<< $source->add_columns(qw/+col1 +col2/) >>) is legal, but useless --
150 it does the same thing it would do without the plus.
151
152 The contents of the column_info are not set in stone. The following
153 keys are currently recognised/used by DBIx::Class:
154
155 =over 4
156
157 =item accessor
158
159    { accessor => '_name' }
160
161    # example use, replace standard accessor with one of your own:
162    sub name {
163        my ($self, $value) = @_;
164
165        die "Name cannot contain digits!" if($value =~ /\d/);
166        $self->_name($value);
167
168        return $self->_name();
169    }
170
171 Use this to set the name of the accessor method for this column. If unset,
172 the name of the column will be used.
173
174 =item data_type
175
176    { data_type => 'integer' }
177
178 This contains the column type. It is automatically filled if you use the
179 L<SQL::Translator::Producer::DBIx::Class::File> producer, or the
180 L<DBIx::Class::Schema::Loader> module.
181
182 Currently there is no standard set of values for the data_type. Use
183 whatever your database supports.
184
185 =item size
186
187    { size => 20 }
188
189 The length of your column, if it is a column type that can have a size
190 restriction. This is currently only used to create tables from your
191 schema, see L<DBIx::Class::Schema/deploy>.
192
193 =item is_nullable
194
195    { is_nullable => 1 }
196
197 Set this to a true value for a columns that is allowed to contain NULL
198 values, default is false. This is currently only used to create tables
199 from your schema, see L<DBIx::Class::Schema/deploy>.
200
201 =item is_auto_increment
202
203    { is_auto_increment => 1 }
204
205 Set this to a true value for a column whose value is somehow
206 automatically set, defaults to false. This is used to determine which
207 columns to empty when cloning objects using
208 L<DBIx::Class::Row/copy>. It is also used by
209 L<DBIx::Class::Schema/deploy>.
210
211 =item is_numeric
212
213    { is_numeric => 1 }
214
215 Set this to a true or false value (not C<undef>) to explicitly specify
216 if this column contains numeric data. This controls how set_column
217 decides whether to consider a column dirty after an update: if
218 C<is_numeric> is true a numeric comparison C<< != >> will take place
219 instead of the usual C<eq>
220
221 If not specified the storage class will attempt to figure this out on
222 first access to the column, based on the column C<data_type>. The
223 result will be cached in this attribute.
224
225 =item is_foreign_key
226
227    { is_foreign_key => 1 }
228
229 Set this to a true value for a column that contains a key from a
230 foreign table, defaults to false. This is currently only used to
231 create tables from your schema, see L<DBIx::Class::Schema/deploy>.
232
233 =item default_value
234
235    { default_value => \'now()' }
236
237 Set this to the default value which will be inserted into a column by
238 the database. Can contain either a value or a function (use a
239 reference to a scalar e.g. C<\'now()'> if you want a function). This
240 is currently only used to create tables from your schema, see
241 L<DBIx::Class::Schema/deploy>.
242
243 See the note on L<DBIx::Class::Row/new> for more information about possible
244 issues related to db-side default values.
245
246 =item sequence
247
248    { sequence => 'my_table_seq' }
249
250 Set this on a primary key column to the name of the sequence used to
251 generate a new key value. If not specified, L<DBIx::Class::PK::Auto>
252 will attempt to retrieve the name of the sequence from the database
253 automatically.
254
255 =item auto_nextval
256
257 Set this to a true value for a column whose value is retrieved automatically
258 from a sequence or function (if supported by your Storage driver.) For a
259 sequence, if you do not use a trigger to get the nextval, you have to set the
260 L</sequence> value as well.
261
262 Also set this for MSSQL columns with the 'uniqueidentifier'
263 L<data_type|DBIx::Class::ResultSource/data_type> whose values you want to
264 automatically generate using C<NEWID()>, unless they are a primary key in which
265 case this will be done anyway.
266
267 =item extra
268
269 This is used by L<DBIx::Class::Schema/deploy> and L<SQL::Translator>
270 to add extra non-generic data to the column. For example: C<< extra
271 => { unsigned => 1} >> is used by the MySQL producer to set an integer
272 column to unsigned. For more details, see
273 L<SQL::Translator::Producer::MySQL>.
274
275 =back
276
277 =head2 add_column
278
279 =over
280
281 =item Arguments: $colname, \%columninfo?
282
283 =item Return value: 1/0 (true/false)
284
285 =back
286
287   $source->add_column('col' => \%info);
288
289 Add a single column and optional column info. Uses the same column
290 info keys as L</add_columns>.
291
292 =cut
293
294 sub add_columns {
295   my ($self, @cols) = @_;
296   $self->_ordered_columns(\@cols) unless $self->_ordered_columns;
297
298   my @added;
299   my $columns = $self->_columns;
300   while (my $col = shift @cols) {
301     my $column_info = {};
302     if ($col =~ s/^\+//) {
303       $column_info = $self->column_info($col);
304     }
305
306     # If next entry is { ... } use that for the column info, if not
307     # use an empty hashref
308     if (ref $cols[0]) {
309       my $new_info = shift(@cols);
310       %$column_info = (%$column_info, %$new_info);
311     }
312     push(@added, $col) unless exists $columns->{$col};
313     $columns->{$col} = $column_info;
314   }
315   push @{ $self->_ordered_columns }, @added;
316   return $self;
317 }
318
319 sub add_column { shift->add_columns(@_); } # DO NOT CHANGE THIS TO GLOB
320
321 =head2 has_column
322
323 =over
324
325 =item Arguments: $colname
326
327 =item Return value: 1/0 (true/false)
328
329 =back
330
331   if ($source->has_column($colname)) { ... }
332
333 Returns true if the source has a column of this name, false otherwise.
334
335 =cut
336
337 sub has_column {
338   my ($self, $column) = @_;
339   return exists $self->_columns->{$column};
340 }
341
342 =head2 column_info
343
344 =over
345
346 =item Arguments: $colname
347
348 =item Return value: Hashref of info
349
350 =back
351
352   my $info = $source->column_info($col);
353
354 Returns the column metadata hashref for a column, as originally passed
355 to L</add_columns>. See L</add_columns> above for information on the
356 contents of the hashref.
357
358 =cut
359
360 sub column_info {
361   my ($self, $column) = @_;
362   $self->throw_exception("No such column $column")
363     unless exists $self->_columns->{$column};
364   #warn $self->{_columns_info_loaded}, "\n";
365   if ( ! $self->_columns->{$column}{data_type}
366        and $self->column_info_from_storage
367        and ! $self->{_columns_info_loaded}
368        and $self->schema and $self->storage )
369   {
370     $self->{_columns_info_loaded}++;
371     my $info = {};
372     my $lc_info = {};
373
374     # try for the case of storage without table
375     try {
376       $info = $self->storage->columns_info_for( $self->from );
377       for my $realcol ( keys %{$info} ) {
378         $lc_info->{lc $realcol} = $info->{$realcol};
379       }
380       foreach my $col ( keys %{$self->_columns} ) {
381         $self->_columns->{$col} = {
382           %{ $self->_columns->{$col} },
383           %{ $info->{$col} || $lc_info->{lc $col} || {} }
384         };
385       }
386     };
387   }
388   return $self->_columns->{$column};
389 }
390
391 =head2 columns
392
393 =over
394
395 =item Arguments: None
396
397 =item Return value: Ordered list of column names
398
399 =back
400
401   my @column_names = $source->columns;
402
403 Returns all column names in the order they were declared to L</add_columns>.
404
405 =cut
406
407 sub columns {
408   my $self = shift;
409   $self->throw_exception(
410     "columns() is a read-only accessor, did you mean add_columns()?"
411   ) if @_;
412   return @{$self->{_ordered_columns}||[]};
413 }
414
415 =head2 remove_columns
416
417 =over
418
419 =item Arguments: @colnames
420
421 =item Return value: undefined
422
423 =back
424
425   $source->remove_columns(qw/col1 col2 col3/);
426
427 Removes the given list of columns by name, from the result source.
428
429 B<Warning>: Removing a column that is also used in the sources primary
430 key, or in one of the sources unique constraints, B<will> result in a
431 broken result source.
432
433 =head2 remove_column
434
435 =over
436
437 =item Arguments: $colname
438
439 =item Return value: undefined
440
441 =back
442
443   $source->remove_column('col');
444
445 Remove a single column by name from the result source, similar to
446 L</remove_columns>.
447
448 B<Warning>: Removing a column that is also used in the sources primary
449 key, or in one of the sources unique constraints, B<will> result in a
450 broken result source.
451
452 =cut
453
454 sub remove_columns {
455   my ($self, @to_remove) = @_;
456
457   my $columns = $self->_columns
458     or return;
459
460   my %to_remove;
461   for (@to_remove) {
462     delete $columns->{$_};
463     ++$to_remove{$_};
464   }
465
466   $self->_ordered_columns([ grep { not $to_remove{$_} } @{$self->_ordered_columns} ]);
467 }
468
469 sub remove_column { shift->remove_columns(@_); } # DO NOT CHANGE THIS TO GLOB
470
471 =head2 set_primary_key
472
473 =over 4
474
475 =item Arguments: @cols
476
477 =item Return value: undefined
478
479 =back
480
481 Defines one or more columns as primary key for this source. Must be
482 called after L</add_columns>.
483
484 Additionally, defines a L<unique constraint|add_unique_constraint>
485 named C<primary>.
486
487 Note: you normally do want to define a primary key on your sources
488 B<even if the underlying database table does not have a primary key>.
489 See
490 L<DBIx::Class::Manual::Intro/The Significance and Importance of Primary Keys>
491 for more info.
492
493 =cut
494
495 sub set_primary_key {
496   my ($self, @cols) = @_;
497   # check if primary key columns are valid columns
498   foreach my $col (@cols) {
499     $self->throw_exception("No such column $col on table " . $self->name)
500       unless $self->has_column($col);
501   }
502   $self->_primaries(\@cols);
503
504   $self->add_unique_constraint(primary => \@cols);
505 }
506
507 =head2 primary_columns
508
509 =over 4
510
511 =item Arguments: None
512
513 =item Return value: Ordered list of primary column names
514
515 =back
516
517 Read-only accessor which returns the list of primary keys, supplied by
518 L</set_primary_key>.
519
520 =cut
521
522 sub primary_columns {
523   return @{shift->_primaries||[]};
524 }
525
526 # a helper method that will automatically die with a descriptive message if
527 # no pk is defined on the source in question. For internal use to save
528 # on if @pks... boilerplate
529 sub _pri_cols {
530   my $self = shift;
531   my @pcols = $self->primary_columns
532     or $self->throw_exception (sprintf(
533       "Operation requires a primary key to be declared on '%s' via set_primary_key",
534       $self->source_name,
535     ));
536   return @pcols;
537 }
538
539 =head2 add_unique_constraint
540
541 =over 4
542
543 =item Arguments: $name?, \@colnames
544
545 =item Return value: undefined
546
547 =back
548
549 Declare a unique constraint on this source. Call once for each unique
550 constraint.
551
552   # For UNIQUE (column1, column2)
553   __PACKAGE__->add_unique_constraint(
554     constraint_name => [ qw/column1 column2/ ],
555   );
556
557 Alternatively, you can specify only the columns:
558
559   __PACKAGE__->add_unique_constraint([ qw/column1 column2/ ]);
560
561 This will result in a unique constraint named
562 C<table_column1_column2>, where C<table> is replaced with the table
563 name.
564
565 Unique constraints are used, for example, when you pass the constraint
566 name as the C<key> attribute to L<DBIx::Class::ResultSet/find>. Then
567 only columns in the constraint are searched.
568
569 Throws an error if any of the given column names do not yet exist on
570 the result source.
571
572 =cut
573
574 sub add_unique_constraint {
575   my $self = shift;
576   my $cols = pop @_;
577   my $name = shift;
578
579   $name ||= $self->name_unique_constraint($cols);
580
581   foreach my $col (@$cols) {
582     $self->throw_exception("No such column $col on table " . $self->name)
583       unless $self->has_column($col);
584   }
585
586   my %unique_constraints = $self->unique_constraints;
587   $unique_constraints{$name} = $cols;
588   $self->_unique_constraints(\%unique_constraints);
589 }
590
591 =head2 name_unique_constraint
592
593 =over 4
594
595 =item Arguments: \@colnames
596
597 =item Return value: Constraint name
598
599 =back
600
601   $source->table('mytable');
602   $source->name_unique_constraint(['col1', 'col2']);
603   # returns
604   'mytable_col1_col2'
605
606 Return a name for a unique constraint containing the specified
607 columns. The name is created by joining the table name and each column
608 name, using an underscore character.
609
610 For example, a constraint on a table named C<cd> containing the columns
611 C<artist> and C<title> would result in a constraint name of C<cd_artist_title>.
612
613 This is used by L</add_unique_constraint> if you do not specify the
614 optional constraint name.
615
616 =cut
617
618 sub name_unique_constraint {
619   my ($self, $cols) = @_;
620
621   my $name = $self->name;
622   $name = $$name if (ref $name eq 'SCALAR');
623
624   return join '_', $name, @$cols;
625 }
626
627 =head2 unique_constraints
628
629 =over 4
630
631 =item Arguments: None
632
633 =item Return value: Hash of unique constraint data
634
635 =back
636
637   $source->unique_constraints();
638
639 Read-only accessor which returns a hash of unique constraints on this
640 source.
641
642 The hash is keyed by constraint name, and contains an arrayref of
643 column names as values.
644
645 =cut
646
647 sub unique_constraints {
648   return %{shift->_unique_constraints||{}};
649 }
650
651 =head2 unique_constraint_names
652
653 =over 4
654
655 =item Arguments: None
656
657 =item Return value: Unique constraint names
658
659 =back
660
661   $source->unique_constraint_names();
662
663 Returns the list of unique constraint names defined on this source.
664
665 =cut
666
667 sub unique_constraint_names {
668   my ($self) = @_;
669
670   my %unique_constraints = $self->unique_constraints;
671
672   return keys %unique_constraints;
673 }
674
675 =head2 unique_constraint_columns
676
677 =over 4
678
679 =item Arguments: $constraintname
680
681 =item Return value: List of constraint columns
682
683 =back
684
685   $source->unique_constraint_columns('myconstraint');
686
687 Returns the list of columns that make up the specified unique constraint.
688
689 =cut
690
691 sub unique_constraint_columns {
692   my ($self, $constraint_name) = @_;
693
694   my %unique_constraints = $self->unique_constraints;
695
696   $self->throw_exception(
697     "Unknown unique constraint $constraint_name on '" . $self->name . "'"
698   ) unless exists $unique_constraints{$constraint_name};
699
700   return @{ $unique_constraints{$constraint_name} };
701 }
702
703 =head2 sqlt_deploy_callback
704
705 =over
706
707 =item Arguments: $callback
708
709 =back
710
711   __PACKAGE__->sqlt_deploy_callback('mycallbackmethod');
712
713 An accessor to set a callback to be called during deployment of
714 the schema via L<DBIx::Class::Schema/create_ddl_dir> or
715 L<DBIx::Class::Schema/deploy>.
716
717 The callback can be set as either a code reference or the name of a
718 method in the current result class.
719
720 If not set, the L</default_sqlt_deploy_hook> is called.
721
722 Your callback will be passed the $source object representing the
723 ResultSource instance being deployed, and the
724 L<SQL::Translator::Schema::Table> object being created from it. The
725 callback can be used to manipulate the table object or add your own
726 customised indexes. If you need to manipulate a non-table object, use
727 the L<DBIx::Class::Schema/sqlt_deploy_hook>.
728
729 See L<DBIx::Class::Manual::Cookbook/Adding Indexes And Functions To
730 Your SQL> for examples.
731
732 This sqlt deployment callback can only be used to manipulate
733 SQL::Translator objects as they get turned into SQL. To execute
734 post-deploy statements which SQL::Translator does not currently
735 handle, override L<DBIx::Class::Schema/deploy> in your Schema class
736 and call L<dbh_do|DBIx::Class::Storage::DBI/dbh_do>.
737
738 =head2 default_sqlt_deploy_hook
739
740 =over
741
742 =item Arguments: $source, $sqlt_table
743
744 =item Return value: undefined
745
746 =back
747
748 This is the sensible default for L</sqlt_deploy_callback>.
749
750 If a method named C<sqlt_deploy_hook> exists in your Result class, it
751 will be called and passed the current C<$source> and the
752 C<$sqlt_table> being deployed.
753
754 =cut
755
756 sub default_sqlt_deploy_hook {
757   my $self = shift;
758
759   my $class = $self->result_class;
760
761   if ($class and $class->can('sqlt_deploy_hook')) {
762     $class->sqlt_deploy_hook(@_);
763   }
764 }
765
766 sub _invoke_sqlt_deploy_hook {
767   my $self = shift;
768   if ( my $hook = $self->sqlt_deploy_callback) {
769     $self->$hook(@_);
770   }
771 }
772
773 =head2 resultset
774
775 =over 4
776
777 =item Arguments: None
778
779 =item Return value: $resultset
780
781 =back
782
783 Returns a resultset for the given source. This will initially be created
784 on demand by calling
785
786   $self->resultset_class->new($self, $self->resultset_attributes)
787
788 but is cached from then on unless resultset_class changes.
789
790 =head2 resultset_class
791
792 =over 4
793
794 =item Arguments: $classname
795
796 =item Return value: $classname
797
798 =back
799
800   package My::Schema::ResultSet::Artist;
801   use base 'DBIx::Class::ResultSet';
802   ...
803
804   # In the result class
805   __PACKAGE__->resultset_class('My::Schema::ResultSet::Artist');
806
807   # Or in code
808   $source->resultset_class('My::Schema::ResultSet::Artist');
809
810 Set the class of the resultset. This is useful if you want to create your
811 own resultset methods. Create your own class derived from
812 L<DBIx::Class::ResultSet>, and set it here. If called with no arguments,
813 this method returns the name of the existing resultset class, if one
814 exists.
815
816 =head2 resultset_attributes
817
818 =over 4
819
820 =item Arguments: \%attrs
821
822 =item Return value: \%attrs
823
824 =back
825
826   # In the result class
827   __PACKAGE__->resultset_attributes({ order_by => [ 'id' ] });
828
829   # Or in code
830   $source->resultset_attributes({ order_by => [ 'id' ] });
831
832 Store a collection of resultset attributes, that will be set on every
833 L<DBIx::Class::ResultSet> produced from this result source. For a full
834 list see L<DBIx::Class::ResultSet/ATTRIBUTES>.
835
836 =cut
837
838 sub resultset {
839   my $self = shift;
840   $self->throw_exception(
841     'resultset does not take any arguments. If you want another resultset, '.
842     'call it on the schema instead.'
843   ) if scalar @_;
844
845   return $self->resultset_class->new(
846     $self,
847     {
848       %{$self->{resultset_attributes}},
849       %{$self->schema->default_resultset_attributes}
850     },
851   );
852 }
853
854 =head2 source_name
855
856 =over 4
857
858 =item Arguments: $source_name
859
860 =item Result value: $source_name
861
862 =back
863
864 Set an alternate name for the result source when it is loaded into a schema.
865 This is useful if you want to refer to a result source by a name other than
866 its class name.
867
868   package ArchivedBooks;
869   use base qw/DBIx::Class/;
870   __PACKAGE__->table('books_archive');
871   __PACKAGE__->source_name('Books');
872
873   # from your schema...
874   $schema->resultset('Books')->find(1);
875
876 =head2 from
877
878 =over 4
879
880 =item Arguments: None
881
882 =item Return value: FROM clause
883
884 =back
885
886   my $from_clause = $source->from();
887
888 Returns an expression of the source to be supplied to storage to specify
889 retrieval from this source. In the case of a database, the required FROM
890 clause contents.
891
892 =head2 schema
893
894 =over 4
895
896 =item Arguments: None
897
898 =item Return value: A schema object
899
900 =back
901
902   my $schema = $source->schema();
903
904 Returns the L<DBIx::Class::Schema> object that this result source
905 belongs to.
906
907 =head2 storage
908
909 =over 4
910
911 =item Arguments: None
912
913 =item Return value: A Storage object
914
915 =back
916
917   $source->storage->debug(1);
918
919 Returns the storage handle for the current schema.
920
921 See also: L<DBIx::Class::Storage>
922
923 =cut
924
925 sub storage { shift->schema->storage; }
926
927 =head2 add_relationship
928
929 =over 4
930
931 =item Arguments: $relname, $related_source_name, \%cond, [ \%attrs ]
932
933 =item Return value: 1/true if it succeeded
934
935 =back
936
937   $source->add_relationship('relname', 'related_source', $cond, $attrs);
938
939 L<DBIx::Class::Relationship> describes a series of methods which
940 create pre-defined useful types of relationships. Look there first
941 before using this method directly.
942
943 The relationship name can be arbitrary, but must be unique for each
944 relationship attached to this result source. 'related_source' should
945 be the name with which the related result source was registered with
946 the current schema. For example:
947
948   $schema->source('Book')->add_relationship('reviews', 'Review', {
949     'foreign.book_id' => 'self.id',
950   });
951
952 The condition C<$cond> needs to be an L<SQL::Abstract>-style
953 representation of the join between the tables. For example, if you're
954 creating a relation from Author to Book,
955
956   { 'foreign.author_id' => 'self.id' }
957
958 will result in the JOIN clause
959
960   author me JOIN book foreign ON foreign.author_id = me.id
961
962 You can specify as many foreign => self mappings as necessary.
963
964 Valid attributes are as follows:
965
966 =over 4
967
968 =item join_type
969
970 Explicitly specifies the type of join to use in the relationship. Any
971 SQL join type is valid, e.g. C<LEFT> or C<RIGHT>. It will be placed in
972 the SQL command immediately before C<JOIN>.
973
974 =item proxy
975
976 An arrayref containing a list of accessors in the foreign class to proxy in
977 the main class. If, for example, you do the following:
978
979   CD->might_have(liner_notes => 'LinerNotes', undef, {
980     proxy => [ qw/notes/ ],
981   });
982
983 Then, assuming LinerNotes has an accessor named notes, you can do:
984
985   my $cd = CD->find(1);
986   # set notes -- LinerNotes object is created if it doesn't exist
987   $cd->notes('Notes go here');
988
989 =item accessor
990
991 Specifies the type of accessor that should be created for the
992 relationship. Valid values are C<single> (for when there is only a single
993 related object), C<multi> (when there can be many), and C<filter> (for
994 when there is a single related object, but you also want the relationship
995 accessor to double as a column accessor). For C<multi> accessors, an
996 add_to_* method is also created, which calls C<create_related> for the
997 relationship.
998
999 =back
1000
1001 Throws an exception if the condition is improperly supplied, or cannot
1002 be resolved.
1003
1004 =cut
1005
1006 sub add_relationship {
1007   my ($self, $rel, $f_source_name, $cond, $attrs) = @_;
1008   $self->throw_exception("Can't create relationship without join condition")
1009     unless $cond;
1010   $attrs ||= {};
1011
1012   # Check foreign and self are right in cond
1013   if ( (ref $cond ||'') eq 'HASH') {
1014     for (keys %$cond) {
1015       $self->throw_exception("Keys of condition should be of form 'foreign.col', not '$_'")
1016         if /\./ && !/^foreign\./;
1017     }
1018   }
1019
1020   my %rels = %{ $self->_relationships };
1021   $rels{$rel} = { class => $f_source_name,
1022                   source => $f_source_name,
1023                   cond  => $cond,
1024                   attrs => $attrs };
1025   $self->_relationships(\%rels);
1026
1027   return $self;
1028
1029 # XXX disabled. doesn't work properly currently. skip in tests.
1030
1031   my $f_source = $self->schema->source($f_source_name);
1032   unless ($f_source) {
1033     $self->ensure_class_loaded($f_source_name);
1034     $f_source = $f_source_name->result_source;
1035     #my $s_class = ref($self->schema);
1036     #$f_source_name =~ m/^${s_class}::(.*)$/;
1037     #$self->schema->register_class(($1 || $f_source_name), $f_source_name);
1038     #$f_source = $self->schema->source($f_source_name);
1039   }
1040   return unless $f_source; # Can't test rel without f_source
1041
1042   try { $self->_resolve_join($rel, 'me', {}, []) }
1043   catch {
1044     # If the resolve failed, back out and re-throw the error
1045     delete $rels{$rel};
1046     $self->_relationships(\%rels);
1047     $self->throw_exception("Error creating relationship $rel: $_");
1048   };
1049
1050   1;
1051 }
1052
1053 =head2 relationships
1054
1055 =over 4
1056
1057 =item Arguments: None
1058
1059 =item Return value: List of relationship names
1060
1061 =back
1062
1063   my @relnames = $source->relationships();
1064
1065 Returns all relationship names for this source.
1066
1067 =cut
1068
1069 sub relationships {
1070   return keys %{shift->_relationships};
1071 }
1072
1073 =head2 relationship_info
1074
1075 =over 4
1076
1077 =item Arguments: $relname
1078
1079 =item Return value: Hashref of relation data,
1080
1081 =back
1082
1083 Returns a hash of relationship information for the specified relationship
1084 name. The keys/values are as specified for L</add_relationship>.
1085
1086 =cut
1087
1088 sub relationship_info {
1089   my ($self, $rel) = @_;
1090   return $self->_relationships->{$rel};
1091 }
1092
1093 =head2 has_relationship
1094
1095 =over 4
1096
1097 =item Arguments: $rel
1098
1099 =item Return value: 1/0 (true/false)
1100
1101 =back
1102
1103 Returns true if the source has a relationship of this name, false otherwise.
1104
1105 =cut
1106
1107 sub has_relationship {
1108   my ($self, $rel) = @_;
1109   return exists $self->_relationships->{$rel};
1110 }
1111
1112 =head2 reverse_relationship_info
1113
1114 =over 4
1115
1116 =item Arguments: $relname
1117
1118 =item Return value: Hashref of relationship data
1119
1120 =back
1121
1122 Looks through all the relationships on the source this relationship
1123 points to, looking for one whose condition is the reverse of the
1124 condition on this relationship.
1125
1126 A common use of this is to find the name of the C<belongs_to> relation
1127 opposing a C<has_many> relation. For definition of these look in
1128 L<DBIx::Class::Relationship>.
1129
1130 The returned hashref is keyed by the name of the opposing
1131 relationship, and contains its data in the same manner as
1132 L</relationship_info>.
1133
1134 =cut
1135
1136 sub reverse_relationship_info {
1137   my ($self, $rel) = @_;
1138   my $rel_info = $self->relationship_info($rel);
1139   my $ret = {};
1140
1141   return $ret unless ((ref $rel_info->{cond}) eq 'HASH');
1142
1143   my @cond = keys(%{$rel_info->{cond}});
1144   my @refkeys = map {/^\w+\.(\w+)$/} @cond;
1145   my @keys = map {$rel_info->{cond}->{$_} =~ /^\w+\.(\w+)$/} @cond;
1146
1147   # Get the related result source for this relationship
1148   my $othertable = $self->related_source($rel);
1149
1150   # Get all the relationships for that source that related to this source
1151   # whose foreign column set are our self columns on $rel and whose self
1152   # columns are our foreign columns on $rel.
1153   my @otherrels = $othertable->relationships();
1154   my $otherrelationship;
1155   foreach my $otherrel (@otherrels) {
1156     my $otherrel_info = $othertable->relationship_info($otherrel);
1157
1158     my $back = $othertable->related_source($otherrel);
1159     next unless $back->source_name eq $self->source_name;
1160
1161     my @othertestconds;
1162
1163     if (ref $otherrel_info->{cond} eq 'HASH') {
1164       @othertestconds = ($otherrel_info->{cond});
1165     }
1166     elsif (ref $otherrel_info->{cond} eq 'ARRAY') {
1167       @othertestconds = @{$otherrel_info->{cond}};
1168     }
1169     else {
1170       next;
1171     }
1172
1173     foreach my $othercond (@othertestconds) {
1174       my @other_cond = keys(%$othercond);
1175       my @other_refkeys = map {/^\w+\.(\w+)$/} @other_cond;
1176       my @other_keys = map {$othercond->{$_} =~ /^\w+\.(\w+)$/} @other_cond;
1177       next if (!$self->_compare_relationship_keys(\@refkeys, \@other_keys) ||
1178                !$self->_compare_relationship_keys(\@other_refkeys, \@keys));
1179       $ret->{$otherrel} =  $otherrel_info;
1180     }
1181   }
1182   return $ret;
1183 }
1184
1185 sub compare_relationship_keys {
1186   carp 'compare_relationship_keys is a private method, stop calling it';
1187   my $self = shift;
1188   $self->_compare_relationship_keys (@_);
1189 }
1190
1191 # Returns true if both sets of keynames are the same, false otherwise.
1192 sub _compare_relationship_keys {
1193   my ($self, $keys1, $keys2) = @_;
1194
1195   # Make sure every keys1 is in keys2
1196   my $found;
1197   foreach my $key (@$keys1) {
1198     $found = 0;
1199     foreach my $prim (@$keys2) {
1200       if ($prim eq $key) {
1201         $found = 1;
1202         last;
1203       }
1204     }
1205     last unless $found;
1206   }
1207
1208   # Make sure every key2 is in key1
1209   if ($found) {
1210     foreach my $prim (@$keys2) {
1211       $found = 0;
1212       foreach my $key (@$keys1) {
1213         if ($prim eq $key) {
1214           $found = 1;
1215           last;
1216         }
1217       }
1218       last unless $found;
1219     }
1220   }
1221
1222   return $found;
1223 }
1224
1225 # Returns the {from} structure used to express JOIN conditions
1226 sub _resolve_join {
1227   my ($self, $join, $alias, $seen, $jpath, $parent_force_left) = @_;
1228
1229   # we need a supplied one, because we do in-place modifications, no returns
1230   $self->throw_exception ('You must supply a seen hashref as the 3rd argument to _resolve_join')
1231     unless ref $seen eq 'HASH';
1232
1233   $self->throw_exception ('You must supply a joinpath arrayref as the 4th argument to _resolve_join')
1234     unless ref $jpath eq 'ARRAY';
1235
1236   $jpath = [@$jpath]; # copy
1237
1238   if (not defined $join) {
1239     return ();
1240   }
1241   elsif (ref $join eq 'ARRAY') {
1242     return
1243       map {
1244         $self->_resolve_join($_, $alias, $seen, $jpath, $parent_force_left);
1245       } @$join;
1246   }
1247   elsif (ref $join eq 'HASH') {
1248
1249     my @ret;
1250     for my $rel (keys %$join) {
1251
1252       my $rel_info = $self->relationship_info($rel)
1253         or $self->throw_exception("No such relationship '$rel' on " . $self->source_name);
1254
1255       my $force_left = $parent_force_left;
1256       $force_left ||= lc($rel_info->{attrs}{join_type}||'') eq 'left';
1257
1258       # the actual seen value will be incremented by the recursion
1259       my $as = $self->storage->relname_to_table_alias(
1260         $rel, ($seen->{$rel} && $seen->{$rel} + 1)
1261       );
1262
1263       push @ret, (
1264         $self->_resolve_join($rel, $alias, $seen, [@$jpath], $force_left),
1265         $self->related_source($rel)->_resolve_join(
1266           $join->{$rel}, $as, $seen, [@$jpath, { $rel => $as }], $force_left
1267         )
1268       );
1269     }
1270     return @ret;
1271
1272   }
1273   elsif (ref $join) {
1274     $self->throw_exception("No idea how to resolve join reftype ".ref $join);
1275   }
1276   else {
1277     my $count = ++$seen->{$join};
1278     my $as = $self->storage->relname_to_table_alias(
1279       $join, ($count > 1 && $count)
1280     );
1281
1282     my $rel_info = $self->relationship_info($join)
1283       or $self->throw_exception("No such relationship $join on " . $self->source_name);
1284
1285     my $rel_src = $self->related_source($join);
1286     return [ { $as => $rel_src->from,
1287                -source_handle => $rel_src->handle,
1288                -join_type => $parent_force_left
1289                   ? 'left'
1290                   : $rel_info->{attrs}{join_type}
1291                 ,
1292                -join_path => [@$jpath, { $join => $as } ],
1293                -is_single => (
1294                   $rel_info->{attrs}{accessor}
1295                     &&
1296                   first { $rel_info->{attrs}{accessor} eq $_ } (qw/single filter/)
1297                 ),
1298                -alias => $as,
1299                -relation_chain_depth => $seen->{-relation_chain_depth} || 0,
1300              },
1301              $self->_resolve_condition($rel_info->{cond}, $as, $alias) ];
1302   }
1303 }
1304
1305 sub pk_depends_on {
1306   carp 'pk_depends_on is a private method, stop calling it';
1307   my $self = shift;
1308   $self->_pk_depends_on (@_);
1309 }
1310
1311 # Determines whether a relation is dependent on an object from this source
1312 # having already been inserted. Takes the name of the relationship and a
1313 # hashref of columns of the related object.
1314 sub _pk_depends_on {
1315   my ($self, $relname, $rel_data) = @_;
1316
1317   my $relinfo = $self->relationship_info($relname);
1318
1319   # don't assume things if the relationship direction is specified
1320   return $relinfo->{attrs}{is_foreign_key_constraint}
1321     if exists ($relinfo->{attrs}{is_foreign_key_constraint});
1322
1323   my $cond = $relinfo->{cond};
1324   return 0 unless ref($cond) eq 'HASH';
1325
1326   # map { foreign.foo => 'self.bar' } to { bar => 'foo' }
1327   my $keyhash = { map { my $x = $_; $x =~ s/.*\.//; $x; } reverse %$cond };
1328
1329   # assume anything that references our PK probably is dependent on us
1330   # rather than vice versa, unless the far side is (a) defined or (b)
1331   # auto-increment
1332   my $rel_source = $self->related_source($relname);
1333
1334   foreach my $p ($self->primary_columns) {
1335     if (exists $keyhash->{$p}) {
1336       unless (defined($rel_data->{$keyhash->{$p}})
1337               || $rel_source->column_info($keyhash->{$p})
1338                             ->{is_auto_increment}) {
1339         return 0;
1340       }
1341     }
1342   }
1343
1344   return 1;
1345 }
1346
1347 sub resolve_condition {
1348   carp 'resolve_condition is a private method, stop calling it';
1349   my $self = shift;
1350   $self->_resolve_condition (@_);
1351 }
1352
1353 # Resolves the passed condition to a concrete query fragment. If given an alias,
1354 # returns a join condition; if given an object, inverts that object to produce
1355 # a related conditional from that object.
1356 our $UNRESOLVABLE_CONDITION = \'1 = 0';
1357
1358 sub _resolve_condition {
1359   my ($self, $cond, $as, $for) = @_;
1360   if (ref $cond eq 'HASH') {
1361     my %ret;
1362     foreach my $k (keys %{$cond}) {
1363       my $v = $cond->{$k};
1364       # XXX should probably check these are valid columns
1365       $k =~ s/^foreign\.// ||
1366         $self->throw_exception("Invalid rel cond key ${k}");
1367       $v =~ s/^self\.// ||
1368         $self->throw_exception("Invalid rel cond val ${v}");
1369       if (ref $for) { # Object
1370         #warn "$self $k $for $v";
1371         unless ($for->has_column_loaded($v)) {
1372           if ($for->in_storage) {
1373             $self->throw_exception(sprintf
1374               "Unable to resolve relationship '%s' from object %s: column '%s' not "
1375             . 'loaded from storage (or not passed to new() prior to insert()). You '
1376             . 'probably need to call ->discard_changes to get the server-side defaults '
1377             . 'from the database.',
1378               $as,
1379               $for,
1380               $v,
1381             );
1382           }
1383           return $UNRESOLVABLE_CONDITION;
1384         }
1385         $ret{$k} = $for->get_column($v);
1386         #$ret{$k} = $for->get_column($v) if $for->has_column_loaded($v);
1387         #warn %ret;
1388       } elsif (!defined $for) { # undef, i.e. "no object"
1389         $ret{$k} = undef;
1390       } elsif (ref $as eq 'HASH') { # reverse hashref
1391         $ret{$v} = $as->{$k};
1392       } elsif (ref $as) { # reverse object
1393         $ret{$v} = $as->get_column($k);
1394       } elsif (!defined $as) { # undef, i.e. "no reverse object"
1395         $ret{$v} = undef;
1396       } else {
1397         $ret{"${as}.${k}"} = "${for}.${v}";
1398       }
1399     }
1400     return \%ret;
1401   } elsif (ref $cond eq 'ARRAY') {
1402     return [ map { $self->_resolve_condition($_, $as, $for) } @$cond ];
1403   } else {
1404    die("Can't handle condition $cond yet :(");
1405   }
1406 }
1407
1408
1409 # Accepts one or more relationships for the current source and returns an
1410 # array of column names for each of those relationships. Column names are
1411 # prefixed relative to the current source, in accordance with where they appear
1412 # in the supplied relationships.
1413
1414 sub _resolve_prefetch {
1415   my ($self, $pre, $alias, $alias_map, $order, $collapse, $pref_path) = @_;
1416   $pref_path ||= [];
1417
1418   if (not defined $pre) {
1419     return ();
1420   }
1421   elsif( ref $pre eq 'ARRAY' ) {
1422     return
1423       map { $self->_resolve_prefetch( $_, $alias, $alias_map, $order, $collapse, [ @$pref_path ] ) }
1424         @$pre;
1425   }
1426   elsif( ref $pre eq 'HASH' ) {
1427     my @ret =
1428     map {
1429       $self->_resolve_prefetch($_, $alias, $alias_map, $order, $collapse, [ @$pref_path ] ),
1430       $self->related_source($_)->_resolve_prefetch(
1431                $pre->{$_}, "${alias}.$_", $alias_map, $order, $collapse, [ @$pref_path, $_] )
1432     } keys %$pre;
1433     return @ret;
1434   }
1435   elsif( ref $pre ) {
1436     $self->throw_exception(
1437       "don't know how to resolve prefetch reftype ".ref($pre));
1438   }
1439   else {
1440     my $p = $alias_map;
1441     $p = $p->{$_} for (@$pref_path, $pre);
1442
1443     $self->throw_exception (
1444       "Unable to resolve prefetch '$pre' - join alias map does not contain an entry for path: "
1445       . join (' -> ', @$pref_path, $pre)
1446     ) if (ref $p->{-join_aliases} ne 'ARRAY' or not @{$p->{-join_aliases}} );
1447
1448     my $as = shift @{$p->{-join_aliases}};
1449
1450     my $rel_info = $self->relationship_info( $pre );
1451     $self->throw_exception( $self->source_name . " has no such relationship '$pre'" )
1452       unless $rel_info;
1453     my $as_prefix = ($alias =~ /^.*?\.(.+)$/ ? $1.'.' : '');
1454     my $rel_source = $self->related_source($pre);
1455
1456     if ($rel_info->{attrs}{accessor} && $rel_info->{attrs}{accessor} eq 'multi') {
1457       $self->throw_exception(
1458         "Can't prefetch has_many ${pre} (join cond too complex)")
1459         unless ref($rel_info->{cond}) eq 'HASH';
1460       my $dots = @{[$as_prefix =~ m/\./g]} + 1; # +1 to match the ".${as_prefix}"
1461       if (my ($fail) = grep { @{[$_ =~ m/\./g]} == $dots }
1462                          keys %{$collapse}) {
1463         my ($last) = ($fail =~ /([^\.]+)$/);
1464         carp (
1465           "Prefetching multiple has_many rels ${last} and ${pre} "
1466           .(length($as_prefix)
1467             ? "at the same level (${as_prefix}) "
1468             : "at top level "
1469           )
1470           . 'will explode the number of row objects retrievable via ->next or ->all. '
1471           . 'Use at your own risk.'
1472         );
1473       }
1474       #my @col = map { (/^self\.(.+)$/ ? ("${as_prefix}.$1") : ()); }
1475       #              values %{$rel_info->{cond}};
1476       $collapse->{".${as_prefix}${pre}"} = [ $rel_source->_pri_cols ];
1477         # action at a distance. prepending the '.' allows simpler code
1478         # in ResultSet->_collapse_result
1479       my @key = map { (/^foreign\.(.+)$/ ? ($1) : ()); }
1480                     keys %{$rel_info->{cond}};
1481       my @ord = (ref($rel_info->{attrs}{order_by}) eq 'ARRAY'
1482                    ? @{$rel_info->{attrs}{order_by}}
1483
1484                 : (defined $rel_info->{attrs}{order_by}
1485                        ? ($rel_info->{attrs}{order_by})
1486                        : ()));
1487       push(@$order, map { "${as}.$_" } (@key, @ord));
1488     }
1489
1490     return map { [ "${as}.$_", "${as_prefix}${pre}.$_", ] }
1491       $rel_source->columns;
1492   }
1493 }
1494
1495 =head2 related_source
1496
1497 =over 4
1498
1499 =item Arguments: $relname
1500
1501 =item Return value: $source
1502
1503 =back
1504
1505 Returns the result source object for the given relationship.
1506
1507 =cut
1508
1509 sub related_source {
1510   my ($self, $rel) = @_;
1511   if( !$self->has_relationship( $rel ) ) {
1512     $self->throw_exception("No such relationship '$rel' on " . $self->source_name);
1513   }
1514   return $self->schema->source($self->relationship_info($rel)->{source});
1515 }
1516
1517 =head2 related_class
1518
1519 =over 4
1520
1521 =item Arguments: $relname
1522
1523 =item Return value: $classname
1524
1525 =back
1526
1527 Returns the class name for objects in the given relationship.
1528
1529 =cut
1530
1531 sub related_class {
1532   my ($self, $rel) = @_;
1533   if( !$self->has_relationship( $rel ) ) {
1534     $self->throw_exception("No such relationship '$rel' on " . $self->source_name);
1535   }
1536   return $self->schema->class($self->relationship_info($rel)->{source});
1537 }
1538
1539 =head2 handle
1540
1541 Obtain a new handle to this source. Returns an instance of a
1542 L<DBIx::Class::ResultSourceHandle>.
1543
1544 =cut
1545
1546 sub handle {
1547     return DBIx::Class::ResultSourceHandle->new({
1548         schema         => $_[0]->schema,
1549         source_moniker => $_[0]->source_name
1550     });
1551 }
1552
1553 =head2 throw_exception
1554
1555 See L<DBIx::Class::Schema/"throw_exception">.
1556
1557 =cut
1558
1559 sub throw_exception {
1560   my $self = shift;
1561
1562   if (defined $self->schema) {
1563     $self->schema->throw_exception(@_);
1564   }
1565   else {
1566     DBIx::Class::Exception->throw(@_);
1567   }
1568 }
1569
1570 =head2 source_info
1571
1572 Stores a hashref of per-source metadata.  No specific key names
1573 have yet been standardized, the examples below are purely hypothetical
1574 and don't actually accomplish anything on their own:
1575
1576   __PACKAGE__->source_info({
1577     "_tablespace" => 'fast_disk_array_3',
1578     "_engine" => 'InnoDB',
1579   });
1580
1581 =head2 new
1582
1583   $class->new();
1584
1585   $class->new({attribute_name => value});
1586
1587 Creates a new ResultSource object.  Not normally called directly by end users.
1588
1589 =head2 column_info_from_storage
1590
1591 =over
1592
1593 =item Arguments: 1/0 (default: 0)
1594
1595 =item Return value: 1/0
1596
1597 =back
1598
1599   __PACKAGE__->column_info_from_storage(1);
1600
1601 Enables the on-demand automatic loading of the above column
1602 metadata from storage as necessary.  This is *deprecated*, and
1603 should not be used.  It will be removed before 1.0.
1604
1605
1606 =head1 AUTHORS
1607
1608 Matt S. Trout <mst@shadowcatsystems.co.uk>
1609
1610 =head1 LICENSE
1611
1612 You may distribute this code under the same terms as Perl itself.
1613
1614 =cut
1615
1616 1;