Make sure array-relconds edge case is handled properly
Peter Rabbitson [Fri, 3 Jul 2015 11:39:24 +0000 (13:39 +0200)]
Hopefully nobody in the wild is using this... hahaha who am I kidding. Anyway
being thorough before subsequent commits

lib/DBIx/Class/ResultSource.pm
t/relationship/core.t

index c88361f..d8ec2b5 100644 (file)
@@ -2127,7 +2127,13 @@ sub _resolve_relationship_condition {
 
   # we got something back - sanity check and infer values if we can
   my @nonvalues;
-  if ( my $jfc = $ret->{join_free_condition} and $ret->{join_free_condition} ne UNRESOLVABLE_CONDITION ) {
+  if (
+    $ret->{join_free_condition}
+      and
+    $ret->{join_free_condition} ne UNRESOLVABLE_CONDITION
+      and
+    my $jfc = $storage->_collapse_cond( $ret->{join_free_condition} )
+  ) {
 
     my $jfc_eqs = $storage->_extract_fixed_condition_columns($jfc, 'consider_nulls');
 
index c611142..e0e243c 100644 (file)
@@ -262,6 +262,22 @@ is_same_sql_bind (
 $undir_maps = $schema->resultset("Artist")->find(2)->artist_undirected_maps;
 is($undir_maps->count, 1, 'found 1 undirected map for artist 2');
 
+{
+  my $artist_to_mangle = $schema->resultset('Artist')->find(2);
+
+  $artist_to_mangle->set_from_related( artist_undirected_maps => { id1 => 42 } );
+
+  ok( ! $artist_to_mangle->is_changed, 'Unresolvable set_from_related did not alter object' );
+
+  $artist_to_mangle->set_from_related( artist_undirected_maps => {} );
+  ok( $artist_to_mangle->is_changed, 'Definitive set_from_related did alter object' );
+  is (
+    $artist_to_mangle->id,
+    undef,
+    'Correctly unset id on definitive outcome of OR condition',
+  );
+}
+
 my $mapped_rs = $undir_maps->search_related('mapped_artists');
 
 my @art = $mapped_rs->all;