X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBIHacks.pm;h=c7910be6f003288f98616647963ce6855bcf56bf;hb=2a6dda4b4b591e4da531d6c78ff9dc9e359d5fd9;hp=ae04942fd87e1e4bd30dffa58f3c659d8cf584d6;hpb=8e40a627f9c94df8ae46c1c1abc6f7abdb3fdfdf;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBIHacks.pm b/lib/DBIx/Class/Storage/DBIHacks.pm index ae04942..c7910be 100644 --- a/lib/DBIx/Class/Storage/DBIHacks.pm +++ b/lib/DBIx/Class/Storage/DBIHacks.pm @@ -15,8 +15,8 @@ use mro 'c3'; use List::Util 'first'; use Scalar::Util 'blessed'; -use Sub::Name 'subname'; -use DBIx::Class::_Util qw(is_plain_value is_literal_value UNRESOLVABLE_CONDITION); +use DBIx::Class::_Util 'UNRESOLVABLE_CONDITION'; +use SQL::Abstract qw(is_plain_value is_literal_value); use namespace::clean; # @@ -111,8 +111,8 @@ sub _adjust_select_args_for_complex_prefetch { my $outer_attrs = { %$attrs }; delete @{$outer_attrs}{qw(from bind rows offset group_by _grouped_by_distinct having)}; - my $inner_attrs = { %$attrs }; - delete @{$inner_attrs}{qw(for collapse select as _related_results_construction)}; + my $inner_attrs = { %$attrs, _simple_passthrough_construction => 1 }; + delete @{$inner_attrs}{qw(for collapse select as)}; # there is no point of ordering the insides if there is no limit delete $inner_attrs->{order_by} if ( @@ -1120,25 +1120,36 @@ sub _collapse_cond_unroll_pairs { if (ref $rhs eq 'HASH' and ! keys %$rhs) { # FIXME - SQLA seems to be doing... nothing...? } + elsif (ref $rhs eq 'HASH' and keys %$rhs == 1 and exists $rhs->{-ident}) { + push @conds, { $lhs => { '=', $rhs } }; + } + elsif (ref $rhs eq 'HASH' and keys %$rhs == 1 and exists $rhs->{-value} and is_plain_value $rhs->{-value}) { + push @conds, { $lhs => $rhs->{-value} }; + } elsif (ref $rhs eq 'HASH' and keys %$rhs == 1 and exists $rhs->{'='}) { - for my $p ($self->_collapse_cond_unroll_pairs([ [ $lhs => $rhs->{'='} ] ])) { - - # extra sanity check - if (keys %$p > 1) { - require Data::Dumper::Concise; - local $Data::Dumper::Deepcopy = 1; - $self->throw_exception( - "Internal error: unexpected collapse unroll:" - . Data::Dumper::Concise::Dumper { in => { $lhs => $rhs }, out => $p } - ); - } + if( is_literal_value $rhs->{'='}) { + push @conds, { $lhs => $rhs }; + } + else { + for my $p ($self->_collapse_cond_unroll_pairs([ [ $lhs => $rhs->{'='} ] ])) { + + # extra sanity check + if (keys %$p > 1) { + require Data::Dumper::Concise; + local $Data::Dumper::Deepcopy = 1; + $self->throw_exception( + "Internal error: unexpected collapse unroll:" + . Data::Dumper::Concise::Dumper { in => { $lhs => $rhs }, out => $p } + ); + } - my ($l, $r) = %$p; + my ($l, $r) = %$p; - push @conds, ( ! length ref $r or is_plain_value($r) ) - ? { $l => $r } - : { $l => { '=' => $r } } - ; + push @conds, ( ! length ref $r or is_plain_value($r) ) + ? { $l => $r } + : { $l => { '=' => $r } } + ; + } } } elsif (ref $rhs eq 'ARRAY') { @@ -1208,23 +1219,29 @@ sub _extract_fixed_condition_columns { $vals->{$undef_marker} = $v if $consider_nulls } elsif ( - ! length ref $v - or - is_plain_value ($v) - ) { - $vals->{$v} = $v; - } - elsif ( ref $v eq 'HASH' and keys %$v == 1 - and - ref $v->{'='} - and + ) { + if (exists $v->{-value}) { + if (defined $v->{-value}) { + $vals->{$v->{-value}} = $v->{-value} + } + elsif( $consider_nulls ) { + $vals->{$undef_marker} = $v->{-value}; + } + } # do not need to check for plain values - _collapse_cond did it for us - is_literal_value($v->{'='}) + elsif(ref $v->{'='} and is_literal_value($v->{'='}) ) { + $vals->{$v->{'='}} = $v->{'='}; + } + } + elsif ( + ! length ref $v + or + is_plain_value ($v) ) { - $vals->{$v->{'='}} = $v->{'='}; + $vals->{$v} = $v; } elsif (ref $v eq 'ARRAY' and ($v->[0]||'') eq '-and') { for ( @{$v}[1..$#$v] ) {