$self->throw_exception("Arguments 'self_alias' and 'foreign_alias' may not be identical")
if $args->{self_alias} eq $args->{foreign_alias};
+# TEMP
+ my $exception_rel_id = "relationship '$args->{rel_name}' on source '@{[ $self->source_name ]}'";
+
my $rel_info = $self->relationship_info($args->{rel_name})
# TEMP
# or $self->throw_exception( "No such $exception_rel_id" );
or carp_unique("Requesting resolution on non-existent relationship '$args->{rel_name}' on source '@{[ $self->source_name ]}': fix your code *soon*, as it will break with the next major version");
- my $exception_rel_id = "relationship '$rel_info->{_original_name}' on source '@{[ $self->source_name ]}'";
+# TEMP
+ $exception_rel_id = "relationship '$rel_info->{_original_name}' on source '@{[ $self->source_name ]}'"
+ if $rel_info;
$self->throw_exception("No practical way to resolve $exception_rel_id between two data structures")
if exists $args->{self_result_object} and exists $args->{foreign_values};
)
;
- my $rel_rsrc = $self->related_source($args->{rel_name});
+#TEMP
+ my $rel_rsrc;# = $self->related_source($args->{rel_name});
if (exists $args->{foreign_values}) {
+# TEMP
+ $rel_rsrc ||= $self->related_source($args->{rel_name});
+
if (defined blessed $args->{foreign_values}) {
$self->throw_exception( "Objects supplied as 'foreign_values' ($args->{foreign_values}) must inherit from DBIx::Class::Row" )
$args->{foreign_values} = { $args->{foreign_values}->get_columns };
}
elsif (! defined $args->{foreign_values} or ref $args->{foreign_values} eq 'HASH') {
+ my $ri = { map { $_ => 1 } $rel_rsrc->relationships };
my $ci = $rel_rsrc->columns_info;
- ! exists $ci->{$_} and $self->throw_exception(
+ ! exists $ci->{$_} and ! exists $ri->{$_} and $self->throw_exception(
"Key '$_' supplied as 'foreign_values' is not a column on related source '@{[ $rel_rsrc->source_name ]}'"
) for keys %{ $args->{foreign_values} ||= {} };
}
"The join-free condition returned for $exception_rel_id must be a hash reference"
) unless ref $jfc eq 'HASH';
+# TEMP
+ $rel_rsrc ||= $self->related_source($args->{rel_name});
+
my ($joinfree_alias, $joinfree_source);
if (defined $args->{self_result_object}) {
$joinfree_alias = $args->{foreign_alias};
$joinfree_source->columns
};
- $fq_col_list->{$_} or $self->throw_exception (
+ exists $fq_col_list->{$_} or $self->throw_exception (
"The join-free condition returned for $exception_rel_id may only "
- . 'contain keys that are fully qualified column names of the corresponding source'
+ . 'contain keys that are fully qualified column names of the corresponding source '
+ . "(it returned '$_')"
) for keys %$jfc;
+ (
+ length ref $_
+ and
+ defined blessed($_)
+ and
+ $_->isa('DBIx::Class::Row')
+ and
+ $self->throw_exception (
+ "The join-free condition returned for $exception_rel_id may not "
+ . 'contain result objects as values - perhaps instead of invoking '
+ . '->$something you meant to return ->get_column($something)'
+ )
+ ) for values %$jfc;
+
}
}
elsif (ref $args->{condition} eq 'HASH') {
for my $lhs (keys %$col_eqs) {
next if $col_eqs->{$lhs} eq UNRESOLVABLE_CONDITION;
- my ($rhs) = @{ is_literal_value( $ret->{condition}{$lhs} ) || next };
+
+# TEMP
+ $rel_rsrc ||= $self->related_source($args->{rel_name});
# there is no way to know who is right and who is left in a cref
- # therefore a full blown resolution call
+ # therefore a full blown resolution call, and figure out the
+ # direction a bit further below
$colinfos ||= $storage->_resolve_column_info([
{ -alias => $args->{self_alias}, -rsrc => $self },
{ -alias => $args->{foreign_alias}, -rsrc => $rel_rsrc },
]);
- my ($l_col, $r_col) = map { $_ =~ / ([^\.]+) $ /x } ($lhs, $rhs);
+ next unless $colinfos->{$lhs}; # someone is engaging in witchcraft
- if (
- $colinfos->{$l_col}
- and
- $colinfos->{$r_col}
+ if ( my $rhs_ref = is_literal_value( $col_eqs->{$lhs} ) ) {
+
+ if (
+ $colinfos->{$rhs_ref->[0]}
+ and
+ $colinfos->{$lhs}{-source_alias} ne $colinfos->{$rhs_ref->[0]}{-source_alias}
+ ) {
+ ( $colinfos->{$lhs}{-source_alias} eq $args->{self_alias} )
+ ? ( $ret->{identity_map}{$colinfos->{$lhs}{-colname}} = $colinfos->{$rhs_ref->[0]}{-colname} )
+ : ( $ret->{identity_map}{$colinfos->{$rhs_ref->[0]}{-colname}} = $colinfos->{$lhs}{-colname} )
+ ;
+ }
+ }
+ elsif (
+ $col_eqs->{$lhs} =~ /^ ( \Q$args->{self_alias}\E \. .+ ) /x
and
- $colinfos->{$l_col}{-source_alias} ne $colinfos->{$r_col}{-source_alias}
+ ($colinfos->{$1}||{})->{-result_source} == $rel_rsrc
) {
- ( $colinfos->{$l_col}{-source_alias} eq $args->{self_alias} )
- ? ( $ret->{identity_map}{$l_col} = $r_col )
- : ( $ret->{identity_map}{$r_col} = $l_col )
+ my ($lcol, $rcol) = map
+ { $colinfos->{$_}{-colname} }
+ ( $lhs, $1 )
;
+ carp_unique(
+ "The $exception_rel_id specifies equality of column '$lcol' and the "
+ . "*VALUE* '$rcol' (you did not use the { -ident => ... } operator)"
+ );
}
}
}
- $ret
+ # FIXME - temporary, to fool the idiotic check in SQLMaker::_join_condition
+ $ret->{condition} = { -and => [ $ret->{condition} ] }
+ unless $ret->{condition} eq UNRESOLVABLE_CONDITION;
+
+ $ret;
}
=head2 related_source