From: John Napiorkowski Date: Tue, 15 May 2007 17:59:59 +0000 (+0000) Subject: Passes all the tests but.. X-Git-Tag: v0.08010~150^2~51^2~5 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=7f99746737bbbcb61f9dd0296a86a08a25f8b4fa;p=dbsrgits%2FDBIx-Class.git Passes all the tests but.. -- 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 --- diff --git a/lib/DBIx/Class/ResultSet.pm b/lib/DBIx/Class/ResultSet.pm index 1c3342b..eda5e42 100644 --- a/lib/DBIx/Class/ResultSet.pm +++ b/lib/DBIx/Class/ResultSet.pm @@ -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); } } diff --git a/t/101populate_rs.t b/t/101populate_rs.t index 17cfe3b..0c66dcc 100644 --- a/t/101populate_rs.t +++ b/t/101populate_rs.t @@ -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'); + }