Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
6b851c68
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
6b851c68
编写于
8月 18, 2010
作者:
A
Aaron Patterson
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
joins can be created
上级
0403efa4
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
120 addition
and
10 deletion
+120
-10
lib/arel/nodes.rb
lib/arel/nodes.rb
+3
-0
lib/arel/nodes/inner_join.rb
lib/arel/nodes/inner_join.rb
+13
-0
lib/arel/nodes/on.rb
lib/arel/nodes/on.rb
+11
-0
lib/arel/nodes/table_alias.rb
lib/arel/nodes/table_alias.rb
+20
-0
lib/arel/select_manager.rb
lib/arel/select_manager.rb
+9
-0
lib/arel/table.rb
lib/arel/table.rb
+12
-1
lib/arel/visitors/to_sql.rb
lib/arel/visitors/to_sql.rb
+19
-6
spec/arel/select_manager_spec.rb
spec/arel/select_manager_spec.rb
+20
-2
spec/arel/table_spec.rb
spec/arel/table_spec.rb
+12
-0
spec/arel/update_manager_spec.rb
spec/arel/update_manager_spec.rb
+1
-1
未找到文件。
lib/arel/nodes.rb
浏览文件 @
6b851c68
...
...
@@ -10,3 +10,6 @@
require
'arel/nodes/update_statement'
require
'arel/nodes/delete_statement'
require
'arel/nodes/unqualified_column'
require
'arel/nodes/table_alias'
require
'arel/nodes/inner_join'
require
'arel/nodes/on'
lib/arel/nodes/inner_join.rb
0 → 100644
浏览文件 @
6b851c68
module
Arel
module
Nodes
class
InnerJoin
attr_accessor
:left
,
:right
,
:constraint
def
initialize
left
,
right
,
constraint
@left
=
left
@right
=
right
@constraint
=
constraint
end
end
end
end
lib/arel/nodes/on.rb
0 → 100644
浏览文件 @
6b851c68
module
Arel
module
Nodes
class
On
attr_accessor
:expr
def
initialize
expr
@expr
=
expr
end
end
end
end
lib/arel/nodes/table_alias.rb
0 → 100644
浏览文件 @
6b851c68
module
Arel
module
Nodes
class
TableAlias
attr_reader
:name
,
:relation
,
:columns
def
initialize
name
,
relation
@name
=
name
@relation
=
relation
@columns
=
relation
.
columns
.
map
{
|
column
|
column
.
dup
.
tap
{
|
col
|
col
.
relation
=
self
}
}
end
def
[]
name
name
=
name
.
to_s
columns
.
find
{
|
column
|
column
.
name
==
name
}
end
end
end
end
lib/arel/select_manager.rb
浏览文件 @
6b851c68
...
...
@@ -8,12 +8,21 @@ def initialize engine
@ctx
=
@head
.
cores
.
last
end
def
on
expr
@ctx
.
froms
.
last
.
constraint
=
Nodes
::
On
.
new
(
expr
)
self
end
def
from
table
@ctx
.
froms
<<
table
self
end
def
project
projection
projection
=
::
String
==
projection
.
class
?
Nodes
::
SqlLiteral
.
new
(
projection
)
:
projection
@ctx
.
projections
<<
projection
self
end
...
...
lib/arel/table.rb
浏览文件 @
6b851c68
...
...
@@ -5,19 +5,30 @@ class Table
@engine
=
nil
class
<<
self
;
attr_accessor
:engine
;
end
attr_reader
:name
,
:engine
attr_reader
:name
,
:engine
,
:aliases
def
initialize
name
,
engine
=
Table
.
engine
@name
=
name
@engine
=
engine
@engine
=
engine
[
:engine
]
if
Hash
===
engine
@columns
=
nil
@aliases
=
[]
end
def
alias
Nodes
::
TableAlias
.
new
(
"
#{
name
}
_2"
,
self
).
tap
do
|
node
|
@aliases
<<
node
end
end
def
tm
SelectManager
.
new
(
@engine
).
from
(
self
)
end
def
join
relation
SelectManager
.
new
(
@engine
).
from
(
Nodes
::
InnerJoin
.
new
(
self
,
relation
,
nil
))
end
def
where
condition
tm
.
where
condition
end
...
...
lib/arel/visitors/to_sql.rb
浏览文件 @
6b851c68
...
...
@@ -36,7 +36,7 @@ def visit_Arel_Nodes_InsertStatement o
}
.join ', '})"
unless
o
.
columns
.
empty?
),
(
"VALUES (
#{
o
.
values
.
map
{
|
value
|
value
?
quote
(
visit
(
value
)
)
:
'NULL'
value
?
visit
(
value
)
:
'NULL'
}
.join ', '})"
unless
o
.
values
.
empty?
),
].
compact
.
join
' '
...
...
@@ -57,12 +57,24 @@ def visit_Arel_Nodes_SelectCore o
].
compact
.
join
' '
end
def
visit_Arel_Nodes_TableAlias
o
"
#{
visit
o
.
relation
}
#{
quote_table_name
o
.
name
}
"
end
def
visit_Arel_Nodes_InnerJoin
o
"
#{
visit
o
.
left
}
INNER JOIN
#{
visit
o
.
right
}
#{
visit
o
.
constraint
}
"
end
def
visit_Arel_Nodes_On
o
"ON
#{
visit
o
.
expr
}
"
end
def
visit_Arel_Table
o
quote_table_name
o
.
name
end
def
visit_Arel_Nodes_In
o
"
#{
visit
o
.
left
}
IN (
#{
o
.
right
.
map
{
|
x
|
quote
visit
x
}
.join ', '})"
"
#{
visit
o
.
left
}
IN (
#{
o
.
right
.
map
{
|
x
|
visit
x
}
.join ', '})"
end
def
visit_Arel_Nodes_Or
o
...
...
@@ -71,7 +83,7 @@ def visit_Arel_Nodes_Or o
def
visit_Arel_Nodes_Equality
o
right
=
o
.
right
right
=
right
?
quote
(
visit
(
right
)
)
:
'NULL'
right
=
right
?
visit
(
right
)
:
'NULL'
"
#{
visit
o
.
left
}
=
#{
right
}
"
end
...
...
@@ -87,12 +99,13 @@ def visit_Arel_Attributes_Attribute o
alias
:visit_Arel_Attributes_Time
:visit_Arel_Attributes_Attribute
def
visit_Fixnum
o
;
o
end
alias
:visit_Time
:visit_Fixnum
alias
:visit_String
:visit_Fixnum
alias
:visit_TrueClass
:visit_Fixnum
alias
:visit_Arel_Nodes_SqlLiteral
:visit_Fixnum
alias
:visit_Arel_SqlLiteral
:visit_Fixnum
# This is deprecated
def
visit_TrueClass
o
;
quote
(
o
)
end
def
visit_String
o
;
quote
(
o
)
end
def
visit_Time
o
;
quote
(
o
)
end
DISPATCH
=
{}
def
visit
object
send
"visit_
#{
object
.
class
.
name
.
gsub
(
'::'
,
'_'
)
}
"
,
object
...
...
spec/arel/select_manager_spec.rb
浏览文件 @
6b851c68
...
...
@@ -54,7 +54,7 @@ def execute sql
table
=
Table
.
new
:users
manager
=
Arel
::
SelectManager
.
new
engine
manager
.
from
table
manager
.
update
(
'foo = bar'
)
manager
.
update
(
SqlLiteral
.
new
(
'foo = bar'
)
)
engine
.
executed
.
last
.
should
be_like
%{ UPDATE "users" SET foo = bar }
end
...
...
@@ -89,7 +89,7 @@ def execute sql
it
'takes strings'
do
table
=
Table
.
new
:users
manager
=
Arel
::
SelectManager
.
new
Table
.
engine
manager
.
project
'*'
manager
.
project
Nodes
::
SqlLiteral
.
new
(
'*'
)
manager
.
to_sql
.
should
be_like
%{
SELECT *
}
...
...
@@ -149,6 +149,24 @@ def execute sql
end
end
describe
"join"
do
it
"joins itself"
do
left
=
Table
.
new
:users
right
=
left
.
alias
predicate
=
left
[
:id
].
eq
(
right
[
:id
])
mgr
=
left
.
join
(
right
)
mgr
.
project
Nodes
::
SqlLiteral
.
new
(
'*'
)
check
mgr
.
on
(
predicate
).
should
==
mgr
mgr
.
to_sql
.
should
be_like
%{
SELECT * FROM "users"
INNER JOIN "users" "users_2"
ON "users"."id" = "users_2"."id"
}
end
end
describe
'from'
do
it
"makes sql"
do
table
=
Table
.
new
:users
...
...
spec/arel/table_spec.rb
浏览文件 @
6b851c68
...
...
@@ -6,6 +6,18 @@ module Arel
@relation
=
Table
.
new
(
:users
)
end
describe
'alias'
do
it
'should create a node that proxies to a table'
do
check
@relation
.
aliases
.
should
==
[]
node
=
@relation
.
alias
check
@relation
.
aliases
.
should
==
[
node
]
check
node
.
name
.
should
==
'users_2'
check
node
[
:id
].
relation
.
should
==
node
check
node
[
:id
].
relation
.
should
!=
node
end
end
describe
'new'
do
it
'should accept an engine'
do
rel
=
Table
.
new
:users
,
'foo'
...
...
spec/arel/update_manager_spec.rb
浏览文件 @
6b851c68
...
...
@@ -21,7 +21,7 @@ module Arel
table
=
Table
.
new
(
:users
)
um
=
Arel
::
UpdateManager
.
new
Table
.
engine
um
.
table
table
um
.
set
"foo = bar"
um
.
set
Nodes
::
SqlLiteral
.
new
"foo = bar"
um
.
to_sql
.
should
be_like
%{ UPDATE "users" SET foo = bar }
end
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录