# Test to ensure we get a consistent result set wether or not we use the # prefetch option in combination rows (LIMIT). use strict; use warnings; use Test::More; use Test::Exception; use lib qw(t/lib); use DBICTest; my $schema = DBICTest->init_schema(); my $no_prefetch = $schema->resultset('Artist')->search( [ # search deliberately contrived { 'artwork.cd_id' => undef }, { 'tracks.title' => { '!=' => 'blah-blah-1234568' }} ], { rows => 3, join => { cds => [qw/artwork tracks/] }, } ); my $use_prefetch = $no_prefetch->search( {}, { select => ['me.artistid', 'me.name'], as => ['artistid', 'name'], prefetch => 'cds', order_by => { -desc => 'name' }, } ); is($no_prefetch->count, $use_prefetch->count, '$no_prefetch->count == $use_prefetch->count'); is( scalar ($no_prefetch->all), scalar ($use_prefetch->all), "Amount of returned rows is right" ); my $artist_many_cds = $schema->resultset('Artist')->search ( {}, { join => 'cds', group_by => 'me.artistid', having => \ 'count(cds.cdid) > 1', })->first; $no_prefetch = $schema->resultset('Artist')->search( { artistid => $artist_many_cds->id }, { rows => 1 } ); $use_prefetch = $no_prefetch->search ({}, { prefetch => 'cds' }); my $normal_artist = $no_prefetch->single; my $prefetch_artist = $use_prefetch->find({ name => $artist_many_cds->name }); my $prefetch2_artist = $use_prefetch->first; is( $prefetch_artist->cds->count, $normal_artist->cds->count, "Count of child rel with prefetch + rows => 1 is right (find)" ); is( $prefetch2_artist->cds->count, $normal_artist->cds->count, "Count of child rel with prefetch + rows => 1 is right (first)" ); is ( scalar ($prefetch_artist->cds->all), scalar ($normal_artist->cds->all), "Amount of child rel rows with prefetch + rows => 1 is right (find)" ); is ( scalar ($prefetch2_artist->cds->all), scalar ($normal_artist->cds->all), "Amount of child rel rows with prefetch + rows => 1 is right (first)" ); throws_ok ( sub { $use_prefetch->single }, qr/resultsets prefetching has_many/, 'single() with multiprefetch is illegal', ); my $artist = $use_prefetch->search({'cds.title' => $artist_many_cds->cds->first->title })->next; is($artist->cds->count, 1, "count on search limiting prefetched has_many"); # try with double limit my $artist2 = $use_prefetch->search({'cds.title' => { '!=' => $artist_many_cds->cds->first->title } })->slice (0,0)->next; is($artist2->cds->count, 2, "count on search limiting prefetched has_many"); done_testing;