[Dbix-class] DBIx::Class::Index::Simple
Pedro Melo
melo at simplicidade.org
Wed Apr 2 11:58:38 BST 2008
Hi,
On Apr 2, 2008, at 12:40 AM, Peter Rabbitson wrote:
> Hi,
>
> Attached is a patchset allowing an alternative way of specifying
> simple SQLT indexes in classes. Full documentation and a two tests
> are included (can't think of more). Castaway liked it, Ash didn't,
> so I accept suggestions for a better design. One thing is certain -
> using sqlt_deploy_hook for adding single column indexes is the most
> convoluted way possible.
Is there any way to introspect a schema to find out what indexes
exist? If not, could you add some?
We auto-document schemas based on introspection of the schemas and
this would fit right in.
My previous attempts to this used source_info() and a indexes key,
where I would list
name => [qw/ columns /] pairs.
Regarding the column attribute vs add_index/add_index_named methods,
I prefer the latter as long as introspection is possible.
I know that the module is ::Simple, but I prefer to have a
single ::Index that covers most of what people want, and most of my
schemas have multi-column indexes.
Best regards,
>
> Peter
> Index: t/03podcoverage.t
> ===================================================================
> --- t/03podcoverage.t (revision 4250)
> +++ t/03podcoverage.t (working copy)
> @@ -89,6 +89,7 @@
> 'DBIx::Class::Storage::DBI::mysql' => { skip
> => 1 },
> 'SQL::Translator::Parser::DBIx::Class' => { skip
> => 1 },
> 'SQL::Translator::Producer::DBIx::Class::File' => { skip
> => 1 },
> + 'DBIx::Class::Index::Simple' => { skip
> => 1 },
>
> # skipped because the synopsis covers it clearly
>
> Index: t/lib/DBICTest/Schema/Event.pm
> ===================================================================
> --- t/lib/DBICTest/Schema/Event.pm (revision 4250)
> +++ t/lib/DBICTest/Schema/Event.pm (working copy)
> @@ -4,14 +4,14 @@
> use warnings;
> use base qw/DBIx::Class::Core/;
>
> -__PACKAGE__->load_components(qw/InflateColumn::DateTime/);
> +__PACKAGE__->load_components(qw/InflateColumn::DateTime
> Index::Simple/);
>
> __PACKAGE__->table('event');
>
> __PACKAGE__->add_columns(
> id => { data_type => 'integer', is_auto_increment => 1 },
> starts_at => { data_type => 'datetime' },
> - created_on => { data_type => 'timestamp' }
> + created_on => { data_type => 'timestamp', index_as =>
> 'created_test_simple_idx' }
> );
>
> __PACKAGE__->set_primary_key('id');
> Index: t/86sqlt.t
> ===================================================================
> --- t/86sqlt.t (revision 4250)
> +++ t/86sqlt.t (working copy)
> @@ -10,7 +10,7 @@
>
> my $schema = DBICTest->init_schema;
>
> -plan tests => 160;
> +plan tests => 162;
>
> my $translator = SQL::Translator->new(
> parser_args => {
> @@ -305,6 +305,14 @@
> );
>
> my $tschema = $translator->schema();
> +
> +# Test that the Index::Simple::sqlt_deploy_hook was called and
> that the correct
> +# indexes were created:
> +my ($s_idx) = grep { $_->name eq 'created_test_simple_idx'}
> ($tschema->get_table('event')->get_indices);
> +my $s_cols = [ $s_idx ? $s_idx->fields : '' ];
> +ok( $s_idx, 'Index::Simple created an index with the correct name');
> +is_deeply( $s_cols, [qw/created_on/], 'Index::Simple created an
> index on the correct column');
> +
> # Test that the $schema->sqlt_deploy_hook was called okay and that
> it removed
> # the 'link' table
> ok( !defined($tschema->get_table('link')), "Link table was removed
> by hook");
> Index: lib/DBIx/Class/Index/Simple.pm
> ===================================================================
> --- lib/DBIx/Class/Index/Simple.pm (revision 0)
> +++ lib/DBIx/Class/Index/Simple.pm (revision 0)
> @@ -0,0 +1,93 @@
> +package DBIx::Class::Index::Simple;
> +
> +use warnings;
> +use strict;
> +
> +use base qw/DBIx::Class/;
> +
> +=head1 NAME
> +
> +DBIx::Class::Index::Simple - Easy definition of L<SQLT|
> SQL::Translator> non-unique indexes for single columns
> +
> +=head1 SYNOPSIS
> +
> + __PACKAGE__->load_components(qw/Index::Simple Core/);
> + __PACKAGE__->add_columns(
> + ...
> + data => {
> + data_type 'VARCHAR',
> + size => '100',
> + index_as => 'data_idx',
> + },
> + ...
> + );
> +
> +=head1 DESCRIPTION
> +
> +This component allows easy definition of single column non-unique
> indexes for
> +further use with L<SQLTranslator|SQL::Translator>. It provides a
> convenient alternative
> +to the standard method of defining indexes as described in the
> +L<Cookbook|DBIx::Class::Manual::Cookbook/"Adding Indexes And
> Functions To Your SQL">.
> +Just add the attribute C<index_as> to every column you want to
> index, and supply the
> +index name as the attribute value. The index name must be unique
> among all other index
> +and/or unique constraint names defined for a specific
> resultsource, otherwise an
> +exception is thrown. The example from the L<SYNOPSIS> above is
> identical to:
> +
> + __PACKAGE__->add_columns(
> + ...
> + data => {
> + data_type 'VARCHAR',
> + size => '100',
> + },
> + ...
> + );
> +
> + sub sqlt_deploy_hook {
> + my ($self, $sqlt_table) = @_;
> + $sqlt_table->add_index(name => 'data_idx', fields =>
> ['data']);
> + }
> +
> +=head1 USAGE NOTES
> +
> +The module adds indexes by declaring a version of the
> C<sqlt_deploy_hook> method. If you
> +want to use this component together with your own
> C<sqlt_deploy_hook>, you need add an
> +explicit inherited method call to your version:
> +
> + sub sqlt_deploy_hook {
> + my ($self, $sqlt_table) = @_;
> +
> + <do your stuff>
> +
> + $self->next::method ($sqlt_table); #call sqlt_deploy_hook
> from Index::Simple
> + }
> +
> +=head1 AUTHORS
> +
> +Peter Rabbitson, <rabbit+devel at rabbit.us>
> +
> +=head1 LICENSE
> +
> +You may distribute this code under the same terms as Perl itself.
> +
> +=cut
> +
> +sub sqlt_deploy_hook {
> + my $self = shift;
> + my ($sqlt_table) = @_;
> +
> + foreach my $column ($self->columns) {
> + if (exists $self->column_info($column)->{index_as}) {
> +
> + my $idx_name = $self->column_info($column)->{index_as};
> + if (not defined $idx_name or length ($idx_name) == 0) {
> + $self->throw_exception("You must supply an index
> name for $column");
> + }
> +
> + $sqlt_table->add_index(name => $idx_name, fields =>
> [$column]);
> + }
> + }
> +
> + $self->next::method (@_) if $self->next::can;
> +}
> +
> +1;
> Index: lib/DBIx/Class/Manual/Cookbook.pod
> ===================================================================
> --- lib/DBIx/Class/Manual/Cookbook.pod (revision 4250)
> +++ lib/DBIx/Class/Manual/Cookbook.pod (working copy)
> @@ -1056,6 +1056,18 @@
> L<SQL::Translator::Schema/add_view> or
> L<SQL::Translator::Schema/add_procedure>.
>
> +=head2 Adding Single Column Non-Unique Indexes
> +
> +If all you want to do is add a single column non-unique index to
> one or several
> +columns you can use the L<Index::Simple|
> DBIx::Class::Index::Simple> component:
> +
> + package My::Schema::Artist;
> +
> + __PACKAGE__->load_components(qw/Index::Simple Core/);
> + __PACKAGE__->table('artist');
> + __PACKAGE__->add_columns(id => { ... }, name => { ... index_as =>
> 'name', ... })
> +
> +
> =head2 Schema versioning
>
> The following example shows simplistically how you might use
> DBIx::Class to
> _______________________________________________
> List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
> IRC: irc.perl.org#dbix-class
> SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
> Searchable Archive: http://www.grokbase.com/group/dbix-
> class at lists.rawmode.org
--
Pedro Melo
Blog: http://www.simplicidade.org/notes/
XMPP ID: melo at simplicidade.org
Use XMPP!
More information about the DBIx-Class
mailing list