[Dbix-class] multiple has_many rels in prefetch not supported in 0.081?

Moritz Onken onken at houseofdesign.de
Wed Aug 27 10:04:55 BST 2008


Am 26.08.2008 um 20:34 schrieb Matt S Trout:

> On Tue, Aug 26, 2008 at 03:03:11PM +0200, Moritz Onken wrote:
>> As I said I'm on it and writing some examples and tests.
>
> Ok, awesome. Please start a new thread when you've got that  
> together, I
> think this one was mostly the "resolving confusion" thread so the
> "figuring out what to fix" one can be its own thing :)

first test is attached. Couldn't find a test case where it returns
totally unrelated rows. The only problem is that it returns rows
multiple times.

############################################################
use strict;
use warnings;

use Test::More;
use lib qw(t/lib);
use DBICTest;
use Data::Dumper;

my $schema = DBICTest->init_schema();

my $orig_debug = $schema->storage->debug;

BEGIN {
     eval "use DBD::SQLite";
     plan $@
       ? ( skip_all => 'needs DBD::SQLite for testing' )
       : ( tests => 10 );
}

my $artist = $schema->resultset("Artist")->first;
$artist->cds->delete;
$artist->onekeys->delete;

$artist->create_related( "cds", { title => "cd1", year => "1984" } );
$artist->create_related( "cds", { title => "cd2", year => "1984" } );
$artist->create_related( "cds", { title => "cd3", year => "1984" } );
$artist->create_related( "onekeys", { cd => 1 } );
$artist->create_related( "onekeys", { cd => 2 } );

is( $artist->onekeys->count, 2, "count without prefetch is fine" );
is( $artist->cds->count, 2 );

my $search = {};
my $attr = { prefetch => [qw/cds onekeys/] };

$artist = $schema->resultset("Artist")->search( $search, $attr )->first;

is( $artist->onekeys->count, 2, "artist has 2 onekeys" )
   ;    # returns 6 which is 2*3 (see l. 29)
is( $artist->cds->count, 3, "artist has 3 cds" );

my @cds = sort ( map { $_->title } $artist->cds->all );
is_deeply( \@cds, [qw(cd1 cd2 cd3)], "no duplicates" );

my @onekeys = sort ( map { $_->cd } $artist->onekeys->all );
is_deeply( \@onekeys, [qw(1 2)] );    # @onekeys = (1,1,2,2);

$attr = { prefetch => [qw/onekeys cds/] };    # switch order

$artist =
   $schema->resultset("Artist")
   ->search( { artistid => $artist->artistid }, $attr )->first;

is( $artist->onekeys->count, 2, "artist has 2 onekeys" );
is( $artist->cds->count,     3, "artist has 3 cds" );

@cds = sort ( map { $_->title } $artist->cds->all );
is_deeply( \@cds, [qw(cd1 cd2 cd3)] )
   ;    # @onekeys = qw(cd1 cd1 cd2 cd2 cd3 cd3));

@onekeys = sort ( map { $_->cd } $artist->onekeys->all );
is_deeply( \@onekeys, [qw(1 2)] );




More information about the DBIx-Class mailing list