Passes all the tests but..
John Napiorkowski [Tue, 15 May 2007 17:59:59 +0000 (17:59 +0000)]
 -- Had to change the test to make each row declare the same columns (no autocreate for autoPKs)
 -- Right now inner related resultsets call popular in array context.  Needs to be fixed

lib/DBIx/Class/ResultSet.pm
t/101populate_rs.t

index 1c3342b..eda5e42 100644 (file)
@@ -1280,7 +1280,7 @@ i.e.,
 use Data::Dump qw/dump/;
 
 sub populate {
-  my ($self, $data) = @_;
+  my ($self, $data) = @_;  #warn dump $self->result_source->primary_columns;
   
   if(defined wantarray) {
     my @created;
@@ -1292,15 +1292,39 @@ sub populate {
   else
   {
     my ($first, @rest) = @$data;
-    my @names = keys %$first;
        
-       warn dump keys %$_ for @$data;
+       ## We assume for now that the first item is required to name all the columns
+       ## and relationships similarly to how schema->populate requires a first item
+       ## of all the column names.
        
-       #@$data = map { my %unit = %$_; warn dump @unit{qw/cds artistid/}; warn dump %unit; } @$data;
+    my @names = grep { !$self->result_source->has_relationship($_) } keys %$first;
        
-       die "Void mode not supported yet :)";
+    $self->result_source->storage->insert_bulk(
+               $self->result_source, 
+               \@names, 
+               [map { [ map {defined $_ ? $_ : $self->throw_exception("Undefined value for column!")} @$_{@names} ] } @$data]
+       );
+       
+       ## Again we assume the first row has to define all the related resultsets
+       my @rels = grep { $self->result_source->has_relationship($_) } keys %$first;
+       my @pks = $self->result_source->primary_columns;
+       
+       ## Must have PKs to use this!!!
+       
+       foreach my $item (@$data)
+       {
+               ## First we need to get a result for each
+               ## We need to call populate for each relationship.
+               
+               foreach my $rel (@rels)
+               {
+                       my $result = $self->find(map {{$_=>$item->{$_}} } @pks);
+                       
+                       my @discard = $result->$rel->populate($item->{$rel});
+                       #$result->$rel->populate($item->{$rel});
+               }
+       }
        
-    #$self->result_source->storage->insert_bulk($self->result_source, \@names, $data);
   }
 }
 
index 17cfe3b..0c66dcc 100644 (file)
@@ -5,14 +5,14 @@ use Test::More;
 use lib qw(t/lib);
 use DBICTest;
 
-plan tests => 18;
+plan tests => 25;
 
 my $schema = DBICTest->init_schema();
 my $rs = $schema->resultset('Artist');
 
 RETURN_RESULTSETS: {
 
-       my ($crap, $girl) = $rs->populate( [
+       my ($crap, $girl, $damn) = $rs->populate( [
          { artistid => 4, name => 'Manufactured Crap', cds => [ 
                  { title => 'My First CD', year => 2006 },
                  { title => 'Yet More Tweeny-Pop crap', year => 2007 },
@@ -25,12 +25,13 @@ RETURN_RESULTSETS: {
 
                ]
          },
-         { name => 'Like I Give a Damn' }
+         { artistid=>6, name => 'Like I Give a Damn' }
 
        ] );
        
        isa_ok( $crap, 'DBICTest::Artist', "Got 'Artist'");
-       isa_ok( $girl, 'DBICTest::Artist', "Got 'Artist'");
+       isa_ok( $damn, 'DBICTest::Artist', "Got 'Artist'");
+       isa_ok( $girl, 'DBICTest::Artist', "Got 'Artist'");     
        
        ok( $crap->name eq 'Manufactured Crap', "Got Correct name for result object");
        ok( $girl->name eq 'Angsty-Whiny Girl', "Got Correct name for result object");
@@ -44,56 +45,57 @@ RETURN_RESULTSETS: {
 RETURN_VOID: {
 
        $rs->populate( [
-         { artistid => 4, name => 'Manufactured Crap', cds => [ 
-                 { title => 'My First CD', year => 2006 },
-                 { title => 'Yet More Tweeny-Pop crap', year => 2007 },
+         { artistid => 7, name => 'Manufactured CrapB', cds => [ 
+                 { title => 'My First CDB', year => 2006 },
+                 { title => 'Yet More Tweeny-Pop crapB', year => 2007 },
                ] 
          },
-         { artistid => 5, name => 'Angsty-Whiny Girl', cds => [
-                 { title => 'My parents sold me to a record company' ,year => 2005 },
-                 { title => 'Why Am I So Ugly?', year => 2006 },
-                 { title => 'I Got Surgery and am now Popular', year => 2007 }
+         { artistid => 8, name => 'Angsty-Whiny GirlB', cds => [
+                 { title => 'My parents sold me to a record companyB' ,year => 2005 },
+                 { title => 'Why Am I So Ugly?B', year => 2006 },
+                 { title => 'I Got Surgery and am now PopularB', year => 2007 }
 
                ]
          },
-         { name => 'Like I Give a Damn' }
+         {artistid=>9,  name => 'XXXX' }
 
        ] );
-
-       my $artist = $rs->find(4);
+       
+       my $artist = $rs->find(7);
 
        ok($artist, 'Found artist');
-       is($artist->name, 'Manufactured Crap');
+       is($artist->name, 'Manufactured CrapB');
        is($artist->cds->count, 2, 'Has CDs');
 
        my @cds = $artist->cds;
 
-       is($cds[0]->title, 'My First CD', 'A CD');
+       is($cds[0]->title, 'My First CDB', 'A CD');
        is($cds[0]->year,  2006, 'Published in 2006');
 
-       is($cds[1]->title, 'Yet More Tweeny-Pop crap', 'Another crap CD');
+       is($cds[1]->title, 'Yet More Tweeny-Pop crapB', 'Another crap CD');
        is($cds[1]->year,  2007, 'Published in 2007');
 
-       $artist = $rs->find(5);
+       $artist = $rs->find(8);
        ok($artist, 'Found artist');
-       is($artist->name, 'Angsty-Whiny Girl');
+       is($artist->name, 'Angsty-Whiny GirlB');
        is($artist->cds->count, 3, 'Has CDs');
 
        @cds = $artist->cds;
 
 
-       is($cds[0]->title, 'My parents sold me to a record company', 'A CD');
+       is($cds[0]->title, 'My parents sold me to a record companyB', 'A CD');
        is($cds[0]->year,  2005, 'Published in 2005');
 
-       is($cds[1]->title, 'Why Am I So Ugly?', 'A Coaster');
+       is($cds[1]->title, 'Why Am I So Ugly?B', 'A Coaster');
        is($cds[1]->year,  2006, 'Published in 2006');
 
-       is($cds[2]->title, 'I Got Surgery and am now Popular', 'Selling un-attainable dreams');
+       is($cds[2]->title, 'I Got Surgery and am now PopularB', 'Selling un-attainable dreams');
        is($cds[2]->year,  2007, 'Published in 2007');
 
-       $artist = $rs->search({name => 'Like I Give A Damn'})->single;
-       ok($artist);
+       $artist = $rs->search({name => 'XXXX'})->single;
+       ok($artist, "Got Expected Artist Result");
 
        is($artist->cds->count, 0, 'No CDs');
+
 }