提交 80ad95ba 编写于 作者: A Aaron Patterson

moving visitors around

上级 445a0ea3
......@@ -12,12 +12,7 @@
require 'arel/expression'
####
require 'arel/visitors/to_sql'
require 'arel/visitors/postgresql'
require 'arel/visitors/update_sql'
require 'arel/visitors/join_sql'
require 'arel/visitors/order_clauses'
require 'arel/visitors/dot'
require 'arel/visitors'
require 'arel/tree_manager'
require 'arel/insert_manager'
......
......@@ -2,10 +2,11 @@ module Arel
class SelectManager < Arel::TreeManager
include Arel::Crud
def initialize engine
super
def initialize engine, table = nil
super(engine)
@head = Nodes::SelectStatement.new
@ctx = @head.cores.last
from table
end
def taken
......
......@@ -37,11 +37,11 @@ def alias
end
def tm
SelectManager.new(@engine).from(self)
SelectManager.new(@engine, self)
end
def from table
SelectManager.new(@engine).from table
SelectManager.new(@engine, table)
end
def joins manager
......
......@@ -4,23 +4,31 @@ class TreeManager
include Arel::Relation
VISITORS = {
'postgresql' => Arel::Visitors::PostgreSQL
'postgresql' => Arel::Visitors::PostgreSQL,
'mysql' => Arel::Visitors::MySQL,
'mysql2' => Arel::Visitors::MySQL,
}
attr_accessor :visitor
def initialize engine
@engine = engine
@pool = engine.connection_pool
@adapter = @pool.spec.config[:adapter]
@visitor_klass = VISITORS[@adapter] || Visitors::ToSql
@engine = engine
@visitor = nil
end
def to_dot
Visitors::Dot.new.accept @head
end
def visitor
return @visitor if @visitor
pool = @engine.connection_pool
adapter = pool.spec.config[:adapter]
@visitor = (VISITORS[adapter] || Visitors::ToSql).new(@engine)
end
def to_sql
viz = @visitor_klass.new @engine
viz.accept @head
visitor.accept @head
end
def initialize_copy other
......
......@@ -46,11 +46,7 @@ def set values
end
def to_sql
viz = @visitor_klass.new @engine
unless @engine.connection_pool.spec.config[:adapter] =~ /^mysql/
viz.extend(Visitors::UpdateSql)
end
viz.accept @head
visitor.accept @head
end
end
end
require 'arel/visitors/to_sql'
require 'arel/visitors/postgresql'
require 'arel/visitors/mysql'
require 'arel/visitors/join_sql'
require 'arel/visitors/order_clauses'
require 'arel/visitors/dot'
module Arel
module Visitors
module UpdateSql
class MySQL < Arel::Visitors::ToSql
def visit_Arel_Nodes_UpdateStatement o
if o.orders.empty? && o.limit.nil?
wheres = o.wheres
else
stmt = Nodes::SelectStatement.new
core = stmt.cores.first
core.froms = o.relation
core.projections = [o.relation.primary_key]
stmt.limit = o.limit
stmt.orders = o.orders
wheres = [Nodes::In.new(o.relation.primary_key, [stmt])]
end
[
"UPDATE #{visit o.relation}",
("SET #{o.values.map { |value| visit value }.join ', '}" unless o.values.empty?),
("WHERE #{wheres.map { |x| visit x }.join ' AND '}" unless wheres.empty?)
("WHERE #{o.wheres.map { |x| visit x }.join ' AND '}" unless o.wheres.empty?),
("ORDER BY #{o.orders.map { |x| visit x }.join(', ')}" unless o.orders.empty?),
("LIMIT #{o.limit}" if o.limit),
].compact.join ' '
end
end
end
end
......@@ -22,15 +22,25 @@ def visit_Arel_Nodes_DeleteStatement o
end
def visit_Arel_Nodes_UpdateStatement o
if o.orders.empty? && o.limit.nil?
wheres = o.wheres
else
stmt = Nodes::SelectStatement.new
core = stmt.cores.first
core.froms = o.relation
core.projections = [o.relation.primary_key]
stmt.limit = o.limit
stmt.orders = o.orders
wheres = [Nodes::In.new(o.relation.primary_key, [stmt])]
end
[
"UPDATE #{visit o.relation}",
("SET #{o.values.map { |value| visit value }.join ', '}" unless o.values.empty?),
("WHERE #{o.wheres.map { |x| visit x }.join ' AND '}" unless o.wheres.empty?),
("ORDER BY #{o.orders.map { |x| visit x }.join(', ')}" unless o.orders.empty?),
("LIMIT #{o.limit}" if o.limit),
("WHERE #{wheres.map { |x| visit x }.join ' AND '}" unless wheres.empty?)
].compact.join ' '
end
def visit_Arel_Nodes_InsertStatement o
[
"INSERT INTO #{visit o.relation}",
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册