Bring in line behavior of related_resultset() on both $rs and $result
Peter Rabbitson [Fri, 26 Jun 2015 14:37:20 +0000 (16:37 +0200)]
The original problematic behavior on $result was introduced back in 64acc2bc
and never noticed since :(

Changes
lib/DBIx/Class/Relationship/Base.pm
lib/DBIx/Class/ResultSet.pm

diff --git a/Changes b/Changes
index 5bd566c..5d0bd69 100644 (file)
--- 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.
index c7daf57..04b1a88 100644 (file)
@@ -499,15 +499,20 @@ this instance (like in the case of C<might_have> 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 );
     }
   };
 }
index 4cd3c5e..3d1a3a1 100644 (file)
@@ -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;