Skip to content

Commit 8f386d7

Browse files
authored
Merge pull request rails#50778 from fatkodima/fix-caching-async-queries
Fix async queries to work with query cache and other cached async queries
2 parents 194ce13 + 63ad11a commit 8f386d7

File tree

6 files changed

+18
-4
lines changed

6 files changed

+18
-4
lines changed

activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,7 @@ def select(sql, name = nil, binds = [], prepare: false, async: false)
629629

630630
result = internal_exec_query(sql, name, binds, prepare: prepare)
631631
if async
632-
FutureResult::Complete.new(result)
632+
FutureResult.wrap(result)
633633
else
634634
result
635635
end

activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ def select_all(arel, name = nil, binds = [], preparable: nil, async: false) # :n
107107

108108
if async
109109
result = lookup_sql_cache(sql, name, binds) || super(sql, name, binds, preparable: preparable, async: async)
110-
FutureResult::Complete.new(result)
110+
FutureResult.wrap(result)
111111
else
112112
cache_sql(sql, name, binds) { super(sql, name, binds, preparable: preparable, async: async) }
113113
end

activerecord/lib/active_record/future_result.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,15 @@ def flush
4747

4848
Canceled = Class.new(ActiveRecordError)
4949

50+
def self.wrap(result)
51+
case result
52+
when self, Complete
53+
result
54+
else
55+
Complete.new(result)
56+
end
57+
end
58+
5059
delegate :empty?, :to_a, to: :result
5160
delegate_missing_to :result
5261

activerecord/lib/active_record/relation.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1040,7 +1040,7 @@ def exec_queries(&block)
10401040
def exec_main_query(async: false)
10411041
if @none
10421042
if async
1043-
return FutureResult::Complete.new([])
1043+
return FutureResult.wrap([])
10441044
else
10451045
return []
10461046
end

activerecord/lib/active_record/result.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ def hash_rows
195195
EMPTY = new([].freeze, [].freeze, {}.freeze).freeze
196196
private_constant :EMPTY
197197

198-
EMPTY_ASYNC = FutureResult::Complete.new(EMPTY).freeze
198+
EMPTY_ASYNC = FutureResult.wrap(EMPTY).freeze
199199
private_constant :EMPTY_ASYNC
200200
end
201201
end

activerecord/test/cases/calculations_test.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1242,6 +1242,11 @@ def test_calculation_with_query_cache
12421242
count = ShipPart.count
12431243
assert_async_equal count, ShipPart.async_count
12441244
end
1245+
1246+
ShipPart.cache do
1247+
count = ShipPart.async_count
1248+
assert_async_equal count.value, ShipPart.async_count
1249+
end
12451250
end
12461251

12471252
def test_pluck_joined_with_polymorphic_relation

0 commit comments

Comments
 (0)