arel 0.1.0 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitmodules +3 -0
- data/README.markdown +26 -26
- data/Rakefile +34 -46
- data/Thorfile +122 -0
- data/arel.gemspec +205 -201
- data/lib/arel.rb +11 -7
- data/lib/arel/algebra.rb +7 -2
- data/lib/arel/algebra/{primitives/attribute.rb → attribute.rb} +7 -7
- data/lib/arel/algebra/core_extensions.rb +4 -0
- 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/{primitives/expression.rb → expression.rb} +0 -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/relation.rb +1 -1
- data/lib/arel/algebra/{primitives/value.rb → value.rb} +0 -0
- data/lib/arel/engines/memory/predicates.rb +26 -24
- data/lib/arel/engines/sql.rb +1 -1
- data/lib/arel/engines/sql/core_extensions.rb +4 -0
- data/lib/arel/engines/sql/{extensions → core_extensions}/array.rb +1 -1
- 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/formatters.rb +6 -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 +33 -9
- data/lib/arel/engines/sql/relations/writes.rb +41 -10
- data/lib/arel/session.rb +9 -6
- 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 +5 -5
- 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 +1 -1
- 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 +57 -55
- 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/group_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/insert_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/join_spec.rb +1 -1
- 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 +1 -1
- 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/spec.opts +3 -0
- data/spec/spec_helper.rb +8 -0
- metadata +39 -25
- data/VERSION +0 -1
- 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
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
module Arel
|
4
4
|
describe Order do
|
@@ -6,7 +6,7 @@ module Arel
|
|
6
6
|
@relation = Table.new(:users)
|
7
7
|
@attribute = @relation[:id]
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
describe "#==" do
|
11
11
|
it "returns true when the Orders are for the same attribute and direction" do
|
12
12
|
Ascending.new(@attribute).should == Ascending.new(@attribute)
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
module Arel
|
4
4
|
describe Relation do
|
@@ -17,8 +17,8 @@ module Arel
|
|
17
17
|
|
18
18
|
describe 'when given a', Symbol, String do
|
19
19
|
it "returns the attribute with the same name, if it exists" do
|
20
|
-
@relation[:id].should == @attribute1
|
21
|
-
@relation['id'].should == @attribute1
|
20
|
+
check @relation[:id].should == @attribute1
|
21
|
+
check @relation['id'].should == @attribute1
|
22
22
|
@relation[:does_not_exist].should be_nil
|
23
23
|
end
|
24
24
|
end
|
@@ -80,7 +80,7 @@ module Arel
|
|
80
80
|
|
81
81
|
describe '#where' do
|
82
82
|
before do
|
83
|
-
@predicate = Equality.new(@attribute1, @attribute2)
|
83
|
+
@predicate = Predicates::Equality.new(@attribute1, @attribute2)
|
84
84
|
end
|
85
85
|
|
86
86
|
it "manufactures a where relation" do
|
@@ -180,7 +180,7 @@ module Arel
|
|
180
180
|
|
181
181
|
describe Relation::Enumerable do
|
182
182
|
it "implements enumerable" do
|
183
|
-
@relation.collect.should == @relation.session.read(@relation).collect
|
183
|
+
check @relation.collect.should == @relation.session.read(@relation).collect
|
184
184
|
@relation.first.should == @relation.session.read(@relation).first
|
185
185
|
end
|
186
186
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
module Arel
|
4
4
|
describe Table do
|
@@ -9,7 +9,7 @@ module Arel
|
|
9
9
|
describe '[]' do
|
10
10
|
describe 'when given a', Symbol do
|
11
11
|
it "manufactures an attribute if the symbol names an attribute within the relation" do
|
12
|
-
@relation[:id].should == Attribute.new(@relation, :id)
|
12
|
+
check @relation[:id].should == Attribute.new(@relation, :id)
|
13
13
|
@relation[:does_not_exist].should be_nil
|
14
14
|
end
|
15
15
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
module Arel
|
4
4
|
describe Join do
|
@@ -10,9 +10,8 @@ module Arel
|
|
10
10
|
], [:id, :name])
|
11
11
|
@photos = Table.new(:photos)
|
12
12
|
@photos.delete
|
13
|
-
@photos
|
14
|
-
|
15
|
-
.insert(@photos[:id] => 2, @photos[:user_id] => 2, @photos[:camera_id] => 42)
|
13
|
+
@photos.insert(@photos[:id] => 1, @photos[:user_id] => 1, @photos[:camera_id] => 6)
|
14
|
+
@photos.insert(@photos[:id] => 2, @photos[:user_id] => 2, @photos[:camera_id] => 42)
|
16
15
|
end
|
17
16
|
|
18
17
|
describe 'when the in memory relation is on the left' do
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
module Arel
|
4
4
|
describe Insert do
|
@@ -14,13 +14,13 @@ module Arel
|
|
14
14
|
it "manufactures an array of hashes of attributes to values" do
|
15
15
|
@relation \
|
16
16
|
.insert(@relation[:id] => 4, @relation[:name] => 'guinea fowl') \
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
17
|
+
do |relation|
|
18
|
+
relation.should == [
|
19
|
+
Row.new(relation, [1, 'duck']),
|
20
|
+
Row.new(relation, [2, 'duck']),
|
21
|
+
Row.new(relation, [3, 'goose']),
|
22
|
+
Row.new(relation, [4, 'guinea fowl'])
|
23
|
+
]
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -1,113 +1,116 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
module Arel
|
4
|
-
|
5
|
-
|
6
|
-
@relation = Table.new(:users)
|
7
|
-
@attribute1 = @relation[:id]
|
8
|
-
@attribute2 = @relation[:name]
|
4
|
+
module Predicates
|
5
|
+
describe Binary do
|
9
6
|
class ConcreteBinary < Binary
|
10
7
|
def predicate_sql
|
11
8
|
"<=>"
|
12
9
|
end
|
13
10
|
end
|
14
|
-
end
|
15
11
|
|
16
|
-
describe "with compound predicates" do
|
17
12
|
before do
|
18
|
-
@
|
19
|
-
@
|
13
|
+
@relation = Table.new(:users)
|
14
|
+
@attribute1 = @relation[:id]
|
15
|
+
@attribute2 = @relation[:name]
|
20
16
|
end
|
21
17
|
|
22
|
-
describe
|
23
|
-
|
24
|
-
|
25
|
-
|
18
|
+
describe "with compound predicates" do
|
19
|
+
before do
|
20
|
+
@operand1 = ConcreteBinary.new(@attribute1, 1)
|
21
|
+
@operand2 = ConcreteBinary.new(@attribute2, "name")
|
22
|
+
end
|
26
23
|
|
27
|
-
|
28
|
-
|
29
|
-
|
24
|
+
describe Or do
|
25
|
+
describe "#to_sql" do
|
26
|
+
it "manufactures sql with an OR operation" do
|
27
|
+
sql = Or.new(@operand1, @operand2).to_sql
|
30
28
|
|
31
|
-
|
32
|
-
|
33
|
-
|
29
|
+
adapter_is :mysql do
|
30
|
+
sql.should be_like(%Q{(`users`.`id` <=> 1 OR `users`.`name` <=> 'name')})
|
31
|
+
end
|
32
|
+
|
33
|
+
adapter_is :postgresql do
|
34
|
+
sql.should be_like(%Q{("users"."id" <=> 1 OR "users"."name" <=> E'name')})
|
35
|
+
end
|
34
36
|
|
35
|
-
|
36
|
-
|
37
|
+
adapter_is :sqlite3 do
|
38
|
+
sql.should be_like(%Q{("users"."id" <=> 1 OR "users"."name" <=> 'name')})
|
39
|
+
end
|
37
40
|
end
|
38
41
|
end
|
39
42
|
end
|
40
|
-
end
|
41
43
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
44
|
+
describe And do
|
45
|
+
describe "#to_sql" do
|
46
|
+
it "manufactures sql with an AND operation" do
|
47
|
+
sql = And.new(@operand1, @operand2).to_sql
|
46
48
|
|
47
|
-
|
48
|
-
|
49
|
-
|
49
|
+
adapter_is :mysql do
|
50
|
+
sql.should be_like(%Q{(`users`.`id` <=> 1 AND `users`.`name` <=> 'name')})
|
51
|
+
end
|
50
52
|
|
51
|
-
|
52
|
-
|
53
|
-
|
53
|
+
adapter_is :sqlite3 do
|
54
|
+
sql.should be_like(%Q{("users"."id" <=> 1 AND "users"."name" <=> 'name')})
|
55
|
+
end
|
54
56
|
|
55
|
-
|
56
|
-
|
57
|
+
adapter_is :postgresql do
|
58
|
+
sql.should be_like(%Q{("users"."id" <=> 1 AND "users"."name" <=> E'name')})
|
59
|
+
end
|
57
60
|
end
|
58
61
|
end
|
59
62
|
end
|
60
63
|
end
|
61
|
-
end
|
62
64
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
65
|
+
describe '#to_sql' do
|
66
|
+
describe 'when relating two attributes' do
|
67
|
+
it 'manufactures sql with a binary operation' do
|
68
|
+
sql = ConcreteBinary.new(@attribute1, @attribute2).to_sql
|
67
69
|
|
68
|
-
|
69
|
-
|
70
|
-
|
70
|
+
adapter_is :mysql do
|
71
|
+
sql.should be_like(%Q{`users`.`id` <=> `users`.`name`})
|
72
|
+
end
|
71
73
|
|
72
|
-
|
73
|
-
|
74
|
+
adapter_is_not :mysql do
|
75
|
+
sql.should be_like(%Q{"users"."id" <=> "users"."name"})
|
76
|
+
end
|
74
77
|
end
|
75
78
|
end
|
76
|
-
end
|
77
79
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
80
|
+
describe 'when relating an attribute and a value' do
|
81
|
+
before do
|
82
|
+
@value = "1-asdf"
|
83
|
+
end
|
82
84
|
|
83
|
-
|
84
|
-
|
85
|
-
|
85
|
+
describe 'when relating to an integer attribute' do
|
86
|
+
it 'formats values as integers' do
|
87
|
+
sql = ConcreteBinary.new(@attribute1, @value).to_sql
|
86
88
|
|
87
|
-
|
88
|
-
|
89
|
-
|
89
|
+
adapter_is :mysql do
|
90
|
+
sql.should be_like(%Q{`users`.`id` <=> 1})
|
91
|
+
end
|
90
92
|
|
91
|
-
|
92
|
-
|
93
|
+
adapter_is_not :mysql do
|
94
|
+
sql.should be_like(%Q{"users"."id" <=> 1})
|
95
|
+
end
|
93
96
|
end
|
94
97
|
end
|
95
|
-
end
|
96
98
|
|
97
|
-
|
98
|
-
|
99
|
-
|
99
|
+
describe 'when relating to a string attribute' do
|
100
|
+
it 'formats values as strings' do
|
101
|
+
sql = ConcreteBinary.new(@attribute2, @value).to_sql
|
100
102
|
|
101
|
-
|
102
|
-
|
103
|
-
|
103
|
+
adapter_is :mysql do
|
104
|
+
sql.should be_like(%Q{`users`.`name` <=> '1-asdf'})
|
105
|
+
end
|
104
106
|
|
105
|
-
|
106
|
-
|
107
|
-
|
107
|
+
adapter_is :sqlite3 do
|
108
|
+
sql.should be_like(%Q{"users"."name" <=> '1-asdf'})
|
109
|
+
end
|
108
110
|
|
109
|
-
|
110
|
-
|
111
|
+
adapter_is :postgresql do
|
112
|
+
sql.should be_like(%Q{"users"."name" <=> E'1-asdf'})
|
113
|
+
end
|
111
114
|
end
|
112
115
|
end
|
113
116
|
end
|
@@ -1,43 +1,60 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
module Arel
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
4
|
+
module Predicates
|
5
|
+
describe Equality do
|
6
|
+
before do
|
7
|
+
@relation1 = Table.new(:users)
|
8
|
+
@relation2 = Table.new(:photos)
|
9
|
+
@attribute1 = @relation1[:id]
|
10
|
+
@attribute2 = @relation2[:user_id]
|
11
|
+
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
describe '#to_sql' do
|
14
|
+
describe 'when relating to a non-nil value' do
|
15
|
+
it "manufactures an equality predicate" do
|
16
|
+
sql = Equality.new(@attribute1, @attribute2).to_sql
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
18
|
+
adapter_is :mysql do
|
19
|
+
sql.should be_like(%Q{`users`.`id` = `photos`.`user_id`})
|
20
|
+
end
|
20
21
|
|
21
|
-
|
22
|
-
|
22
|
+
adapter_is_not :mysql do
|
23
|
+
sql.should be_like(%Q{"users"."id" = "photos"."user_id"})
|
24
|
+
end
|
23
25
|
end
|
24
26
|
end
|
25
|
-
end
|
26
27
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
28
|
+
describe 'when relation to a nil value' do
|
29
|
+
before do
|
30
|
+
@nil = nil
|
31
|
+
end
|
32
|
+
|
33
|
+
it "manufactures an is null predicate" do
|
34
|
+
sql = Equality.new(@attribute1, @nil).to_sql
|
31
35
|
|
32
|
-
|
33
|
-
|
36
|
+
adapter_is :mysql do
|
37
|
+
sql.should be_like(%Q{`users`.`id` IS NULL})
|
38
|
+
end
|
34
39
|
|
35
|
-
|
36
|
-
|
40
|
+
adapter_is_not :mysql do
|
41
|
+
sql.should be_like(%Q{"users"."id" IS NULL})
|
42
|
+
end
|
37
43
|
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "when relating to a nil Value" do
|
47
|
+
it "manufactures an IS NULL predicate" do
|
48
|
+
value = nil.bind(@relation1)
|
49
|
+
sql = Equality.new(@attribute1, value).to_sql
|
50
|
+
|
51
|
+
adapter_is :mysql do
|
52
|
+
sql.should be_like(%Q{`users`.`id` IS NULL})
|
53
|
+
end
|
38
54
|
|
39
|
-
|
40
|
-
|
55
|
+
adapter_is_not :mysql do
|
56
|
+
sql.should be_like(%Q{"users"."id" IS NULL})
|
57
|
+
end
|
41
58
|
end
|
42
59
|
end
|
43
60
|
end
|