allow undef for has_many rels in addition to empty arrayref + tests
authorAlexander Hartmaier <alexander.hartmaier@t-systems.at>
Wed, 6 Oct 2010 13:03:32 +0000 (15:03 +0200)
committerAlexander Hartmaier <alexander.hartmaier@t-systems.at>
Wed, 6 Oct 2010 13:03:32 +0000 (15:03 +0200)
lib/DBIx/Class/ResultSet/RecursiveUpdate.pm
t/lib/DBSchema.pm
t/lib/RunTests.pm

index fcc3b0a92d0bf5d2ccfc840edc5de9ad44b615ab..2d3efb8dfd19a60157ec56d86bc6876749384389 100644 (file)
@@ -267,21 +267,19 @@ sub _update_relation {
                 ->{is_nullable};
     }
 
-    #warn "\tNULLABLE: $all_fks_nullable\n";
     $if_not_submitted = $all_fks_nullable ? 'nullify' : 'delete'
         unless defined $if_not_submitted;
 
-    # handle undef
-    #if (not defined $updates && $if_not_submitted eq 'delete') {
-    #    warn "$name " . ref $object;
-    #    $object->related_resultset($name)->delete;
-    #    return;
-    #}
+    #warn "\tNULLABLE: $all_fks_nullable ACTION: $if_not_submitted\n";
 
     #warn "RELINFO for $name: " . Dumper($info); use Data::Dumper;
 
     # the only valid datatype for a has_many rels is an arrayref
     if ( $info->{attrs}{accessor} eq 'multi' ) {
+
+        # handle undef like empty arrayref
+        $updates = []
+            unless defined $updates;
         $self->throw_exception(
             "data for has_many relationship '$name' must be an arrayref")
             unless ref $updates eq 'ARRAY';
@@ -314,6 +312,7 @@ sub _update_relation {
                 }
             );
         }
+
         # foreign table has multiple pk columns
         else {
             for my $obj (@updated_objs) {
@@ -323,7 +322,7 @@ sub _update_relation {
                 }
                 push @cond, \%cond_for_obj;
             }
-            $rs_rel_delist = $rs_rel_delist->search_rs({ -not => [@cond] });
+            $rs_rel_delist = $rs_rel_delist->search_rs( { -not => [@cond] } );
         }
 
         #warn "\tCOND: " . Dumper(\%cond);
@@ -332,36 +331,12 @@ sub _update_relation {
 
             #warn "\tdeleting related rows: $rel_delist_cnt\n";
             $rs_rel_delist->delete;
-
-            # # only handles related result classes with single primary keys
-            # if ( 1 == $rel_col_cnt ) {
-            # $object->$name->search(
-            # {   $rel_cols[0] =>
-            # { -not_in => [ map ( $_->id, @updated_objs ) ] }
-            # }
-            # )->delete;
-            # }
-            # else {
-            # warn "multi-column relationships aren't supported\n";
-            # }
         }
         elsif ( $if_not_submitted eq 'set_to_null' ) {
 
             #warn "\tnullifying related rows: $rel_delist_cnt\n";
             my %update = map { $_ => undef } @rel_cols;
             $rs_rel_delist->update( \%update );
-
-            # # only handles related result classes with single primary keys
-            # if ( 1 == $rel_col_cnt ) {
-            # $object->$name->search(
-            # {   $rel_cols[0] =>
-            # { -not_in => [ map ( $_->id, @updated_objs ) ] }
-            # }
-            # )->update( { $rel_cols[0] => undef } );
-            # }
-            # else {
-            # warn "multi-column relationships aren't supported\n";
-            # }
         }
     }
     elsif ($info->{attrs}{accessor} eq 'single'
index 3d01f23f1bc0260fa26d3c7a9d6487a0c7a100b2..af80fbf17373078aeabdc0b44267f47cec443ecb 100644 (file)
@@ -20,7 +20,7 @@ sub tables_exist {
 sub get_test_schema {
     my ( $dsn, $user, $pass ) = @_;
     $dsn ||= 'dbi:SQLite:dbname=t/var/dvdzbr.db';
-    warn "testing $dsn";
+    warn "testing $dsn\n";
     my $schema = __PACKAGE__->connect( $dsn, $user, $pass, {} );
     my $deploy_attrs;
     $deploy_attrs->{add_drop_table} = 1 if tables_exist( $dsn, $user, $pass );
index b5eef51ffe3e3627483ef95f499167e5564dfa90..defb70128de29976bb718a57ab4999d0328966dc 100644 (file)
@@ -9,7 +9,7 @@ use DBIx::Class::ResultSet::RecursiveUpdate;
 sub run_tests {
     my $schema = shift;
 
-    plan tests => 42;
+    plan tests => 45;
 
     my $dvd_rs  = $schema->resultset('Dvd');
     my $user_rs = $schema->resultset('User');
@@ -100,8 +100,8 @@ sub run_tests {
     # changing existing records
     my $num_of_users = $user_rs->count;
     $updates = {
-        id => $dvd->dvd_id,    # id instead of dvd_id
-        ####aaaa => undef,
+        id               => $dvd->dvd_id,         # id instead of dvd_id
+                                                  #aaaa => undef,
         name             => undef,
         tags             => [],
         'owner'          => $another_owner->id,
@@ -194,14 +194,6 @@ sub run_tests {
     $dvd = $dvd_rs->find(1);
     is( $dvd->get_column('owner'), $user->id, 'foreign key set' );
 
-    # # delete has_many where foreign cols aren't nullable
-    # $updates = {
-    # id => $user->id,
-    # owned_dvds => undef,
-    # };
-    # $user = $user_rs->recursive_update( $updates );
-    # ok ( !$dvd_rs->find( 1 ), 'owned dvd deleted');
-
     $dvd_rs->update( { current_borrower => $user->id } );
     ok( $user->borrowed_dvds->count > 1, 'Precond' );
     $updates = {
@@ -257,7 +249,17 @@ sub run_tests {
     };
     ok( my $new_user = $user_rs->recursive_update($new_person) );
 
-    #print STDERR Dumper $new_user;
+    # delete has_many where foreign cols aren't nullable
+    my $rs_user_dvd = $user->owned_dvds;
+    my @user_dvd_ids = map { $_->id } $rs_user_dvd->all;
+    is( $rs_user_dvd->count, 1, 'user owns 1 dvd');
+    $updates = {
+        id         => $user->id,
+        owned_dvds => undef,
+    };
+    $user = $user_rs->recursive_update($updates);
+    is( $user->owned_dvds->count, 0, 'user owns no dvds');
+    is( $dvd_rs->search({ dvd_id => {-in => \@user_dvd_ids }})->count, 0, 'owned dvds deleted' );
 
 #    $updates = {
 #            name => 'Test name 1',
This page took 0.023587 seconds and 4 git commands to generate.