Skip to content

Commit 93ecc6d

Browse files
authored
Merge pull request #4428 from rmosolgo/fewer-dead-result-checks
Reduce dead_result? and non_null? checks at runtime
2 parents 9c574fc + 0dfb1a3 commit 93ecc6d

File tree

1 file changed

+17
-16
lines changed

1 file changed

+17
-16
lines changed

lib/graphql/execution/interpreter/runtime.rb

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,8 @@ def evaluate_selection(result_name, field_ast_nodes_or_ast_node, owner_object, o
429429
# This seems janky, but we need to know
430430
# the field's return type at this path in order
431431
# to propagate `null`
432-
if return_type.non_null?
432+
return_type_non_null = return_type.non_null?
433+
if return_type_non_null
433434
(selections_result.graphql_non_null_field_names ||= []).push(result_name)
434435
end
435436
# Set this before calling `run_with_directives`, so that the directive can have the latest path
@@ -449,22 +450,22 @@ def evaluate_selection(result_name, field_ast_nodes_or_ast_node, owner_object, o
449450
resolved_arguments = GraphQL::Execution::Interpreter::Arguments::EMPTY
450451
if field_defn.extras.size == 0
451452
evaluate_selection_with_resolved_keyword_args(
452-
NO_ARGS, resolved_arguments, field_defn, ast_node, field_ast_nodes, owner_type, object, is_eager_field, result_name, selections_result, parent_object, return_type,
453+
NO_ARGS, resolved_arguments, field_defn, ast_node, field_ast_nodes, owner_type, object, is_eager_field, result_name, selections_result, parent_object, return_type, return_type_non_null
453454
)
454455
else
455-
evaluate_selection_with_args(resolved_arguments, field_defn, ast_node, field_ast_nodes, owner_type, object, is_eager_field, result_name, selections_result, parent_object, return_type)
456+
evaluate_selection_with_args(resolved_arguments, field_defn, ast_node, field_ast_nodes, owner_type, object, is_eager_field, result_name, selections_result, parent_object, return_type, return_type_non_null)
456457
end
457458
else
458459
@query.arguments_cache.dataload_for(ast_node, field_defn, object) do |resolved_arguments|
459-
evaluate_selection_with_args(resolved_arguments, field_defn, ast_node, field_ast_nodes, owner_type, object, is_eager_field, result_name, selections_result, parent_object, return_type)
460+
evaluate_selection_with_args(resolved_arguments, field_defn, ast_node, field_ast_nodes, owner_type, object, is_eager_field, result_name, selections_result, parent_object, return_type, return_type_non_null)
460461
end
461462
end
462463
end
463464

464-
def evaluate_selection_with_args(arguments, field_defn, ast_node, field_ast_nodes, owner_type, object, is_eager_field, result_name, selection_result, parent_object, return_type) # rubocop:disable Metrics/ParameterLists
465+
def evaluate_selection_with_args(arguments, field_defn, ast_node, field_ast_nodes, owner_type, object, is_eager_field, result_name, selection_result, parent_object, return_type, return_type_non_null) # rubocop:disable Metrics/ParameterLists
465466
after_lazy(arguments, owner: owner_type, field: field_defn, ast_node: ast_node, owner_object: object, arguments: arguments, result_name: result_name, result: selection_result) do |resolved_arguments|
466467
if resolved_arguments.is_a?(GraphQL::ExecutionError) || resolved_arguments.is_a?(GraphQL::UnauthorizedError)
467-
continue_value(resolved_arguments, owner_type, field_defn, return_type.non_null?, ast_node, result_name, selection_result)
468+
continue_value(resolved_arguments, owner_type, field_defn, return_type_non_null, ast_node, result_name, selection_result)
468469
next
469470
end
470471

@@ -513,11 +514,11 @@ def evaluate_selection_with_args(arguments, field_defn, ast_node, field_ast_node
513514
resolved_arguments.keyword_arguments
514515
end
515516

516-
evaluate_selection_with_resolved_keyword_args(kwarg_arguments, resolved_arguments, field_defn, ast_node, field_ast_nodes, owner_type, object, is_eager_field, result_name, selection_result, parent_object, return_type)
517+
evaluate_selection_with_resolved_keyword_args(kwarg_arguments, resolved_arguments, field_defn, ast_node, field_ast_nodes, owner_type, object, is_eager_field, result_name, selection_result, parent_object, return_type, return_type_non_null)
517518
end
518519
end
519520

520-
def evaluate_selection_with_resolved_keyword_args(kwarg_arguments, resolved_arguments, field_defn, ast_node, field_ast_nodes, owner_type, object, is_eager_field, result_name, selection_result, parent_object, return_type) # rubocop:disable Metrics/ParameterLists
521+
def evaluate_selection_with_resolved_keyword_args(kwarg_arguments, resolved_arguments, field_defn, ast_node, field_ast_nodes, owner_type, object, is_eager_field, result_name, selection_result, parent_object, return_type, return_type_non_null) # rubocop:disable Metrics/ParameterLists
521522
st = get_current_runtime_state
522523
st.current_field = field_defn
523524
st.current_object = object
@@ -553,7 +554,7 @@ def evaluate_selection_with_resolved_keyword_args(kwarg_arguments, resolved_argu
553554
end
554555
end
555556
after_lazy(app_result, owner: owner_type, field: field_defn, ast_node: ast_node, owner_object: object, arguments: resolved_arguments, result_name: result_name, result: selection_result) do |inner_result|
556-
continue_value = continue_value(inner_result, owner_type, field_defn, return_type.non_null?, ast_node, result_name, selection_result)
557+
continue_value = continue_value(inner_result, owner_type, field_defn, return_type_non_null, ast_node, result_name, selection_result)
557558
if HALT != continue_value
558559
continue_field(continue_value, owner_type, field_defn, return_type, ast_node, next_selections, false, object, resolved_arguments, result_name, selection_result)
559560
end
@@ -573,7 +574,7 @@ def evaluate_selection_with_resolved_keyword_args(kwarg_arguments, resolved_argu
573574

574575

575576
def dead_result?(selection_result)
576-
selection_result.graphql_dead || ((parent = selection_result.graphql_parent) && parent.graphql_dead)
577+
selection_result.graphql_dead # || ((parent = selection_result.graphql_parent) && parent.graphql_dead)
577578
end
578579

579580
def set_result(selection_result, result_name, value)
@@ -827,21 +828,21 @@ def continue_field(value, owner_type, field, current_type, ast_node, next_select
827828
inner_type = current_type.of_type
828829
# This is true for objects, unions, and interfaces
829830
use_dataloader_job = !inner_type.unwrap.kind.input?
831+
inner_type_non_null = inner_type.non_null?
830832
response_list = GraphQLResultArray.new(result_name, selection_result)
831-
response_list.graphql_non_null_list_items = inner_type.non_null?
833+
response_list.graphql_non_null_list_items = inner_type_non_null
832834
set_result(selection_result, result_name, response_list)
833835
idx = 0
834836
list_value = begin
835837
value.each do |inner_value|
836-
break if dead_result?(response_list)
837838
this_idx = idx
838839
idx += 1
839840
if use_dataloader_job
840841
@dataloader.append_job do
841-
resolve_list_item(inner_value, inner_type, ast_node, field, owner_object, arguments, this_idx, response_list, next_selections, owner_type)
842+
resolve_list_item(inner_value, inner_type, inner_type_non_null, ast_node, field, owner_object, arguments, this_idx, response_list, next_selections, owner_type)
842843
end
843844
else
844-
resolve_list_item(inner_value, inner_type, ast_node, field, owner_object, arguments, this_idx, response_list, next_selections, owner_type)
845+
resolve_list_item(inner_value, inner_type, inner_type_non_null, ast_node, field, owner_object, arguments, this_idx, response_list, next_selections, owner_type)
845846
end
846847
end
847848

@@ -871,14 +872,14 @@ def continue_field(value, owner_type, field, current_type, ast_node, next_select
871872
end
872873
end
873874

874-
def resolve_list_item(inner_value, inner_type, ast_node, field, owner_object, arguments, this_idx, response_list, next_selections, owner_type) # rubocop:disable Metrics/ParameterLists
875+
def resolve_list_item(inner_value, inner_type, inner_type_non_null, ast_node, field, owner_object, arguments, this_idx, response_list, next_selections, owner_type) # rubocop:disable Metrics/ParameterLists
875876
st = get_current_runtime_state
876877
st.current_result_name = this_idx
877878
st.current_result = response_list
878879
call_method_on_directives(:resolve_each, owner_object, ast_node.directives) do
879880
# This will update `response_list` with the lazy
880881
after_lazy(inner_value, owner: inner_type, ast_node: ast_node, field: field, owner_object: owner_object, arguments: arguments, result_name: this_idx, result: response_list) do |inner_inner_value|
881-
continue_value = continue_value(inner_inner_value, owner_type, field, inner_type.non_null?, ast_node, this_idx, response_list)
882+
continue_value = continue_value(inner_inner_value, owner_type, field, inner_type_non_null, ast_node, this_idx, response_list)
882883
if HALT != continue_value
883884
continue_field(continue_value, owner_type, field, inner_type, ast_node, next_selections, false, owner_object, arguments, this_idx, response_list)
884885
end

0 commit comments

Comments
 (0)