Skip to content

Commit

Permalink
Multilevel find_or_(multi)create got inadvertently broken
Browse files Browse the repository at this point in the history
Relax the check of what we feed to the relcond resolver
  • Loading branch information
ribasushi committed Sep 16, 2014
1 parent 07add74 commit e084cb2
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 1 deletion.
3 changes: 2 additions & 1 deletion lib/DBIx/Class/ResultSource.pm
Original file line number Diff line number Diff line change
Expand Up @@ -1907,8 +1907,9 @@ sub _resolve_relationship_condition {
$args->{foreign_values} = { $args->{foreign_values}->get_columns };
}
elsif (! defined $args->{foreign_values} or ref $args->{foreign_values} eq 'HASH') {
my $ri = { map { $_ => 1 } $rel_rsrc->relationships };
my $ci = $rel_rsrc->columns_info;
! exists $ci->{$_} and $self->throw_exception(
! exists $ci->{$_} and ! exists $ri->{$_} and $self->throw_exception(
"Key '$_' supplied as 'foreign_values' is not a column on related source '@{[ $rel_rsrc->source_name ]}'"
) for keys %{ $args->{foreign_values} ||= {} };
}
Expand Down
71 changes: 71 additions & 0 deletions t/multi_create/find_or_multicreate.t
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
use strict;
use warnings;

use Test::More;
use lib qw(t/lib);
use DBICTest;

my $schema = DBICTest->init_schema( no_populate => 1 );

my $t11 = $schema->resultset('Track')->find_or_create({
trackid => 1,
title => 'Track one cd one',
cd => {
year => 1,
title => 'CD one',
very_long_artist_relationship => {
name => 'Artist one',
}
}
});

my $t12 = $schema->resultset('Track')->find_or_create({
trackid => 2,
title => 'Track two cd one',
cd => {
title => 'CD one',
very_long_artist_relationship => {
name => 'Artist one',
}
}
});

# FIXME - MC should be smart enough to infer this on its own...
$schema->resultset('Artist')->create({ name => 'Artist two' });

my $t2 = $schema->resultset('Track')->find_or_create({
trackid => 3,
title => 'Track one cd one',
cd => {
year => 1,
title => 'CD one',
very_long_artist_relationship => {
name => 'Artist two',
}
}
});

is_deeply(
$schema->resultset('Artist')->search({}, {
prefetch => { cds => 'tracks' },
order_by => 'tracks.title',
})->all_hri,
[
{ artistid => 1, charfield => undef, name => "Artist one", rank => 13, cds => [
{ artist => 1, cdid => 1, genreid => undef, single_track => undef, title => "CD one", year => 1, tracks => [
{ cd => 1, last_updated_at => undef, last_updated_on => undef, position => 1, title => "Track one cd one", trackid => 1 },
{ cd => 1, last_updated_at => undef, last_updated_on => undef, position => 2, title => "Track two cd one", trackid => 2 },
]},
]},
{ artistid => 2, charfield => undef, name => "Artist two", rank => 13, cds => [
{ artist => 2, cdid => 2, genreid => undef, single_track => undef, title => "CD one", year => 1, tracks => [
{ cd => 2, last_updated_at => undef, last_updated_on => undef, position => 1, title => "Track one cd one", trackid => 3 },
]},
]},
],
'Expected state of database after several find_or_create rounds'
);


done_testing;

0 comments on commit e084cb2

Please sign in to comment.