Skip to content

Commit 59c31b8

Browse files
authored
Merge pull request #5429 from gmac/gmac--refactor-breadth-interface
Adjust breadth interface hooks
2 parents 4ee6edc + d41f84f commit 59c31b8

File tree

3 files changed

+34
-17
lines changed

3 files changed

+34
-17
lines changed

lib/graphql/execution/interpreter/runtime.rb

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,8 @@ def evaluate_selection(result_name, field_ast_nodes_or_ast_node, selections_resu
376376
def evaluate_selection_with_args(arguments, field_defn, ast_node, field_ast_nodes, object, result_name, selection_result, runtime_state) # rubocop:disable Metrics/ParameterLists
377377
after_lazy(arguments, field: field_defn, ast_node: ast_node, owner_object: object, arguments: arguments, result_name: result_name, result: selection_result, runtime_state: runtime_state) do |resolved_arguments, runtime_state|
378378
if resolved_arguments.is_a?(GraphQL::ExecutionError) || resolved_arguments.is_a?(GraphQL::UnauthorizedError)
379+
next if selection_result.collect_result(result_name, resolved_arguments)
380+
379381
return_type_non_null = field_defn.type.non_null?
380382
continue_value(resolved_arguments, field_defn, return_type_non_null, ast_node, result_name, selection_result)
381383
next
@@ -475,7 +477,8 @@ def evaluate_selection_with_resolved_keyword_args(kwarg_arguments, resolved_argu
475477
end
476478
@current_trace.end_execute_field(field_defn, object, kwarg_arguments, query, app_result)
477479
after_lazy(app_result, field: field_defn, ast_node: ast_node, owner_object: object, arguments: resolved_arguments, result_name: result_name, result: selection_result, runtime_state: runtime_state) do |inner_result, runtime_state|
478-
next if exit_with_inner_result?(inner_result, result_name, selection_result)
480+
next if selection_result.collect_result(result_name, inner_result)
481+
479482
owner_type = selection_result.graphql_result_type
480483
return_type = field_defn.type
481484
continue_value = continue_value(inner_result, field_defn, return_type.non_null?, ast_node, result_name, selection_result)
@@ -496,11 +499,6 @@ def evaluate_selection_with_resolved_keyword_args(kwarg_arguments, resolved_argu
496499
end
497500
end
498501

499-
# Hook for breadth-first implementations to exit after a single resolver generation.
500-
def exit_with_inner_result?(inner_result, result_name, selection_result)
501-
false
502-
end
503-
504502
def set_result(selection_result, result_name, value, is_child_result, is_non_null)
505503
if !selection_result.graphql_dead
506504
if value.nil? && is_non_null

lib/graphql/execution/interpreter/runtime/graphql_result.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,11 @@ def fix_result_order
157157
end
158158
end
159159
end
160+
161+
# hook for breadth-first implementations to signal when collecting results.
162+
def collect_result(result_name, result_value)
163+
false
164+
end
160165
end
161166

162167
class GraphQLResultArray

spec/graphql/execution/breadth_runtime_spec.rb

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@
88
class SimpleBreadthRuntime < GraphQL::Execution::Interpreter::Runtime
99
class BreadthObject < GraphQL::Execution::Interpreter::Runtime::GraphQLResultHash
1010
attr_accessor :breadth_index
11+
attr_accessor :results_by_key
12+
13+
def collect_result(result_name, result_value)
14+
results_by_key[result_name][breadth_index] = result_value
15+
true
16+
end
1117
end
1218

1319
def initialize(query:)
@@ -22,26 +28,24 @@ def initialize(query:)
2228
@breadth_results_by_key = {}
2329
end
2430

25-
def run
26-
result = nil
31+
def run(&block)
2732
query.current_trace.execute_multiplex(multiplex: query.multiplex) do
28-
query.current_trace.execute_query(query: query) do
29-
result = yield
30-
end
33+
query.current_trace.execute_query(query: query, &block)
3134
end
32-
result
3335
ensure
3436
delete_all_interpreter_context
3537
end
3638

3739
def evaluate_breadth_selection(objects, parent_type, node)
3840
result_key = node.alias || node.name
3941
@breadth_results_by_key[result_key] = Array.new(objects.size)
42+
4043
objects.each_with_index do |object, index|
4144
app_value = parent_type.wrap(object, query.context)
4245
breadth_object = BreadthObject.new(nil, parent_type, app_value, nil, false, node.selections, false, node, nil, nil)
4346
breadth_object.ordered_result_keys = []
4447
breadth_object.breadth_index = index
48+
breadth_object.results_by_key = @breadth_results_by_key
4549

4650
state = get_current_runtime_state
4751
state.current_result_name = nil
@@ -53,11 +57,6 @@ def evaluate_breadth_selection(objects, parent_type, node)
5357

5458
@breadth_results_by_key[result_key]
5559
end
56-
57-
def exit_with_inner_result?(inner_result, result_key, breadth_object)
58-
@breadth_results_by_key[result_key][breadth_object.breadth_index] = inner_result
59-
true
60-
end
6160
end
6261

6362
class PassthroughLoader < GraphQL::Batch::Loader
@@ -169,6 +168,14 @@ def args(a:, b:)
169168
"#{a}#{b}"
170169
end
171170

171+
field :valid_args, String do |f|
172+
f.argument :a, String, validates: { length: { is: 1 } }
173+
end
174+
175+
def valid_args(a:)
176+
a
177+
end
178+
172179
field :range, String do |f|
173180
f.argument :input, RangeInput
174181
end
@@ -268,6 +275,13 @@ def test_maps_basic_arguments_with_variables
268275
assert_equal ["fizzbuzz"], result
269276
end
270277

278+
def test_maps_invalidated_arguments
279+
doc = %|query { validArgs(a: "boo") }|
280+
result = map_breadth_objects([{}], doc)
281+
assert result.first.is_a?(GraphQL::ExecutionError)
282+
assert_equal "a is the wrong length (should be 1)", result.first.message
283+
end
284+
271285
def test_maps_prepared_input_object
272286
doc = %|{ range(input: { min: 1, max: 2 }) }|
273287
result = map_breadth_objects([{}], doc)

0 commit comments

Comments
 (0)