square-arel 2.0.9.20110222133018
Sign up to get free protection for your applications and to get access to all the features.
- data/.autotest +26 -0
- data/History.txt +105 -0
- data/MIT-LICENSE.txt +20 -0
- data/Manifest.txt +124 -0
- data/README.markdown +94 -0
- data/Rakefile +20 -0
- data/lib/arel.rb +39 -0
- data/lib/arel/attributes.rb +20 -0
- data/lib/arel/attributes/attribute.rb +18 -0
- data/lib/arel/compatibility/wheres.rb +33 -0
- data/lib/arel/crud.rb +37 -0
- data/lib/arel/delete_manager.rb +18 -0
- data/lib/arel/deprecated.rb +4 -0
- data/lib/arel/expression.rb +4 -0
- data/lib/arel/expressions.rb +23 -0
- data/lib/arel/insert_manager.rb +34 -0
- data/lib/arel/nodes.rb +53 -0
- data/lib/arel/nodes/and.rb +6 -0
- data/lib/arel/nodes/as.rb +6 -0
- data/lib/arel/nodes/assignment.rb +6 -0
- data/lib/arel/nodes/avg.rb +6 -0
- data/lib/arel/nodes/between.rb +6 -0
- data/lib/arel/nodes/binary.rb +12 -0
- data/lib/arel/nodes/count.rb +13 -0
- data/lib/arel/nodes/delete_statement.rb +19 -0
- data/lib/arel/nodes/does_not_match.rb +6 -0
- data/lib/arel/nodes/equality.rb +9 -0
- data/lib/arel/nodes/except.rb +7 -0
- data/lib/arel/nodes/exists.rb +7 -0
- data/lib/arel/nodes/function.rb +18 -0
- data/lib/arel/nodes/greater_than.rb +6 -0
- data/lib/arel/nodes/greater_than_or_equal.rb +6 -0
- data/lib/arel/nodes/group.rb +6 -0
- data/lib/arel/nodes/grouping.rb +6 -0
- data/lib/arel/nodes/having.rb +6 -0
- data/lib/arel/nodes/in.rb +6 -0
- data/lib/arel/nodes/inner_join.rb +6 -0
- data/lib/arel/nodes/insert_statement.rb +19 -0
- data/lib/arel/nodes/intersect.rb +7 -0
- data/lib/arel/nodes/join.rb +13 -0
- data/lib/arel/nodes/less_than.rb +6 -0
- data/lib/arel/nodes/less_than_or_equal.rb +6 -0
- data/lib/arel/nodes/limit.rb +7 -0
- data/lib/arel/nodes/lock.rb +6 -0
- data/lib/arel/nodes/matches.rb +6 -0
- data/lib/arel/nodes/max.rb +6 -0
- data/lib/arel/nodes/min.rb +6 -0
- data/lib/arel/nodes/node.rb +44 -0
- data/lib/arel/nodes/not.rb +6 -0
- data/lib/arel/nodes/not_equal.rb +6 -0
- data/lib/arel/nodes/not_in.rb +6 -0
- data/lib/arel/nodes/offset.rb +7 -0
- data/lib/arel/nodes/on.rb +6 -0
- data/lib/arel/nodes/or.rb +6 -0
- data/lib/arel/nodes/ordering.rb +20 -0
- data/lib/arel/nodes/outer_join.rb +6 -0
- data/lib/arel/nodes/select_core.rb +26 -0
- data/lib/arel/nodes/select_statement.rb +22 -0
- data/lib/arel/nodes/sql_literal.rb +8 -0
- data/lib/arel/nodes/string_join.rb +11 -0
- data/lib/arel/nodes/sum.rb +6 -0
- data/lib/arel/nodes/table_alias.rb +13 -0
- data/lib/arel/nodes/top.rb +6 -0
- data/lib/arel/nodes/unary.rb +11 -0
- data/lib/arel/nodes/union.rb +7 -0
- data/lib/arel/nodes/union_all.rb +7 -0
- data/lib/arel/nodes/unqualified_column.rb +16 -0
- data/lib/arel/nodes/update_statement.rb +21 -0
- data/lib/arel/nodes/values.rb +14 -0
- data/lib/arel/predications.rb +183 -0
- data/lib/arel/relation.rb +6 -0
- data/lib/arel/select_manager.rb +237 -0
- data/lib/arel/sql/engine.rb +10 -0
- data/lib/arel/sql_literal.rb +4 -0
- data/lib/arel/table.rb +134 -0
- data/lib/arel/tree_manager.rb +36 -0
- data/lib/arel/update_manager.rb +49 -0
- data/lib/arel/visitors.rb +38 -0
- data/lib/arel/visitors/depth_first.rb +154 -0
- data/lib/arel/visitors/dot.rb +230 -0
- data/lib/arel/visitors/join_sql.rb +40 -0
- data/lib/arel/visitors/mssql.rb +16 -0
- data/lib/arel/visitors/mysql.rb +34 -0
- data/lib/arel/visitors/oracle.rb +116 -0
- data/lib/arel/visitors/order_clauses.rb +11 -0
- data/lib/arel/visitors/postgresql.rb +58 -0
- data/lib/arel/visitors/sqlite.rb +11 -0
- data/lib/arel/visitors/to_sql.rb +331 -0
- data/lib/arel/visitors/visitor.rb +27 -0
- data/lib/arel/visitors/where_sql.rb +9 -0
- data/square-arel.gemspec +36 -0
- data/test/attributes/test_attribute.rb +664 -0
- data/test/helper.rb +13 -0
- data/test/nodes/test_as.rb +16 -0
- data/test/nodes/test_count.rb +18 -0
- data/test/nodes/test_delete_statement.rb +14 -0
- data/test/nodes/test_equality.rb +74 -0
- data/test/nodes/test_insert_statement.rb +18 -0
- data/test/nodes/test_node.rb +33 -0
- data/test/nodes/test_not.rb +20 -0
- data/test/nodes/test_or.rb +22 -0
- data/test/nodes/test_select_core.rb +22 -0
- data/test/nodes/test_select_statement.rb +13 -0
- data/test/nodes/test_sql_literal.rb +52 -0
- data/test/nodes/test_sum.rb +12 -0
- data/test/nodes/test_update_statement.rb +18 -0
- data/test/support/fake_record.rb +91 -0
- data/test/test_activerecord_compat.rb +18 -0
- data/test/test_attributes.rb +46 -0
- data/test/test_crud.rb +69 -0
- data/test/test_delete_manager.rb +42 -0
- data/test/test_insert_manager.rb +125 -0
- data/test/test_select_manager.rb +659 -0
- data/test/test_table.rb +193 -0
- data/test/test_update_manager.rb +86 -0
- data/test/visitors/test_depth_first.rb +212 -0
- data/test/visitors/test_dot.rb +29 -0
- data/test/visitors/test_join_sql.rb +35 -0
- data/test/visitors/test_mssql.rb +18 -0
- data/test/visitors/test_mysql.rb +45 -0
- data/test/visitors/test_oracle.rb +147 -0
- data/test/visitors/test_postgres.rb +36 -0
- data/test/visitors/test_sqlite.rb +18 -0
- data/test/visitors/test_to_sql.rb +255 -0
- metadata +261 -0
data/test/test_table.rb
ADDED
@@ -0,0 +1,193 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
module Arel
|
4
|
+
describe Table do
|
5
|
+
before do
|
6
|
+
@relation = Table.new(:users)
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'skip' do
|
10
|
+
it 'should add an offset' do
|
11
|
+
sm = @relation.skip 2
|
12
|
+
sm.to_sql.must_be_like "SELECT FROM \"users\" OFFSET 2"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'primary_key' do
|
17
|
+
it 'should return an attribute' do
|
18
|
+
@relation.primary_key.name.must_equal :id
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'select_manager' do
|
23
|
+
it 'should return an empty select manager' do
|
24
|
+
sm = @relation.select_manager
|
25
|
+
sm.to_sql.must_be_like 'SELECT'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe 'having' do
|
30
|
+
it 'adds a having clause' do
|
31
|
+
mgr = @relation.having @relation[:id].eq(10)
|
32
|
+
mgr.to_sql.must_be_like %{
|
33
|
+
SELECT FROM "users" HAVING "users"."id" = 10
|
34
|
+
}
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe 'backwards compat' do
|
39
|
+
describe 'joins' do
|
40
|
+
it 'returns nil' do
|
41
|
+
@relation.joins(nil).must_equal nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe 'join' do
|
46
|
+
it 'noops on nil' do
|
47
|
+
mgr = @relation.join nil
|
48
|
+
|
49
|
+
mgr.to_sql.must_be_like %{ SELECT FROM "users" }
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'takes a second argument for join type' do
|
53
|
+
right = @relation.alias
|
54
|
+
predicate = @relation[:id].eq(right[:id])
|
55
|
+
mgr = @relation.join(right, Nodes::OuterJoin).on(predicate)
|
56
|
+
|
57
|
+
mgr.to_sql.must_be_like %{
|
58
|
+
SELECT FROM "users"
|
59
|
+
LEFT OUTER JOIN "users" "users_2"
|
60
|
+
ON "users"."id" = "users_2"."id"
|
61
|
+
}
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe 'group' do
|
67
|
+
it 'should create a group' do
|
68
|
+
manager = @relation.group @relation[:id]
|
69
|
+
manager.to_sql.must_be_like %{
|
70
|
+
SELECT FROM "users" GROUP BY "users"."id"
|
71
|
+
}
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe 'alias' do
|
76
|
+
it 'should create a node that proxies to a table' do
|
77
|
+
@relation.aliases.must_equal []
|
78
|
+
|
79
|
+
node = @relation.alias
|
80
|
+
@relation.aliases.must_equal [node]
|
81
|
+
node.name.must_equal 'users_2'
|
82
|
+
node[:id].relation.must_equal node
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe 'new' do
|
87
|
+
it 'takes :columns' do
|
88
|
+
columns = Table.engine.connection.columns("users")
|
89
|
+
@relation = Table.new(:users, :columns => columns)
|
90
|
+
@relation.columns.first.name.must_equal :id
|
91
|
+
@relation.engine.must_equal Table.engine
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'should accept an engine' do
|
95
|
+
rel = Table.new :users, 'foo'
|
96
|
+
rel.engine.must_equal 'foo'
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'should accept a hash' do
|
100
|
+
rel = Table.new :users, :engine => 'foo'
|
101
|
+
rel.engine.must_equal 'foo'
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'ignores as if it equals name' do
|
105
|
+
rel = Table.new :users, :as => 'users'
|
106
|
+
rel.table_alias.must_be_nil
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe 'order' do
|
111
|
+
it "should take an order" do
|
112
|
+
manager = @relation.order "foo"
|
113
|
+
manager.to_sql.must_be_like %{ SELECT FROM "users" ORDER BY foo }
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
describe 'take' do
|
118
|
+
it "should add a limit" do
|
119
|
+
manager = @relation.take 1
|
120
|
+
manager.project SqlLiteral.new '*'
|
121
|
+
manager.to_sql.must_be_like %{ SELECT * FROM "users" LIMIT 1 }
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe 'project' do
|
126
|
+
it 'can project' do
|
127
|
+
manager = @relation.project SqlLiteral.new '*'
|
128
|
+
manager.to_sql.must_be_like %{ SELECT * FROM "users" }
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'takes multiple parameters' do
|
132
|
+
manager = @relation.project SqlLiteral.new('*'), SqlLiteral.new('*')
|
133
|
+
manager.to_sql.must_be_like %{ SELECT *, * FROM "users" }
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
describe 'where' do
|
138
|
+
it "returns a tree manager" do
|
139
|
+
manager = @relation.where @relation[:id].eq 1
|
140
|
+
manager.project @relation[:id]
|
141
|
+
manager.must_be_kind_of TreeManager
|
142
|
+
manager.to_sql.must_be_like %{
|
143
|
+
SELECT "users"."id"
|
144
|
+
FROM "users"
|
145
|
+
WHERE "users"."id" = 1
|
146
|
+
}
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
describe 'columns' do
|
151
|
+
it 'returns a list of columns' do
|
152
|
+
columns = @relation.columns
|
153
|
+
columns.length.must_equal 4
|
154
|
+
columns.map { |x| x.name.to_s }.sort.must_equal %w{ created_at bool name id }.sort
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
it "should have a name" do
|
159
|
+
@relation.name.must_equal 'users'
|
160
|
+
end
|
161
|
+
|
162
|
+
it "should have an engine" do
|
163
|
+
@relation.engine.must_equal Table.engine
|
164
|
+
end
|
165
|
+
|
166
|
+
describe '[]' do
|
167
|
+
describe 'when given a Symbol' do
|
168
|
+
it "manufactures an attribute if the symbol names an attribute within the relation" do
|
169
|
+
column = @relation[:id]
|
170
|
+
column.name.must_equal :id
|
171
|
+
column.must_be_kind_of Attributes::Integer
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
describe 'when table does not exist' do
|
176
|
+
it 'returns nil' do
|
177
|
+
@relation[:foooo].must_be_nil
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
describe Table do
|
184
|
+
describe 'when checking the existence of a table' do
|
185
|
+
it 'should be present in the table cache despite the class of its name' do
|
186
|
+
[ 'users', :users ].each do |name|
|
187
|
+
relation = Table.new name
|
188
|
+
Table.table_cache(relation.engine).key?(relation.name).must_equal true
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
module Arel
|
4
|
+
describe 'update manager' do
|
5
|
+
describe 'new' do
|
6
|
+
it 'takes an engine' do
|
7
|
+
Arel::UpdateManager.new Table.engine
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'handles limit properly' do
|
12
|
+
table = Table.new(:users)
|
13
|
+
um = Arel::UpdateManager.new Table.engine
|
14
|
+
um.take 10
|
15
|
+
um.table table
|
16
|
+
um.set [[table[:name], nil]]
|
17
|
+
assert_match(/LIMIT 10/, um.to_sql)
|
18
|
+
end
|
19
|
+
|
20
|
+
describe 'set' do
|
21
|
+
it "updates with null" do
|
22
|
+
table = Table.new(:users)
|
23
|
+
um = Arel::UpdateManager.new Table.engine
|
24
|
+
um.table table
|
25
|
+
um.set [[table[:name], nil]]
|
26
|
+
um.to_sql.must_be_like %{ UPDATE "users" SET "name" = NULL }
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'takes a string' do
|
30
|
+
table = Table.new(:users)
|
31
|
+
um = Arel::UpdateManager.new Table.engine
|
32
|
+
um.table table
|
33
|
+
um.set Nodes::SqlLiteral.new "foo = bar"
|
34
|
+
um.to_sql.must_be_like %{ UPDATE "users" SET foo = bar }
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'takes a list of lists' do
|
38
|
+
table = Table.new(:users)
|
39
|
+
um = Arel::UpdateManager.new Table.engine
|
40
|
+
um.table table
|
41
|
+
um.set [[table[:id], 1], [table[:name], 'hello']]
|
42
|
+
um.to_sql.must_be_like %{
|
43
|
+
UPDATE "users" SET "id" = 1, "name" = 'hello'
|
44
|
+
}
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'chains' do
|
48
|
+
table = Table.new(:users)
|
49
|
+
um = Arel::UpdateManager.new Table.engine
|
50
|
+
um.set([[table[:id], 1], [table[:name], 'hello']]).must_equal um
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe 'table' do
|
55
|
+
it 'generates an update statement' do
|
56
|
+
um = Arel::UpdateManager.new Table.engine
|
57
|
+
um.table Table.new(:users)
|
58
|
+
um.to_sql.must_be_like %{ UPDATE "users" }
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'chains' do
|
62
|
+
um = Arel::UpdateManager.new Table.engine
|
63
|
+
um.table(Table.new(:users)).must_equal um
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe 'where' do
|
68
|
+
it 'generates a where clause' do
|
69
|
+
table = Table.new :users
|
70
|
+
um = Arel::UpdateManager.new Table.engine
|
71
|
+
um.table table
|
72
|
+
um.where table[:id].eq(1)
|
73
|
+
um.to_sql.must_be_like %{
|
74
|
+
UPDATE "users" WHERE "users"."id" = 1
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'chains' do
|
79
|
+
table = Table.new :users
|
80
|
+
um = Arel::UpdateManager.new Table.engine
|
81
|
+
um.table table
|
82
|
+
um.where(table[:id].eq(1)).must_equal um
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,212 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
module Arel
|
4
|
+
module Visitors
|
5
|
+
class TestDepthFirst < MiniTest::Unit::TestCase
|
6
|
+
Collector = Struct.new(:calls) do
|
7
|
+
def call object
|
8
|
+
calls << object
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def setup
|
13
|
+
@collector = Collector.new []
|
14
|
+
@visitor = Visitors::DepthFirst.new @collector
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_raises_with_object
|
18
|
+
assert_raises(TypeError) do
|
19
|
+
@visitor.accept(Object.new)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
# unary ops
|
25
|
+
[
|
26
|
+
Arel::Nodes::Not,
|
27
|
+
Arel::Nodes::Group,
|
28
|
+
Arel::Nodes::On,
|
29
|
+
Arel::Nodes::Grouping,
|
30
|
+
Arel::Nodes::Offset,
|
31
|
+
Arel::Nodes::Having,
|
32
|
+
Arel::Nodes::UnqualifiedColumn,
|
33
|
+
Arel::Nodes::Top,
|
34
|
+
Arel::Nodes::Limit,
|
35
|
+
].each do |klass|
|
36
|
+
define_method("test_#{klass.name.gsub('::', '_')}") do
|
37
|
+
op = klass.new(:a)
|
38
|
+
@visitor.accept op
|
39
|
+
assert_equal [:a, op], @collector.calls
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# functions
|
44
|
+
[
|
45
|
+
Arel::Nodes::Exists,
|
46
|
+
Arel::Nodes::Avg,
|
47
|
+
Arel::Nodes::Min,
|
48
|
+
Arel::Nodes::Max,
|
49
|
+
Arel::Nodes::Sum,
|
50
|
+
].each do |klass|
|
51
|
+
define_method("test_#{klass.name.gsub('::', '_')}") do
|
52
|
+
func = klass.new(:a, :b)
|
53
|
+
@visitor.accept func
|
54
|
+
assert_equal [:a, :b, func], @collector.calls
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_lock
|
59
|
+
lock = Nodes::Lock.new true
|
60
|
+
@visitor.accept lock
|
61
|
+
assert_equal [lock], @collector.calls
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_count
|
65
|
+
count = Nodes::Count.new :a, :b, :c
|
66
|
+
@visitor.accept count
|
67
|
+
assert_equal [:a, :c, :b, count], @collector.calls
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_inner_join
|
71
|
+
join = Nodes::InnerJoin.new :a, :b, :c
|
72
|
+
@visitor.accept join
|
73
|
+
assert_equal [:a, :b, :c, join], @collector.calls
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_outer_join
|
77
|
+
join = Nodes::OuterJoin.new :a, :b, :c
|
78
|
+
@visitor.accept join
|
79
|
+
assert_equal [:a, :b, :c, join], @collector.calls
|
80
|
+
end
|
81
|
+
|
82
|
+
[
|
83
|
+
Arel::Nodes::And,
|
84
|
+
Arel::Nodes::Assignment,
|
85
|
+
Arel::Nodes::Between,
|
86
|
+
Arel::Nodes::DoesNotMatch,
|
87
|
+
Arel::Nodes::Equality,
|
88
|
+
Arel::Nodes::GreaterThan,
|
89
|
+
Arel::Nodes::GreaterThanOrEqual,
|
90
|
+
Arel::Nodes::In,
|
91
|
+
Arel::Nodes::LessThan,
|
92
|
+
Arel::Nodes::LessThanOrEqual,
|
93
|
+
Arel::Nodes::Matches,
|
94
|
+
Arel::Nodes::NotEqual,
|
95
|
+
Arel::Nodes::NotIn,
|
96
|
+
Arel::Nodes::Or,
|
97
|
+
Arel::Nodes::StringJoin,
|
98
|
+
Arel::Nodes::TableAlias,
|
99
|
+
Arel::Nodes::Values,
|
100
|
+
Arel::Nodes::As,
|
101
|
+
Arel::Nodes::DeleteStatement,
|
102
|
+
Arel::Nodes::Ordering,
|
103
|
+
].each do |klass|
|
104
|
+
define_method("test_#{klass.name.gsub('::', '_')}") do
|
105
|
+
binary = klass.new(:a, :b)
|
106
|
+
@visitor.accept binary
|
107
|
+
assert_equal [:a, :b, binary], @collector.calls
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
[
|
112
|
+
Arel::Attributes::Integer,
|
113
|
+
Arel::Attributes::Float,
|
114
|
+
Arel::Attributes::String,
|
115
|
+
Arel::Attributes::Time,
|
116
|
+
Arel::Attributes::Boolean,
|
117
|
+
Arel::Attributes::Attribute
|
118
|
+
].each do |klass|
|
119
|
+
define_method("test_#{klass.name.gsub('::', '_')}") do
|
120
|
+
binary = klass.new(:a, :b)
|
121
|
+
@visitor.accept binary
|
122
|
+
assert_equal [:a, :b, binary], @collector.calls
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_table
|
127
|
+
relation = Arel::Table.new(:users)
|
128
|
+
@visitor.accept relation
|
129
|
+
assert_equal ['users', relation], @collector.calls
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_array
|
133
|
+
node = Nodes::Or.new(:a, :b)
|
134
|
+
list = [node]
|
135
|
+
@visitor.accept list
|
136
|
+
assert_equal [:a, :b, node, list], @collector.calls
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_hash
|
140
|
+
node = Nodes::Or.new(:a, :b)
|
141
|
+
hash = { node => node }
|
142
|
+
@visitor.accept hash
|
143
|
+
assert_equal [:a, :b, node, :a, :b, node, hash], @collector.calls
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_update_statement
|
147
|
+
stmt = Nodes::UpdateStatement.new
|
148
|
+
stmt.relation = :a
|
149
|
+
stmt.values << :b
|
150
|
+
stmt.wheres << :c
|
151
|
+
stmt.orders << :d
|
152
|
+
stmt.limit = :e
|
153
|
+
|
154
|
+
@visitor.accept stmt
|
155
|
+
assert_equal [:a, :b, stmt.values, :c, stmt.wheres, :d, stmt.orders,
|
156
|
+
:e, stmt], @collector.calls
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_select_core
|
160
|
+
core = Nodes::SelectCore.new
|
161
|
+
core.projections << :a
|
162
|
+
core.froms = :b
|
163
|
+
core.wheres << :c
|
164
|
+
core.groups << :d
|
165
|
+
core.having = :e
|
166
|
+
|
167
|
+
@visitor.accept core
|
168
|
+
assert_equal [
|
169
|
+
:a, core.projections,
|
170
|
+
:b,
|
171
|
+
:c, core.wheres,
|
172
|
+
:d, core.groups,
|
173
|
+
:e,
|
174
|
+
core], @collector.calls
|
175
|
+
end
|
176
|
+
|
177
|
+
def test_select_statement
|
178
|
+
ss = Nodes::SelectStatement.new
|
179
|
+
ss.cores.replace [:a]
|
180
|
+
ss.orders << :b
|
181
|
+
ss.limit = :c
|
182
|
+
ss.lock = :d
|
183
|
+
ss.offset = :e
|
184
|
+
|
185
|
+
@visitor.accept ss
|
186
|
+
assert_equal [
|
187
|
+
:a, ss.cores,
|
188
|
+
:b, ss.orders,
|
189
|
+
:c,
|
190
|
+
:d,
|
191
|
+
:e,
|
192
|
+
ss], @collector.calls
|
193
|
+
end
|
194
|
+
|
195
|
+
def test_insert_statement
|
196
|
+
stmt = Nodes::InsertStatement.new
|
197
|
+
stmt.relation = :a
|
198
|
+
stmt.columns << :b
|
199
|
+
stmt.values = :c
|
200
|
+
|
201
|
+
@visitor.accept stmt
|
202
|
+
assert_equal [:a, :b, stmt.columns, :c, stmt], @collector.calls
|
203
|
+
end
|
204
|
+
|
205
|
+
def test_node
|
206
|
+
node = Nodes::Node.new
|
207
|
+
@visitor.accept node
|
208
|
+
assert_equal [node], @collector.calls
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|