X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FResultSource.pm;h=4669926ffe77788f32b82a4755f0a525a27eb19f;hb=c200d949;hp=57d833eae9afb05f174e7dfd5eb48986c71f89e7;hpb=bad0b73b680b041ca8ce677365ca1f6387232e61;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/ResultSource.pm b/lib/DBIx/Class/ResultSource.pm index 57d833e..4669926 100644 --- a/lib/DBIx/Class/ResultSource.pm +++ b/lib/DBIx/Class/ResultSource.pm @@ -1973,11 +1973,26 @@ sub _resolve_relationship_condition { $joinfree_source->columns }; - $fq_col_list->{$_} or $self->throw_exception ( + exists $fq_col_list->{$_} or $self->throw_exception ( "The join-free condition returned for $exception_rel_id may only " - . 'contain keys that are fully qualified column names of the corresponding source' + . 'contain keys that are fully qualified column names of the corresponding source ' + . "(it returned '$_')" ) for keys %$jfc; + ( + length ref $_ + and + defined blessed($_) + and + $_->isa('DBIx::Class::Row') + and + $self->throw_exception ( + "The join-free condition returned for $exception_rel_id may not " + . 'contain result objects as values - perhaps instead of invoking ' + . '->$something you meant to return ->get_column($something)' + ) + ) for values %$jfc; + } } elsif (ref $args->{condition} eq 'HASH') { @@ -2124,33 +2139,52 @@ 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} + 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} ) + ; + } + } + elsif ( + $col_eqs->{$lhs} =~ /^ ( \Q$args->{self_alias}\E \. .+ ) /x and - $colinfos->{$l_col}{-source_alias} ne $colinfos->{$r_col}{-source_alias} + ($colinfos->{$1}||{})->{-result_source} == $rel_rsrc ) { - ( $colinfos->{$l_col}{-source_alias} eq $args->{self_alias} ) - ? ( $ret->{identity_map}{$l_col} = $r_col ) - : ( $ret->{identity_map}{$r_col} = $l_col ) + my ($lcol, $rcol) = map + { $colinfos->{$_}{-colname} } + ( $lhs, $1 ) ; + carp_unique( + "The $exception_rel_id specifies equality of column '$lcol' and the " + . "*VALUE* '$rcol' (you did not use the { -ident => ... } operator)" + ); } } } - $ret + # FIXME - temporary, to fool the idiotic check in SQLMaker::_join_condition + $ret->{condition} = { -and => [ $ret->{condition} ] } + unless $ret->{condition} eq UNRESOLVABLE_CONDITION; + + $ret; } =head2 related_source