X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FResultSource%2FView.pm;h=818295ec2eeb9a0db7dbe7ef647a21822370be04;hb=e5c6382908ee65577e53c0771629384d70959a3d;hp=7d6ec12e63f51a1151b9d62ed05e60f0105fc988;hpb=1d521afde80ce560e448083985c5bed8376bda5d;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/ResultSource/View.pm b/lib/DBIx/Class/ResultSource/View.pm index 7d6ec12..818295e 100644 --- a/lib/DBIx/Class/ResultSource/View.pm +++ b/lib/DBIx/Class/ResultSource/View.pm @@ -3,50 +3,186 @@ package DBIx::Class::ResultSource::View; use strict; use warnings; -use DBIx::Class::ResultSet; - -use base qw/DBIx::Class/; -__PACKAGE__->load_components(qw/ResultSource/); - - - _columns _primaries _unique_constraints name resultset_attributes - schema from _relationships column_info_from_storage source_info - source_name/); +use base 'DBIx::Class::ResultSource'; +__PACKAGE__->mk_group_accessors( rsrc_instance_specific_attribute => qw( + is_virtual view_definition deploy_depends_on +)); =head1 NAME -DBIx::Class::ResultSource::Table - Table object +DBIx::Class::ResultSource::View - ResultSource object representing a view =head1 SYNOPSIS + package MyApp::Schema::Result::Year2000CDs; + + use base qw/DBIx::Class::Core/; + + __PACKAGE__->table_class('DBIx::Class::ResultSource::View'); + + __PACKAGE__->table('year2000cds'); + __PACKAGE__->result_source->is_virtual(1); + __PACKAGE__->result_source->view_definition( + "SELECT cdid, artist, title FROM cd WHERE year ='2000'" + ); + __PACKAGE__->add_columns( + 'cdid' => { + data_type => 'integer', + is_auto_increment => 1, + }, + 'artist' => { + data_type => 'integer', + }, + 'title' => { + data_type => 'varchar', + size => 100, + }, + ); + =head1 DESCRIPTION -Table object that inherits from L +View object that inherits from L + +This class extends ResultSource to add basic view support. + +A view has a L, which contains a SQL query. The query can +only have parameters if L is set to true. It may contain JOINs, +sub selects and any other SQL your database supports. + +View definition SQL is deployed to your database on +L unless you set L to true. + +Deploying the view does B translate it between different database +syntaxes, so be careful what you write in your view SQL. + +Virtual views (L true), are assumed to not +exist in your database as a real view. The L in this +case replaces the view name in a FROM clause in a subselect. + +=head1 EXAMPLES + +Having created the MyApp::Schema::Year2000CDs schema as shown in the SYNOPSIS +above, you can then: + + $y2000_cds = $schema->resultset('Year2000CDs') + ->search() + ->all(); + $count = $schema->resultset('Year2000CDs') + ->search() + ->count(); + +If you modified the schema to include a placeholder + + __PACKAGE__->result_source->view_definition( + "SELECT cdid, artist, title FROM cd WHERE year = ?" + ); + +and ensuring you have is_virtual set to true: + + __PACKAGE__->result_source->is_virtual(1); + +You could now say: + + $y2001_cds = $schema->resultset('Year2000CDs') + ->search({}, { bind => [2001] }) + ->all(); + $count = $schema->resultset('Year2000CDs') + ->search({}, { bind => [2001] }) + ->count(); + +=head1 SQL EXAMPLES + +=over + +=item is_virtual set to false + + $schema->resultset('Year2000CDs')->all(); + + SELECT cdid, artist, title FROM year2000cds me + +=item is_virtual set to true + + $schema->resultset('Year2000CDs')->all(); + + SELECT cdid, artist, title FROM + (SELECT cdid, artist, title FROM cd WHERE year ='2000') me + +=back =head1 METHODS +=head2 is_virtual + + __PACKAGE__->result_source->is_virtual(1); + +Set to true for a virtual view, false or unset for a real +database-based view. + +=head2 view_definition + + __PACKAGE__->result_source->view_definition( + "SELECT cdid, artist, title FROM cd WHERE year ='2000'" + ); + +An SQL query for your view. Will not be translated across database +syntaxes. + +=head2 deploy_depends_on + + __PACKAGE__->result_source->deploy_depends_on( + ["MyApp::Schema::Result::Year","MyApp::Schema::Result::CD"] + ); + +Specify the views (and only the views) that this view depends on. +Pass this an array reference of fully qualified result classes. + +=head1 OVERRIDDEN METHODS + =head2 from Returns the FROM entry for the table (i.e. the view name) +or the SQL as a subselect if this is a virtual view. =cut -sub from { shift->name; } +sub from { + $_[0]->throw_exception('from() is not a setter method') if @_ > 1; + $_[0]->is_virtual + ? \( '(' . $_[0]->view_definition .')' ) + : $_[0]->name + ; +} -1; +=head1 OTHER METHODS + +=head2 new -=head1 AUTHORS +The constructor. -Matt S. Trout +=cut -With Contributions from: +sub new { + my ( $self, @args ) = @_; + my $new = $self->next::method(@args); + $new->{deploy_depends_on} = + { map { $_ => 1 } + @{ $new->{deploy_depends_on} || [] } } + unless ref $new->{deploy_depends_on} eq 'HASH'; + return $new; +} -Guillermo Roditi Egroditi@cpan.orgE +=head1 FURTHER QUESTIONS? -=head1 LICENSE +Check the list of L. -You may distribute this code under the same terms as Perl itself. +=head1 COPYRIGHT AND LICENSE + +This module is free software L +by the L. You can +redistribute it and/or modify it under the same terms as the +L. =cut +1;