From: John Napiorkowski Date: Fri, 18 May 2007 16:01:47 +0000 (+0000) Subject: -- Additional tests for checking correct autocreation of PK's when needed X-Git-Tag: v0.08010~150^2~51^2~1 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=dbsrgits%2FDBIx-Class.git;a=commitdiff_plain;h=6f8ab6dc1902d7536b682bd6c32c22b48f3e5e3d -- Additional tests for checking correct autocreation of PK's when needed -- Cleaned up the code to reflect DBIx indenting standards -- Additional documentation --- diff --git a/lib/DBIx/Class/ResultSet.pm b/lib/DBIx/Class/ResultSet.pm index f49a071..e77108b 100644 --- a/lib/DBIx/Class/ResultSet.pm +++ b/lib/DBIx/Class/ResultSet.pm @@ -1252,32 +1252,45 @@ Pass an arrayref of hashrefs. Each hashref should be a structure suitable for submitting to a $resultset->create(...) method. In void context, C in L is used -to insert the data, as this is a fast method. +to insert the data, as this is a faster method. Otherwise, each set of data is inserted into the database using L, and a arrayref of the resulting row objects is returned. -i.e., +Example: Assuming an Artist Class that has many CDs Classes relating: - $rs->populate( [ - { artistid => 4, name => 'Manufactured Crap', cds => [ - { title => 'My First CD', year => 2006 }, - { title => 'Yet More Tweeny-Pop crap', 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 } - ] - }, - { name => 'Like I Give a Damn' } - - ] ); + my $Artist_rs = $schema->resultset("Artist"); + + ## Void Context Example + $Artist_rs->populate([ + { artistid => 4, name => 'Manufactured Crap', cds => [ + { title => 'My First CD', year => 2006 }, + { title => 'Yet More Tweeny-Pop crap', 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 } + ], + }, + ]); + + ## Array Context Example + my ($ArtistOne, $ArtistTwo, $ArtistThree) = $Artist_rs->populate([ + { name => "Artist One"}, + { name => "Artist Two"}, + { name => "Artist Three", cds=> [ + { title => "First CD", year => 2007}, + { title => "Second CD", year => 2008}, + ]} + ]); + + print $ArtistOne->name; ## response is 'Artist One' + print $ArtistThree->cds->count ## reponse is '2' =cut -use Data::Dump qw/dump/; sub populate { my ($self, $data) = @_; @@ -1290,46 +1303,44 @@ sub populate { return @created; } else { my ($first, @rest) = @$data; - + my @names = grep { !ref $first->{$_} } keys %$first; - - my @values = map { - [ map { - defined $_ ? $_ : $self->throw_exception("Undefined value for column!") - } @$_{@names} ] - } @$data; - + + my @values = map { + [ map { + defined $_ ? $_ : $self->throw_exception("Undefined value for column!") + } @$_{@names} ] + } @$data; + $self->result_source->storage->insert_bulk( - $self->result_source, - \@names, - \@values, - ); - - my @rels = grep { $self->result_source->has_relationship($_) } keys %$first; - my @pks = $self->result_source->primary_columns; - - foreach my $item (@$data) { - - foreach my $rel (@rels) { - next unless $item->{$rel}; - - my $parent = $self->find(map {{$_=>$item->{$_}} } @pks) || next; - my $child = $parent->$rel; - - my $related = $child->result_source->resolve_condition( - - $parent->result_source->relationship_info($rel)->{cond}, - $child, - $parent, - ); - - my @rows_to_add = ref $item->{$rel} eq 'ARRAY' ? @{$item->{$rel}} : ($item->{$rel}); - my @populate = map { {%$_, %$related} } @rows_to_add; - - $child->populate( \@populate ); - } - } - + $self->result_source, + \@names, + \@values, + ); + + my @rels = grep { $self->result_source->has_relationship($_) } keys %$first; + my @pks = $self->result_source->primary_columns; + + foreach my $item (@$data) { + + foreach my $rel (@rels) { + next unless $item->{$rel}; + + my $parent = $self->find(map {{$_=>$item->{$_}} } @pks) || next; + my $child = $parent->$rel; + + my $related = $child->result_source->resolve_condition( + $parent->result_source->relationship_info($rel)->{cond}, + $child, + $parent, + ); + + my @rows_to_add = ref $item->{$rel} eq 'ARRAY' ? @{$item->{$rel}} : ($item->{$rel}); + my @populate = map { {%$_, %$related} } @rows_to_add; + + $child->populate( \@populate ); + } + } } } diff --git a/t/101populate_rs.t b/t/101populate_rs.t index c4c8830..7d25d78 100644 --- a/t/101populate_rs.t +++ b/t/101populate_rs.t @@ -5,7 +5,7 @@ use Test::More; use lib qw(t/lib); use DBICTest; -plan tests => 31; +plan tests => 40; my $schema = DBICTest->init_schema(); my $rs = $schema->resultset('Artist'); @@ -42,9 +42,7 @@ RETURN_RESULTSETS: { 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"); ok( $xxxaaa->name eq 'bbbb', "Got Correct name for result object"); - - use Data::Dump qw/dump/; - + ok( $crap->cds->count == 2, "got Expected Number of Cds"); ok( $girl->cds->count == 3, "got Expected Number of Cds"); } @@ -113,3 +111,40 @@ RETURN_VOID: { is($artist->cds->count, 1, 'Has One CD'); } +RETURN_RESULTSETS_AUTOPK: { + + my ($crap, $girl, $damn, $xxxaaa) = $rs->populate( [ + { name => 'Manufactured CrapC', cds => [ + { title => 'My First CD', year => 2006 }, + { title => 'Yet More Tweeny-Pop crap', year => 2007 }, + ] + }, + { name => 'Angsty-Whiny GirlC', 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 } + + ] + }, + { name => 'Like I Give a DamnC' }, + + { name => 'bbbbC', cds => [ + { title => 'xxxaaa' ,year => 2005 }, + ] + }, + + ] ); + + isa_ok( $crap, 'DBICTest::Artist', "Got 'Artist'"); + isa_ok( $damn, 'DBICTest::Artist', "Got 'Artist'"); + isa_ok( $girl, 'DBICTest::Artist', "Got 'Artist'"); + isa_ok( $xxxaaa, 'DBICTest::Artist', "Got 'Artist'"); + + ok( $crap->name eq 'Manufactured CrapC', "Got Correct name for result object"); + ok( $girl->name eq 'Angsty-Whiny GirlC', "Got Correct name for result object"); + ok( $xxxaaa->name eq 'bbbbC', "Got Correct name for result object"); + + ok( $crap->cds->count == 2, "got Expected Number of Cds"); + ok( $girl->cds->count == 3, "got Expected Number of Cds"); +} +