X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FResultSet.pm;h=91b7b447caddec4dad6a567a475a568a540fcda4;hb=f8bad7690ec8115ba42c6fe55a5ddb3a0ad2b8dd;hp=a5a6406f1c2068b9dcd0553e2bb5d1c8924db99b;hpb=888a0746debd73e3aa2bbff0592b8046b7161b94;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/ResultSet.pm b/lib/DBIx/Class/ResultSet.pm index a5a6406..91b7b44 100644 --- a/lib/DBIx/Class/ResultSet.pm +++ b/lib/DBIx/Class/ResultSet.pm @@ -171,6 +171,7 @@ sub search_rs { $attrs = pop(@_) if @_ > 1 and ref $_[$#_] eq 'HASH'; my $our_attrs = { %{$self->{attrs}} }; my $having = delete $our_attrs->{having}; + my $where = delete $our_attrs->{where}; my $new_attrs = { %{$our_attrs}, %{$attrs} }; @@ -179,8 +180,8 @@ sub search_rs { next unless exists $attrs->{$key}; $new_attrs->{$key} = $self->_merge_attr($our_attrs->{$key}, $attrs->{$key}); } - - my $where = (@_ + + my $cond = (@_ ? ( (@_ == 1 || ref $_[0] eq "HASH") ? shift @@ -204,6 +205,17 @@ sub search_rs { } : $where); } + if (defined $cond) { + $new_attrs->{where} = ( + defined $new_attrs->{where} + ? { '-and' => [ + map { + ref $_ eq 'ARRAY' ? [ -or => $_ ] : $_ + } $cond, $new_attrs->{where} + ] + } + : $cond); + } if (defined $having) { $new_attrs->{having} = ( @@ -1211,9 +1223,10 @@ sub new_result { ) if ($self->{cond} && !(ref $self->{cond} eq 'HASH')); my $alias = $self->{attrs}{alias}; + my $collapsed_cond = $self->{cond} ? $self->_collapse_cond($self->{cond}) : {}; my %new = ( %{ $self->_remove_alias($values, $alias) }, - %{ $self->_remove_alias($self->{cond}, $alias) }, + %{ $self->_remove_alias($collapsed_cond, $alias) }, ); my $obj = $self->result_class->new(\%new); @@ -1221,6 +1234,41 @@ sub new_result { return $obj; } +# _collapse_cond +# +# Recursively collapse the condition. + +sub _collapse_cond { + my ($self, $cond, $collapsed) = @_; + + $collapsed ||= {}; + + if (ref $cond eq 'ARRAY') { + foreach my $subcond (@$cond) { + next unless ref $subcond; # -or +# warn "ARRAY: " . Dumper $subcond; + $collapsed = $self->_collapse_cond($subcond, $collapsed); + } + } + elsif (ref $cond eq 'HASH') { + if (keys %$cond and (keys %$cond)[0] eq '-and') { + foreach my $subcond (@{$cond->{-and}}) { +# warn "HASH: " . Dumper $subcond; + $collapsed = $self->_collapse_cond($subcond, $collapsed); + } + } + else { +# warn "LEAF: " . Dumper $cond; + foreach my $col (keys %$cond) { + my $value = $cond->{$col}; + $collapsed->{$col} = $value; + } + } + } + + return $collapsed; +} + # _remove_alias # # Remove the specified alias from the specified query hash. A copy is made so