X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fcount%2Fcount_rs.t;h=174f6307f690186b25498c1de8e8bc0fb38d61e2;hb=757891ed5c4132d95e339212a5f66a2ee9fe4503;hp=af0f0363f9ca299a5f3d5c25e34443acc74131ff;hpb=0e773352a9c6c034dfb2526b8d68bf6ac1e2323b;p=dbsrgits%2FDBIx-Class.git diff --git a/t/count/count_rs.t b/t/count/count_rs.t index af0f036..174f630 100644 --- a/t/count/count_rs.t +++ b/t/count/count_rs.t @@ -4,9 +4,13 @@ use warnings; use lib qw(t/lib); use Test::More; -use DBICTest; -use DBIC::SqlMakerTest; -use DBIC::DebugObj; +use DBICTest ':DiffSQL'; +use DBIx::Class::SQLMaker::LimitDialects; + +my ($ROWS, $OFFSET) = ( + DBIx::Class::SQLMaker::LimitDialects->__rows_bindtype, + DBIx::Class::SQLMaker::LimitDialects->__offset_bindtype, +); my $schema = DBICTest->init_schema(); @@ -17,27 +21,25 @@ my $schema = DBICTest->init_schema(); { position => [1,2] }, { prefetch => [qw/disc lyrics/], rows => 3, offset => 8 }, ); - is ($rs->all, 2, 'Correct number of objects'); - - - my ($sql, @bind); - $schema->storage->debugobj(DBIC::DebugObj->new(\$sql, \@bind)); - $schema->storage->debug(1); + my @wherebind = ( + [ { sqlt_datatype => 'int', dbic_colname => 'position' } + => 1 ], + [ { sqlt_datatype => 'int', dbic_colname => 'position' } + => 2 ], + ); - is ($rs->count, 2, 'Correct count via count()'); + is ($rs->all, 2, 'Correct number of objects'); - is_same_sql_bind ( - $sql, - \@bind, + $schema->is_executed_sql_bind( sub { + is ($rs->count, 2, 'Correct count via count()'); + }, [[ 'SELECT COUNT( * ) FROM cd me JOIN track tracks ON tracks.cd = me.cdid JOIN cd disc ON disc.cdid = tracks.cd WHERE ( ( position = ? OR position = ? ) ) - ', - [ qw/'1' '2'/ ], - 'count softlimit applied', - ); + ', @wherebind + ]], 'count softlimit applied'); my $crs = $rs->count_rs; is ($crs->next, 2, 'Correct count via count_rs()'); @@ -51,15 +53,10 @@ my $schema = DBICTest->init_schema(); JOIN track tracks ON tracks.cd = me.cdid JOIN cd disc ON disc.cdid = tracks.cd WHERE ( ( position = ? OR position = ? ) ) - LIMIT 3 OFFSET 8 + LIMIT ? OFFSET ? ) tracks )', - [ - [ { sqlt_datatype => 'int', dbic_colname => 'position' } - => 1 ], - [ { sqlt_datatype => 'int', dbic_colname => 'position' } - => 2 ], - ], + [ @wherebind, [$ROWS => 3], [$OFFSET => 8] ], 'count_rs db-side limit applied', ); } @@ -71,17 +68,18 @@ my $schema = DBICTest->init_schema(); { 'tracks.position' => [1,2] }, { prefetch => [qw/tracks artist/], rows => 3, offset => 4 }, ); - is ($rs->all, 1, 'Correct number of objects'); - - my ($sql, @bind); - $schema->storage->debugobj(DBIC::DebugObj->new(\$sql, \@bind)); - $schema->storage->debug(1); + my @wherebind = ( + [ { sqlt_datatype => 'int', dbic_colname => 'tracks.position' } + => 1 ], + [ { sqlt_datatype => 'int', dbic_colname => 'tracks.position' } + => 2 ], + ); - is ($rs->count, 1, 'Correct count via count()'); + is ($rs->all, 1, 'Correct number of objects'); - is_same_sql_bind ( - $sql, - \@bind, + $schema->is_executed_sql_bind( sub { + is ($rs->count, 1, 'Correct count via count()'); + }, [ [ 'SELECT COUNT( * ) FROM ( SELECT cds.cdid @@ -92,10 +90,8 @@ my $schema = DBICTest->init_schema(); WHERE tracks.position = ? OR tracks.position = ? GROUP BY cds.cdid ) cds - ', - [ qw/'1' '2'/ ], - 'count softlimit applied', - ); + ', @wherebind + ]], 'count softlimit applied' ); my $crs = $rs->count_rs; is ($crs->next, 1, 'Correct count via count_rs()'); @@ -111,20 +107,15 @@ my $schema = DBICTest->init_schema(); JOIN artist artist ON artist.artistid = cds.artist WHERE tracks.position = ? OR tracks.position = ? GROUP BY cds.cdid - LIMIT 3 OFFSET 4 + LIMIT ? OFFSET ? ) cds )', - [ - [ { sqlt_datatype => 'int', dbic_colname => 'tracks.position' } - => 1 ], - [ { sqlt_datatype => 'int', dbic_colname => 'tracks.position' } - => 2 ], - ], + [ @wherebind, [$ROWS => 3], [$OFFSET => 4], ], 'count_rs db-side limit applied', ); } -# count with a having clause +# count with a having clause { my $rs = $schema->resultset("Artist")->search( {}, @@ -143,10 +134,10 @@ my $schema = DBICTest->init_schema(); $crs->as_query, '(SELECT COUNT( * ) FROM ( - SELECT me.artistid, MAX( cds.year ) AS newest_cd_year, - FROM artist me - LEFT JOIN cd cds ON cds.artist = me.artistid - GROUP BY me.artistid + SELECT me.artistid, MAX( cds.year ) AS newest_cd_year + FROM artist me + LEFT JOIN cd cds ON cds.artist = me.artistid + GROUP BY me.artistid HAVING newest_cd_year = ? ) me )', @@ -158,4 +149,42 @@ my $schema = DBICTest->init_schema(); is ($crs->next, 2, 'Correct artist count (each with one 2001 cd)'); } +# count with two having clauses +{ + my $rs = $schema->resultset("Artist")->search( + {}, + { + join => 'cds', + group_by => 'me.artistid', + '+select' => [ { max => 'cds.year', -as => 'newest_cd_year' } ], + '+as' => ['newest_cd_year'], + having => { 'newest_cd_year' => [ '1998', '2001' ] } + } + ); + + my $crs = $rs->count_rs; + + is_same_sql_bind ( + $crs->as_query, + '(SELECT COUNT( * ) + FROM ( + SELECT me.artistid, MAX( cds.year ) AS newest_cd_year + FROM artist me + LEFT JOIN cd cds ON cds.artist = me.artistid + GROUP BY me.artistid + HAVING newest_cd_year = ? OR newest_cd_year = ? + ) me + )', + [ + [ { dbic_colname => 'newest_cd_year' } + => '1998' ], + [ { dbic_colname => 'newest_cd_year' } + => '2001' ], + ], + 'count with having clause keeps sql as alias', + ); + + is ($crs->next, 3, 'Correct artist count (each with one 1998 or 2001 cd)'); +} + done_testing;