X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FResultSet.pm;h=c94476da2ac3aeab6b53e8a44a5bd5f16803e31b;hb=46a05fd450f4848c6dc5f1302001571a79f4728e;hp=82109c9d9cb41ec8d381fa7f5895f76a097bfe99;hpb=acee4e4d60a59d831571937ce4148cd4ffd5ac80;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/lib/DBIx/Class/ResultSet.pm b/lib/DBIx/Class/ResultSet.pm index 82109c9..c94476d 100644 --- a/lib/DBIx/Class/ResultSet.pm +++ b/lib/DBIx/Class/ResultSet.pm @@ -95,14 +95,24 @@ sub new { $attrs->{alias} ||= 'me'; - bless { + # XXXX + # Use a named hash here and bless afterwards to avoid a huge performance hit + # in perl 5.8.8-5+ FC5 and later, and possibly other distributions. + # + # See https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=196836 for more + # information. + my $self = { result_source => $source, result_class => $attrs->{result_class} || $source->result_class, cond => $attrs->{where}, count => undef, pager => undef, attrs => $attrs - }, $class; + }; + + bless $self, $class; + + return $self; } =head2 search @@ -1550,11 +1560,13 @@ sub _resolved_attrs { my $collapse = $attrs->{collapse} || {}; if (my $prefetch = delete $attrs->{prefetch}) { + $prefetch = $self->_merge_attr({}, $prefetch); my @pre_order; + my $seen = $attrs->{seen_join} || {}; foreach my $p (ref $prefetch eq 'ARRAY' ? @$prefetch : ($prefetch)) { # bring joins back to level of current class my @prefetch = $source->resolve_prefetch( - $p, $alias, { %{$attrs->{seen_join}||{}} }, \@pre_order, $collapse + $p, $alias, $seen, \@pre_order, $collapse ); push(@{$attrs->{select}}, map { $_->[0] } @prefetch); push(@{$attrs->{as}}, map { $_->[1] } @prefetch); @@ -1568,7 +1580,8 @@ sub _resolved_attrs { sub _merge_attr { my ($self, $a, $b) = @_; - return $b unless $a; + return $b unless defined($a); + return $a unless defined($b); if (ref $b eq 'HASH' && ref $a eq 'HASH') { foreach my $key (keys %{$b}) {