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=91b7b447caddec4dad6a567a475a568a540fcda4;hpb=7141bdfcd7f155c22d3e2044bf7f69663b67c801;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/lib/DBIx/Class/ResultSet.pm b/lib/DBIx/Class/ResultSet.pm index 91b7b44..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, @@ -997,13 +1022,14 @@ sub first { # appropriately, returning the new condition. sub _cond_for_update_delete { - my ($self) = @_; + my ($self, $full_cond) = @_; my $cond = {}; + $full_cond ||= $self->{cond}; # No-op. No condition, we're updating/deleting everything - return $cond unless ref $self->{cond}; + return $cond unless ref $full_cond; - if (ref $self->{cond} eq 'ARRAY') { + if (ref $full_cond eq 'ARRAY') { $cond = [ map { my %hash; @@ -1012,36 +1038,33 @@ sub _cond_for_update_delete { $hash{$1} = $_->{$key}; } \%hash; - } @{$self->{cond}} + } @{$full_cond} ]; } - elsif (ref $self->{cond} eq 'HASH') { - if ((keys %{$self->{cond}})[0] eq '-and') { + elsif (ref $full_cond eq 'HASH') { + if ((keys %{$full_cond})[0] eq '-and') { $cond->{-and} = []; - my @cond = @{$self->{cond}{-and}}; + my @cond = @{$full_cond->{-and}}; for (my $i = 0; $i < @cond; $i++) { my $entry = $cond[$i]; - my %hash; + my $hash; if (ref $entry eq 'HASH') { - foreach my $key (keys %{$entry}) { - $key =~ /([^.]+)$/; - $hash{$1} = $entry->{$key}; - } + $hash = $self->_cond_for_update_delete($entry); } else { $entry =~ /([^.]+)$/; - $hash{$1} = $cond[++$i]; + $hash->{$1} = $cond[++$i]; } - push @{$cond->{-and}}, \%hash; + push @{$cond->{-and}}, $hash; } } else { - foreach my $key (keys %{$self->{cond}}) { + foreach my $key (keys %{$full_cond}) { $key =~ /([^.]+)$/; - $cond->{$1} = $self->{cond}{$key}; + $cond->{$1} = $full_cond->{$key}; } } } @@ -1120,7 +1143,7 @@ sub update_all { Deletes the contents of the resultset from its result source. Note that this will not run DBIC cascade triggers. See L if you need triggers -to run. +to run. See also L. =cut @@ -1227,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; } @@ -1277,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\.)?([^.]+)$/; } @@ -1731,8 +1760,8 @@ Which column(s) to order the results by. This is currently passed through directly to SQL, so you can give e.g. C for a descending order on the column `year'. -Please note that if you have quoting enabled (see -L) you will need to do C<\'year DESC' > to +Please note that if you have C enabled (see +L) you will need to do C<\'year DESC' > to specify an order. (The scalar ref causes it to be passed as raw sql to the DB, so you will need to manually quote things as appropriate.)