DBIx-EAV
view release on metacpan or search on metacpan
lib/DBIx/EAV/ResultSet.pm view on Meta::CPAN
sub _to_bool { 1 }
sub _build_cursor {
my $self = shift;
DBIx::EAV::Cursor->new(
eav => $self->eav,
type => $self->type,
query => $self->_query,
options => $self->_options,
);
}
sub new_entity {
my ($self, $data) = @_;
my $entity = $self->entity_class->new( eav => $self->eav, type => $self->type );
$entity->set($data) if ref $data eq 'HASH';
$entity;
}
sub inflate_entity {
my ($self, $data) = @_;
my $type = $self->type;
$type = $self->eav->type_by_id($data->{entity_type_id})
if $data->{entity_type_id} && $data->{entity_type_id} != $type->id;
my $entity = $self->entity_class->new( eav => $self->eav, type => $type, raw => $data );
$entity->load_attributes;
$entity;
}
{
no warnings;
*create = \&insert;
}
sub insert {
my ($self, $data) = @_;
$self->new_entity($data)->save;
}
sub populate {
my ($self, $data) = @_;
die 'Call populate(\@items)' unless ref $data eq 'ARRAY';
my @result;
foreach my $item (@$data) {
push @result, $self->insert($item);
}
return wantarray ? @result : \@result;
}
sub update {
my ($self, $data, $where) = @_;
$where //= {};
$where->{entity_type_id} = $self->type->id;
# do a direct update for static attributes
}
sub delete {
my $self = shift;
my $eav = $self->eav;
my $type = $self->type;
my $entities_table = $eav->table('entities');
# Call delete_all for SQLite since it doesn't
# support delete with joins.
# Better solution welcome.
return $self->delete_all if
$self->eav->schema->db_driver_name eq 'SQLite';
unless ($eav->schema->database_cascade_delete) {
# delete links by relationship id
my @ids = map { $_->{id} } $type->relationships;
$eav->table('entity_relationships')->delete(
{
relationship_id => \@ids,
$entities_table->name.'.entity_type_id' => $type->id
},
{ join => { $entities_table->name => [{ 'me.left_entity_id' => 'their.id' }, { 'me.right_entity_id' => 'their.id' }] } }
);
# delete attributes:
# - group attrs by data type so only one DELETE command is sent per data type
# - restrict by entity_type_id so we dont delete parent/sibiling/child data
my %types;
push @{ $types{$_->{data_type}} }, $_->{id}
for $type->attributes(no_static => 1);
while (my ($data_type, $ids) = each %types) {
my $value_table = $eav->table('value_'.$data_type);
$value_table->delete(
{
attribute_id => $ids,
$entities_table->name.'.entity_type_id' => $type->id
},
{ join => { $entities_table->name => { 'me.entity_id' => 'their.id' } } }
);
}
}
$entities_table->delete({ entity_type_id => $type->id });
}
sub delete_all {
( run in 1.322 second using v1.01-cache-2.11-cpan-97f6503c9c8 )