I think we are done here
[dbsrgits/DBIx-Class.git] / t / prefetch / correlated.t
index e4e747d..3506027 100644 (file)
@@ -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;