提交 98fc2599 编写于 作者: S Sean Griffin

Remove `engine` from `TreeManager` and subclasses

This constructor parameter was unused for everything except the
convenience methods `to_sql` and `where_sql`. We can pass the engine
into those methods directly.
上级 75082848
......@@ -3,7 +3,7 @@ module Arel
# FIXME hopefully we can remove this
module Crud
def compile_update values, pk
um = UpdateManager.new @engine
um = UpdateManager.new
if Nodes::SqlLiteral === values
relation = @ctx.from
......@@ -26,11 +26,11 @@ def compile_insert values
end
def create_insert
InsertManager.new @engine
InsertManager.new
end
def compile_delete
dm = DeleteManager.new @engine
dm = DeleteManager.new
dm.wheres = @ctx.wheres
dm.from @ctx.froms
dm
......
module Arel
class DeleteManager < Arel::TreeManager
def initialize engine
def initialize
super
@ast = Nodes::DeleteStatement.new
@ctx = @ast
......
module Arel
class InsertManager < Arel::TreeManager
def initialize engine
def initialize
super
@ast = Nodes::InsertStatement.new
end
......
......@@ -12,10 +12,6 @@ def [] name
def table_name
relation.respond_to?(:name) ? relation.name : name
end
def engine
relation.engine
end
end
end
end
......@@ -6,8 +6,8 @@ class SelectManager < Arel::TreeManager
STRING_OR_SYMBOL_CLASS = [Symbol, String]
def initialize engine, table = nil
super(engine)
def initialize table = nil
super()
@ast = Nodes::SelectStatement.new
@ctx = @ast.cores.last
from table
......@@ -176,10 +176,10 @@ def orders
@ast.orders
end
def where_sql
def where_sql engine = Table.engine
return if @ctx.wheres.empty?
viz = Visitors::WhereSql.new @engine.connection
viz = Visitors::WhereSql.new engine.connection
Nodes::SqlLiteral.new viz.accept(@ctx, Collectors::SQLString.new).value
end
......
......@@ -6,7 +6,7 @@ class Table
@engine = nil
class << self; attr_accessor :engine; end
attr_accessor :name, :engine, :aliases, :table_alias
attr_accessor :name, :aliases, :table_alias
# TableAlias and Table both have a #table_name which is the name of the underlying table
alias :table_name :name
......@@ -15,7 +15,6 @@ def initialize name, options = {}
@name = name.to_s
@columns = nil
@aliases = []
@engine = Table.engine
# Sometime AR sends an :as parameter to table, to let the table know
# that it is an Alias. We may want to override new, and return a
......@@ -32,8 +31,8 @@ def alias name = "#{self.name}_2"
end
end
def from engine = Table.engine
SelectManager.new(engine, self)
def from
SelectManager.new(self)
end
def join relation, klass = Nodes::InnerJoin
......
......@@ -8,8 +8,7 @@ class TreeManager
attr_accessor :bind_values
def initialize engine
@engine = engine
def initialize
@ctx = nil
@bind_values = []
end
......@@ -20,13 +19,9 @@ def to_dot
collector.value
end
def visitor
engine.connection.visitor
end
def to_sql
def to_sql engine = Table.engine
collector = Arel::Collectors::SQLString.new
collector = visitor.accept @ast, collector
collector = engine.connection.visitor.accept @ast, collector
collector.value
end
......
module Arel
class UpdateManager < Arel::TreeManager
def initialize engine
def initialize
super
@ast = Nodes::UpdateStatement.new
@ctx = @ast
......
......@@ -20,7 +20,7 @@ def compile node
def ast_with_binds bv
table = Table.new(:users)
manager = Arel::SelectManager.new Table.engine, table
manager = Arel::SelectManager.new table
manager.where(table[:age].eq(bv))
manager.where(table[:name].eq(bv))
manager.ast
......
......@@ -20,7 +20,7 @@ def compile node
def ast_with_binds bv
table = Table.new(:users)
manager = Arel::SelectManager.new Table.engine, table
manager = Arel::SelectManager.new table
manager.where(table[:age].eq(bv))
manager.where(table[:name].eq(bv))
manager.ast
......
......@@ -4,13 +4,6 @@
module Arel
module Nodes
describe 'table alias' do
it 'has an #engine which delegates to the relation' do
relation = OpenStruct.new(engine: 'vroom')
node = TableAlias.new relation, :foo
node.engine.must_equal 'vroom'
end
describe 'equality' do
it 'is equal with equal ivars' do
relation1 = Table.new(:users)
......
......@@ -4,21 +4,21 @@ module Arel
describe 'delete manager' do
describe 'new' do
it 'takes an engine' do
Arel::DeleteManager.new Table.engine
Arel::DeleteManager.new
end
end
describe 'from' do
it 'uses from' do
table = Table.new(:users)
dm = Arel::DeleteManager.new Table.engine
dm = Arel::DeleteManager.new
dm.from table
dm.to_sql.must_be_like %{ DELETE FROM "users" }
end
it 'chains' do
table = Table.new(:users)
dm = Arel::DeleteManager.new Table.engine
dm = Arel::DeleteManager.new
dm.from(table).must_equal dm
end
end
......@@ -26,7 +26,7 @@ module Arel
describe 'where' do
it 'uses where values' do
table = Table.new(:users)
dm = Arel::DeleteManager.new Table.engine
dm = Arel::DeleteManager.new
dm.from table
dm.where table[:id].eq(10)
dm.to_sql.must_be_like %{ DELETE FROM "users" WHERE "users"."id" = 10}
......@@ -34,7 +34,7 @@ module Arel
it 'chains' do
table = Table.new(:users)
dm = Arel::DeleteManager.new Table.engine
dm = Arel::DeleteManager.new
dm.where(table[:id].eq(10)).must_equal dm
end
end
......
......@@ -4,13 +4,13 @@ module Arel
describe 'insert manager' do
describe 'new' do
it 'takes an engine' do
Arel::InsertManager.new Table.engine
Arel::InsertManager.new
end
end
describe 'insert' do
it 'can create a Values node' do
manager = Arel::InsertManager.new Table.engine
manager = Arel::InsertManager.new
values = manager.create_values %w{ a b }, %w{ c d }
assert_kind_of Arel::Nodes::Values, values
......@@ -19,7 +19,7 @@ module Arel
end
it 'allows sql literals' do
manager = Arel::InsertManager.new Table.engine
manager = Arel::InsertManager.new
manager.into Table.new(:users)
manager.values = manager.create_values [Arel.sql('*')], %w{ a }
manager.to_sql.must_be_like %{
......@@ -29,7 +29,7 @@ module Arel
it "inserts false" do
table = Table.new(:users)
manager = Arel::InsertManager.new Table.engine
manager = Arel::InsertManager.new
manager.insert [[table[:bool], false]]
manager.to_sql.must_be_like %{
......@@ -39,7 +39,7 @@ module Arel
it "inserts null" do
table = Table.new(:users)
manager = Arel::InsertManager.new Table.engine
manager = Arel::InsertManager.new
manager.insert [[table[:id], nil]]
manager.to_sql.must_be_like %{
INSERT INTO "users" ("id") VALUES (NULL)
......@@ -48,7 +48,7 @@ module Arel
it "inserts time" do
table = Table.new(:users)
manager = Arel::InsertManager.new Table.engine
manager = Arel::InsertManager.new
time = Time.now
attribute = table[:created_at]
......@@ -61,7 +61,7 @@ module Arel
it 'takes a list of lists' do
table = Table.new(:users)
manager = Arel::InsertManager.new Table.engine
manager = Arel::InsertManager.new
manager.into table
manager.insert [[table[:id], 1], [table[:name], 'aaron']]
manager.to_sql.must_be_like %{
......@@ -71,7 +71,7 @@ module Arel
it 'defaults the table' do
table = Table.new(:users)
manager = Arel::InsertManager.new Table.engine
manager = Arel::InsertManager.new
manager.insert [[table[:id], 1], [table[:name], 'aaron']]
manager.to_sql.must_be_like %{
INSERT INTO "users" ("id", "name") VALUES (1, 'aaron')
......@@ -80,7 +80,7 @@ module Arel
it 'noop for empty list' do
table = Table.new(:users)
manager = Arel::InsertManager.new Table.engine
manager = Arel::InsertManager.new
manager.insert [[table[:id], 1]]
manager.insert []
manager.to_sql.must_be_like %{
......@@ -91,13 +91,13 @@ module Arel
describe 'into' do
it 'takes a Table and chains' do
manager = Arel::InsertManager.new Table.engine
manager = Arel::InsertManager.new
manager.into(Table.new(:users)).must_equal manager
end
it 'converts to sql' do
table = Table.new :users
manager = Arel::InsertManager.new Table.engine
manager = Arel::InsertManager.new
manager.into table
manager.to_sql.must_be_like %{
INSERT INTO "users"
......@@ -108,7 +108,7 @@ module Arel
describe 'columns' do
it "converts to sql" do
table = Table.new :users
manager = Arel::InsertManager.new Table.engine
manager = Arel::InsertManager.new
manager.into table
manager.columns << table[:id]
manager.to_sql.must_be_like %{
......@@ -120,7 +120,7 @@ module Arel
describe "values" do
it "converts to sql" do
table = Table.new :users
manager = Arel::InsertManager.new Table.engine
manager = Arel::InsertManager.new
manager.into table
manager.values = Nodes::Values.new [1]
......@@ -133,7 +133,7 @@ module Arel
describe "combo" do
it "combines columns and values list in order" do
table = Table.new :users
manager = Arel::InsertManager.new Table.engine
manager = Arel::InsertManager.new
manager.into table
manager.values = Nodes::Values.new [1, 'aaron']
......@@ -150,10 +150,10 @@ module Arel
it "accepts a select query in place of a VALUES clause" do
table = Table.new :users
manager = Arel::InsertManager.new Table.engine
manager = Arel::InsertManager.new
manager.into table
select = Arel::SelectManager.new Table.engine
select = Arel::SelectManager.new
select.project Arel.sql('1')
select.project Arel.sql('"aaron"')
......
此差异已折叠。
......@@ -179,10 +179,6 @@ module Arel
@relation.table_name.must_equal 'users'
end
it "should have an engine" do
@relation.engine.must_equal Table.engine
end
describe '[]' do
describe 'when given a Symbol' do
it "manufactures an attribute if the symbol names an attribute within the relation" do
......
......@@ -4,13 +4,13 @@ module Arel
describe 'update manager' do
describe 'new' do
it 'takes an engine' do
Arel::UpdateManager.new Table.engine
Arel::UpdateManager.new
end
end
it "should not quote sql literals" do
table = Table.new(:users)
um = Arel::UpdateManager.new Table.engine
um = Arel::UpdateManager.new
um.table table
um.set [[table[:name], Arel::Nodes::BindParam.new]]
um.to_sql.must_be_like %{ UPDATE "users" SET "name" = ? }
......@@ -18,7 +18,7 @@ module Arel
it 'handles limit properly' do
table = Table.new(:users)
um = Arel::UpdateManager.new Table.engine
um = Arel::UpdateManager.new
um.key = 'id'
um.take 10
um.table table
......@@ -29,7 +29,7 @@ module Arel
describe 'set' do
it "updates with null" do
table = Table.new(:users)
um = Arel::UpdateManager.new Table.engine
um = Arel::UpdateManager.new
um.table table
um.set [[table[:name], nil]]
um.to_sql.must_be_like %{ UPDATE "users" SET "name" = NULL }
......@@ -37,7 +37,7 @@ module Arel
it 'takes a string' do
table = Table.new(:users)
um = Arel::UpdateManager.new Table.engine
um = Arel::UpdateManager.new
um.table table
um.set Nodes::SqlLiteral.new "foo = bar"
um.to_sql.must_be_like %{ UPDATE "users" SET foo = bar }
......@@ -45,7 +45,7 @@ module Arel
it 'takes a list of lists' do
table = Table.new(:users)
um = Arel::UpdateManager.new Table.engine
um = Arel::UpdateManager.new
um.table table
um.set [[table[:id], 1], [table[:name], 'hello']]
um.to_sql.must_be_like %{
......@@ -55,25 +55,25 @@ module Arel
it 'chains' do
table = Table.new(:users)
um = Arel::UpdateManager.new Table.engine
um = Arel::UpdateManager.new
um.set([[table[:id], 1], [table[:name], 'hello']]).must_equal um
end
end
describe 'table' do
it 'generates an update statement' do
um = Arel::UpdateManager.new Table.engine
um = Arel::UpdateManager.new
um.table Table.new(:users)
um.to_sql.must_be_like %{ UPDATE "users" }
end
it 'chains' do
um = Arel::UpdateManager.new Table.engine
um = Arel::UpdateManager.new
um.table(Table.new(:users)).must_equal um
end
it 'generates an update statement with joins' do
um = Arel::UpdateManager.new Table.engine
um = Arel::UpdateManager.new
table = Table.new(:users)
join_source = Arel::Nodes::JoinSource.new(
......@@ -89,7 +89,7 @@ module Arel
describe 'where' do
it 'generates a where clause' do
table = Table.new :users
um = Arel::UpdateManager.new Table.engine
um = Arel::UpdateManager.new
um.table table
um.where table[:id].eq(1)
um.to_sql.must_be_like %{
......@@ -99,7 +99,7 @@ module Arel
it 'chains' do
table = Table.new :users
um = Arel::UpdateManager.new Table.engine
um = Arel::UpdateManager.new
um.table table
um.where(table[:id].eq(1)).must_equal um
end
......@@ -108,7 +108,7 @@ module Arel
describe 'key' do
before do
@table = Table.new :users
@um = Arel::UpdateManager.new Table.engine
@um = Arel::UpdateManager.new
@um.key = @table[:foo]
end
......
......@@ -17,7 +17,7 @@ def setup
# substitutes binds with values from block
def test_assignment_binds_are_substituted
table = Table.new(:users)
um = Arel::UpdateManager.new Table.engine
um = Arel::UpdateManager.new
bp = Nodes::BindParam.new
um.set [[table[:name], bp]]
visitor = Class.new(Arel::Visitors::ToSql) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册