X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FResultSource%2FRowParser.pm;h=6540dc70bc24013a050a198186946b7713dea712;hb=e5c6382908ee65577e53c0771629384d70959a3d;hp=93d7ef933740788eda7e896a2cf4cc50a5af0954;hpb=fd2d3c95807b9d4f812966cec28d110c70680cd2;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/ResultSource/RowParser.pm b/lib/DBIx/Class/ResultSource/RowParser.pm index 93d7ef9..6540dc7 100644 --- a/lib/DBIx/Class/ResultSource/RowParser.pm +++ b/lib/DBIx/Class/ResultSource/RowParser.pm @@ -6,16 +6,19 @@ use warnings; use base 'DBIx::Class'; -use Try::Tiny; -use List::Util qw(first max); - use DBIx::Class::ResultSource::RowParser::Util qw( assemble_simple_parser assemble_collapsing_parser ); +use DBIx::Class::_Util qw( DUMMY_ALIASPAIR dbic_internal_try dbic_internal_catch ); use DBIx::Class::Carp; +# FIXME - this should go away +# instead Carp::Skip should export usable keywords or something like that +my $unique_carper; +BEGIN { $unique_carper = \&carp_unique } + use namespace::clean; # Accepts a prefetch map (one or more relationships for the current source), @@ -122,8 +125,6 @@ sub _mk_row_parser { }, ); - my $check_null_columns; - my $src = (! $args->{collapse} ) ? assemble_simple_parser(\%common) : do { my $collapse_map = $self->_resolve_collapse ({ # FIXME @@ -141,9 +142,6 @@ sub _mk_row_parser { premultiplied => $args->{premultiplied}, }); - $check_null_columns = $collapse_map->{-identifying_columns} - if @{$collapse_map->{-identifying_columns}}; - assemble_collapsing_parser({ %common, collapse_map => $collapse_map, @@ -153,10 +151,7 @@ sub _mk_row_parser { utf8::upgrade($src) if DBIx::Class::_ENV_::STRESSTEST_UTF8_UPGRADE_GENERATED_COLLAPSER_SOURCE; - return ( - $args->{eval} ? ( eval "sub $src" || die $@ ) : $src, - $check_null_columns, - ); + $src; } @@ -197,11 +192,28 @@ sub _resolve_collapse { is_single => ( $inf->{attrs}{accessor} && $inf->{attrs}{accessor} ne 'multi' ), is_inner => ( ( $inf->{attrs}{join_type} || '' ) !~ /^left/i), rsrc => $self->related_source($rel), - fk_map => $self->_resolve_relationship_condition( - rel_name => $rel, - self_alias => "\xFE", # irrelevant - foreign_alias => "\xFF", # irrelevant - )->{identity_map}, + fk_map => ( + dbic_internal_try { + $self->_resolve_relationship_condition( + rel_name => $rel, + + # an API where these are optional would be too cumbersome, + # instead always pass in some dummy values + DUMMY_ALIASPAIR, + )->{identity_map}, + } + dbic_internal_catch { + + $unique_carper->( + "Resolution of relationship '$rel' failed unexpectedly, " + . 'please relay the following error and seek assistance via ' + . DBIx::Class::_ENV_::HELP_URL . ". Encountered error: $_" + ); + + # RV + +{} + } + ), }; } @@ -412,7 +424,14 @@ sub _resolve_collapse { # coderef later $collapse_map->{-identifying_columns} = []; $collapse_map->{-identifying_columns_variants} = [ sort { - (scalar @$a) <=> (scalar @$b) or max(@$a) <=> max(@$b) + (scalar @$a) <=> (scalar @$b) + or + ( + # Poor man's max() + ( sort { $b <=> $a } @$a )[0] + <=> + ( sort { $b <=> $a } @$b )[0] + ) } @collapse_sets ]; } } @@ -458,12 +477,15 @@ sub _resolve_collapse { is_single => $relinfo->{$rel}{is_single}, - # if there is at least one *inner* reverse relationship which is HASH-based (equality only) + # if there is at least one *inner* reverse relationship ( meaning identity-only ) # we can safely assume that the child can not exist without us - rev_rel_is_optional => ( first - { ref $_->{cond} eq 'HASH' and ($_->{attrs}{join_type}||'') !~ /^left/i } - values %{ $self->reverse_relationship_info($rel) }, - ) ? 0 : 1, + rev_rel_is_optional => ( + ( grep { + ($_->{attrs}{join_type}||'') !~ /^left/i + } values %{ $self->reverse_relationship_info($rel) } ) + ? 0 + : 1 + ), # if this is a 1:1 our own collapser can be used as a collapse-map # (regardless of left or not)