X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=dbsrgits%2FDBIx-Class.git;a=blobdiff_plain;f=t%2Fprefetch%2Fcorrelated.t;h=350602797f2dc99c6629d239a1bceeb0a9129255;hp=e4e747d348c4247edcbe1dcc1056cf182ebc15cc;hb=4e9fc3f33df616fb7340d05e304ff985b9cce9cb;hpb=4c2b30d6e53cd05e570ad112e87ad6f96355f695 diff --git a/t/prefetch/correlated.t b/t/prefetch/correlated.t index e4e747d..3506027 100644 --- a/t/prefetch/correlated.t +++ b/t/prefetch/correlated.t @@ -2,7 +2,6 @@ use strict; use warnings; use Test::More; -use Test::Exception; use lib qw(t/lib); use DBICTest; use DBIC::SqlMakerTest; @@ -19,16 +18,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,16 +45,28 @@ is_same_sql_bind( LEFT JOIN track tracks ON tracks.cd = me.cdid WHERE me.artist != ? - ORDER BY tracks.cd + ORDER BY me.cdid )', [ - [ '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' ); +my $queries = 0; +$schema->storage->debugcb(sub { $queries++; }); +$schema->storage->debug(1); + is_deeply ( { map { $_->cdid => { @@ -77,4 +84,59 @@ 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 != ? + ORDER BY me.cdid + )', + [ + + # 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;