@@ -300,17 +300,17 @@ local parent_args_values = function(parent, connection_parts)
300
300
local destination_args_values = {}
301
301
for _ , part in ipairs (connection_parts ) do
302
302
assert (type (part .source_field ) == ' string' ,
303
- ' part.source_field must be a string, got ' ..
304
- type (part .destination_field ))
303
+ ' part.source_field must be a string, got ' ..
304
+ type (part .destination_field ))
305
305
assert (type (part .destination_field ) == ' string' ,
306
- ' part.destination_field must be a string, got ' ..
307
- type (part .destination_field ))
306
+ ' part.destination_field must be a string, got ' ..
307
+ type (part .destination_field ))
308
308
309
309
destination_args_names [# destination_args_names + 1 ] =
310
- part .destination_field
310
+ part .destination_field
311
311
local value = parent [part .source_field ]
312
312
destination_args_values [# destination_args_values + 1 ] =
313
- value
313
+ value
314
314
end
315
315
316
316
return destination_args_names , destination_args_values
@@ -475,8 +475,6 @@ local convert_union_connection = function(state, connection, collection_name)
475
475
local collection_to_arguments = {}
476
476
local collection_to_list_arguments = {}
477
477
478
- local determinant_to_variant = {}
479
-
480
478
for _ , v in ipairs (c .variants ) do
481
479
assert (v .determinant , ' each variant should have a determinant' )
482
480
assert (type (v .determinant ) == ' table' , ' variant\' s determinant ' ..
@@ -493,13 +491,12 @@ local convert_union_connection = function(state, connection, collection_name)
493
491
(' destination_type (named %s) must not be nil' ):format (
494
492
v .destination_collection ))
495
493
496
- determinant_to_variant [v .determinant ] = v
497
-
498
-
499
494
local v_args = args_from_destination_collection (state ,
500
495
v .destination_collection , c .type )
501
496
destination_type = specify_destination_type (destination_type , c .type )
502
497
498
+
499
+
503
500
local v_list_args = state .list_arguments [v .destination_collection ]
504
501
505
502
union_types [# union_types + 1 ] = destination_type
@@ -508,30 +505,21 @@ local convert_union_connection = function(state, connection, collection_name)
508
505
collection_to_list_arguments [v .destination_collection ] = v_list_args
509
506
end
510
507
511
-
512
- local resolveType = function (result )
513
- for _ , v in pairs (c .variants ) do
514
- local dest_collection =
515
- state .nullable_collection_types [v .destination_collection ]
516
- if utils .do_have_keys (result , utils .get_keys (dest_collection .fields )) then
517
- return dest_collection
518
- end
519
- end
520
- end
521
-
522
508
local determinant_keys = utils .get_keys (c .variants [1 ].determinant )
523
509
524
- local resolve_variant = function (parent )
510
+ local resolve_variant = function (parent )
525
511
assert (utils .do_have_keys (parent , determinant_keys ),
526
512
(' Parent object of union object doesn\' t have determinant ' ..
527
513
' fields which are necessary to determine which resolving ' ..
528
514
' variant should be used. Union parent object:\n "%s"\n ' ..
529
515
' Determinant keys:\n "%s"' ):
530
516
format (yaml .encode (parent ), yaml .encode (determinant_keys )))
531
517
518
+ local variant_num
532
519
local resulting_variant
533
- for determinant , variant in pairs (determinant_to_variant ) do
534
- local is_match = utils .is_subtable (parent , determinant )
520
+ for i , variant in ipairs (c .variants ) do
521
+ variant_num = i
522
+ local is_match = utils .is_subtable (parent , variant .determinant )
535
523
536
524
if is_match then
537
525
resulting_variant = variant
@@ -541,16 +529,19 @@ local convert_union_connection = function(state, connection, collection_name)
541
529
542
530
assert (resulting_variant , (' Variant resolving failed.' ..
543
531
' Parent object: "%s"\n ' ):format (yaml .encode (parent )))
544
- return resulting_variant
532
+ return resulting_variant , variant_num
545
533
end
546
534
547
535
local field = {
548
536
name = c .name ,
549
- kind = types .union ({name = c .name , types = union_types ,
550
- resolveType = resolveType }),
537
+ kind = types .union ({
538
+ name = c .name ,
539
+ types = union_types ,
540
+ }),
551
541
arguments = nil ,
552
542
resolve = function (parent , args_instance , info )
553
- local v = resolve_variant (parent )
543
+ local v , variant_num = resolve_variant (parent )
544
+ local destination_type = union_types [variant_num ]
554
545
local destination_collection =
555
546
state .nullable_collection_types [v .destination_collection ]
556
547
local destination_args_names , destination_args_values =
@@ -571,7 +562,7 @@ local convert_union_connection = function(state, connection, collection_name)
571
562
' collection "%s"' ):format (json .encode (parent ),
572
563
tostring (collection_name )))
573
564
end
574
- return c .type == ' 1:N' and {} or nil
565
+ return c .type == ' 1:N' and {} or nil , destination_type
575
566
end
576
567
577
568
local from = {
@@ -605,9 +596,9 @@ local convert_union_connection = function(state, connection, collection_name)
605
596
-- situation above
606
597
assert (# objs == 1 , ' expect one matching object, got ' ..
607
598
tostring (# objs ))
608
- return objs [1 ]
599
+ return objs [1 ], destination_type
609
600
else -- c.type == '1:N'
610
- return objs
601
+ return objs , destination_type
611
602
end
612
603
end
613
604
}
0 commit comments