Alzabo
view release on metacpan or search on metacpan
lib/Alzabo/Create/Index.pm view on Meta::CPAN
package Alzabo::Create::Index;
use strict;
use vars qw($VERSION);
use Alzabo::Create;
use Alzabo::Exceptions ( abbr => 'params_exception' );
use Alzabo::Utils;
use Params::Validate qw( :all );
Params::Validate::validation_options
( on_fail => sub { params_exception join '', @_ } );
use base qw(Alzabo::Index);
$VERSION = 2.0;
1;
sub new
{
my $proto = shift;
my $class = ref $proto || $proto;
validate( @_, { table => { isa => 'Alzabo::Create::Table' },
columns => { type => ARRAYREF },
unique => { type => BOOLEAN, default => 0 },
fulltext => { type => BOOLEAN, default => 0 },
function => { type => UNDEF | SCALAR, default => undef },
} );
my %p = @_;
my $self = bless {}, $class;
$self->{table} = $p{table};
$self->{unique} = $p{unique} || 0;
$self->{fulltext} = $p{fulltext} || 0;
$self->{function} = $p{function};
$self->{columns} = Tie::IxHash->new;
foreach my $c (@{ $p{columns} })
{
my %p = Alzabo::Utils::safe_isa( $c, 'Alzabo::Column' ) ? ( column => $c ) : %$c;
$self->add_column(%p);
}
$self->table->schema->rules->validate_index($self);
return $self;
}
sub add_column
{
my $self = shift;
validate( @_, { column => { isa => 'Alzabo::Create::Column' },
prefix => { type => SCALAR,
optional => 1 } } );
my %p = @_;
my $new_name = $p{column}->name;
params_exception "Column $new_name already exists in index."
if $self->{columns}->EXISTS($new_name);
$self->{columns}->STORE( $new_name, \%p );
eval { $self->table->schema->rules->validate_index($self); };
if ($@)
{
$self->{columns}->DELETE($new_name);
rethrow_exception($@);
}
}
sub delete_column
{
my $self = shift;
validate_pos( @_, { isa => 'Alzabo::Create::Column' } );
my $c = shift;
params_exception "Column " . $c->name . " is not part of index."
unless $self->{columns}->EXISTS( $c->name );
$self->{columns}->DELETE( $c->name );
}
sub set_prefix
{
( run in 2.061 seconds using v1.01-cache-2.11-cpan-8f98c5d2c55 )