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 )