Skip to content

Commit fc40677

Browse files
committed
Add Lazy handling to AsyncDataloader
1 parent c2257b8 commit fc40677

File tree

2 files changed

+27
-10
lines changed

2 files changed

+27
-10
lines changed

lib/graphql/dataloader/async_dataloader.rb

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,7 @@ def run(trace_query_lazy: nil)
2929
first_pass = false
3030
fiber_vars = get_fiber_variables
3131

32-
while (f = (job_fibers.shift || (((job_fibers.size + next_job_fibers.size + source_tasks.size) < jobs_fiber_limit) && spawn_job_fiber(trace))))
33-
if f.alive?
34-
finished = run_fiber(f)
35-
if !finished
36-
next_job_fibers << f
37-
end
38-
end
39-
end
40-
job_fibers.concat(next_job_fibers)
41-
next_job_fibers.clear
32+
run_pending_steps(job_fibers, next_job_fibers, source_tasks, jobs_fiber_limit, trace)
4233

4334
Sync do |root_task|
4435
set_fiber_variables(fiber_vars)
@@ -54,6 +45,18 @@ def run(trace_query_lazy: nil)
5445
next_source_tasks.clear
5546
end
5647
end
48+
49+
if !@lazies_at_depth.empty?
50+
with_trace_query_lazy(trace_query_lazy) do
51+
run_next_pending_lazies(job_fibers, trace)
52+
run_pending_steps(job_fibers, next_job_fibers, source_tasks, jobs_fiber_limit, trace)
53+
end
54+
elsif !@steps_to_rerun_after_lazy.empty?
55+
@pending_jobs.concat(@steps_to_rerun_after_lazy)
56+
f = spawn_job_fiber(trace)
57+
job_fibers << f
58+
@steps_to_rerun_after_lazy.clear
59+
end
5760
end
5861
trace&.end_dataloader(self)
5962
end
@@ -69,6 +72,19 @@ def run(trace_query_lazy: nil)
6972

7073
private
7174

75+
def run_pending_steps(job_fibers, next_job_fibers, source_tasks, jobs_fiber_limit, trace)
76+
while (f = (job_fibers.shift || (((job_fibers.size + next_job_fibers.size + source_tasks.size) < jobs_fiber_limit) && spawn_job_fiber(trace))))
77+
if f.alive?
78+
finished = run_fiber(f)
79+
if !finished
80+
next_job_fibers << f
81+
end
82+
end
83+
end
84+
job_fibers.concat(next_job_fibers)
85+
next_job_fibers.clear
86+
end
87+
7288
def spawn_source_task(parent_task, condition, trace)
7389
pending_sources = nil
7490
@source_cache.each_value do |source_by_batch_params|

spec/graphql/dataloader_spec.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -940,6 +940,7 @@ def self.included(child_class)
940940
query_str = "{ cookbooks { featuredRecipe { name } } }"
941941
context = { batched_calls_counter: BatchedCallsCounter.new }
942942
result = schema.execute(query_str, context: context)
943+
assert_equal ["Cornbread", "Grits"], result["data"]["cookbooks"].map { |c| c["featuredRecipe"]["name"] }
943944
refute result.key?("errors")
944945
assert_equal 1, context[:batched_calls_counter].count
945946
end

0 commit comments

Comments
 (0)