X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fsqlmaker%2Flimit_dialects%2Frno.t;h=4f24e564c854fca88d0628b410c5073e00da98f0;hb=851437691480515dfef50e5e170b77ff51d07620;hp=4b96a65d262c5397edac6e99a49b7eeb18fcce4d;hpb=d763268755f6b9ee1d0d4d8442d989ef7c5a4d7d;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/t/sqlmaker/limit_dialects/rno.t b/t/sqlmaker/limit_dialects/rno.t index 4b96a65..4f24e56 100644 --- a/t/sqlmaker/limit_dialects/rno.t +++ b/t/sqlmaker/limit_dialects/rno.t @@ -5,6 +5,12 @@ use Test::More; use lib qw(t/lib); use DBICTest; use DBIC::SqlMakerTest; +use DBIx::Class::SQLMaker::LimitDialects; + +my ($TOTAL, $OFFSET) = ( + DBIx::Class::SQLMaker::LimitDialects->__total_bindtype, + DBIx::Class::SQLMaker::LimitDialects->__offset_bindtype, +); my $schema = DBICTest->init_schema; @@ -20,10 +26,10 @@ my $rs_selectas_col = $schema->resultset ('BooksInLibrary')->search ({}, { is_same_sql_bind( $rs_selectas_col->as_query, '( - SELECT id, source, owner, title, price, + SELECT me.id, me.source, me.owner, me.title, me.price, owner__name FROM ( - SELECT id, source, owner, title, price, + SELECT me.id, me.source, me.owner, me.title, me.price, owner__name, ROW_NUMBER() OVER( ) AS rno__row__index FROM ( @@ -34,9 +40,13 @@ is_same_sql_bind( WHERE ( source = ? ) ) me ) me - WHERE rno__row__index BETWEEN 1 AND 1 + WHERE rno__row__index >= ? AND rno__row__index <= ? )', - [ [ 'source', 'Library' ] ], + [ + [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } => 'Library' ], + [ $OFFSET => 1 ], + [ $TOTAL => 1 ], + ], ); $schema->storage->_sql_maker->quote_char ([qw/ [ ] /]); @@ -52,10 +62,10 @@ my $rs_selectas_rel = $schema->resultset ('BooksInLibrary')->search ({}, { is_same_sql_bind( $rs_selectas_rel->as_query, '( - SELECT [id], [source], [owner], [title], [price], + SELECT [me].[id], [me].[source], [me].[owner], [me].[title], [me].[price], [owner_name] FROM ( - SELECT [id], [source], [owner], [title], [price], + SELECT [me].[id], [me].[source], [me].[owner], [me].[title], [me].[price], [owner_name], ROW_NUMBER() OVER( ) AS [rno__row__index] FROM ( @@ -66,11 +76,103 @@ is_same_sql_bind( WHERE ( [source] = ? ) ) [me] ) [me] - WHERE [rno__row__index] BETWEEN 1 AND 1 + WHERE [rno__row__index] >= ? AND [rno__row__index] <= ? + )', + [ + [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } => 'Library' ], + [ $OFFSET => 1 ], + [ $TOTAL => 1 ], + ], +); + +{ +my $subq = $schema->resultset('Owners')->search({ + 'count.id' => { -ident => 'owner.id' }, + 'count.name' => 'fail', # no one would do this in real life +}, { alias => 'owner' })->count_rs; + +my $rs_selectas_rel = $schema->resultset('BooksInLibrary')->search ({}, { + columns => [ + { owner_name => 'owner.name' }, + { owner_books => $subq->as_query }, + ], + join => 'owner', + rows => 1, + order_by => 'me.id', +}); + +# SELECT [owner_name], [owner_books] FROM ( +# SELECT [owner_name], [owner_books], [ORDER__BY__1], ROW_NUMBER() OVER( ORDER BY [ORDER__BY__1] ) AS [rno__row__index] FROM ( +# SELECT [owner].[name] AS [owner_name], (SELECT COUNT( * ) FROM [owners] [owner] WHERE ( ( [count].[id] = [owner].[id] AND [count].[name] = ? ) )) AS [owner_books], [me].[id] AS [ORDER__BY__1] FROM [books] [me] JOIN [owners] [owner] ON [owner].[id] = [me].[owner] WHERE ( [source] = ? ) +# ) [me] +# ) [me] WHERE [rno__row__index] >= ? AND [rno__row__index] <= ? + +is_same_sql_bind( + $rs_selectas_rel->as_query, + '( + SELECT [owner_name], [owner_books] + FROM ( + SELECT [owner_name], [owner_books], ROW_NUMBER() OVER( ORDER BY [ORDER__BY__1] ) AS [rno__row__index] + FROM ( + SELECT [owner].[name] AS [owner_name], + ( SELECT COUNT( * ) FROM [owners] [owner] + WHERE [count].[id] = [owner].[id] and [count].[name] = ? ) AS [owner_books], + [me].[id] AS [ORDER__BY__1] + FROM [books] [me] + JOIN [owners] [owner] ON [owner].[id] = [me].[owner] + WHERE ( [source] = ? ) + ) [me] + ) [me] + WHERE [rno__row__index] >= ? AND [rno__row__index] <= ? + )', + [ + [ { dbic_colname => 'count.name' } => 'fail' ], + [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } => 'Library' ], + [ $OFFSET => 1 ], + [ $TOTAL => 1 ], + ], +); + +}{ +my $subq = $schema->resultset('Owners')->search({ + 'count.id' => { -ident => 'owner.id' }, +}, { alias => 'owner' })->count_rs; + +my $rs_selectas_rel = $schema->resultset('BooksInLibrary')->search ({}, { + columns => [ + { owner_name => 'owner.name' }, + { owner_books => $subq->as_query }, + ], + join => 'owner', + rows => 1, +}); + +is_same_sql_bind( + $rs_selectas_rel->as_query, + '( + SELECT [owner_name], [owner_books] + FROM ( + SELECT [owner_name], [owner_books], ROW_NUMBER() OVER( ) AS [rno__row__index] + FROM ( + SELECT [owner].[name] AS [owner_name], + ( SELECT COUNT( * ) FROM [owners] [owner] WHERE [count].[id] = [owner].[id] ) AS [owner_books] + FROM [books] [me] + JOIN [owners] [owner] ON [owner].[id] = [me].[owner] + WHERE ( [source] = ? ) + ) [me] + ) [me] + WHERE [rno__row__index] >= ? AND [rno__row__index] <= ? )', - [ [ 'source', 'Library' ] ], + [ + [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } + => 'Library' ], + [ $OFFSET => 1 ], + [ $TOTAL => 1 ], + ], ); +} + { my $rs = $schema->resultset('Artist')->search({}, { columns => 'name', @@ -86,5 +188,35 @@ is_same_sql_bind( ); } +{ +my $subq = $schema->resultset('Owners')->search({ + 'books.owner' => { -ident => 'owner.id' }, +}, { alias => 'owner', select => ['id'] } )->count_rs; + +my $rs_selectas_rel = $schema->resultset('BooksInLibrary')->search( { -exists => $subq->as_query }, { select => ['id','owner'], rows => 1 } ); + +is_same_sql_bind( + $rs_selectas_rel->as_query, + '( + SELECT [me].[id], [me].[owner] FROM ( + SELECT [me].[id], [me].[owner], ROW_NUMBER() OVER( ) AS [rno__row__index] FROM ( + SELECT [me].[id], [me].[owner] + FROM [books] [me] + WHERE ( ( (EXISTS ( + SELECT COUNT( * ) FROM [owners] [owner] WHERE ( [books].[owner] = [owner].[id] ) + )) AND [source] = ? ) ) + ) [me] + ) [me] WHERE [rno__row__index] >= ? AND [rno__row__index] <= ? + )', + [ + [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } => 'Library' ], + [ $OFFSET => 1 ], + [ $TOTAL => 1 ], + ], + 'Pagination with sub-query in WHERE works' +); + +} + done_testing;