Now really final
[dbsrgits/DBIx-Class.git] / t / 746mssql.t
index 1341cd4..a23898f 100644 (file)
@@ -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 => 23;
 
-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,7 +91,7 @@ CREATE TABLE Books (
 
 CREATE TABLE Owners (
    id INT IDENTITY (1, 1) NOT NULL,
-   [name] VARCHAR(100),
+   name VARCHAR(100),
 )
 
 SQL
@@ -117,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/],
@@ -136,40 +138,90 @@ $schema->populate ('BooksInLibrary', [
 #
 
 {
-  # 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, 8, 'Prefetched grouped search returns correct number of rows');
-    is ($_->count, 8, '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');
   }
 
-  # try a ->belongs_to direction (no select collapse)
+  # make sure count does not become overly complex FIXME
+  is_same_sql_bind (
+    $owners->page(2)->count_rs->as_query,
+    '(
+      SELECT COUNT( * )
+        FROM (
+          SELECT TOP 3 id
+            FROM (
+              SELECT TOP 6 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 ASC
+            ) AS inner_sel
+          ORDER BY id DESC
+        ) count_subq
+    )',
+    [],
+  );
+
+  # 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');
+
+  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');
   }
 
+  # 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 id
+            FROM (
+              SELECT TOP 4 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 ASC
+            ) AS inner_sel
+          ORDER BY id DESC
+        ) count_subq
+    )',
+    [
+      [ 'owner.name' => 'wiggle' ],
+      [ 'owner.name' => 'woggle' ],
+      [ 'source' => 'Library' ],
+    ],
+  );
+
 }
 
 # clean up our mess