X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FResultSource.pm;h=4eca0f877aa46118c9466da2313196280b339709;hb=096395af8e16de3f81ba55540e7379e82a192abf;hp=aa636a7c90de0afb31f9e7d2a25750a7b8f93bb0;hpb=0bad18237edb8e1967fede05b9e5bcf13799f52c;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/ResultSource.pm b/lib/DBIx/Class/ResultSource.pm index aa636a7..4eca0f8 100644 --- a/lib/DBIx/Class/ResultSource.pm +++ b/lib/DBIx/Class/ResultSource.pm @@ -893,7 +893,7 @@ sub add_relationship { } return unless $f_source; # Can't test rel without f_source - eval { $self->_resolve_join($rel, 'me') }; + eval { $self->_resolve_join($rel, 'me', {}) }; if ($@) { # If the resolve failed, back out and re-throw the error delete $rels{$rel}; # @@ -1083,26 +1083,23 @@ sub resolve_join { # Returns the {from} structure used to express JOIN conditions sub _resolve_join { - my ($self, $join, $alias, $seen, $force_left, $jpath) = @_; + my ($self, $join, $alias, $seen, $jpath, $force_left) = @_; # we need a supplied one, because we do in-place modifications, no returns $self->throw_exception ('You must supply a seen hashref as the 3rd argument to _resolve_join') unless $seen; - $force_left ||= { force => 0 }; - # This isn't quite right, we should actually dive into $seen and reconstruct # the entire path (the reference entry point would be the join conditional # with depth == current_depth - 1. At this point however nothing depends on # having the entire path, transcending related_resultset, so just leave it # as is, hairy enough already. - $jpath ||= []; + $jpath ||= []; if (ref $join eq 'ARRAY') { return map { - local $force_left->{force} = $force_left->{force}; - $self->_resolve_join($_, $alias, $seen, $force_left, [@$jpath]); + $self->_resolve_join($_, $alias, $seen, [@$jpath], $force_left); } @$join; } elsif (ref $join eq 'HASH') { return @@ -1110,9 +1107,9 @@ sub _resolve_join { my $as = ($seen->{$_} ? join ('_', $_, $seen->{$_} + 1) : $_); # the actual seen value will be incremented below local $force_left->{force} = $force_left->{force}; ( - $self->_resolve_join($_, $alias, $seen, $force_left, [@$jpath]), + $self->_resolve_join($_, $alias, $seen, [@$jpath], $force_left), $self->related_source($_)->_resolve_join( - $join->{$_}, $as, $seen, $force_left, [@$jpath, $_] + $join->{$_}, $as, $seen, [@$jpath, $_], $force_left ) ); } keys %$join; @@ -1120,22 +1117,24 @@ sub _resolve_join { $self->throw_exception("No idea how to resolve join reftype ".ref $join); } else { + return() unless defined $join; + my $count = ++$seen->{$join}; my $as = ($count > 1 ? "${join}_${count}" : $join); my $rel_info = $self->relationship_info($join); $self->throw_exception("No such relationship ${join}") unless $rel_info; my $type; - if ($force_left->{force}) { + if ($force_left) { $type = 'left'; } else { $type = $rel_info->{attrs}{join_type} || ''; - $force_left->{force} = 1 if lc($type) eq 'left'; + $force_left = 1 if lc($type) eq 'left'; } my $rel_src = $self->related_source($join); return [ { $as => $rel_src->from, - -result_source => $rel_src, + -source_handle => $rel_src->handle, -join_type => $type, -join_path => [@$jpath, $join], -alias => $as,