Index: /Users/mo/Documents/workspace/DBIx-Class/lib/DBIx/Class/ResultSet.pm =================================================================== --- /Users/mo/Documents/workspace/DBIx-Class/lib/DBIx/Class/ResultSet.pm (revision 4911) +++ /Users/mo/Documents/workspace/DBIx-Class/lib/DBIx/Class/ResultSet.pm (working copy) @@ -12,6 +12,7 @@ use DBIx::Class::ResultSetColumn; use DBIx::Class::ResultSourceHandle; use List::Util (); +use Test::More; # We need is_deeply functionality use Scalar::Util (); use base qw/DBIx::Class/; @@ -827,7 +828,6 @@ sub _collapse_result { my ($self, $as_proto, $row) = @_; - my @copy = @$row; # 'foo' => [ undef, 'foo' ] @@ -942,10 +942,44 @@ } } } - + + if($self->{attrs}{distinct}) { + # $info->[1] contains all the relations, right? + $info->[1] = $self->_distinct_result_deeply($info->[1]) + if($info->[1]); + } + + return $info; } +sub _distinct_result_deeply { + # this is a recursive method + # Definition Recursion: See Recursion :-) + my ($self, $info, $rels) = @_; + # return if no relations in that row + return unless $info; + # object for distinct info + my $new_info = {}; + while (my($rel, $data) = each %{$info}) { + for my $row (@{$data}) { + push(@{$new_info->{$rel}}, $row) + # check whether this row is already in $new_info + # and ignore if so, otherwise add it to $new_info + unless( + grep + { Test::More::_deep_check($_, $row) } + @{$new_info->{$rel}||[]}); + # do the recursion + $row->[1] = $self->_distinct_result_deeply($row->[1]) + if($row->[1]); + } + } + return $new_info; + + +} + =head2 result_source =over 4