DBIx-NoSQL
view release on metacpan or search on metacpan
lib/DBIx/NoSQL/Model/Index.pm view on Meta::CPAN
my $self = shift;
return if $self->prepared;
$self->register_result_class;
if ( ! $self->exists ) {
$self->deploy;
}
elsif ( ! $self->same ) {
if ( 1 ) {
$self->redeploy;
}
else {
my $model = $self->model->name;
die "Unable to prepare index for model ($model) because index already exists (and is different)";
}
}
$self->prepared( 1 );
}
sub register_result_class {
my $self = shift;
my $model = $self->model;
my $store = $self->store;
my $schema = $store->schema;
my $name = $self->model->name;
my $result_class = $self->result_class;
$schema->unregister_source( $name ) if $schema->source_registrations->{ $name };
{
unless ( $result_class->can( 'result_source_instance' ) ) {
$result_class->table( $name );
}
my $key_column = $self->key_column;
unless( $result_class->has_column( $key_column ) ) {
$result_class->add_column( $key_column => {
data_type => 'text'
} );
}
unless( $result_class->primary_columns ) {
$result_class->set_primary_key( $key_column );
}
for my $field ( values %{ $model->field_map } ) {
next unless $field->index;
unless( $result_class->has_column( $field->name ) ) {
$field->install_index( $model, $result_class );
}
}
}
$schema->register_class( $name => $result_class );
my $table = $result_class->table;
my $deployment_statements = $schema->build_deployment_statements;
my @deployment_statements = split m/;\n/, $deployment_statements;
my ( $create ) = grep { m/(?:(?i)CREATE\s+TABLE\s+.*)$table/ } @deployment_statements;
my ( $drop ) = grep { m/(?:(?i)DROP\s+TABLE\s+.*)$table/ } @deployment_statements;
s/^\s*//, s/\s*$// for $create, $drop;
$self->create_statement( $create );
$self->drop_statement( $drop );
$self->schema_digest( sha1_hex $create );
}
sub stash_schema_digest {
my $self = shift;
my $model = $self->model->name;
return $self->store->stash->value( "model.$model.index.schema_digest", @_ );
}
sub exists {
my $self = shift;
return $self->storage->table_exists( $self->model->name );
}
sub same {
my $self = shift;
return unless my $stash_schema_digest = $self->stash_schema_digest;
return unless my $schema_digest = $self->schema_digest;
return $schema_digest eq $stash_schema_digest;
}
sub deploy {
my $self = shift;
if ( $self->exists ) {
if ( $self->same ) {
return;
}
else {
my $model = $self->model->name;
warn "Index schema mismatch for model ($model)";
return;
}
}
$self->_deploy;
}
sub _deploy {
my $self = shift;
$self->store->storage->do( $self->create_statement );
$self->stash_schema_digest( $self->schema_digest );
}
sub undeploy {
my $self = shift;
$self->store->storage->do( $self->drop_statement );
}
sub redeploy {
my $self = shift;
( run in 0.832 second using v1.01-cache-2.11-cpan-71847e10f99 )