Skip to content

Commit

Permalink
Merge pull request rails#50778 from fatkodima/fix-caching-async-queries
Browse files Browse the repository at this point in the history
Fix async queries to work with query cache and other cached async queries
  • Loading branch information
byroot committed Jan 17, 2024
2 parents 194ce13 + 63ad11a commit 8f386d7
Show file tree
Hide file tree
Showing 6 changed files with 18 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -629,7 +629,7 @@ def select(sql, name = nil, binds = [], prepare: false, async: false)

result = internal_exec_query(sql, name, binds, prepare: prepare)
if async
FutureResult::Complete.new(result)
FutureResult.wrap(result)
else
result
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ def select_all(arel, name = nil, binds = [], preparable: nil, async: false) # :n

if async
result = lookup_sql_cache(sql, name, binds) || super(sql, name, binds, preparable: preparable, async: async)
FutureResult::Complete.new(result)
FutureResult.wrap(result)
else
cache_sql(sql, name, binds) { super(sql, name, binds, preparable: preparable, async: async) }
end
Expand Down
9 changes: 9 additions & 0 deletions activerecord/lib/active_record/future_result.rb
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,15 @@ def flush

Canceled = Class.new(ActiveRecordError)

def self.wrap(result)
case result
when self, Complete
result
else
Complete.new(result)
end
end

delegate :empty?, :to_a, to: :result
delegate_missing_to :result

Expand Down
2 changes: 1 addition & 1 deletion activerecord/lib/active_record/relation.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1040,7 +1040,7 @@ def exec_queries(&block)
def exec_main_query(async: false)
if @none
if async
return FutureResult::Complete.new([])
return FutureResult.wrap([])
else
return []
end
Expand Down
2 changes: 1 addition & 1 deletion activerecord/lib/active_record/result.rb
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ def hash_rows
EMPTY = new([].freeze, [].freeze, {}.freeze).freeze
private_constant :EMPTY

EMPTY_ASYNC = FutureResult::Complete.new(EMPTY).freeze
EMPTY_ASYNC = FutureResult.wrap(EMPTY).freeze
private_constant :EMPTY_ASYNC
end
end
5 changes: 5 additions & 0 deletions activerecord/test/cases/calculations_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1242,6 +1242,11 @@ def test_calculation_with_query_cache
count = ShipPart.count
assert_async_equal count, ShipPart.async_count
end

ShipPart.cache do
count = ShipPart.async_count
assert_async_equal count.value, ShipPart.async_count
end
end

def test_pluck_joined_with_polymorphic_relation
Expand Down

0 comments on commit 8f386d7

Please sign in to comment.