-alias => $as,
-relation_chain_depth => $seen->{-relation_chain_depth} || 0,
},
- $self->_resolve_condition($rel_info->{cond}, $as, $alias) ];
+ $self->_resolve_condition($rel_info->{cond}, $as, $alias, $join) ];
}
}
our $UNRESOLVABLE_CONDITION = \'1 = 0';
sub _resolve_condition {
- my ($self, $cond, $as, $for) = @_;
- if (ref $cond eq 'HASH') {
+ my ($self, $cond, $as, $for, $rel) = @_;
+ if (ref $cond eq 'CODE') {
+
+ # heuristic for the actual relname
+ if (! defined $rel) {
+ if (!ref $as) {
+ $rel = $as;
+ }
+ elsif (!ref $for) {
+ $rel = $for;
+ }
+ }
+
+ if (! defined $rel) {
+ $self->throw_exception ('Unable to determine relationship name for condition resolution');
+ }
+
+ return $cond->({
+ self_alias => ref $for ? $as : $for,
+ foreign_alias => ref $for ? $self->related_source($rel)->resultset->current_source_alias : $as,
+ self_resultsource => $self,
+ foreign_relname => $rel,
+ self_rowobj => ref $for ? $for : undef
+ });
+
+ } elsif (ref $cond eq 'HASH') {
my %ret;
foreach my $k (keys %{$cond}) {
my $v = $cond->{$k};
} elsif (ref $cond eq 'ARRAY') {
return [ map { $self->_resolve_condition($_, $as, $for) } @$cond ];
} else {
- die("Can't handle condition $cond yet :(");
+ $self->throw_exception ("Can't handle condition $cond yet :(");
}
}
"Can't prefetch has_many ${pre} (join cond too complex)")
unless ref($rel_info->{cond}) eq 'HASH';
my $dots = @{[$as_prefix =~ m/\./g]} + 1; # +1 to match the ".${as_prefix}"
+
if (my ($fail) = grep { @{[$_ =~ m/\./g]} == $dots }
keys %{$collapse}) {
my ($last) = ($fail =~ /([^\.]+)$/);
. 'Use at your own risk.'
);
}
+
#my @col = map { (/^self\.(.+)$/ ? ("${as_prefix}.$1") : ()); }
# values %{$rel_info->{cond}};
$collapse->{".${as_prefix}${pre}"} = [ $rel_source->_pri_cols ];