mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Make it the responsibility of the connection to hold on to a visitor for generating SQL, rather than the TreeManager. (There is a related commit coming in Active Record.)
This commit is contained in:
parent
03b6ca269a
commit
79411322ae
18 changed files with 46 additions and 42 deletions
|
@ -32,8 +32,7 @@ module Arel
|
|||
#
|
||||
# Maybe we should just use `Table.engine`? :'(
|
||||
def to_sql engine = Table.engine
|
||||
viz = Visitors.for engine
|
||||
viz.accept self
|
||||
engine.connection.visitor.accept self
|
||||
end
|
||||
|
||||
# Iterate through AST, nodes will be yielded depth-first
|
||||
|
|
|
@ -149,13 +149,13 @@ module Arel
|
|||
|
||||
def wheres
|
||||
warn "#{caller[0]}: SelectManager#wheres is deprecated and will be removed in ARel 3.0.0 with no replacement"
|
||||
Compatibility::Wheres.new @engine, @ctx.wheres
|
||||
Compatibility::Wheres.new @engine.connection_pool, @ctx.wheres
|
||||
end
|
||||
|
||||
def where_sql
|
||||
return if @ctx.wheres.empty?
|
||||
|
||||
viz = Visitors::WhereSql.new @engine
|
||||
viz = Visitors::WhereSql.new @engine.connection_pool
|
||||
Nodes::SqlLiteral.new viz.accept @ctx
|
||||
end
|
||||
|
||||
|
@ -205,12 +205,13 @@ module Arel
|
|||
def join_sql
|
||||
return nil if @ctx.source.right.empty?
|
||||
|
||||
sql = @visitor.dup.extend(Visitors::JoinSql).accept @ctx
|
||||
sql = visitor.dup.extend(Visitors::JoinSql).accept @ctx
|
||||
Nodes::SqlLiteral.new sql
|
||||
end
|
||||
|
||||
def order_clauses
|
||||
Visitors::OrderClauses.new(@engine).accept(@ast).map { |x|
|
||||
visitor = Visitors::OrderClauses.new(@engine.connection_pool)
|
||||
visitor.accept(@ast).map { |x|
|
||||
Nodes::SqlLiteral.new x
|
||||
}
|
||||
end
|
||||
|
|
|
@ -4,21 +4,23 @@ module Arel
|
|||
include Arel::Relation
|
||||
include Arel::FactoryMethods
|
||||
|
||||
attr_accessor :visitor
|
||||
attr_reader :ast, :engine
|
||||
|
||||
def initialize engine
|
||||
@engine = engine
|
||||
@visitor = Visitors.visitor_for @engine
|
||||
@ctx = nil
|
||||
@engine = engine
|
||||
@ctx = nil
|
||||
end
|
||||
|
||||
def to_dot
|
||||
Visitors::Dot.new.accept @ast
|
||||
end
|
||||
|
||||
def visitor
|
||||
engine.connection.visitor
|
||||
end
|
||||
|
||||
def to_sql
|
||||
@visitor.accept @ast
|
||||
visitor.accept @ast
|
||||
end
|
||||
|
||||
def initialize_copy other
|
||||
|
|
|
@ -4,17 +4,15 @@ require 'date'
|
|||
module Arel
|
||||
module Visitors
|
||||
class ToSql < Arel::Visitors::Visitor
|
||||
def initialize engine
|
||||
@engine = engine
|
||||
def initialize pool
|
||||
@pool = pool
|
||||
@connection = nil
|
||||
@pool = nil
|
||||
@quoted_tables = {}
|
||||
@quoted_columns = {}
|
||||
end
|
||||
|
||||
def accept object
|
||||
self.last_column = nil
|
||||
@pool = @engine.connection_pool
|
||||
@pool.with_connection do |conn|
|
||||
@connection = conn
|
||||
super
|
||||
|
|
|
@ -8,13 +8,13 @@ module Arel
|
|||
end
|
||||
|
||||
def test_default_to_sql
|
||||
viz = Arel::Visitors::ToSql.new Table.engine
|
||||
viz = Arel::Visitors::ToSql.new Table.engine.connection_pool
|
||||
node = Arel::Nodes::Bin.new(Arel.sql('zomg'))
|
||||
assert_equal 'zomg', viz.accept(node)
|
||||
end
|
||||
|
||||
def test_mysql_to_sql
|
||||
viz = Arel::Visitors::MySQL.new Table.engine
|
||||
viz = Arel::Visitors::MySQL.new Table.engine.connection_pool
|
||||
node = Arel::Nodes::Bin.new(Arel.sql('zomg'))
|
||||
assert_equal 'BINARY zomg', viz.accept(node)
|
||||
end
|
||||
|
|
|
@ -23,7 +23,7 @@ module Arel
|
|||
def test_set_quantifier
|
||||
core = Arel::Nodes::SelectCore.new
|
||||
core.set_quantifier = Arel::Nodes::Distinct.new
|
||||
viz = Arel::Visitors::ToSql.new Table.engine
|
||||
viz = Arel::Visitors::ToSql.new Table.engine.connection_pool
|
||||
assert_match 'DISTINCT', viz.accept(core)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -3,6 +3,10 @@ require 'helper'
|
|||
module Arel
|
||||
module Nodes
|
||||
describe 'sql literal' do
|
||||
before do
|
||||
@visitor = Visitors::ToSql.new Table.engine.connection_pool
|
||||
end
|
||||
|
||||
describe 'sql' do
|
||||
it 'makes a sql literal node' do
|
||||
sql = Arel.sql 'foo'
|
||||
|
@ -13,38 +17,33 @@ module Arel
|
|||
describe 'count' do
|
||||
it 'makes a count node' do
|
||||
node = SqlLiteral.new('*').count
|
||||
viz = Visitors::ToSql.new Table.engine
|
||||
viz.accept(node).must_be_like %{ COUNT(*) }
|
||||
@visitor.accept(node).must_be_like %{ COUNT(*) }
|
||||
end
|
||||
|
||||
it 'makes a distinct node' do
|
||||
node = SqlLiteral.new('*').count true
|
||||
viz = Visitors::ToSql.new Table.engine
|
||||
viz.accept(node).must_be_like %{ COUNT(DISTINCT *) }
|
||||
@visitor.accept(node).must_be_like %{ COUNT(DISTINCT *) }
|
||||
end
|
||||
end
|
||||
|
||||
describe 'equality' do
|
||||
it 'makes an equality node' do
|
||||
node = SqlLiteral.new('foo').eq(1)
|
||||
viz = Visitors::ToSql.new Table.engine
|
||||
viz.accept(node).must_be_like %{ foo = 1 }
|
||||
@visitor.accept(node).must_be_like %{ foo = 1 }
|
||||
end
|
||||
end
|
||||
|
||||
describe 'grouped "or" equality' do
|
||||
it 'makes a grouping node with an or node' do
|
||||
node = SqlLiteral.new('foo').eq_any([1,2])
|
||||
viz = Visitors::ToSql.new Table.engine
|
||||
viz.accept(node).must_be_like %{ (foo = 1 OR foo = 2) }
|
||||
@visitor.accept(node).must_be_like %{ (foo = 1 OR foo = 2) }
|
||||
end
|
||||
end
|
||||
|
||||
describe 'grouped "and" equality' do
|
||||
it 'makes a grouping node with an or node' do
|
||||
node = SqlLiteral.new('foo').eq_all([1,2])
|
||||
viz = Visitors::ToSql.new Table.engine
|
||||
viz.accept(node).must_be_like %{ (foo = 1 AND foo = 2) }
|
||||
@visitor.accept(node).must_be_like %{ (foo = 1 AND foo = 2) }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -3,9 +3,9 @@ module FakeRecord
|
|||
end
|
||||
|
||||
class Connection
|
||||
attr_reader :tables, :columns_hash
|
||||
attr_reader :tables, :columns_hash, :visitor
|
||||
|
||||
def initialize
|
||||
def initialize(visitor)
|
||||
@tables = %w{ users photos developers products}
|
||||
@columns = {
|
||||
'users' => [
|
||||
|
@ -27,6 +27,7 @@ module FakeRecord
|
|||
'users' => 'id',
|
||||
'products' => 'id'
|
||||
}
|
||||
@visitor = visitor
|
||||
end
|
||||
|
||||
def primary_key name
|
||||
|
@ -78,7 +79,7 @@ module FakeRecord
|
|||
|
||||
def initialize
|
||||
@spec = Spec.new(:adapter => 'america')
|
||||
@connection = Connection.new
|
||||
@connection = Connection.new(Arel::Visitors::ToSql.new(self))
|
||||
end
|
||||
|
||||
def with_connection
|
||||
|
|
|
@ -42,6 +42,10 @@ module Arel
|
|||
@engine.connection.tables
|
||||
end
|
||||
|
||||
def visitor
|
||||
@engine.connection.visitor
|
||||
end
|
||||
|
||||
def execute sql, name = nil, *args
|
||||
@executed << sql
|
||||
end
|
||||
|
|
|
@ -4,7 +4,7 @@ module Arel
|
|||
module Visitors
|
||||
describe 'the ibm_db visitor' do
|
||||
before do
|
||||
@visitor = IBM_DB.new Table.engine
|
||||
@visitor = IBM_DB.new Table.engine.connection_pool
|
||||
end
|
||||
|
||||
it 'uses FETCH FIRST n ROWS to limit results' do
|
||||
|
|
|
@ -4,7 +4,7 @@ module Arel
|
|||
module Visitors
|
||||
describe 'the informix visitor' do
|
||||
before do
|
||||
@visitor = Informix.new Table.engine
|
||||
@visitor = Informix.new Table.engine.connection_pool
|
||||
end
|
||||
|
||||
it 'uses LIMIT n to limit results' do
|
||||
|
|
|
@ -4,7 +4,7 @@ module Arel
|
|||
module Visitors
|
||||
describe 'the join_sql visitor' do
|
||||
before do
|
||||
@visitor = ToSql.new Table.engine
|
||||
@visitor = ToSql.new Table.engine.connection_pool
|
||||
@visitor.extend(JoinSql)
|
||||
end
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ module Arel
|
|||
module Visitors
|
||||
describe 'the mssql visitor' do
|
||||
before do
|
||||
@visitor = MSSQL.new Table.engine
|
||||
@visitor = MSSQL.new Table.engine.connection_pool
|
||||
@table = Arel::Table.new "users"
|
||||
end
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ module Arel
|
|||
module Visitors
|
||||
describe 'the mysql visitor' do
|
||||
before do
|
||||
@visitor = MySQL.new Table.engine
|
||||
@visitor = MySQL.new Table.engine.connection_pool
|
||||
end
|
||||
|
||||
it 'squashes parenthesis on multiple unions' do
|
||||
|
|
|
@ -4,7 +4,7 @@ module Arel
|
|||
module Visitors
|
||||
describe 'the oracle visitor' do
|
||||
before do
|
||||
@visitor = Oracle.new Table.engine
|
||||
@visitor = Oracle.new Table.engine.connection_pool
|
||||
end
|
||||
|
||||
it 'modifies order when there is distinct and first value' do
|
||||
|
|
|
@ -4,7 +4,7 @@ module Arel
|
|||
module Visitors
|
||||
describe 'the postgres visitor' do
|
||||
before do
|
||||
@visitor = PostgreSQL.new Table.engine
|
||||
@visitor = PostgreSQL.new Table.engine.connection_pool
|
||||
end
|
||||
|
||||
describe 'locking' do
|
||||
|
|
|
@ -4,7 +4,7 @@ module Arel
|
|||
module Visitors
|
||||
describe 'the sqlite visitor' do
|
||||
before do
|
||||
@visitor = SQLite.new Table.engine
|
||||
@visitor = SQLite.new Table.engine.connection_pool
|
||||
end
|
||||
|
||||
it 'defaults limit to -1' do
|
||||
|
|
|
@ -8,7 +8,7 @@ module Arel
|
|||
module Visitors
|
||||
describe 'the to_sql visitor' do
|
||||
before do
|
||||
@visitor = ToSql.new Table.engine
|
||||
@visitor = ToSql.new Table.engine.connection_pool
|
||||
@table = Table.new(:users)
|
||||
@attr = @table[:id]
|
||||
end
|
||||
|
@ -220,7 +220,7 @@ module Arel
|
|||
end
|
||||
end
|
||||
in_node = Nodes::In.new @attr, %w{ a b c }
|
||||
visitor = visitor.new(Table.engine)
|
||||
visitor = visitor.new(Table.engine.connection_pool)
|
||||
visitor.expected = Table.engine.connection.columns(:users).find { |x|
|
||||
x.name == 'name'
|
||||
}
|
||||
|
@ -308,7 +308,7 @@ module Arel
|
|||
end
|
||||
end
|
||||
in_node = Nodes::NotIn.new @attr, %w{ a b c }
|
||||
visitor = visitor.new(Table.engine)
|
||||
visitor = visitor.new(Table.engine.connection_pool)
|
||||
visitor.expected = Table.engine.connection.columns(:users).find { |x|
|
||||
x.name == 'name'
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue