X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FResultSource.pm;h=d758ed7351f0a5bc07c5aab1cca3e71568f49aab;hb=9f9a73659ab2dbca0957049d3c0c7997512581ac;hp=3233e3ab4a1b45d8cd0883e6881e5e6666551e35;hpb=8a3a5bc5a44ae69c66b2aa5e0388ddb9aea98379;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/ResultSource.pm b/lib/DBIx/Class/ResultSource.pm index 3233e3a..d758ed7 100644 --- a/lib/DBIx/Class/ResultSource.pm +++ b/lib/DBIx/Class/ResultSource.pm @@ -13,6 +13,7 @@ use Devel::GlobalDestruction; use Try::Tiny; use List::Util 'first'; use Scalar::Util qw/blessed weaken isweak/; +use Data::Query::ExprHelpers; use namespace::clean; @@ -1811,6 +1812,33 @@ sub _resolve_condition { } return wantarray ? (\@ret, $crosstable) : \@ret; } + elsif (blessed($cond) and $cond->isa('Data::Query::ExprBuilder')) { + my %cross; + my $as = blessed($for) ? 'me' : $as; + my $mapped = map_dq_tree { + if (is_Identifier and @{$_->{elements}} == 2) { + foreach my $check ([ foreign => $as ], [ self => $for ]) { + my ($ident, $thing) = @$check; + if ($_->{elements}[0] eq $ident) { + if ($thing and !ref($thing)) { + $cross{$thing} = 1; + return \Identifier($thing, $_->{elements}[1]); + } elsif (!defined($thing)) { + return \perl_scalar_value(undef); + } elsif ((ref($thing)||'') eq 'HASH') { + return \perl_scalar_value($thing->{$_->{elements}[1]}); + } elsif (blessed($thing)) { + return \perl_scalar_value($thing->get_column($_->{elements}[1])); + } else { + die "I have no idea what ${thing} is supposed to be"; + } + } + } + } + return $_; + } $cond->{expr}; + return (wantarray ? (\$mapped, (keys %cross == 2)) : \$mapped); + } else { $self->throw_exception ("Can't handle condition $cond for relationship '$rel_name' yet :("); }