From: Peter Rabbitson Date: Fri, 22 May 2009 08:31:25 +0000 (+0000) Subject: Some attributes require a grouped count subquery, some - just a subquery. Differentia... X-Git-Tag: v0.08103~39 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=69e16dc45e23c998ed321238d7700b5340413073;p=dbsrgits%2FDBIx-Class.git Some attributes require a grouped count subquery, some - just a subquery. Differentiate properly --- diff --git a/lib/DBIx/Class/ResultSet.pm b/lib/DBIx/Class/ResultSet.pm index 7e59438..f6cc3ba 100644 --- a/lib/DBIx/Class/ResultSet.pm +++ b/lib/DBIx/Class/ResultSet.pm @@ -1141,21 +1141,25 @@ sub count { return $self->search(@_)->count if @_ and defined $_[0]; return scalar @{ $self->get_cache } if $self->get_cache; - my @subq_attrs = qw/prefetch collapse distinct group_by having/; + my @grouped_subq_attrs = qw/prefetch collapse distinct group_by having/; + my @subq_attrs = (); + my $attrs = $self->_resolved_attrs; - # if we are not paged - we are simply asking for a limit if (not $attrs->{page} and not $attrs->{software_limit}) { push @subq_attrs, qw/rows offset/; } - return $self->_has_attr (@subq_attrs) - ? $self->_count_subq + my $need_subq = $self->_has_attr (@subq_attrs); + my $need_group_subq = $self->_has_attr (@grouped_subq_attrs); + + return ($need_subq || $need_group_subq) + ? $self->_count_subq ($need_group_subq) : $self->_count_simple } sub _count_subq { - my $self = shift; + my ($self, $add_group_by) = @_; my $attrs = $self->_resolved_attrs_copy; @@ -1165,8 +1169,10 @@ sub _count_subq { # these can not go in the subquery, and there is no point of ordering it delete $sub_attrs->{$_} for qw/prefetch collapse select +select as +as columns +columns order_by/; - # force a group_by and the same set of columns (most databases require this) - $sub_attrs->{columns} = $sub_attrs->{group_by} ||= [ map { "$attrs->{alias}.$_" } ($self->result_source->primary_columns) ]; + # if needed force a group_by and the same set of columns (most databases require this) + if ($add_group_by) { + $sub_attrs->{columns} = $sub_attrs->{group_by} ||= [ map { "$attrs->{alias}.$_" } ($self->result_source->primary_columns) ]; + } $attrs->{from} = [{ count_subq => (ref $self)->new ($self->result_source, $sub_attrs )->as_query