DBIx-NoSQL
view release on metacpan or search on metacpan
lib/DBIx/NoSQL/Model/Index.pm view on Meta::CPAN
package DBIx::NoSQL::Model::Index;
our $AUTHORITY = 'cpan:YANICK';
$DBIx::NoSQL::Model::Index::VERSION = '0.0021';
use strict;
use warnings;
use Moose;
use Clone qw/ clone /;
use Digest::SHA qw/ sha1_hex /;
use DBIx::NoSQL::Search;
has model => qw/ is ro required 1 weak_ref 1 /, handles => [qw/ store storage /];
has prepared => qw/ is rw isa Bool default 0 /;
has key_column => qw/ is rw isa Str lazy_build 1 /;
sub _build_key_column { 'key' }
has [qw/ create_statement drop_statement schema_digest /] => qw/ is rw isa Maybe[Str] /;
has result_class_scaffold => qw/ is ro lazy_build 1 /;
sub _build_result_class_scaffold { return DBIx::NoSQL::ClassScaffold->new->become_ResultClass }
has result_class => qw/ is ro lazy_build 1 /;
sub _build_result_class { return shift->result_class_scaffold->package }
sub search {
my $self = shift;
$self->prepare;
my $search = DBIx::NoSQL::Search->new( model => $self->model );
if ( @_ ) {
$search->_where( $_[0] );
}
return $search;
}
sub update {
my $self = shift;
my $key = shift;
my $target = shift;
$self->prepare;
my $model = $self->model;
my $data = $target;
if ( $data && ! ref $data ) {
$data = $model->deserialize( $target );
}
my %set;
$set{ $self->key_column } = $key;
while( my ( $field, $column ) = each %{ $model->_field2column_map } ) {
$set{ $column } = $data->{ $field };
}
$self->store->schema->resultset( $self->model->name )->update_or_create(
\%set, { key => 'primary' },
);
}
sub delete {
my $self = shift;
my $key = shift;
$self->prepare;
my $result = $self->store->schema->resultset( $self->model->name )->find(
{ $self->key_column => $key },
{ key => 'primary' }
);
if ( $result ) {
$result->delete;
}
}
sub prepare {
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 );
( run in 0.575 second using v1.01-cache-2.11-cpan-39bf76dae61 )