Skip to content

Commit

Permalink
Make it the responsibility of the connection to hold on to a visitor …
Browse files Browse the repository at this point in the history
…for generating SQL, rather than the TreeManager. (There is a related commit coming in Active Record.)
  • Loading branch information
jonleighton committed Aug 8, 2011
1 parent 03b6ca2 commit 7941132
Show file tree
Hide file tree
Showing 18 changed files with 46 additions and 42 deletions.
3 changes: 1 addition & 2 deletions lib/arel/nodes/node.rb
Expand Up @@ -32,8 +32,7 @@ def and right
#
# 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
Expand Down
9 changes: 5 additions & 4 deletions lib/arel/select_manager.rb
Expand Up @@ -149,13 +149,13 @@ def orders

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

Expand Down Expand Up @@ -205,12 +205,13 @@ def take limit
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
Expand Down
12 changes: 7 additions & 5 deletions lib/arel/tree_manager.rb
Expand Up @@ -4,21 +4,23 @@ class TreeManager
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
Expand Down
6 changes: 2 additions & 4 deletions lib/arel/visitors/to_sql.rb
Expand Up @@ -4,17 +4,15 @@
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
Expand Down
4 changes: 2 additions & 2 deletions test/nodes/test_bin.rb
Expand Up @@ -8,13 +8,13 @@ def test_new
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
Expand Down
2 changes: 1 addition & 1 deletion test/nodes/test_select_core.rb
Expand Up @@ -23,7 +23,7 @@ def test_clone
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
Expand Down
19 changes: 9 additions & 10 deletions test/nodes/test_sql_literal.rb
Expand Up @@ -3,6 +3,10 @@
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'
Expand All @@ -13,38 +17,33 @@ module Nodes
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
Expand Down
7 changes: 4 additions & 3 deletions test/support/fake_record.rb
Expand Up @@ -3,9 +3,9 @@ class Column < Struct.new(:name, :type)
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' => [
Expand All @@ -27,6 +27,7 @@ def initialize
'users' => 'id',
'products' => 'id'
}
@visitor = visitor
end

def primary_key name
Expand Down Expand Up @@ -78,7 +79,7 @@ class Spec < Struct.new(:config)

def initialize
@spec = Spec.new(:adapter => 'america')
@connection = Connection.new
@connection = Connection.new(Arel::Visitors::ToSql.new(self))
end

def with_connection
Expand Down
4 changes: 4 additions & 0 deletions test/test_select_manager.rb
Expand Up @@ -42,6 +42,10 @@ def tables
@engine.connection.tables
end

def visitor
@engine.connection.visitor
end

def execute sql, name = nil, *args
@executed << sql
end
Expand Down
2 changes: 1 addition & 1 deletion test/visitors/test_ibm_db.rb
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion test/visitors/test_informix.rb
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion test/visitors/test_join_sql.rb
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion test/visitors/test_mssql.rb
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion test/visitors/test_mysql.rb
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion test/visitors/test_oracle.rb
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion test/visitors/test_postgres.rb
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion test/visitors/test_sqlite.rb
Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions test/visitors/test_to_sql.rb
Expand Up @@ -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
Expand Down Expand Up @@ -220,7 +220,7 @@ def quote value, column = nil
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'
}
Expand Down Expand Up @@ -308,7 +308,7 @@ def quote value, column = nil
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'
}
Expand Down

0 comments on commit 7941132

Please sign in to comment.