aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/statement_cache.rb
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2014-01-16 15:38:05 -0800
committerAaron Patterson <aaron.patterson@gmail.com>2014-01-16 15:38:05 -0800
commite7f5317ff9696e7e38c56d403ec822ee94aa8e24 (patch)
treeebcbd0e5bd8756a2b5153b4b11271f0235a6f7fb /activerecord/lib/active_record/statement_cache.rb
parent060fbd6a88332ae5e3d8b9cf3d20559544b08693 (diff)
downloadrails-e7f5317ff9696e7e38c56d403ec822ee94aa8e24.tar.gz
rails-e7f5317ff9696e7e38c56d403ec822ee94aa8e24.tar.bz2
rails-e7f5317ff9696e7e38c56d403ec822ee94aa8e24.zip
change query strategy based on adapter
Diffstat (limited to 'activerecord/lib/active_record/statement_cache.rb')
-rw-r--r--activerecord/lib/active_record/statement_cache.rb45
1 files changed, 41 insertions, 4 deletions
diff --git a/activerecord/lib/active_record/statement_cache.rb b/activerecord/lib/active_record/statement_cache.rb
index 8372d54c15..7e73744d59 100644
--- a/activerecord/lib/active_record/statement_cache.rb
+++ b/activerecord/lib/active_record/statement_cache.rb
@@ -16,6 +16,32 @@ module ActiveRecord
class StatementCache
Substitute = Struct.new :name
+ class Query
+ def initialize(connection, sql)
+ @connection = connection
+ @sql = sql
+ end
+
+ def sql_for(binds)
+ @sql
+ end
+ end
+
+ class PartialQuery < Query
+ def sql_for(binds)
+ @sql.gsub(/\?/) { @connection.quote(*binds.shift.reverse) }
+ end
+ end
+
+ def self.query(connection, visitor, ast)
+ Query.new connection, visitor.accept(ast)
+ end
+
+ def self.partial_query(connection, visitor, ast)
+ sql = visitor.accept(ast) { "?" }
+ PartialQuery.new connection, sql
+ end
+
class Params
def [](name); Substitute.new name; end
end
@@ -45,17 +71,22 @@ module ActiveRecord
@sql = nil
@binds = nil
@block = block
+ @query_builder = nil
@params = Params.new
end
def execute(params)
rel = relation @params
- arel = rel.arel
- klass = rel.klass
- bv = binds rel
+ arel = rel.arel
+ klass = rel.klass
+ bind_map = binds rel
+ bind_values = bind_map.bind params
- klass.find_by_sql sql(klass, arel, bv), bv.bind(params)
+ builder = query_builder klass.connection, arel
+ sql = builder.sql_for bind_values
+
+ klass.find_by_sql sql, bind_values
end
alias :call :execute
@@ -64,6 +95,12 @@ module ActiveRecord
@binds || @mutex.synchronize { @binds ||= BindMap.new rel.bind_values }
end
+ def query_builder(connection, arel)
+ @query_builder || @mutex.synchronize {
+ @query_builder ||= connection.cacheable_query(arel)
+ }
+ end
+
def sql(klass, arel, bv)
@sql || @mutex.synchronize {
@sql ||= klass.connection.to_sql arel, bv