Ambrosia

 view release on metacpan or  search on metacpan

lib/Ambrosia/EntityDataModel.pm  view on Meta::CPAN

    goto &id_value;
}

sub primary_key_value
{
    my $self = shift;
    my $pk_name = $self->primary_key();
    return $self->$pk_name;
}

################################################################################

sub need_insert
{
    return $_[0]->IS_NEW;
}

sub need_update
{
    return $_[0]->IS_LOADED || $_[0]->IS_UPDATED
}

sub id_value_from_hash
{
    my $proto = shift;
    my $h = shift;
    my $key_name = $proto->key();

    if ( ref $key_name )
    {
        return [ @$h{@$key_name} ];
    }
    else
    {
        return $h->{$key_name};
    }
}

################################################################################
#   END
################################################################################
sub get_cache_code
{
    my $proto = shift;

    if ( my $class = ref $proto )
    {
        my $id = $proto->key_value();
        return $class . '_' . join '_', (ref $id ? @$id : $id);
    }
    else
    {
        my $id = shift();
        if ( defined $id )
        {
            return $proto . '_' . join '_', (ref $id ? @$id : $id);
        }
        else
        {
            die 'Bad usage get_cache_code: ' . $proto . '; '
                . join('; ', caller(0), "\n")
                . join('; ', caller(1), "\n")
                . join('; ', caller(2), "\n");
        }
    }
}

sub after_load
{
    @_;
}

sub list
{
    my $proto = shift;
    my $class = ref($proto) || $proto;
    my $offset = shift;
    my $limit = shift;
    my $count = shift;

    my $driver = storage->driver($class->driver_type, $class->source_name);

    assert {$driver} 'Not defined driver';
    return new Ambrosia::core::Nil unless $driver;

    my $source_path = join '_', grep defined $_, $class->source_path();

    my $entity;
    my $query = Ambrosia::QL
        ->from([$class->source_path()], \$entity)
        ->in($driver)
        ->what($class->fields_mapping)
        ->select(sub {
                my %h = map { my $v = $entity->{$_}; s/^${source_path}_//; $_ => $v } keys %$entity;
                if ( my $old = $driver->cache->get($class->get_cache_code($class->id_value_from_hash(\%h))) )
                {
                    return $old;
                }
                my $e = $class->new(%h);
                $driver->cache->set($e->get_cache_code, $e);
                $e->after_load;
                return $e;
            });

    my $list;
    if ( $limit )
    {
        $query->skip($offset || 0);
    }

    if ( $count )
    {
        ($list, $count) = $query->count($limit);
        return ($list, $count);
    }
    else
    {
        $list = [$query->take($limit)];
    }

    return ($list, undef);
}



( run in 0.575 second using v1.01-cache-2.11-cpan-5a3173703d6 )