[Bast-commits] r8748 - in DBIx-Class/0.08/trunk: . lib/DBIx/Class lib/DBIx/Class/Storage t/count

ribasushi at dev.catalyst.perl.org ribasushi at dev.catalyst.perl.org
Thu Feb 18 23:35:01 GMT 2010


Author: ribasushi
Date: 2010-02-18 23:35:01 +0000 (Thu, 18 Feb 2010)
New Revision: 8748

Added:
   DBIx-Class/0.08/trunk/t/count/group_by_func.t
Modified:
   DBIx-Class/0.08/trunk/Changes
   DBIx-Class/0.08/trunk/lib/DBIx/Class/ResultSet.pm
   DBIx-Class/0.08/trunk/lib/DBIx/Class/Storage/DBI.pm
Log:
Fix count of group_by over aliased function

Modified: DBIx-Class/0.08/trunk/Changes
===================================================================
--- DBIx-Class/0.08/trunk/Changes	2010-02-18 23:34:22 UTC (rev 8747)
+++ DBIx-Class/0.08/trunk/Changes	2010-02-18 23:35:01 UTC (rev 8748)
@@ -1,7 +1,8 @@
 Revision history for DBIx::Class
 
         - Make sure possibly overwritten deployment_statements methods in
-          schemas get called on $schema->deploy.
+          schemas get called on $schema->deploy
+        - Fix count() with group_by aliased-function resultsets
 
 0.08119 2010-02-15 09:36:00 (UTC)
         - Add $rs->is_ordered to test for existing order_by on a resultset

Modified: DBIx-Class/0.08/trunk/lib/DBIx/Class/ResultSet.pm
===================================================================
--- DBIx-Class/0.08/trunk/lib/DBIx/Class/ResultSet.pm	2010-02-18 23:34:22 UTC (rev 8747)
+++ DBIx-Class/0.08/trunk/lib/DBIx/Class/ResultSet.pm	2010-02-18 23:35:01 UTC (rev 8748)
@@ -1264,7 +1264,7 @@
     $sub_attrs->{group_by} = [ map { "$attrs->{alias}.$_" } ($rsrc->primary_columns) ]
   }
 
-  $sub_attrs->{select} = $rsrc->storage->_subq_count_select ($rsrc, $sub_attrs);
+  $sub_attrs->{select} = $rsrc->storage->_subq_count_select ($rsrc, $attrs);
 
   # this is so that the query can be simplified e.g.
   # * ordering can be thrown away in things like Top limit

Modified: DBIx-Class/0.08/trunk/lib/DBIx/Class/Storage/DBI.pm
===================================================================
--- DBIx-Class/0.08/trunk/lib/DBIx/Class/Storage/DBI.pm	2010-02-18 23:34:22 UTC (rev 8747)
+++ DBIx-Class/0.08/trunk/lib/DBIx/Class/Storage/DBI.pm	2010-02-18 23:35:01 UTC (rev 8748)
@@ -1896,8 +1896,34 @@
 #
 sub _subq_count_select {
   my ($self, $source, $rs_attrs) = @_;
-  return $rs_attrs->{group_by} if $rs_attrs->{group_by};
 
+  if (my $groupby = $rs_attrs->{group_by}) {
+
+    my $avail_columns = $self->_resolve_column_info ($rs_attrs->{from});
+
+    my $sel_index;
+    for my $sel (@{$rs_attrs->{select}}) {
+      if (ref $sel eq 'HASH' and $sel->{-as}) {
+        $sel_index->{$sel->{-as}} = $sel;
+      }
+    }
+
+    my @selection;
+    for my $g_part (@$groupby) {
+      if (ref $g_part or $avail_columns->{$g_part}) {
+        push @selection, $g_part;
+      }
+      elsif ($sel_index->{$g_part}) {
+        push @selection, $sel_index->{$g_part};
+      }
+      else {
+        $self->throw_exception ("group_by criteria '$g_part' not contained within current resultset source(s)");
+      }
+    }
+
+    return \@selection;
+  }
+
   my @pcols = map { join '.', $rs_attrs->{alias}, $_ } ($source->primary_columns);
   return @pcols ? \@pcols : [ 1 ];
 }

Added: DBIx-Class/0.08/trunk/t/count/group_by_func.t
===================================================================
--- DBIx-Class/0.08/trunk/t/count/group_by_func.t	                        (rev 0)
+++ DBIx-Class/0.08/trunk/t/count/group_by_func.t	2010-02-18 23:35:01 UTC (rev 8748)
@@ -0,0 +1,36 @@
+use strict;
+use warnings;
+
+use Test::More;
+
+use lib qw(t/lib);
+
+use DBICTest;
+
+my $schema = DBICTest->init_schema();
+
+my $rs = $schema->resultset ('CD')->search ({}, {
+  select => [
+    { substr => [ 'title', 1, 1 ], -as => 'initial' },
+    { count => '*' },
+  ],
+  as => [qw/title_initial cnt/],
+  group_by => ['initial'],
+  order_by => { -desc => 'initial' },
+  result_class => 'DBIx::Class::ResultClass::HashRefInflator',
+});
+
+is_deeply (
+  [$rs->all],
+  [
+    { title_initial => 'S', cnt => '1' },
+    { title_initial => 'G', cnt => '1' },
+    { title_initial => 'F', cnt => '1' },
+    { title_initial => 'C', cnt => '2' },
+  ],
+  'Correct result',
+);
+
+is ($rs->count, 4, 'Correct count');
+
+done_testing;




More information about the Bast-commits mailing list