X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FResultSet.pm;h=7e74edf3708ed1bc1a5618121843f8e06fefc960;hb=d647897e1d4a596a0dffd223639a976728c85bb3;hp=ec5413687607617367682fe7cbda62b74b693a19;hpb=d73c65616463b6d435eac899dc2ef21c1b53b29a;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/lib/DBIx/Class/ResultSet.pm b/lib/DBIx/Class/ResultSet.pm index ec54136..7e74edf 100644 --- a/lib/DBIx/Class/ResultSet.pm +++ b/lib/DBIx/Class/ResultSet.pm @@ -184,7 +184,15 @@ sub search_rs { my $cond = (@_ ? ( (@_ == 1 || ref $_[0] eq "HASH") - ? shift + ? ( + (ref $_[0] eq 'HASH') + ? ( + (keys %{ $_[0] } > 0) + ? shift + : undef + ) + : shift + ) : ( (@_ % 2) ? $self->throw_exception("Odd number of arguments to search") @@ -205,6 +213,7 @@ sub search_rs { } : $where); } + if (defined $cond) { $new_attrs->{where} = ( defined $new_attrs->{where} @@ -334,6 +343,22 @@ sub find { $input_query = {@_}; } + my (%related, $info); + + foreach my $key (keys %$input_query) { + if (ref($input_query->{$key}) + && ($info = $self->result_source->relationship_info($key))) { + my $rel_q = $self->result_source->resolve_condition( + $info->{cond}, delete $input_query->{$key}, $key + ); + die "Can't handle OR join condition in find" if ref($rel_q) eq 'ARRAY'; + @related{keys %$rel_q} = values %$rel_q; + } + } + if (my @keys = keys %related) { + @{$input_query}{@keys} = values %related; + } + my @unique_queries = $self->_unique_queries($input_query, $attrs); # Build the final query: Default to the disjunction of the unique queries, @@ -1225,10 +1250,10 @@ sub new_result { my %new = ( %{ $self->_remove_alias($values, $alias) }, %{ $self->_remove_alias($collapsed_cond, $alias) }, + -result_source => $self->result_source, ); my $obj = $self->result_class->new(\%new); - $obj->result_source($self->result_source) if $obj->can('result_source'); return $obj; } @@ -1275,9 +1300,15 @@ sub _collapse_cond { sub _remove_alias { my ($self, $query, $alias) = @_; - my %unaliased = %{ $query || {} }; - foreach my $key (keys %unaliased) { - $unaliased{$1} = delete $unaliased{$key} + my %orig = %{ $query || {} }; + my %unaliased; + + foreach my $key (keys %orig) { + if ($key !~ /\./) { + $unaliased{$key} = $orig{$key}; + next; + } + $unaliased{$1} = $orig{$key} if $key =~ m/^(?:\Q$alias\E\.)?([^.]+)$/; }