From: Peter Rabbitson Date: Sun, 14 Sep 2014 18:41:55 +0000 (+0200) Subject: A more robust column equality extractor X-Git-Tag: v0.082800~43 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=21621fe4565697ead298e6829425dc0e9e5ba816;p=dbsrgits%2FDBIx-Class.git A more robust column equality extractor It is a mistake to reach into $ret->{condition} - it may very well be a non-hash structure. Also replace the silly regexping with the (already regexed out) results of the info resolver --- diff --git a/lib/DBIx/Class/ResultSource.pm b/lib/DBIx/Class/ResultSource.pm index 9e8641a..34f26e9 100644 --- a/lib/DBIx/Class/ResultSource.pm +++ b/lib/DBIx/Class/ResultSource.pm @@ -2139,28 +2139,29 @@ sub _resolve_relationship_condition { for my $lhs (keys %$col_eqs) { next if $col_eqs->{$lhs} eq UNRESOLVABLE_CONDITION; - my ($rhs) = @{ is_literal_value( $ret->{condition}{$lhs} ) || next }; # there is no way to know who is right and who is left in a cref - # therefore a full blown resolution call + # therefore a full blown resolution call, and figure out the + # direction a bit further below $colinfos ||= $storage->_resolve_column_info([ { -alias => $args->{self_alias}, -rsrc => $self }, { -alias => $args->{foreign_alias}, -rsrc => $rel_rsrc }, ]); - my ($l_col, $r_col) = map { $_ =~ / ([^\.]+) $ /x } ($lhs, $rhs); + next unless $colinfos->{$lhs}; # someone is engaging in witchcraft - if ( - $colinfos->{$l_col} - and - $colinfos->{$r_col} - and - $colinfos->{$l_col}{-source_alias} ne $colinfos->{$r_col}{-source_alias} - ) { - ( $colinfos->{$l_col}{-source_alias} eq $args->{self_alias} ) - ? ( $ret->{identity_map}{$l_col} = $r_col ) - : ( $ret->{identity_map}{$r_col} = $l_col ) - ; + if ( my $rhs_ref = is_literal_value( $col_eqs->{$lhs} ) ) { + + if ( + $colinfos->{$rhs_ref->[0]} + and + $colinfos->{$lhs}{-source_alias} ne $colinfos->{$rhs_ref->[0]}{-source_alias} + ) { + ( $colinfos->{$lhs}{-source_alias} eq $args->{self_alias} ) + ? ( $ret->{identity_map}{$colinfos->{$lhs}{-colname}} = $colinfos->{$rhs_ref->[0]}{-colname} ) + : ( $ret->{identity_map}{$colinfos->{$rhs_ref->[0]}{-colname}} = $colinfos->{$lhs}{-colname} ) + ; + } } } }