arel 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitmodules +3 -0
- data/History.txt +11 -0
- data/README.markdown +26 -26
- data/Rakefile +34 -46
- data/Thorfile +124 -0
- data/arel.gemspec +216 -201
- data/lib/arel/algebra/{primitives/attribute.rb → attribute.rb} +7 -7
- data/lib/arel/algebra/{extensions → core_extensions}/class.rb +2 -2
- data/lib/arel/algebra/{extensions → core_extensions}/hash.rb +1 -1
- data/lib/arel/algebra/{extensions → core_extensions}/object.rb +1 -1
- data/lib/arel/algebra/{extensions → core_extensions}/symbol.rb +1 -1
- data/lib/arel/algebra/core_extensions.rb +4 -0
- data/lib/arel/algebra/{primitives/ordering.rb → ordering.rb} +1 -1
- data/lib/arel/algebra/predicates.rb +32 -30
- data/lib/arel/algebra/relations/operations/from.rb +6 -0
- data/lib/arel/algebra/relations/operations/having.rb +13 -0
- data/lib/arel/algebra/relations/operations/join.rb +4 -0
- data/lib/arel/algebra/relations/operations/lock.rb +12 -0
- data/lib/arel/algebra/relations/operations/project.rb +1 -1
- data/lib/arel/algebra/relations/relation.rb +9 -2
- data/lib/arel/algebra/relations/utilities/compound.rb +2 -2
- data/lib/arel/algebra/relations.rb +3 -0
- data/lib/arel/algebra.rb +7 -2
- data/lib/arel/engines/memory/predicates.rb +26 -24
- data/lib/arel/engines/memory/relations/operations.rb +6 -0
- data/lib/arel/engines/sql/christener.rb +2 -1
- data/lib/arel/engines/sql/{extensions → core_extensions}/array.rb +6 -2
- data/lib/arel/engines/sql/{extensions → core_extensions}/nil_class.rb +1 -1
- data/lib/arel/engines/sql/{extensions → core_extensions}/object.rb +1 -1
- data/lib/arel/engines/sql/{extensions → core_extensions}/range.rb +1 -1
- data/lib/arel/engines/sql/core_extensions.rb +4 -0
- data/lib/arel/engines/sql/engine.rb +4 -0
- data/lib/arel/engines/sql/formatters.rb +12 -3
- data/lib/arel/engines/sql/predicates.rb +37 -35
- data/lib/arel/engines/sql/primitives.rb +10 -2
- data/lib/arel/engines/sql/relations/operations/join.rb +2 -2
- data/lib/arel/engines/sql/relations/relation.rb +46 -10
- data/lib/arel/engines/sql/relations/table.rb +18 -5
- data/lib/arel/engines/sql/relations/utilities/compound.rb +1 -1
- data/lib/arel/engines/sql/relations/writes.rb +58 -11
- data/lib/arel/engines/sql.rb +1 -1
- data/lib/arel/session.rb +9 -6
- data/lib/arel.rb +9 -8
- data/spec/arel/algebra/unit/predicates/binary_spec.rb +23 -21
- data/spec/arel/algebra/unit/predicates/equality_spec.rb +20 -18
- data/spec/arel/algebra/unit/predicates/in_spec.rb +7 -5
- data/spec/arel/algebra/unit/primitives/attribute_spec.rb +10 -12
- data/spec/arel/algebra/unit/primitives/expression_spec.rb +1 -1
- data/spec/arel/algebra/unit/primitives/value_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/alias_spec.rb +2 -2
- data/spec/arel/algebra/unit/relations/delete_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/group_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/insert_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/join_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/order_spec.rb +2 -2
- data/spec/arel/algebra/unit/relations/project_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/relation_spec.rb +9 -9
- data/spec/arel/algebra/unit/relations/skip_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/table_spec.rb +2 -2
- data/spec/arel/algebra/unit/relations/take_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/update_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/where_spec.rb +1 -1
- data/spec/arel/algebra/unit/session/session_spec.rb +6 -6
- data/spec/arel/engines/memory/integration/joins/cross_engine_spec.rb +3 -4
- data/spec/arel/engines/memory/unit/relations/array_spec.rb +1 -1
- data/spec/arel/engines/memory/unit/relations/insert_spec.rb +8 -8
- data/spec/arel/engines/memory/unit/relations/join_spec.rb +1 -1
- data/spec/arel/engines/memory/unit/relations/order_spec.rb +1 -1
- data/spec/arel/engines/memory/unit/relations/project_spec.rb +1 -1
- data/spec/arel/engines/memory/unit/relations/skip_spec.rb +1 -1
- data/spec/arel/engines/memory/unit/relations/take_spec.rb +1 -1
- data/spec/arel/engines/memory/unit/relations/where_spec.rb +1 -1
- data/spec/arel/engines/sql/integration/joins/with_adjacency_spec.rb +1 -1
- data/spec/arel/engines/sql/integration/joins/with_aggregations_spec.rb +1 -1
- data/spec/arel/engines/sql/integration/joins/with_compounds_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/engine_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/predicates/binary_spec.rb +73 -70
- data/spec/arel/engines/sql/unit/predicates/equality_spec.rb +45 -28
- data/spec/arel/engines/sql/unit/predicates/in_spec.rb +75 -54
- data/spec/arel/engines/sql/unit/predicates/predicates_spec.rb +48 -46
- data/spec/arel/engines/sql/unit/primitives/attribute_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/primitives/expression_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/primitives/literal_spec.rb +13 -1
- data/spec/arel/engines/sql/unit/primitives/value_spec.rb +3 -3
- data/spec/arel/engines/sql/unit/relations/alias_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/delete_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/from_spec.rb +50 -0
- data/spec/arel/engines/sql/unit/relations/group_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/having_spec.rb +36 -0
- data/spec/arel/engines/sql/unit/relations/insert_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/join_spec.rb +85 -4
- data/spec/arel/engines/sql/unit/relations/lock_spec.rb +61 -0
- data/spec/arel/engines/sql/unit/relations/order_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/project_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/skip_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/table_spec.rb +42 -3
- data/spec/arel/engines/sql/unit/relations/take_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/update_spec.rb +13 -7
- data/spec/arel/engines/sql/unit/relations/where_spec.rb +1 -1
- data/spec/connections/mysql_connection.rb +3 -3
- data/spec/connections/postgresql_connection.rb +2 -2
- data/spec/connections/sqlite3_connection.rb +3 -2
- data/spec/doubles/hash.rb +4 -0
- data/spec/schemas/mysql_schema.rb +7 -0
- data/spec/schemas/postgresql_schema.rb +7 -0
- data/spec/schemas/sqlite3_schema.rb +7 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_helper.rb +9 -1
- metadata +50 -25
- data/VERSION +0 -1
- data/lib/arel/.DS_Store +0 -0
- data/lib/arel/algebra/extensions.rb +0 -4
- data/lib/arel/algebra/primitives.rb +0 -5
- data/lib/arel/engines/sql/extensions.rb +0 -4
- /data/lib/arel/algebra/{primitives/expression.rb → expression.rb} +0 -0
- /data/lib/arel/algebra/{primitives/value.rb → value.rb} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require
|
|
1
|
+
require 'spec_helper'
|
|
2
2
|
|
|
3
3
|
module Arel
|
|
4
4
|
describe SqlLiteral do
|
|
@@ -18,6 +18,18 @@ module Arel
|
|
|
18
18
|
sql.should be_like(%Q{SELECT COUNT(*) AS count_id FROM "users"})
|
|
19
19
|
end
|
|
20
20
|
end
|
|
21
|
+
|
|
22
|
+
it "manufactures expressions on literal SQL fragment" do
|
|
23
|
+
sql = @relation.project(SqlLiteral.new("2 * credit_limit").sum).to_sql
|
|
24
|
+
|
|
25
|
+
adapter_is :mysql do
|
|
26
|
+
sql.should be_like(%Q{SELECT SUM(2 * credit_limit) AS sum_id FROM `users`})
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
adapter_is_not :mysql do
|
|
30
|
+
sql.should be_like(%Q{SELECT SUM(2 * credit_limit) AS sum_id FROM "users"})
|
|
31
|
+
end
|
|
32
|
+
end
|
|
21
33
|
end
|
|
22
34
|
end
|
|
23
35
|
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require
|
|
1
|
+
require 'spec_helper'
|
|
2
2
|
|
|
3
3
|
module Arel
|
|
4
4
|
describe Value do
|
|
@@ -9,11 +9,11 @@ module Arel
|
|
|
9
9
|
describe '#to_sql' do
|
|
10
10
|
it "appropriately quotes the value" do
|
|
11
11
|
Value.new(1, @relation).to_sql.should be_like('1')
|
|
12
|
-
|
|
12
|
+
|
|
13
13
|
adapter_is_not :postgresql do
|
|
14
14
|
Value.new('asdf', @relation).to_sql.should be_like("'asdf'")
|
|
15
15
|
end
|
|
16
|
-
|
|
16
|
+
|
|
17
17
|
adapter_is :postgresql do
|
|
18
18
|
Value.new('asdf', @relation).to_sql.should be_like("E'asdf'")
|
|
19
19
|
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module Arel
|
|
4
|
+
describe Table do
|
|
5
|
+
before do
|
|
6
|
+
@relation = Table.new(:users)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
describe '#to_sql' do
|
|
10
|
+
it "manufactures a simple select query" do
|
|
11
|
+
sql = @relation.from("workers").to_sql
|
|
12
|
+
|
|
13
|
+
adapter_is :mysql do
|
|
14
|
+
sql.should be_like(%Q{
|
|
15
|
+
SELECT `users`.`id`, `users`.`name`
|
|
16
|
+
FROM workers
|
|
17
|
+
})
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
adapter_is_not :mysql do
|
|
21
|
+
sql.should be_like(%Q{
|
|
22
|
+
SELECT "users"."id", "users"."name"
|
|
23
|
+
FROM workers
|
|
24
|
+
})
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe '#to_sql' do
|
|
30
|
+
it "overrides and use last from clause given " do
|
|
31
|
+
sql = @relation.from("workers").from("users").to_sql
|
|
32
|
+
|
|
33
|
+
adapter_is :mysql do
|
|
34
|
+
sql.should be_like(%Q{
|
|
35
|
+
SELECT `users`.`id`, `users`.`name`
|
|
36
|
+
FROM users
|
|
37
|
+
})
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
adapter_is_not :mysql do
|
|
41
|
+
sql.should be_like(%Q{
|
|
42
|
+
SELECT "users"."id", "users"."name"
|
|
43
|
+
FROM users
|
|
44
|
+
})
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module Arel
|
|
4
|
+
describe Having do
|
|
5
|
+
before do
|
|
6
|
+
@relation = Table.new(:developers)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
describe '#to_sql' do
|
|
10
|
+
describe 'when given a predicate' do
|
|
11
|
+
it "manufactures sql with where clause conditions" do
|
|
12
|
+
sql = @relation.group(@relation[:department]).having("MIN(salary) > 1000").to_sql
|
|
13
|
+
|
|
14
|
+
adapter_is :mysql do
|
|
15
|
+
sql.should be_like(%Q{
|
|
16
|
+
SELECT `developers`.`id`, `developers`.`name`, `developers`.`salary`, `developers`.`department`
|
|
17
|
+
FROM `developers`
|
|
18
|
+
GROUP BY `developers`.`department`
|
|
19
|
+
HAVING MIN(salary) > 1000
|
|
20
|
+
})
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
adapter_is_not :mysql do
|
|
24
|
+
sql.should be_like(%Q{
|
|
25
|
+
SELECT "developers"."id", "developers"."name", "developers"."salary", "developers"."department"
|
|
26
|
+
FROM "developers"
|
|
27
|
+
GROUP BY "developers"."department"
|
|
28
|
+
HAVING MIN(salary) > 1000
|
|
29
|
+
})
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
@@ -1,17 +1,24 @@
|
|
|
1
|
-
require
|
|
1
|
+
require 'spec_helper'
|
|
2
2
|
|
|
3
3
|
module Arel
|
|
4
4
|
describe Join do
|
|
5
5
|
before do
|
|
6
6
|
@relation1 = Table.new(:users)
|
|
7
7
|
@relation2 = Table.new(:photos)
|
|
8
|
-
@
|
|
8
|
+
@predicate1 = @relation1[:id].eq(@relation2[:user_id])
|
|
9
|
+
|
|
10
|
+
@relation3 = Table.new(:users, :as => :super_users)
|
|
11
|
+
@relation4 = Table.new(:photos, :as => :super_photos)
|
|
12
|
+
|
|
13
|
+
@predicate2 = @relation3[:id].eq(@relation2[:user_id])
|
|
14
|
+
@predicate3 = @relation3[:id].eq(@relation4[:user_id])
|
|
9
15
|
end
|
|
10
16
|
|
|
11
17
|
describe '#to_sql' do
|
|
18
|
+
|
|
12
19
|
describe 'when joining with another relation' do
|
|
13
20
|
it 'manufactures sql joining the two tables on the predicate' do
|
|
14
|
-
sql = InnerJoin.new(@relation1, @relation2, @
|
|
21
|
+
sql = InnerJoin.new(@relation1, @relation2, @predicate1).to_sql
|
|
15
22
|
|
|
16
23
|
adapter_is :mysql do
|
|
17
24
|
sql.should be_like(%Q{
|
|
@@ -29,6 +36,51 @@ module Arel
|
|
|
29
36
|
})
|
|
30
37
|
end
|
|
31
38
|
end
|
|
39
|
+
|
|
40
|
+
describe 'when joining with another relation with an aliased table' do
|
|
41
|
+
it 'manufactures sql joining the two tables on the predicate respecting table aliasing' do
|
|
42
|
+
sql = InnerJoin.new(@relation3, @relation2, @predicate2).to_sql
|
|
43
|
+
|
|
44
|
+
adapter_is :mysql do
|
|
45
|
+
sql.should be_like(%Q{
|
|
46
|
+
SELECT `super_users`.`id`, `super_users`.`name`, `photos`.`id`, `photos`.`user_id`, `photos`.`camera_id`
|
|
47
|
+
FROM `users` AS `super_users`
|
|
48
|
+
INNER JOIN `photos` ON `super_users`.`id` = `photos`.`user_id`
|
|
49
|
+
})
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
adapter_is_not :mysql do
|
|
53
|
+
sql.should be_like(%Q{
|
|
54
|
+
SELECT "super_users"."id", "super_users"."name", "photos"."id", "photos"."user_id", "photos"."camera_id"
|
|
55
|
+
FROM "users" AS "super_users"
|
|
56
|
+
INNER JOIN "photos" ON "super_users"."id" = "photos"."user_id"
|
|
57
|
+
})
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
describe 'when joining with two relations with aliased tables' do
|
|
63
|
+
it 'manufactures sql joining the two tables on the predicate respecting table aliasing' do
|
|
64
|
+
sql = InnerJoin.new(@relation3, @relation4, @predicate3).to_sql
|
|
65
|
+
|
|
66
|
+
adapter_is :mysql do
|
|
67
|
+
sql.should be_like(%Q{
|
|
68
|
+
SELECT `super_users`.`id`, `super_users`.`name`, `super_photos`.`id`, `super_photos`.`user_id`, `super_photos`.`camera_id`
|
|
69
|
+
FROM `users` AS `super_users`
|
|
70
|
+
INNER JOIN `photos` AS `super_photos` ON `super_users`.`id` = `super_photos`.`user_id`
|
|
71
|
+
})
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
adapter_is_not :mysql do
|
|
75
|
+
sql.should be_like(%Q{
|
|
76
|
+
SELECT "super_users"."id", "super_users"."name", "super_photos"."id", "super_photos"."user_id", "super_photos"."camera_id"
|
|
77
|
+
FROM "users" AS "super_users"
|
|
78
|
+
INNER JOIN "photos" AS "super_photos" ON "super_users"."id" = "super_photos"."user_id"
|
|
79
|
+
})
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
32
84
|
end
|
|
33
85
|
|
|
34
86
|
describe 'when joining with a string' do
|
|
@@ -51,7 +103,36 @@ module Arel
|
|
|
51
103
|
})
|
|
52
104
|
end
|
|
53
105
|
end
|
|
54
|
-
|
|
106
|
+
|
|
107
|
+
it "passes the string when there are multiple string joins" do
|
|
108
|
+
relation = StringJoin.new(@relation1, "INNER JOIN asdf ON fdsa")
|
|
109
|
+
relation = StringJoin.new(relation, "INNER JOIN lifo ON fifo")
|
|
110
|
+
sql = StringJoin.new(relation, "INNER JOIN hatful ON hallow").to_sql
|
|
111
|
+
|
|
112
|
+
adapter_is :mysql do
|
|
113
|
+
sql.should be_like(%Q{
|
|
114
|
+
SELECT `users`.`id`, `users`.`name`
|
|
115
|
+
FROM `users`
|
|
116
|
+
INNER JOIN asdf ON fdsa
|
|
117
|
+
INNER JOIN lifo ON fifo
|
|
118
|
+
INNER JOIN hatful ON hallow
|
|
119
|
+
})
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
adapter_is_not :mysql do
|
|
123
|
+
sql.should be_like(%Q{
|
|
124
|
+
SELECT "users"."id", "users"."name"
|
|
125
|
+
FROM "users"
|
|
126
|
+
INNER JOIN asdf ON fdsa
|
|
127
|
+
INNER JOIN lifo ON fifo
|
|
128
|
+
INNER JOIN hatful ON hallow
|
|
129
|
+
})
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
|
|
55
136
|
end
|
|
56
137
|
end
|
|
57
138
|
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module Arel
|
|
4
|
+
describe Lock do
|
|
5
|
+
before do
|
|
6
|
+
@relation = Table.new(:users)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
describe '#to_sql' do
|
|
10
|
+
it "manufactures a simple select query lock" do
|
|
11
|
+
sql = @relation.lock.to_sql
|
|
12
|
+
|
|
13
|
+
adapter_is :mysql do
|
|
14
|
+
sql.should be_like(%Q{
|
|
15
|
+
SELECT `users`.`id`, `users`.`name`
|
|
16
|
+
FROM `users` FOR UPDATE
|
|
17
|
+
})
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
adapter_is :postgresql do
|
|
21
|
+
sql.should be_like(%Q{
|
|
22
|
+
SELECT "users"."id", "users"."name"
|
|
23
|
+
FROM "users" FOR UPDATE
|
|
24
|
+
})
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
adapter_is :sqlite3 do
|
|
28
|
+
sql.should be_like(%Q{
|
|
29
|
+
SELECT "users"."id", "users"."name"
|
|
30
|
+
FROM "users"
|
|
31
|
+
})
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "manufactures a select query locking with a given lock" do
|
|
36
|
+
sql = @relation.lock("LOCK IN SHARE MODE").to_sql
|
|
37
|
+
|
|
38
|
+
adapter_is :mysql do
|
|
39
|
+
sql.should be_like(%Q{
|
|
40
|
+
SELECT `users`.`id`, `users`.`name`
|
|
41
|
+
FROM `users` LOCK IN SHARE MODE
|
|
42
|
+
})
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
adapter_is :postgresql do
|
|
46
|
+
sql.should be_like(%Q{
|
|
47
|
+
SELECT "users"."id", "users"."name"
|
|
48
|
+
FROM "users" LOCK IN SHARE MODE
|
|
49
|
+
})
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
adapter_is :sqlite3 do
|
|
53
|
+
sql.should be_like(%Q{
|
|
54
|
+
SELECT "users"."id", "users"."name"
|
|
55
|
+
FROM "users"
|
|
56
|
+
})
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require
|
|
1
|
+
require 'spec_helper'
|
|
2
2
|
|
|
3
3
|
module Arel
|
|
4
4
|
describe Table do
|
|
@@ -26,6 +26,45 @@ module Arel
|
|
|
26
26
|
end
|
|
27
27
|
end
|
|
28
28
|
|
|
29
|
+
describe '#as' do
|
|
30
|
+
it "manufactures a simple select query using aliases" do
|
|
31
|
+
sql = @relation.as(:super_users).to_sql
|
|
32
|
+
|
|
33
|
+
adapter_is :mysql do
|
|
34
|
+
sql.should be_like(%Q{
|
|
35
|
+
SELECT `super_users`.`id`, `super_users`.`name`
|
|
36
|
+
FROM `users` AS `super_users`
|
|
37
|
+
})
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
adapter_is_not :mysql do
|
|
41
|
+
sql.should be_like(%Q{
|
|
42
|
+
SELECT "super_users"."id", "super_users"."name"
|
|
43
|
+
FROM "users" AS "super_users"
|
|
44
|
+
})
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it "does not apply alias if it's same as the table name" do
|
|
49
|
+
sql = @relation.as(:users).to_sql
|
|
50
|
+
|
|
51
|
+
adapter_is :mysql do
|
|
52
|
+
sql.should be_like(%Q{
|
|
53
|
+
SELECT `users`.`id`, `users`.`name`
|
|
54
|
+
FROM `users`
|
|
55
|
+
})
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
adapter_is_not :mysql do
|
|
59
|
+
sql.should be_like(%Q{
|
|
60
|
+
SELECT "users"."id", "users"."name"
|
|
61
|
+
FROM "users"
|
|
62
|
+
})
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
end
|
|
67
|
+
|
|
29
68
|
describe '#column_for' do
|
|
30
69
|
it "returns the column corresponding to the attribute" do
|
|
31
70
|
@relation.column_for(@relation[:id]).should == @relation.columns.detect { |c| c.name == 'id' }
|
|
@@ -42,8 +81,8 @@ module Arel
|
|
|
42
81
|
|
|
43
82
|
describe '#reset' do
|
|
44
83
|
it "reloads columns from the database" do
|
|
45
|
-
lambda {
|
|
46
|
-
lambda { @relation.reset
|
|
84
|
+
lambda { @relation.engine.stub!(:columns => []) }.should_not change { @relation.attributes }
|
|
85
|
+
lambda { @relation.reset }.should change { @relation.attributes }
|
|
47
86
|
end
|
|
48
87
|
end
|
|
49
88
|
end
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
require
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
class User
|
|
4
|
+
def self.primary_key
|
|
5
|
+
"id"
|
|
6
|
+
end
|
|
7
|
+
end
|
|
2
8
|
|
|
3
9
|
module Arel
|
|
4
10
|
describe Update do
|
|
@@ -45,17 +51,17 @@ module Arel
|
|
|
45
51
|
|
|
46
52
|
adapter_is :sqlite3 do
|
|
47
53
|
sql.should be_like(%Q{
|
|
48
|
-
UPDATE "users"
|
|
49
|
-
|
|
50
|
-
LIMIT 1
|
|
54
|
+
UPDATE "users" SET
|
|
55
|
+
"name" = 'nick'
|
|
56
|
+
WHERE "id" IN (SELECT "id" FROM "users" LIMIT 1)
|
|
51
57
|
})
|
|
52
58
|
end
|
|
53
59
|
|
|
54
60
|
adapter_is :postgresql do
|
|
55
61
|
sql.should be_like(%Q{
|
|
56
|
-
UPDATE "users"
|
|
57
|
-
|
|
58
|
-
LIMIT 1
|
|
62
|
+
UPDATE "users" SET
|
|
63
|
+
"name" = E'nick'
|
|
64
|
+
WHERE "id" IN (SELECT "id" FROM "users" LIMIT 1)
|
|
59
65
|
})
|
|
60
66
|
end
|
|
61
67
|
end
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
require "rubygems"
|
|
2
|
-
require "activerecord"
|
|
3
1
|
puts "Using native MySQL"
|
|
2
|
+
require "active_record"
|
|
3
|
+
require 'logger'
|
|
4
4
|
|
|
5
5
|
ActiveRecord::Base.logger = Logger.new("debug.log")
|
|
6
6
|
|
|
7
7
|
ActiveRecord::Base.configurations = {
|
|
8
8
|
'unit' => {
|
|
9
9
|
:adapter => 'mysql',
|
|
10
|
-
:username => '
|
|
10
|
+
:username => 'root',
|
|
11
11
|
:encoding => 'utf8',
|
|
12
12
|
:database => 'arel_unit',
|
|
13
13
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
require "rubygems"
|
|
2
|
-
require "activerecord"
|
|
3
1
|
puts "Using native SQLite3"
|
|
2
|
+
require "active_record"
|
|
3
|
+
require 'logger'
|
|
4
4
|
|
|
5
5
|
ActiveRecord::Base.logger = Logger.new("debug.log")
|
|
6
6
|
|
|
@@ -16,6 +16,7 @@ ActiveRecord::Base.configurations = {
|
|
|
16
16
|
|
|
17
17
|
unless File.exist?(db_file)
|
|
18
18
|
puts "SQLite3 database not found at #{db_file}. Rebuilding it."
|
|
19
|
+
require 'fileutils'
|
|
19
20
|
FileUtils.mkdir_p(File.dirname(db_file))
|
|
20
21
|
sqlite_command = %Q{sqlite3 "#{db_file}" "create table a (a integer); drop table a;"}
|
|
21
22
|
puts "Executing '#{sqlite_command}'"
|
data/spec/doubles/hash.rb
CHANGED
|
@@ -3,18 +3,22 @@ class Hash
|
|
|
3
3
|
to_a.sort { |(key1, value1), (key2, value2)| key1.hash <=> key2.hash }
|
|
4
4
|
end
|
|
5
5
|
|
|
6
|
+
undef :keys
|
|
6
7
|
def keys
|
|
7
8
|
ordered_array.collect(&:first)
|
|
8
9
|
end
|
|
9
10
|
|
|
11
|
+
undef :values
|
|
10
12
|
def values
|
|
11
13
|
ordered_array.collect { |_, v| v }
|
|
12
14
|
end
|
|
13
15
|
|
|
16
|
+
undef :each
|
|
14
17
|
def each(&block)
|
|
15
18
|
ordered_array.each(&block)
|
|
16
19
|
end
|
|
17
20
|
|
|
21
|
+
undef :shift
|
|
18
22
|
def shift
|
|
19
23
|
returning to_a.first do |k, v|
|
|
20
24
|
delete(k)
|
|
@@ -11,6 +11,13 @@ sql = <<-SQL
|
|
|
11
11
|
user_id INTEGER NOT NULL,
|
|
12
12
|
camera_id INTEGER NOT NULL
|
|
13
13
|
);
|
|
14
|
+
DROP TABLE IF EXISTS developers;
|
|
15
|
+
CREATE TABLE developers (
|
|
16
|
+
id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
|
17
|
+
name VARCHAR(255) NOT NULL,
|
|
18
|
+
salary INTEGER NOT NULL,
|
|
19
|
+
department VARCHAR(255) NOT NULL
|
|
20
|
+
);
|
|
14
21
|
SQL
|
|
15
22
|
|
|
16
23
|
sql.split(/;/).select(&:present?).each do |sql_statement|
|
|
@@ -11,6 +11,13 @@ sql = <<-SQL
|
|
|
11
11
|
user_id INTEGER NOT NULL,
|
|
12
12
|
camera_id INTEGER NOT NULL
|
|
13
13
|
);
|
|
14
|
+
DROP TABLE IF EXISTS developers;
|
|
15
|
+
CREATE TABLE developers (
|
|
16
|
+
id SERIAL PRIMARY KEY NOT NULL,
|
|
17
|
+
name VARCHAR(255) NOT NULL,
|
|
18
|
+
salary INTEGER NOT NULL,
|
|
19
|
+
department VARCHAR(255) NOT NULL
|
|
20
|
+
);
|
|
14
21
|
SQL
|
|
15
22
|
|
|
16
23
|
sql.split(/;/).select(&:present?).each do |sql_statement|
|
|
@@ -11,6 +11,13 @@ sql = <<-SQL
|
|
|
11
11
|
user_id INTEGER NOT NULL,
|
|
12
12
|
camera_id INTEGER NOT NULL
|
|
13
13
|
);
|
|
14
|
+
DROP TABLE IF EXISTS developers;
|
|
15
|
+
CREATE TABLE developers (
|
|
16
|
+
id INTEGER NOT NULL PRIMARY KEY,
|
|
17
|
+
name VARCHAR(255) NOT NULL,
|
|
18
|
+
salary INTEGER NOT NULL,
|
|
19
|
+
department VARCHAR(255) NOT NULL
|
|
20
|
+
);
|
|
14
21
|
SQL
|
|
15
22
|
|
|
16
23
|
sql.split(/;/).select(&:present?).each do |sql_statement|
|
data/spec/spec.opts
ADDED
data/spec/spec_helper.rb
CHANGED
|
@@ -37,10 +37,18 @@ module AdapterGuards
|
|
|
37
37
|
end
|
|
38
38
|
end
|
|
39
39
|
|
|
40
|
+
module Check
|
|
41
|
+
# This is used to eliminate Ruby warnings on some RSpec assertion lines
|
|
42
|
+
# See: https://rspec.lighthouseapp.com/projects/5645/tickets/504
|
|
43
|
+
def check(*args)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
40
47
|
Spec::Runner.configure do |config|
|
|
41
48
|
config.include BeLikeMatcher, HashTheSameAsMatcher, DisambiguateAttributesMatcher
|
|
42
49
|
config.include AdapterGuards
|
|
43
|
-
config.
|
|
50
|
+
config.include Check
|
|
51
|
+
|
|
44
52
|
config.before do
|
|
45
53
|
Arel::Table.engine = Arel::Sql::Engine.new(ActiveRecord::Base)
|
|
46
54
|
end
|