提交 951aa8da 编写于 作者: R Ryuta Kamizono

Ensure query caching for `select_*` methods in connection adapters

上级 9276ebc7
......@@ -13,15 +13,6 @@ def select_all(arel, name = nil, binds = [], preparable: nil) # :nodoc:
result
end
# Returns an array of arrays containing the field values.
# Order is the same as that returned by +columns+.
def select_rows(arel, name = nil, binds = []) # :nodoc:
select_result(arel, name, binds) do |result|
@connection.next_result while @connection.more_results?
result.to_a
end
end
# Executes the SQL statement in the context of this connection.
def execute(sql, name = nil)
# make sure we carry over any changes to ActiveRecord::Base.default_timezone that have been
......@@ -58,16 +49,6 @@ def last_inserted_id(result)
@connection.last_id
end
def select_result(arel, name, binds)
arel, binds = binds_from_relation(arel, binds)
sql = to_sql(arel, binds)
if without_prepared_statement?(binds)
execute_and_free(sql, name) { |result| yield result }
else
exec_stmt_and_free(sql, name, binds, cache_stmt: true) { |_, result| yield result }
end
end
def exec_stmt_and_free(sql, name, binds, cache_stmt: false)
# make sure we carry over any changes to ActiveRecord::Base.default_timezone that have been
# made since we established the connection
......
......@@ -7,30 +7,6 @@ def explain(arel, binds = [])
PostgreSQL::ExplainPrettyPrinter.new.pp(exec_query(sql, "EXPLAIN", binds))
end
def select_value(arel, name = nil, binds = []) # :nodoc:
select_result(arel, name, binds) do |result|
result.getvalue(0, 0) if result.ntuples > 0 && result.nfields > 0
end
end
def select_values(arel, name = nil, binds = []) # :nodoc:
select_result(arel, name, binds) do |result|
if result.nfields > 0
result.column_values(0)
else
[]
end
end
end
# Executes a SELECT query and returns an array of rows. Each row is an
# array of field values.
def select_rows(arel, name = nil, binds = []) # :nodoc:
select_result(arel, name, binds) do |result|
result.values
end
end
# The internal PostgreSQL identifier of the money data type.
MONEY_COLUMN_TYPE_OID = 790 #:nodoc:
# The internal PostgreSQL identifier of the BYTEA data type.
......@@ -175,14 +151,6 @@ def exec_rollback_db_transaction
def suppress_composite_primary_key(pk)
pk unless pk.is_a?(Array)
end
def select_result(arel, name, binds)
arel, binds = binds_from_relation(arel, binds)
sql = to_sql(arel, binds)
execute_and_clear(sql, name, binds) do |result|
yield result
end
end
end
end
end
......
......@@ -316,7 +316,7 @@ def exists?(conditions = :none)
relation = construct_relation_for_exists(relation, conditions)
connection.select_one(relation.arel, "#{name} Exists", relation.bound_attributes) ? true : false
connection.select_value(relation, "#{name} Exists", relation.bound_attributes) ? true : false
rescue ::RangeError
false
end
......
......@@ -210,6 +210,46 @@ def test_exists_queries_with_cache
end
end
def test_select_all_with_cache
Post.cache do
assert_queries(1) do
2.times { Post.connection.select_all(Post.all) }
end
end
end
def test_select_one_with_cache
Post.cache do
assert_queries(1) do
2.times { Post.connection.select_one(Post.all) }
end
end
end
def test_select_value_with_cache
Post.cache do
assert_queries(1) do
2.times { Post.connection.select_value(Post.all) }
end
end
end
def test_select_values_with_cache
Post.cache do
assert_queries(1) do
2.times { Post.connection.select_values(Post.all) }
end
end
end
def test_select_rows_with_cache
Post.cache do
assert_queries(1) do
2.times { Post.connection.select_rows(Post.all) }
end
end
end
def test_query_cache_dups_results_correctly
Task.cache do
now = Time.now.utc
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册