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 )