提交 16e72732 编写于 作者: A Aaron Patterson

full sql statement generation

上级 d827d6e9
require 'arel/version'
require 'arel/table'
require 'arel/attributes'
require 'arel/tree_manager'
require 'arel/nodes'
require 'arel/visitors/to_sql'
......
require 'arel/nodes/equality'
require 'arel/nodes/sql_literal'
require 'arel/nodes/select'
module Arel
module Nodes
class Select
attr_reader :froms, :projections, :wheres
def initialize
@froms = []
@projections = []
@wheres = []
end
end
end
end
module Arel
class TreeManager
def initialize engine
@engine = engine
@statement_list = []
# default to Select
@statement_list << Nodes::Select.new
end
def from table
@statement_list.last.froms << table
self
end
def project projection
@statement_list.last.projections << projection
self
end
def where expr
@statement_list.last.wheres << expr
self
end
def to_sql
viz = Visitors::ToSql.new @engine
viz.accept @statement_list.last
end
end
end
......@@ -12,6 +12,18 @@ def accept object
end
private
def visit_Arel_Nodes_Select o
[
"SELECT #{o.projections.map { |x| visit x }.join ', '}",
"FROM #{o.froms.map { |x| visit x }.join ', ' }",
("WHERE #{o.wheres.map { |x| visit x }.join ' AND ' }" unless o.wheres.blank?)
].compact.join ' '
end
def visit_Arel_Table o
quote_table_name o.name
end
def visit_Arel_Nodes_Equality o
"#{visit o.left} = #{visit o.right}"
end
......
require 'spec_helper'
module Arel
describe 'tree manager' do
describe 'where' do
it "knows where" do
table = Table.new :users
manager = Arel::TreeManager.new Table.engine
manager.from(table).project(table['id'])
manager.where(table['id'].eq(1))
manager.to_sql.should == %{
SELECT "users"."id"
FROM "users"
WHERE "users"."id" = 1
}.gsub("\n", '').gsub(/(^\s*|\s*$)/, '').squeeze(' ')
end
it "chains" do
table = Table.new :users
manager = Arel::TreeManager.new Table.engine
manager.from(table)
manager.project(table['id']).where(table['id'].eq 1).should == manager
end
end
describe 'from' do
it "makes sql" do
table = Table.new :users
manager = Arel::TreeManager.new Table.engine
manager.from table
manager.project table['id']
manager.to_sql.should == 'SELECT "users"."id" FROM "users"'
end
it "chains" do
table = Table.new :users
manager = Arel::TreeManager.new Table.engine
manager.from(table).project(table['id']).should == manager
manager.to_sql.should == 'SELECT "users"."id" FROM "users"'
end
end
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册