File Coverage

blib/lib/DBIx/Class/ResultSource/View.pm
Criterion Covered Total %
statement 21 22 95.4
branch 5 6 83.3
condition n/a
subroutine 6 6 100.0
pod 2 2 100.0
total 34 36 94.4


line stmt bran cond sub pod time code
1             package DBIx::Class::ResultSource::View;
2              
3 330     330   161603 use strict;
  330         1299  
  330         10276  
4 330     330   2108 use warnings;
  330         998  
  330         8829  
5              
6 330     330   2082 use DBIx::Class::ResultSet;
  330         976  
  330         12197  
7              
8 330     330   2146 use base qw/DBIx::Class/;
  330         1018  
  330         108701  
9             __PACKAGE__->load_components(qw/ResultSource/);
10             __PACKAGE__->mk_group_accessors(
11             'simple' => qw(is_virtual view_definition deploy_depends_on) );
12              
13             =head1 NAME
14              
15             DBIx::Class::ResultSource::View - ResultSource object representing a view
16              
17             =head1 SYNOPSIS
18              
19             package MyApp::Schema::Result::Year2000CDs;
20              
21             use base qw/DBIx::Class::Core/;
22              
23             __PACKAGE__->table_class('DBIx::Class::ResultSource::View');
24              
25             __PACKAGE__->table('year2000cds');
26             __PACKAGE__->result_source_instance->is_virtual(1);
27             __PACKAGE__->result_source_instance->view_definition(
28             "SELECT cdid, artist, title FROM cd WHERE year ='2000'"
29             );
30             __PACKAGE__->add_columns(
31             'cdid' => {
32             data_type => 'integer',
33             is_auto_increment => 1,
34             },
35             'artist' => {
36             data_type => 'integer',
37             },
38             'title' => {
39             data_type => 'varchar',
40             size => 100,
41             },
42             );
43              
44             =head1 DESCRIPTION
45              
46             View object that inherits from L<DBIx::Class::ResultSource>
47              
48             This class extends ResultSource to add basic view support.
49              
50             A view has a L</view_definition>, which contains a SQL query. The query can
51             only have parameters if L</is_virtual> is set to true. It may contain JOINs,
52             sub selects and any other SQL your database supports.
53              
54             View definition SQL is deployed to your database on
55             L<DBIx::Class::Schema/deploy> unless you set L</is_virtual> to true.
56              
57             Deploying the view does B<not> translate it between different database
58             syntaxes, so be careful what you write in your view SQL.
59              
60             Virtual views (L</is_virtual> true), are assumed to not
61             exist in your database as a real view. The L</view_definition> in this
62             case replaces the view name in a FROM clause in a subselect.
63              
64             =head1 EXAMPLES
65              
66             Having created the MyApp::Schema::Year2000CDs schema as shown in the SYNOPSIS
67             above, you can then:
68              
69             $2000_cds = $schema->resultset('Year2000CDs')
70             ->search()
71             ->all();
72             $count = $schema->resultset('Year2000CDs')
73             ->search()
74             ->count();
75              
76             If you modified the schema to include a placeholder
77              
78             __PACKAGE__->result_source_instance->view_definition(
79             "SELECT cdid, artist, title FROM cd WHERE year = ?"
80             );
81              
82             and ensuring you have is_virtual set to true:
83              
84             __PACKAGE__->result_source_instance->is_virtual(1);
85              
86             You could now say:
87              
88             $2001_cds = $schema->resultset('Year2000CDs')
89             ->search({}, { bind => [2001] })
90             ->all();
91             $count = $schema->resultset('Year2000CDs')
92             ->search({}, { bind => [2001] })
93             ->count();
94              
95             =head1 SQL EXAMPLES
96              
97             =over
98              
99             =item is_virtual set to false
100              
101             $schema->resultset('Year2000CDs')->all();
102              
103             SELECT cdid, artist, title FROM year2000cds me
104              
105             =item is_virtual set to true
106              
107             $schema->resultset('Year2000CDs')->all();
108              
109             SELECT cdid, artist, title FROM
110             (SELECT cdid, artist, title FROM cd WHERE year ='2000') me
111              
112             =back
113              
114             =head1 METHODS
115              
116             =head2 is_virtual
117              
118             __PACKAGE__->result_source_instance->is_virtual(1);
119              
120             Set to true for a virtual view, false or unset for a real
121             database-based view.
122              
123             =head2 view_definition
124              
125             __PACKAGE__->result_source_instance->view_definition(
126             "SELECT cdid, artist, title FROM cd WHERE year ='2000'"
127             );
128              
129             An SQL query for your view. Will not be translated across database
130             syntaxes.
131              
132             =head2 deploy_depends_on
133              
134             __PACKAGE__->result_source_instance->deploy_depends_on(
135             ["MyApp::Schema::Result::Year","MyApp::Schema::Result::CD"]
136             );
137              
138             Specify the views (and only the views) that this view depends on.
139             Pass this an array reference of fully qualified result classes.
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 12     12 1 25 my $self = shift;
152 12 100       107 return \"(${\$self->view_definition})" if $self->is_virtual;
  6         69  
153 6         67 return $self->name;
154             }
155              
156             =head1 OTHER METHODS
157              
158             =head2 new
159              
160             The constructor.
161              
162             =cut
163              
164             sub new {
165 5578     5578 1 52454 my ( $self, @args ) = @_;
166 5578         20310 my $new = $self->next::method(@args);
167             $new->{deploy_depends_on} =
168 0         0 { map { $_ => 1 }
169 657 50       4275 @{ $new->{deploy_depends_on} || [] } }
170 5578 100       20838 unless ref $new->{deploy_depends_on} eq 'HASH';
171 5578         15972 return $new;
172             }
173              
174             =head1 FURTHER QUESTIONS?
175              
176             Check the list of L<additional DBIC resources|DBIx::Class/GETTING HELP/SUPPORT>.
177              
178             =head1 COPYRIGHT AND LICENSE
179              
180             This module is free software L<copyright|DBIx::Class/COPYRIGHT AND LICENSE>
181             by the L<DBIx::Class (DBIC) authors|DBIx::Class/AUTHORS>. You can
182             redistribute it and/or modify it under the same terms as the
183             L<DBIx::Class library|DBIx::Class/COPYRIGHT AND LICENSE>.
184              
185             =cut
186              
187             1;