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   144589 use strict;
  330         678  
  330         8703  
4 330     330   1282 use warnings;
  330         548  
  330         7610  
5              
6 330     330   1376 use DBIx::Class::ResultSet;
  330         571  
  330         9842  
7              
8 330     330   1255 use base qw/DBIx::Class/;
  330         571  
  330         82085  
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
47              
48             This class extends ResultSource to add basic view support.
49              
50             A view has a L, which contains a SQL query. The query can
51             only have parameters if L 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 unless you set L to true.
56              
57             Deploying the view does B translate it between different database
58             syntaxes, so be careful what you write in your view SQL.
59              
60             Virtual views (L true), are assumed to not
61             exist in your database as a real view. The L 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 16 my $self = shift;
152 12 100       48 return \"(${\$self->view_definition})" if $self->is_virtual;
  6         69  
153 6         56 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 5468     5468 1 40885 my ( $self, @args ) = @_;
166 5468         17409 my $new = $self->next::method(@args);
167             $new->{deploy_depends_on} =
168 0         0 { map { $_ => 1 }
169 656 50       3276 @{ $new->{deploy_depends_on} || [] } }
170 5468 100       14642 unless ref $new->{deploy_depends_on} eq 'HASH';
171 5468         11357 return $new;
172             }
173              
174             =head1 FURTHER QUESTIONS?
175              
176             Check the list of L.
177              
178             =head1 COPYRIGHT AND LICENSE
179              
180             This module is free software L
181             by the L. You can
182             redistribute it and/or modify it under the same terms as the
183             L.
184              
185             =cut
186              
187             1;