Sanify group_by handling in complex prefetch rewrites
[dbsrgits/DBIx-Class.git] / t / prefetch / grouped.t
index af9b1f0..9d7c4ca 100644 (file)
@@ -162,7 +162,9 @@ for ($cd_rs->all) {
   is_same_sql_bind (
     $most_tracks_rs->as_query,
     '(
-      SELECT me.cdid, me.track_count, tracks.trackid, tracks.cd, tracks.position, tracks.title, tracks.last_updated_on, tracks.last_updated_at, liner_notes.liner_id, liner_notes.notes
+      SELECT  me.cdid, me.track_count,
+              tracks.trackid, tracks.cd, tracks.position, tracks.title, tracks.last_updated_on, tracks.last_updated_at, tracks.small_dt, tracks.increment,
+              liner_notes.liner_id, liner_notes.notes
         FROM (
           SELECT me.cdid, COUNT( tracks.trackid ) AS track_count
             FROM cd me
@@ -233,42 +235,40 @@ for ($cd_rs->all) {
   is ($rs->count, 5, 'Correct count of CDs');
 }
 
-lives_ok (sub {
-    my $rs = $schema->resultset("Artwork")->search(undef, {distinct => 1})
-              ->search_related('artwork_to_artist')->search_related('artist',
-                 undef,
-                  { prefetch => q(cds) },
-              );
-    is($rs->all, 0, 'prefetch without WHERE');
-
-    $rs = $schema->resultset("Artwork")->search(undef, {distinct => 1})
-              ->search_related('artwork_to_artist')->search_related('artist',
-                 { 'cds.title' => 'foo' },
-                  { prefetch => q(cds) },
-              );
-    is($rs->all, 0, 'prefetch with WHERE');
-
-
-    # different case
-    $rs = $schema->resultset("Artist")->search(undef)
-                ->search_related('cds')->search_related('genre',
-                    { 'genre.name' => 'foo' },
-                    { prefetch => q(cds) },
-                 );
-    is($rs->all, 0, 'prefetch without distinct');
-
-    $rs = $schema->resultset("Artist")->search(undef, {distinct => 1})
-                ->search_related('cds')->search_related('genre',
-                    { 'genre.name' => 'foo' },
-                 );
-    is($rs->all, 0, 'distinct without prefetch');
+# RT 47779, test group_by as a scalar ref
+{
+  my $track_rs = $schema->resultset ('Track')->search (
+    { 'me.cd' => { -in => [ $cd_rs->get_column ('cdid')->all ] } },
+    {
+      select => [
+        'me.cd',
+        { count => 'me.trackid' },
+      ],
+      as => [qw/
+        cd
+        track_count
+      /],
+      group_by => \'SUBSTR(me.cd, 1, 1)',
+      prefetch => 'cd',
+    },
+  );
 
-    $rs = $schema->resultset("Artist")->search({artistid => '11'}, {distinct => 1})
-                ->search_related('cds')->search_related('genre',
-                    { 'genre.name' => 'foo' },
-                    { prefetch => q(cds) },
-                 );
-    is($rs->all, 0, 'prefetch with distinct');
-}, 'distinct generally works with prefetch');
+  is_same_sql_bind (
+    $track_rs->count_rs->as_query,
+    '(
+      SELECT COUNT( * )
+        FROM (
+          SELECT SUBSTR(me.cd, 1, 1)
+            FROM track me
+            JOIN cd cd ON cd.cdid = me.cd
+          WHERE ( me.cd IN ( ?, ?, ?, ?, ? ) )
+          GROUP BY SUBSTR(me.cd, 1, 1)
+        )
+      count_subq
+    )',
+    [ map { [ 'me.cd' => $_] } ($cd_rs->get_column ('cdid')->all) ],
+    'count() query generated expected SQL',
+  );
+}
 
 done_testing;