package KiokuDB::Backend::Role::TXN::Memory::Scan; use Moose::Role; use Data::Stream::Bulk::Util qw(bulk); use namespace::clean -except => 'meta'; with qw( KiokuDB::Backend::Role::TXN::Memory KiokuDB::Backend::Role::Clear KiokuDB::Backend::Role::Scan ); requires qw( all_storage_entries clear_storage ); sub clear { my $self = shift; if ( @{ $self->_txn_stack } ) { %{ $self->_txn_stack->[-1] } = ( %{ $self->_new_frame }, cleared => 1 ); } else { $self->clear_storage; } } sub all_entries { my $self = shift; my $stack = $self->_txn_stack; if ( @$stack ) { my $frame = $stack->[-1]; my $flat = $self->_collapsed_txn_stack; my $live = bulk(grep { not $_->deleted } values %{ $flat->{live} }); if ( $flat->{cleared} ) { # return all the inserted entries since the clear return $live; } else { my $all = $self->all_storage_entries; # create a filter for all the IDs that have been either deleted or superseded in the transaction frame my %mask; @mask{ keys %{ $flat->{live} } } = (); my $shadowed = keys %mask ? $all->filter(sub {[ grep { not exists $mask{$_->id} } @$_ ]}) : $all; # make note of all read entries in the transaction frame my $noted_shadowed = $shadowed->filter(sub { @{ $frame->{live} }{ map { $_->id } @$_ } = @$_; return $_; }); return $live->cat($noted_shadowed); } } else { return $self->all_storage_entries; } } # ex: set sw=4 et: __PACKAGE__ __END__