dependency for views
[dbsrgits/DBIx-Class-Historic.git] / lib / DBIx / Class / ResultSource / View.pm
1 package DBIx::Class::ResultSource::View;
2
3 use strict;
4 use warnings;
5
6 use DBIx::Class::ResultSet;
7
8 use base qw/DBIx::Class/;
9 __PACKAGE__->load_components(qw/ResultSource/);
10 __PACKAGE__->mk_group_accessors(
11   'simple' => qw(is_virtual view_definition depends_on)
12 );
13
14 sub new {
15   my $new = shift->next::method(@_);
16   $new->{depends_on} = { %{$new->{depends_on}||{}} };
17   return $new;
18 }
19
20 =head1 NAME
21
22 DBIx::Class::ResultSource::View - ResultSource object representing a view
23
24 =head1 SYNOPSIS
25
26   package MyDB::Schema::Result::Year2000CDs;
27
28   use base qw/DBIx::Class/;
29
30   __PACKAGE__->load_components('Core');
31   __PACKAGE__->table_class('DBIx::Class::ResultSource::View');
32
33   __PACKAGE__->table('year2000cds');
34   __PACKAGE__->result_source_instance->is_virtual(1);
35   __PACKAGE__->result_source_instance->view_definition(
36       "SELECT cdid, artist, title FROM cd WHERE year ='2000'"
37   );
38   __PACKAGE__->add_columns(
39     'cdid' => {
40       data_type => 'integer',
41       is_auto_increment => 1,
42     },
43     'artist' => {
44       data_type => 'integer',
45     },
46     'title' => {
47       data_type => 'varchar',
48       size      => 100,
49     },
50   );
51
52 =head1 DESCRIPTION
53
54 View object that inherits from L<DBIx::Class::ResultSource>
55
56 This class extends ResultSource to add basic view support.
57
58 A view has a L</view_definition>, which contains a SQL query. The query can
59 only have parameters if L</is_virtual> is set to true. It may contain JOINs,
60 sub selects and any other SQL your database supports.
61
62 View definition SQL is deployed to your database on
63 L<DBIx::Class::Schema/deploy> unless you set L</is_virtual> to true.
64
65 Deploying the view does B<not> translate it between different database
66 syntaxes, so be careful what you write in your view SQL.
67
68 Virtual views (L</is_virtual> true), are assumed to not
69 exist in your database as a real view. The L</view_definition> in this
70 case replaces the view name in a FROM clause in a subselect.
71
72 =head1 EXAMPLES
73
74 Having created the MyDB::Schema::Year2000CDs schema as shown in the SYNOPSIS
75 above, you can then:
76
77   $2000_cds = $schema->resultset('Year2000CDs')
78                      ->search()
79                      ->all();
80   $count    = $schema->resultset('Year2000CDs')
81                      ->search()
82                      ->count();
83
84 If you modified the schema to include a placeholder
85
86   __PACKAGE__->result_source_instance->view_definition(
87       "SELECT cdid, artist, title FROM cd WHERE year ='?'"
88   );
89
90 and ensuring you have is_virtual set to true:
91
92   __PACKAGE__->result_source_instance->is_virtual(1);
93
94 You could now say:
95
96   $2001_cds = $schema->resultset('Year2000CDs')
97                      ->search({}, { bind => [2001] })
98                      ->all();
99   $count    = $schema->resultset('Year2000CDs')
100                      ->search({}, { bind => [2001] })
101                      ->count();
102
103 =head1 SQL EXAMPLES
104
105 =over
106
107 =item is_virtual set to false
108
109   $schema->resultset('Year2000CDs')->all();
110
111   SELECT cdid, artist, title FROM year2000cds me
112
113 =item is_virtual set to true
114
115   $schema->resultset('Year2000CDs')->all();
116
117   SELECT cdid, artist, title FROM 
118     (SELECT cdid, artist, title FROM cd WHERE year ='2000') me
119
120 =back
121
122 =head1 METHODS
123
124 =head2 is_virtual
125
126   __PACKAGE__->result_source_instance->is_virtual(1);
127
128 Set to true for a virtual view, false or unset for a real
129 database-based view.
130
131 =head2 view_definition
132
133   __PACKAGE__->result_source_instance->view_definition(
134       "SELECT cdid, artist, title FROM cd WHERE year ='2000'"
135       );
136
137 An SQL query for your view. Will not be translated across database
138 syntaxes.
139
140
141 =head1 OVERRIDDEN METHODS
142
143 =head2 from
144
145 Returns the FROM entry for the table (i.e. the view name)
146 or the SQL as a subselect if this is a virtual view.
147
148 =cut
149
150 sub from {
151   my $self = shift;
152   return \"(${\$self->view_definition})" if $self->is_virtual;
153   return $self->name;
154 }
155
156 1;
157
158 =head1 AUTHORS
159
160 Matt S. Trout <mst@shadowcatsystems.co.uk>
161
162 With Contributions from:
163
164 Guillermo Roditi E<lt>groditi@cpan.orgE<gt>
165
166 Jess Robinson <castaway@desert-island.me.uk>
167
168 Wallace Reis <wreis@cpan.org>
169
170 =head1 LICENSE
171
172 You may distribute this code under the same terms as Perl itself.
173
174 =cut
175