Only add a group_by to a complex prefetch if a non-selecting multi-join is detected
Peter Rabbitson [Sat, 25 Dec 2010 03:10:45 +0000 (04:10 +0100)]
Changes
lib/DBIx/Class/Storage/DBIHacks.pm
t/prefetch/o2m_o2m_order_by_with_limit.t

diff --git a/Changes b/Changes
index d1bd079..132c4e5 100644 (file)
--- a/Changes
+++ b/Changes
@@ -33,6 +33,7 @@ Revision history for DBIx::Class
         - Missing dependency check in t/60core.t (RT#62635)
         - Fix regressions in IC::DT registration logic
         - Fix regression in select-associated bind value handling (RT#61025)
+        - Simplify SQL generated by some LIMITed prefetching queries
         - Fix infinite loops on old perls with a recent Try::Tiny
         - Improve "fork()" on Win32 by reimplementing a more robust DBIC
           thread support (still problematic, pending a DBI fix)
index fd1bde5..41ca371 100644 (file)
@@ -115,12 +115,19 @@ sub _adjust_select_args_for_complex_prefetch {
       group_by => ['dummy'], %$inner_attrs,
     });
 
-    # if a multi-type join was needed in the subquery - add a group_by to simulate the
-    # collapse in the subq
+    my $inner_aliastypes =
+      $self->_resolve_aliastypes_from_select_args( $inner_from, $inner_select, $where, $inner_attrs );
+
+    # if a multi-type non-selecting (only restricting) join was needed in the subquery
+    # add a group_by to simulate the collapse in the subq
     if (
       ! $inner_attrs->{group_by}
         and
-      first { ! $_->[0]{-is_single} } (@{$inner_from}[1 .. $#$inner_from])
+      first {
+        $inner_aliastypes->{restricting}{$_}
+          and
+        ! $inner_aliastypes->{selecting}{$_}
+      } ( keys %{$inner_aliastypes->{multiplying}||{}} )
     ) {
       $inner_attrs->{group_by} = $self->_group_over_selection (
         $inner_from, $inner_select, $inner_attrs->{order_by}
index c77530a..4aead92 100644 (file)
@@ -34,7 +34,6 @@ is_same_sql_bind(
           JOIN cd cds_unordered
             ON cds_unordered.artist = me.artistid
         WHERE ( me.rank = ? )
-        GROUP BY cds_unordered.cdid, cds_unordered.artist, cds_unordered.title, cds_unordered.year, cds_unordered.genreid, cds_unordered.single_track, me.name, me.artistid
         ORDER BY me.name ASC, me.artistid DESC
         LIMIT 3
         OFFSET 3