X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F746mssql.t;h=bae2e7c53d3cdb1b80686f323ae0b1da90a81e9b;hb=02d133f0f4c212e7842b869c26265f36cca18b77;hp=b1871f13edd8580ca8cb31f126f88c922f80d1dc;hpb=fc85215b071a2135b94fe2f110e0ee2f1c1e1016;p=dbsrgits%2FDBIx-Class.git diff --git a/t/746mssql.t b/t/746mssql.t index b1871f1..bae2e7c 100644 --- a/t/746mssql.t +++ b/t/746mssql.t @@ -4,15 +4,16 @@ use warnings; use Test::More; use lib qw(t/lib); use DBICTest; +use DBIC::SqlMakerTest; my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_MSSQL_ODBC_${_}" } qw/DSN USER PASS/}; plan skip_all => 'Set $ENV{DBICTEST_MSSQL_ODBC_DSN}, _USER and _PASS to run this test' unless ($dsn && $user); -plan tests => 21; +plan tests => 25; -my $schema = DBICTest::Schema->connect($dsn, $user, $pass, {AutoCommit => 1}); +my $schema = DBICTest::Schema->connect($dsn, $user, $pass); { no warnings 'redefine'; @@ -47,7 +48,7 @@ SQL my %seen_id; # fresh $schema so we start unconnected -$schema = DBICTest::Schema->connect($dsn, $user, $pass, {AutoCommit => 1}); +$schema = DBICTest::Schema->connect($dsn, $user, $pass); # test primary key handling my $new = $schema->resultset('Artist')->create({ name => 'foo' }); @@ -90,16 +91,14 @@ CREATE TABLE Books ( CREATE TABLE Owners ( id INT IDENTITY (1, 1) NOT NULL, - [name] VARCHAR(100), + name VARCHAR(100), ) -SET IDENTITY_INSERT Owners ON - SQL }); $schema->populate ('Owners', [ - [qw/id [name] /], + [qw/id name /], [qw/1 wiggle/], [qw/2 woggle/], [qw/3 boggle/], @@ -119,6 +118,7 @@ $schema->populate ('Owners', [ $schema->populate ('BooksInLibrary', [ [qw/source owner title /], + [qw/Library 1 secrets0/], [qw/Library 1 secrets1/], [qw/Eatery 1 secrets2/], [qw/Library 2 secrets3/], @@ -134,50 +134,91 @@ $schema->populate ('BooksInLibrary', [ ]); # -# try a distinct + prefetch on tables with identically named columns +# try a prefetch on tables with identically named columns # +# set quote char - make sure things work while quoted +$schema->storage->_sql_maker->{quote_char} = [qw/[ ]/]; +$schema->storage->_sql_maker->{name_sep} = '.'; + { - # try a ->has_many direction (due to a 'multi' accessor the select/group_by group is collapsed) + # try a ->has_many direction (group_by is not possible on has_many with limit) my $owners = $schema->resultset ('Owners')->search ({ 'books.id' => { '!=', undef } }, { prefetch => 'books', - distinct => 1, order_by => 'name', - page => 2, - rows => 5, + rows => 3, # 8 results total }); - my $owners2 = $schema->resultset ('Owners')->search ({ id => { -in => $owners->get_column ('me.id')->as_query }}); - for ($owners, $owners2) { - is ($_->all, 2, 'Prefetched grouped search returns correct number of rows'); - is ($_->count, 2, 'Prefetched grouped search returns correct count'); + is ($owners->page(1)->all, 3, 'has_many prefetch returns correct number of rows'); + is ($owners->page(1)->count, 3, 'has-many prefetch returns correct count'); + + TODO: { + local $TODO = 'limit past end of resultset problem'; + is ($owners->page(3)->all, 2, 'has_many prefetch returns correct number of rows'); + is ($owners->page(3)->count, 2, 'has-many prefetch returns correct count'); + is ($owners->page(3)->count_rs->next, 2, 'has-many prefetch returns correct count_rs'); + + # make sure count does not become overly complex FIXME + is_same_sql_bind ( + $owners->page(3)->count_rs->as_query, + '( + SELECT COUNT( * ) + FROM ( + SELECT TOP 3 [me].[id] + FROM [owners] [me] + LEFT JOIN [books] [books] ON [books].[owner] = [me].[id] + WHERE ( [books].[id] IS NOT NULL ) + GROUP BY [me].[id] + ORDER BY [me].[id] DESC + ) [count_subq] + )', + [], + ); } - # try a ->belongs_to direction (no select collapse) + # try a ->belongs_to direction (no select collapse, group_by should work) my $books = $schema->resultset ('BooksInLibrary')->search ({ - 'owner.name' => 'wiggle' + 'owner.name' => [qw/wiggle woggle/], }, { - prefetch => 'owner', distinct => 1, + prefetch => 'owner', order_by => 'name', - page => 2, - rows => 5, + rows => 2, # 3 results total }); - my $books2 = $schema->resultset ('BooksInLibrary')->search ({ id => { -in => $books->get_column ('me.id')->as_query }}); - for ($books, $books2) { - is ($_->all, 1, 'Prefetched grouped search returns correct number of rows'); - is ($_->count, 1, 'Prefetched grouped search returns correct count'); - } - #my $result = $schema->resultset('BooksInLibrary')->search(undef, { - #page => 1, - #rows => 25, - #order_by => ['name', 'title'], - #prefetch => 'owner' - #})->first; + is ($books->page(1)->all, 2, 'Prefetched grouped search returns correct number of rows'); + is ($books->page(1)->count, 2, 'Prefetched grouped search returns correct count'); + + TODO: { + local $TODO = 'limit past end of resultset problem'; + is ($books->page(2)->all, 1, 'Prefetched grouped search returns correct number of rows'); + is ($books->page(2)->count, 1, 'Prefetched grouped search returns correct count'); + is ($books->page(2)->count_rs->next, 1, 'Prefetched grouped search returns correct count_rs'); + + # make sure count does not become overly complex FIXME + is_same_sql_bind ( + $books->page(2)->count_rs->as_query, + '( + SELECT COUNT( * ) + FROM ( + SELECT TOP 2 [me].[id] + FROM [books] [me] + JOIN [owners] [owner] ON [owner].[id] = [me].[owner] + WHERE ( ( ( [owner].[name] = ? OR [owner].[name] = ? ) AND [source] = ? ) ) + GROUP BY [me].[id], [me].[source], [me].[owner], [me].[title], [me].[price], [owner].[id], [owner].[name] + ORDER BY [me].[id] DESC + ) [count_subq] + )', + [ + [ 'owner.name' => 'wiggle' ], + [ 'owner.name' => 'woggle' ], + [ 'source' => 'Library' ], + ], + ); + } }