X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fprefetch%2Fcorrelated.t;h=8d99ff876929b14156c1fe5a198356be5dfb25ab;hb=6dd43920c45d7ae898f1bb902a086a9f99741976;hp=e4e747d348c4247edcbe1dcc1056cf182ebc15cc;hpb=4c2b30d6e53cd05e570ad112e87ad6f96355f695;p=dbsrgits%2FDBIx-Class.git diff --git a/t/prefetch/correlated.t b/t/prefetch/correlated.t index e4e747d..8d99ff8 100644 --- a/t/prefetch/correlated.t +++ b/t/prefetch/correlated.t @@ -2,7 +2,7 @@ use strict; use warnings; use Test::More; -use Test::Exception; +use Test::Deep; use lib qw(t/lib); use DBICTest; use DBIC::SqlMakerTest; @@ -19,16 +19,12 @@ my $cd_data = { map { }, } ( $cdrs->all ) }; -my $queries = 0; -$schema->storage->debugcb(sub { $queries++; }); -$schema->storage->debug(1); - my $c_rs = $cdrs->search ({}, { prefetch => 'tracks', '+columns' => { sibling_count => $cdrs->search( { 'siblings.artist' => { -ident => 'me.artist' }, - 'siblings.cdid' => { '!=' => ['-and', { -ident => 'me.cdid' }, 'bogus condition'] }, + 'siblings.cdid' => { '!=' => ['-and', { -ident => 'me.cdid' }, 23414] }, }, { alias => 'siblings' }, )->count_rs->as_query, }, @@ -50,17 +46,28 @@ is_same_sql_bind( LEFT JOIN track tracks ON tracks.cd = me.cdid WHERE me.artist != ? - ORDER BY tracks.cd )', [ - [ 'siblings.cdid' => 'bogus condition' ], - [ 'me.artist' => 2 ], - [ 'me.artist' => 2 ], + + # subselect + [ { sqlt_datatype => 'integer', dbic_colname => 'siblings.cdid' } + => 23414 ], + + [ { sqlt_datatype => 'integer', dbic_colname => 'me.artist' } + => 2 ], + + # outher WHERE + [ { sqlt_datatype => 'integer', dbic_colname => 'me.artist' } + => 2 ], ], 'Expected SQL on correlated realiased subquery' ); -is_deeply ( +my $queries = 0; +$schema->storage->debugcb(sub { $queries++; }); +$schema->storage->debug(1); + +cmp_deeply ( { map { $_->cdid => { track_titles => [ map { $_->title } ($_->tracks->all) ], @@ -77,4 +84,58 @@ is ($queries, 1, 'Only 1 query fired to retrieve everything'); $schema->storage->debug($orig_debug); $schema->storage->debugcb(undef); +# now add an unbalanced select/as pair +$c_rs = $c_rs->search ({}, { + '+select' => $cdrs->search( + { 'siblings.artist' => { -ident => 'me.artist' } }, + { alias => 'siblings', columns => [ + { first_year => { min => 'year' }}, + { last_year => { max => 'year' }}, + ]}, + )->as_query, + '+as' => [qw/active_from active_to/], +}); + +is_same_sql_bind( + $c_rs->as_query, + '( + SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track, + (SELECT COUNT( * ) + FROM cd siblings + WHERE siblings.artist = me.artist + AND siblings.cdid != me.cdid + AND siblings.cdid != ? + AND me.artist != ? + ), + (SELECT MIN( year ), MAX( year ) + FROM cd siblings + WHERE siblings.artist = me.artist + AND me.artist != ? + ), + tracks.trackid, tracks.cd, tracks.position, tracks.title, tracks.last_updated_on, tracks.last_updated_at + FROM cd me + LEFT JOIN track tracks + ON tracks.cd = me.cdid + WHERE me.artist != ? + )', + [ + + # first subselect + [ { sqlt_datatype => 'integer', dbic_colname => 'siblings.cdid' } + => 23414 ], + + [ { sqlt_datatype => 'integer', dbic_colname => 'me.artist' } + => 2 ], + + # second subselect + [ { sqlt_datatype => 'integer', dbic_colname => 'me.artist' } + => 2 ], + + # outher WHERE + [ { sqlt_datatype => 'integer', dbic_colname => 'me.artist' } + => 2 ], + ], + 'Expected SQL on correlated realiased subquery' +); + done_testing;