@@ -2160,6 +2160,10 @@ sub _resolve_condition {
2160
2160
$is_objlike [$_ ] = 0;
2161
2161
$res_args [$_ ] = ' __gremlins__' ;
2162
2162
}
2163
+ # more compat
2164
+ elsif ( $_ == 0 and $res_args [0]-> isa( $__expected_result_class_isa ) ) {
2165
+ $res_args [0] = { $res_args [0]-> get_columns };
2166
+ }
2163
2167
}
2164
2168
else {
2165
2169
$res_args [$_ ] ||= {};
@@ -2225,7 +2229,7 @@ Internals::SvREADONLY($UNRESOLVABLE_CONDITION => 1);
2225
2229
# # self-explanatory API, modeled on the custom cond coderef:
2226
2230
# rel_name => (scalar)
2227
2231
# foreign_alias => (scalar)
2228
- # foreign_values => (either not supplied, or a hashref, or a foreign ResultObject (to be ->get_columns()ed), or plain undef )
2232
+ # foreign_values => (either not supplied or a hashref )
2229
2233
# self_alias => (scalar)
2230
2234
# self_result_object => (either not supplied or a result object)
2231
2235
# require_join_free_condition => (boolean, throws on failure to construct a JF-cond)
@@ -2287,67 +2291,78 @@ sub _resolve_relationship_condition {
2287
2291
2288
2292
my $rel_rsrc = $self -> related_source($args -> {rel_name });
2289
2293
2290
- if (exists $args -> {foreign_values }) {
2291
-
2292
- if (! defined $args -> {foreign_values } ) {
2293
- # fallback: undef => {}
2294
- $args -> {foreign_values } = {};
2295
- }
2296
- elsif (defined blessed $args -> {foreign_values }) {
2297
-
2298
- $self -> throw_exception( " Objects supplied as 'foreign_values' ($args ->{foreign_values}) must inherit from '$__expected_result_class_isa'" )
2299
- unless $args -> {foreign_values }-> isa( $__expected_result_class_isa );
2300
-
2301
- carp_unique(
2302
- " Objects supplied as 'foreign_values' ($args ->{foreign_values}) "
2303
- . " usually should inherit from the related ResultClass ('@{[ $rel_rsrc ->result_class ]}'), "
2304
- . " perhaps you've made a mistake invoking the condition resolver?"
2305
- ) unless $args -> {foreign_values }-> isa($rel_rsrc -> result_class);
2306
-
2307
- $args -> {foreign_values } = { $args -> {foreign_values }-> get_columns };
2308
- }
2309
- elsif ( ref $args -> {foreign_values } eq ' HASH' ) {
2310
-
2311
- # re-build {foreign_values} excluding identically named rels
2312
- if ( keys %{$args -> {foreign_values }} ) {
2294
+ if (
2295
+ exists $args -> {foreign_values }
2296
+ and
2297
+ (
2298
+ ref $args -> {foreign_values } eq ' HASH'
2299
+ or
2300
+ $self -> throw_exception(
2301
+ " Argument 'foreign_values' must be a hash reference"
2302
+ )
2303
+ )
2304
+ and
2305
+ keys %{$args -> {foreign_values }}
2306
+ ) {
2313
2307
2314
- my ($col_idx , $rel_idx ) = map
2315
- { { map { $_ => 1 } $rel_rsrc -> $_ } }
2316
- qw( columns relationships )
2317
- ;
2308
+ my ($col_idx , $rel_idx ) = map
2309
+ { { map { $_ => 1 } $rel_rsrc -> $_ } }
2310
+ qw( columns relationships )
2311
+ ;
2318
2312
2319
- my $equivalencies = extract_equality_conditions(
2320
- $args -> {foreign_values },
2321
- ' consider nulls' ,
2322
- );
2313
+ my $equivalencies ;
2323
2314
2324
- $args -> {foreign_values } = { map {
2325
- # skip if relationship *and* a non-literal ref
2326
- # this means a multicreate stub was passed in
2315
+ # re-build {foreign_values} excluding refs as follows
2316
+ # ( hot codepath: intentionally convoluted )
2317
+ #
2318
+ $args -> {foreign_values } = { map {
2319
+ (
2320
+ $_ !~ / ^-/
2321
+ or
2322
+ $self -> throw_exception(
2323
+ " The key '$_ ' supplied as part of 'foreign_values' during "
2324
+ . ' relationship resolution must be a column name, not a function'
2325
+ )
2326
+ )
2327
+ and
2328
+ (
2329
+ # skip if relationship ( means a multicreate stub was passed in )
2330
+ # skip if literal ( can't infer anything about it )
2331
+ # or plain throw if nonequiv yet not literal
2332
+ (
2333
+ length ref $args -> {foreign_values }{$_ }
2334
+ and
2327
2335
(
2328
2336
$rel_idx -> {$_ }
2329
- and
2330
- length ref $args -> {foreign_values }{$_ }
2331
- and
2332
- ! is_literal_value($args -> {foreign_values }{$_ })
2337
+ or
2338
+ is_literal_value($args -> {foreign_values }{$_ })
2339
+ or
2340
+ (
2341
+ (
2342
+ ! exists (
2343
+ ( $equivalencies ||= extract_equality_conditions( $args -> {foreign_values }, ' consider nulls' ) )
2344
+ -> {$_ }
2345
+ )
2346
+ or
2347
+ ($equivalencies -> {$_ }||' ' ) eq UNRESOLVABLE_CONDITION
2348
+ )
2349
+ and
2350
+ $self -> throw_exception(
2351
+ " Resolution of relationship '$args ->{rel_name}' failed: "
2352
+ . " supplied value for foreign column '$_ ' is not a direct "
2353
+ . ' equivalence expression'
2354
+ )
2355
+ )
2333
2356
)
2334
- ? ()
2335
- : ( $_ => (
2336
- ! $col_idx -> {$_ }
2337
- ? $self -> throw_exception( " Key '$_ ' supplied as 'foreign_values' is not a column on related source '@{[ $rel_rsrc ->source_name ]}'" )
2338
- : ( !exists $equivalencies -> {$_ } or ($equivalencies -> {$_ }||' ' ) eq UNRESOLVABLE_CONDITION )
2339
- ? $self -> throw_exception( " Value supplied for '...{foreign_values}{$_ }' is not a direct equivalence expression" )
2340
- : $args -> {foreign_values }{$_ }
2341
- ))
2342
- } keys %{$args -> {foreign_values }} };
2343
- }
2344
- }
2345
- else {
2346
- $self -> throw_exception(
2347
- " Argument 'foreign_values' must be either an object inheriting from '@{[ $rel_rsrc ->result_class ]}', "
2348
- . " or a hash reference, or undef"
2349
- );
2350
- }
2357
+ ) ? ()
2358
+ : $col_idx -> {$_ } ? ( $_ => $args -> {foreign_values }{$_ } )
2359
+ : $self -> throw_exception(
2360
+ " The key '$_ ' supplied as part of 'foreign_values' during "
2361
+ . ' relationship resolution is not a column on related source '
2362
+ . " '@{[ $rel_rsrc ->source_name ]}'"
2363
+ )
2364
+ )
2365
+ } keys %{$args -> {foreign_values }} };
2351
2366
}
2352
2367
2353
2368
my $ret ;
0 commit comments