From: Peter Rabbitson Date: Fri, 26 Jun 2015 14:37:20 +0000 (+0200) Subject: Bring in line behavior of related_resultset() on both $rs and $result X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=dbsrgits%2FDBIx-Class.git;a=commitdiff_plain;h=938b7adc4501c517d84be7daa13aefdb67f346b8 Bring in line behavior of related_resultset() on both $rs and $result The original problematic behavior on $result was introduced back in 64acc2bc and never noticed since :( --- diff --git a/Changes b/Changes index 5bd566c..5d0bd69 100644 --- a/Changes +++ b/Changes @@ -1,4 +1,11 @@ Revision history for DBIx::Class + + * Notable Changes and Deprecations + - $result->related_resultset() no longer passes extra arguments to + an underlying search_rs(), as by design these arguments would be + used only on the first call to ->related_resultset(), and ignored + afterwards. Instead an exception (detailing the fix) is thrown. + * New Features - DBIx::Class::Optional::Dependencies now properly understands combinations of requirements and does the right thing with e.g. diff --git a/lib/DBIx/Class/Relationship/Base.pm b/lib/DBIx/Class/Relationship/Base.pm index c7daf57..04b1a88 100644 --- a/lib/DBIx/Class/Relationship/Base.pm +++ b/lib/DBIx/Class/Relationship/Base.pm @@ -499,15 +499,20 @@ this instance (like in the case of C relationships). =cut sub related_resultset { - my $self = shift; + $_[0]->throw_exception( + '$result->related_resultset() no longer accepts extra search arguments, ' + . 'you need to switch to ...->related_resultset($relname)->search_rs(...) ' + . 'instead (it was never documented and more importantly could never work ' + . 'reliably due to the heavy caching involved)' + ) if @_ > 2; - $self->throw_exception("Can't call *_related as class methods") - unless ref $self; + $_[0]->throw_exception("Can't call *_related as class methods") + unless ref $_[0]; - my $rel = shift; + return $_[0]->{related_resultsets}{$_[1]} + if defined $_[0]->{related_resultsets}{$_[1]}; - return $self->{related_resultsets}{$rel} - if defined $self->{related_resultsets}{$rel}; + my ($self, $rel) = @_; return $self->{related_resultsets}{$rel} = do { @@ -516,13 +521,6 @@ sub related_resultset { my $rel_info = $rsrc->relationship_info($rel) or $self->throw_exception( "No such relationship '$rel'" ); - my $attrs = (@_ > 1 && ref $_[$#_] eq 'HASH' ? pop(@_) : {}); - $attrs = { %{$rel_info->{attrs} || {}}, %$attrs }; - - $self->throw_exception( "Invalid query: @_" ) - if (@_ > 1 && (@_ % 2 == 1)); - my $query = ((@_ > 1) ? {@_} : shift); - my ($cond, $is_crosstable) = $rsrc->_resolve_condition( $rel_info->{cond}, $rel, $self, $rel ); # keep in mind that the following if() block is part of a do{} - no return()s!!! @@ -550,9 +548,11 @@ sub related_resultset { $rsrc->resultset->search( $self->ident_condition($obj_table_alias), { alias => $obj_table_alias }, - )->search_related('me', $query, $attrs) + )->search_related('me', undef, $rel_info->{attrs}) } else { + my $attrs = { %{ $rel_info->{attrs} } }; + # FIXME - this conditional doesn't seem correct - got to figure out # at some point what it does. Also the entire UNRESOLVABLE_CONDITION # business seems shady - we could simply not query *at all* @@ -586,10 +586,7 @@ sub related_resultset { } } - $query = ($query ? { '-and' => [ $cond, $query ] } : $cond); - $rsrc->related_source($rel)->resultset->search( - $query, $attrs - ); + $rsrc->related_source($rel)->resultset->search( $cond, $attrs ); } }; } diff --git a/lib/DBIx/Class/ResultSet.pm b/lib/DBIx/Class/ResultSet.pm index 4cd3c5e..3d1a3a1 100644 --- a/lib/DBIx/Class/ResultSet.pm +++ b/lib/DBIx/Class/ResultSet.pm @@ -3220,10 +3220,16 @@ Returns a related resultset for the supplied relationship name. =cut sub related_resultset { - my ($self, $rel) = @_; + $_[0]->throw_exception( + 'Extra arguments to $rs->related_resultset() were always quietly ' + . 'discarded without consideration, you need to switch to ' + . '...->related_resultset( $relname )->search_rs( $search, $args ) instead.' + ) if @_ > 2; + + return $_[0]->{related_resultsets}{$_[1]} + if defined $_[0]->{related_resultsets}{$_[1]}; - return $self->{related_resultsets}{$rel} - if defined $self->{related_resultsets}{$rel}; + my ($self, $rel) = @_; return $self->{related_resultsets}{$rel} = do { my $rsrc = $self->result_source;