Aniki

 view release on metacpan or  search on metacpan

lib/Aniki/Schema/Relationship/Fetcher.pm  view on Meta::CPAN

use Mouse v2.4.5;

has relationship => (
    is       => 'ro',
    weak_ref => 1,
    required => 1,
);

use List::MoreUtils qw/pairwise notall/;
use List::UtilsBy qw/partition_by/;
use Scalar::Util qw/weaken/;
use SQL::QueryMaker;

sub execute {
    my ($self, $handler, $rows, $prefetch) = @_;
    return unless @$rows;

    my %where;
    if (ref $prefetch eq 'HASH') {
        my %prefetch;
        for my $key (keys %$prefetch) {

lib/Aniki/Schema/Relationship/Fetcher.pm  view on Meta::CPAN

        my $dest_keygen = sub {
            my $dest_row = shift;
            return join '|', map { defined $_ ? quotemeta $_ : '(NULL)' } map { $dest_row->get_column($_) } @dest_columns;
        };

        my %dest_rows_map = partition_by { $dest_keygen->($_) } @$dest_rows;
        for my $src_row (@$src_rows) {
            next if notall { defined $src_row->get_column($_) } @src_columns;
            my $dest_rows = $dest_rows_map{$src_keygen->($src_row)};
            $src_row->relay_data->{$name} = $has_many ? $dest_rows : $dest_rows->[0];
            weaken($src_row->relay_data->{$name});
        }
    }
}

__PACKAGE__->meta->make_immutable();
__END__



( run in 0.620 second using v1.01-cache-2.11-cpan-65fba6d93b7 )