arel-compat 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +25 -0
- data/README.markdown +182 -0
- data/lib/arel.rb +13 -0
- data/lib/arel/algebra.rb +10 -0
- data/lib/arel/algebra/attributes.rb +7 -0
- data/lib/arel/algebra/attributes/attribute.rb +270 -0
- data/lib/arel/algebra/attributes/boolean.rb +21 -0
- data/lib/arel/algebra/attributes/decimal.rb +9 -0
- data/lib/arel/algebra/attributes/float.rb +9 -0
- data/lib/arel/algebra/attributes/integer.rb +10 -0
- data/lib/arel/algebra/attributes/string.rb +10 -0
- data/lib/arel/algebra/attributes/time.rb +6 -0
- data/lib/arel/algebra/core_extensions.rb +4 -0
- data/lib/arel/algebra/core_extensions/class.rb +32 -0
- data/lib/arel/algebra/core_extensions/hash.rb +11 -0
- data/lib/arel/algebra/core_extensions/object.rb +30 -0
- data/lib/arel/algebra/core_extensions/symbol.rb +9 -0
- data/lib/arel/algebra/expression.rb +43 -0
- data/lib/arel/algebra/header.rb +67 -0
- data/lib/arel/algebra/ordering.rb +23 -0
- data/lib/arel/algebra/predicates.rb +190 -0
- data/lib/arel/algebra/relations.rb +17 -0
- data/lib/arel/algebra/relations/operations/alias.rb +7 -0
- data/lib/arel/algebra/relations/operations/from.rb +6 -0
- data/lib/arel/algebra/relations/operations/group.rb +12 -0
- data/lib/arel/algebra/relations/operations/having.rb +17 -0
- data/lib/arel/algebra/relations/operations/join.rb +69 -0
- data/lib/arel/algebra/relations/operations/lock.rb +12 -0
- data/lib/arel/algebra/relations/operations/order.rb +19 -0
- data/lib/arel/algebra/relations/operations/project.rb +20 -0
- data/lib/arel/algebra/relations/operations/skip.rb +7 -0
- data/lib/arel/algebra/relations/operations/take.rb +11 -0
- data/lib/arel/algebra/relations/operations/where.rb +17 -0
- data/lib/arel/algebra/relations/relation.rb +136 -0
- data/lib/arel/algebra/relations/row.rb +26 -0
- data/lib/arel/algebra/relations/utilities/compound.rb +54 -0
- data/lib/arel/algebra/relations/utilities/externalization.rb +24 -0
- data/lib/arel/algebra/relations/utilities/nil.rb +7 -0
- data/lib/arel/algebra/relations/writes.rb +36 -0
- data/lib/arel/algebra/value.rb +14 -0
- data/lib/arel/engines.rb +2 -0
- data/lib/arel/engines/memory.rb +4 -0
- data/lib/arel/engines/memory/engine.rb +16 -0
- data/lib/arel/engines/memory/predicates.rb +99 -0
- data/lib/arel/engines/memory/primitives.rb +27 -0
- data/lib/arel/engines/memory/relations.rb +5 -0
- data/lib/arel/engines/memory/relations/array.rb +35 -0
- data/lib/arel/engines/memory/relations/compound.rb +9 -0
- data/lib/arel/engines/memory/relations/operations.rb +67 -0
- data/lib/arel/engines/memory/relations/writes.rb +7 -0
- data/lib/arel/engines/sql.rb +8 -0
- data/lib/arel/engines/sql/attributes.rb +40 -0
- data/lib/arel/engines/sql/christener.rb +14 -0
- data/lib/arel/engines/sql/compilers/ibm_db_compiler.rb +48 -0
- data/lib/arel/engines/sql/compilers/mysql_compiler.rb +11 -0
- data/lib/arel/engines/sql/compilers/oracle_compiler.rb +95 -0
- data/lib/arel/engines/sql/compilers/postgresql_compiler.rb +42 -0
- data/lib/arel/engines/sql/compilers/sqlite_compiler.rb +9 -0
- data/lib/arel/engines/sql/core_extensions.rb +4 -0
- data/lib/arel/engines/sql/core_extensions/array.rb +24 -0
- data/lib/arel/engines/sql/core_extensions/nil_class.rb +15 -0
- data/lib/arel/engines/sql/core_extensions/object.rb +19 -0
- data/lib/arel/engines/sql/core_extensions/range.rb +19 -0
- data/lib/arel/engines/sql/engine.rb +55 -0
- data/lib/arel/engines/sql/formatters.rb +122 -0
- data/lib/arel/engines/sql/predicates.rb +103 -0
- data/lib/arel/engines/sql/primitives.rb +97 -0
- data/lib/arel/engines/sql/relations.rb +10 -0
- data/lib/arel/engines/sql/relations/compiler.rb +118 -0
- data/lib/arel/engines/sql/relations/operations/alias.rb +5 -0
- data/lib/arel/engines/sql/relations/operations/join.rb +33 -0
- data/lib/arel/engines/sql/relations/relation.rb +65 -0
- data/lib/arel/engines/sql/relations/table.rb +88 -0
- data/lib/arel/engines/sql/relations/utilities/compound.rb +10 -0
- data/lib/arel/engines/sql/relations/utilities/externalization.rb +14 -0
- data/lib/arel/engines/sql/relations/utilities/nil.rb +6 -0
- data/lib/arel/engines/sql/relations/utilities/recursion.rb +13 -0
- data/lib/arel/engines/sql/relations/writes.rb +19 -0
- data/lib/arel/session.rb +51 -0
- data/lib/arel/version.rb +3 -0
- data/spec/algebra/unit/predicates/binary_spec.rb +35 -0
- data/spec/algebra/unit/predicates/equality_spec.rb +29 -0
- data/spec/algebra/unit/predicates/in_spec.rb +12 -0
- data/spec/algebra/unit/primitives/attribute_spec.rb +181 -0
- data/spec/algebra/unit/primitives/expression_spec.rb +45 -0
- data/spec/algebra/unit/primitives/value_spec.rb +15 -0
- data/spec/algebra/unit/relations/alias_spec.rb +16 -0
- data/spec/algebra/unit/relations/delete_spec.rb +9 -0
- data/spec/algebra/unit/relations/group_spec.rb +10 -0
- data/spec/algebra/unit/relations/insert_spec.rb +9 -0
- data/spec/algebra/unit/relations/join_spec.rb +25 -0
- data/spec/algebra/unit/relations/order_spec.rb +21 -0
- data/spec/algebra/unit/relations/project_spec.rb +34 -0
- data/spec/algebra/unit/relations/relation_spec.rb +187 -0
- data/spec/algebra/unit/relations/skip_spec.rb +10 -0
- data/spec/algebra/unit/relations/table_spec.rb +38 -0
- data/spec/algebra/unit/relations/take_spec.rb +10 -0
- data/spec/algebra/unit/relations/update_spec.rb +9 -0
- data/spec/algebra/unit/relations/where_spec.rb +19 -0
- data/spec/algebra/unit/session/session_spec.rb +84 -0
- data/spec/attributes/boolean_spec.rb +57 -0
- data/spec/attributes/float_spec.rb +119 -0
- data/spec/attributes/header_spec.rb +42 -0
- data/spec/attributes/integer_spec.rb +119 -0
- data/spec/attributes/string_spec.rb +43 -0
- data/spec/attributes/time_spec.rb +24 -0
- data/spec/engines/memory/integration/joins/cross_engine_spec.rb +51 -0
- data/spec/engines/memory/unit/relations/array_spec.rb +32 -0
- data/spec/engines/memory/unit/relations/insert_spec.rb +28 -0
- data/spec/engines/memory/unit/relations/join_spec.rb +31 -0
- data/spec/engines/memory/unit/relations/order_spec.rb +27 -0
- data/spec/engines/memory/unit/relations/project_spec.rb +27 -0
- data/spec/engines/memory/unit/relations/skip_spec.rb +26 -0
- data/spec/engines/memory/unit/relations/take_spec.rb +26 -0
- data/spec/engines/memory/unit/relations/where_spec.rb +39 -0
- data/spec/engines/sql/integration/joins/with_adjacency_spec.rb +258 -0
- data/spec/engines/sql/integration/joins/with_aggregations_spec.rb +221 -0
- data/spec/engines/sql/integration/joins/with_compounds_spec.rb +137 -0
- data/spec/engines/sql/unit/engine_spec.rb +45 -0
- data/spec/engines/sql/unit/predicates/binary_spec.rb +140 -0
- data/spec/engines/sql/unit/predicates/equality_spec.rb +75 -0
- data/spec/engines/sql/unit/predicates/in_spec.rb +179 -0
- data/spec/engines/sql/unit/predicates/noteq_spec.rb +75 -0
- data/spec/engines/sql/unit/predicates/predicates_spec.rb +79 -0
- data/spec/engines/sql/unit/primitives/attribute_spec.rb +36 -0
- data/spec/engines/sql/unit/primitives/expression_spec.rb +28 -0
- data/spec/engines/sql/unit/primitives/literal_spec.rb +43 -0
- data/spec/engines/sql/unit/primitives/value_spec.rb +29 -0
- data/spec/engines/sql/unit/relations/alias_spec.rb +53 -0
- data/spec/engines/sql/unit/relations/delete_spec.rb +83 -0
- data/spec/engines/sql/unit/relations/from_spec.rb +64 -0
- data/spec/engines/sql/unit/relations/group_spec.rb +72 -0
- data/spec/engines/sql/unit/relations/having_spec.rb +78 -0
- data/spec/engines/sql/unit/relations/insert_spec.rb +143 -0
- data/spec/engines/sql/unit/relations/join_spec.rb +180 -0
- data/spec/engines/sql/unit/relations/lock_spec.rb +86 -0
- data/spec/engines/sql/unit/relations/order_spec.rb +161 -0
- data/spec/engines/sql/unit/relations/project_spec.rb +143 -0
- data/spec/engines/sql/unit/relations/skip_spec.rb +41 -0
- data/spec/engines/sql/unit/relations/table_spec.rb +129 -0
- data/spec/engines/sql/unit/relations/take_spec.rb +49 -0
- data/spec/engines/sql/unit/relations/update_spec.rb +203 -0
- data/spec/engines/sql/unit/relations/where_spec.rb +72 -0
- data/spec/relations/join_spec.rb +42 -0
- data/spec/relations/relation_spec.rb +31 -0
- data/spec/shared/relation_spec.rb +255 -0
- data/spec/spec_helper.rb +36 -0
- data/spec/support/check.rb +6 -0
- data/spec/support/connections/mysql_connection.rb +14 -0
- data/spec/support/connections/oracle_connection.rb +17 -0
- data/spec/support/connections/postgresql_connection.rb +13 -0
- data/spec/support/connections/sqlite3_connection.rb +24 -0
- data/spec/support/guards.rb +28 -0
- data/spec/support/matchers.rb +4 -0
- data/spec/support/matchers/be_like.rb +24 -0
- data/spec/support/matchers/disambiguate_attributes.rb +28 -0
- data/spec/support/matchers/hash_the_same_as.rb +26 -0
- data/spec/support/matchers/have_rows.rb +18 -0
- data/spec/support/model.rb +62 -0
- data/spec/support/schemas/mysql_schema.rb +26 -0
- data/spec/support/schemas/oracle_schema.rb +20 -0
- data/spec/support/schemas/postgresql_schema.rb +26 -0
- data/spec/support/schemas/sqlite3_schema.rb +26 -0
- metadata +258 -0
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Arel" do
|
4
|
+
before :all do
|
5
|
+
@owner = Arel::Model.build do |r|
|
6
|
+
r.engine Arel::Testing::Engine.new
|
7
|
+
|
8
|
+
r.attribute :id, Arel::Attributes::Integer
|
9
|
+
end
|
10
|
+
|
11
|
+
@thing = Arel::Model.build do |r|
|
12
|
+
r.engine Arel::Testing::Engine.new
|
13
|
+
|
14
|
+
r.attribute :id, Arel::Attributes::Integer
|
15
|
+
r.attribute :owner_id, Arel::Attributes::Integer
|
16
|
+
r.attribute :name, Arel::Attributes::String
|
17
|
+
r.attribute :age, Arel::Attributes::Integer
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "Join" do
|
22
|
+
before :all do
|
23
|
+
@relation = @thing.join(@owner).on(@thing[:owner_id].eq(@owner[:id]))
|
24
|
+
@expected = []
|
25
|
+
|
26
|
+
3.times do |owner_id|
|
27
|
+
@owner.insert([owner_id])
|
28
|
+
|
29
|
+
8.times do |i|
|
30
|
+
thing_id = owner_id * 8 + i
|
31
|
+
age = 2 * thing_id
|
32
|
+
name = "Name #{thing_id % 6}"
|
33
|
+
|
34
|
+
@thing.insert([thing_id, owner_id, name, age])
|
35
|
+
@expected << Arel::Row.new(@relation, [thing_id, owner_id, name, age, owner_id])
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
it_should_behave_like 'A Relation'
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Arel" do
|
4
|
+
before :all do
|
5
|
+
@engine = Arel::Testing::Engine.new
|
6
|
+
@relation = Arel::Model.build do |r|
|
7
|
+
r.engine @engine
|
8
|
+
|
9
|
+
r.attribute :id, Arel::Attributes::Integer
|
10
|
+
r.attribute :name, Arel::Attributes::String
|
11
|
+
r.attribute :age, Arel::Attributes::Integer
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "Relation" do
|
16
|
+
before :all do
|
17
|
+
@expected = (1..20).map { |i| @relation.insert([i, "Name #{i % 6}", 2 * i]) }
|
18
|
+
end
|
19
|
+
|
20
|
+
it_should_behave_like 'A Relation'
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "Relation" do
|
24
|
+
describe "#insert" do
|
25
|
+
it "inserts the row into the engine" do
|
26
|
+
@relation.insert([1, 'Foo', 10])
|
27
|
+
@engine.rows.should == [[1, 'Foo', 10]]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,255 @@
|
|
1
|
+
share_examples_for 'A Relation' do
|
2
|
+
|
3
|
+
before :all do
|
4
|
+
# The two needed instance variables need to be set in a
|
5
|
+
# before :all callback.
|
6
|
+
# @relation is the relation being tested here.
|
7
|
+
# @expected is an array of the elements that are expected to be in
|
8
|
+
# the relation.
|
9
|
+
%w[ @relation @expected ].each do |ivar|
|
10
|
+
raise "#{ivar} needs to be defined" unless instance_variable_get(ivar)
|
11
|
+
end
|
12
|
+
|
13
|
+
# There needs to be enough items to be able to run all the tests
|
14
|
+
raise "@expected needs to have at least 6 items" unless @expected.length >= 6
|
15
|
+
end
|
16
|
+
|
17
|
+
before :each do
|
18
|
+
@expected = @expected.dup
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "#each" do
|
22
|
+
it "iterates over the rows in any order" do
|
23
|
+
@relation.should have_rows(@expected)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "#where" do
|
28
|
+
before :all do
|
29
|
+
@expected = @expected.sort_by { |r| r[@relation[:age]] }
|
30
|
+
@pivot = @expected[@expected.length / 2]
|
31
|
+
end
|
32
|
+
|
33
|
+
it "finds rows with an equal to predicate" do
|
34
|
+
expected = @expected.select { |r| r[@relation[:age]] == @pivot[@relation[:age]] }
|
35
|
+
@relation.where(@relation[:age].eq(@pivot[@relation[:age]])).should have_rows(expected)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "finds rows with an equal to complement predicate" do
|
39
|
+
expected = @expected.select { |r| r[@relation[:age]] != @pivot[@relation[:age]] }
|
40
|
+
@relation.where(@relation[:age].eq(@pivot[@relation[:age]]).complement).should have_rows(expected)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "finds rows with a not eq predicate" do
|
44
|
+
expected = @expected.select { |r| r[@relation[:age]] != @pivot[@relation[:age]] }
|
45
|
+
@relation.where(@relation[:age].not_eq(@pivot[@relation[:age]])).should have_rows(expected)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "finds rows with an not eq complement predicate" do
|
49
|
+
expected = @expected.select { |r| r[@relation[:age]] == @pivot[@relation[:age]] }
|
50
|
+
@relation.where(@relation[:age].not_eq(@pivot[@relation[:age]]).complement).should have_rows(expected)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "finds rows with a less than predicate" do
|
54
|
+
expected = @expected.select { |r| r[@relation[:age]] < @pivot[@relation[:age]] }
|
55
|
+
@relation.where(@relation[:age].lt(@pivot[@relation[:age]])).should have_rows(expected)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "finds rows with a less than complement predicate" do
|
59
|
+
expected = @expected.select { |r| r[@relation[:age]] >= @pivot[@relation[:age]] }
|
60
|
+
@relation.where(@relation[:age].lt(@pivot[@relation[:age]]).complement).should have_rows(expected)
|
61
|
+
end
|
62
|
+
|
63
|
+
it "finds rows with a less than or equal to predicate" do
|
64
|
+
expected = @expected.select { |r| r[@relation[:age]] <= @pivot[@relation[:age]] }
|
65
|
+
@relation.where(@relation[:age].lteq(@pivot[@relation[:age]])).should have_rows(expected)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "finds rows with a less than or equal to complement predicate" do
|
69
|
+
expected = @expected.select { |r| r[@relation[:age]] > @pivot[@relation[:age]] }
|
70
|
+
@relation.where(@relation[:age].lteq(@pivot[@relation[:age]]).complement).should have_rows(expected)
|
71
|
+
end
|
72
|
+
|
73
|
+
it "finds rows with a greater than predicate" do
|
74
|
+
expected = @expected.select { |r| r[@relation[:age]] > @pivot[@relation[:age]] }
|
75
|
+
@relation.where(@relation[:age].gt(@pivot[@relation[:age]])).should have_rows(expected)
|
76
|
+
end
|
77
|
+
|
78
|
+
it "finds rows with a greater than complement predicate" do
|
79
|
+
expected = @expected.select { |r| r[@relation[:age]] <= @pivot[@relation[:age]] }
|
80
|
+
@relation.where(@relation[:age].gt(@pivot[@relation[:age]]).complement).should have_rows(expected)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "finds rows with a greater than or equal to predicate" do
|
84
|
+
expected = @expected.select { |r| r[@relation[:age]] >= @pivot[@relation[:age]] }
|
85
|
+
@relation.where(@relation[:age].gteq(@pivot[@relation[:age]])).should have_rows(expected)
|
86
|
+
end
|
87
|
+
|
88
|
+
it "finds rows with a greater than or equal to complement predicate" do
|
89
|
+
expected = @expected.select { |r| r[@relation[:age]] < @pivot[@relation[:age]] }
|
90
|
+
@relation.where(@relation[:age].gteq(@pivot[@relation[:age]]).complement).should have_rows(expected)
|
91
|
+
end
|
92
|
+
|
93
|
+
it "finds rows with a matches predicate" do
|
94
|
+
expected = @expected.select { |r| r[@relation[:name]] =~ /#{@pivot[@relation[:name]]}/ }
|
95
|
+
@relation.where(@relation[:name].matches(/#{@pivot[@relation[:name]]}/)).should have_rows(expected)
|
96
|
+
end
|
97
|
+
|
98
|
+
it "finds rows with a matches complement predicate" do
|
99
|
+
expected = @expected.select { |r| r[@relation[:name]] !~ /#{@pivot[@relation[:name]]}/ }
|
100
|
+
@relation.where(@relation[:name].matches(/#{@pivot[@relation[:name]]}/).complement).should have_rows(expected)
|
101
|
+
end
|
102
|
+
|
103
|
+
it "finds rows with a not matches predicate" do
|
104
|
+
expected = @expected.select { |r| r[@relation[:name]] !~ /#{@pivot[@relation[:name]]}/ }
|
105
|
+
@relation.where(@relation[:name].not_matches(/#{@pivot[@relation[:name]]}/)).should have_rows(expected)
|
106
|
+
end
|
107
|
+
|
108
|
+
it "finds rows with a not matches complement predicate" do
|
109
|
+
expected = @expected.select { |r| r[@relation[:name]] =~ /#{@pivot[@relation[:name]]}/ }
|
110
|
+
@relation.where(@relation[:name].not_matches(/#{@pivot[@relation[:name]]}/).complement).should have_rows(expected)
|
111
|
+
end
|
112
|
+
|
113
|
+
it "finds rows with an in predicate" do
|
114
|
+
expected = @expected.select {|r| r[@relation[:age]] >=3 && r[@relation[:age]] <= 20}
|
115
|
+
@relation.where(@relation[:age].in(3..20)).should have_rows(expected)
|
116
|
+
end
|
117
|
+
|
118
|
+
it "finds rows with an in complement predicate" do
|
119
|
+
expected = @expected.select {|r| !(r[@relation[:age]] >=3 && r[@relation[:age]] <= 20)}
|
120
|
+
@relation.where(@relation[:age].in(3..20).complement).should have_rows(expected)
|
121
|
+
end
|
122
|
+
|
123
|
+
it "finds rows with a not in predicate" do
|
124
|
+
expected = @expected.select {|r| !(r[@relation[:age]] >=3 && r[@relation[:age]] <= 20)}
|
125
|
+
@relation.where(@relation[:age].not_in(3..20)).should have_rows(expected)
|
126
|
+
end
|
127
|
+
|
128
|
+
it "finds rows with a not in complement predicate" do
|
129
|
+
expected = @expected.select {|r| r[@relation[:age]] >=3 && r[@relation[:age]] <= 20}
|
130
|
+
@relation.where(@relation[:age].not_in(3..20).complement).should have_rows(expected)
|
131
|
+
end
|
132
|
+
|
133
|
+
it "finds rows with a polyadic predicate of class Any" do
|
134
|
+
expected = @expected.select {|r| [2,4,8,16].include?(r[@relation[:age]])}
|
135
|
+
@relation.where(@relation[:age].in_any([2,4], [8, 16])).should have_rows(expected)
|
136
|
+
end
|
137
|
+
|
138
|
+
it "finds rows with a polyadic predicate of class Any complement" do
|
139
|
+
expected = @expected.select {|r| ![2,4,8,16].include?(r[@relation[:age]])}
|
140
|
+
@relation.where(@relation[:age].in_any([2,4], [8, 16]).complement).should have_rows(expected)
|
141
|
+
end
|
142
|
+
|
143
|
+
it "finds rows with a polyadic predicate of class All" do
|
144
|
+
expected = @expected.select {|r| r[@relation[:name]] =~ /Name/ && r[@relation[:name]] =~ /1/}
|
145
|
+
@relation.where(@relation[:name].matches_all(/Name/, /1/)).should have_rows(expected)
|
146
|
+
end
|
147
|
+
|
148
|
+
it "finds rows with a polyadic predicate of class All complement" do
|
149
|
+
expected = @expected.select {|r| !(r[@relation[:name]] =~ /Name/ && r[@relation[:name]] =~ /1/)}
|
150
|
+
@relation.where(@relation[:name].matches_all(/Name/, /1/).complement).should have_rows(expected)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
describe "#order" do
|
155
|
+
describe "by one attribute" do
|
156
|
+
before :all do
|
157
|
+
@expected.sort! { |a, b| a[@relation[:age]] <=> b[@relation[:age]]}.map! {|e| e[@relation[:id]]}
|
158
|
+
end
|
159
|
+
|
160
|
+
it "can be specified as ascending order" do
|
161
|
+
actual = []
|
162
|
+
@relation.order(@relation[:age].asc).each { |r| actual << r[@relation[:id]] }
|
163
|
+
actual.should == @expected
|
164
|
+
end
|
165
|
+
|
166
|
+
it "can be specified as descending order" do
|
167
|
+
actual = []
|
168
|
+
@relation.order(@relation[:age].desc).each { |r| actual << r[@relation[:id]] }
|
169
|
+
actual.should == @expected.reverse
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
describe "by two attributes in two separate calls to #order" do
|
174
|
+
before :all do
|
175
|
+
@expected = @expected.sort_by { |e| [e[@relation[:name]], e[@relation[:age]]]}.map {|e| e[@relation[:id]]}
|
176
|
+
end
|
177
|
+
|
178
|
+
it "can be specified as ascending order" do
|
179
|
+
actual = []
|
180
|
+
@relation.order(@relation[:age].asc).order(@relation[:name].asc).each { |r| actual << r[@relation[:id]] }
|
181
|
+
actual.should == @expected
|
182
|
+
end
|
183
|
+
|
184
|
+
it "can be specified as descending order" do
|
185
|
+
actual = []
|
186
|
+
@relation.order(@relation[:age].desc).order(@relation[:name].desc).each { |r| actual << r[@relation[:id]] }
|
187
|
+
actual.should == @expected.reverse
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
describe "by two attributes in one call to #order" do
|
192
|
+
before :all do
|
193
|
+
@expected = @expected.sort_by { |e| [e[@relation[:name]], e[@relation[:age]]]}.map {|e| e[@relation[:id]]}
|
194
|
+
end
|
195
|
+
|
196
|
+
it "can be specified as ascending order in one call to #order" do
|
197
|
+
actual = []
|
198
|
+
@relation.order(@relation[:name].asc, @relation[:age].asc).each { |r| actual << r[@relation[:id]] }
|
199
|
+
actual.should == @expected
|
200
|
+
end
|
201
|
+
|
202
|
+
it "can be specified as descending order in one call to #order" do
|
203
|
+
actual = []
|
204
|
+
@relation.order(@relation[:name].desc, @relation[:age].desc).each { |r| actual << r[@relation[:id]] }
|
205
|
+
actual.should == @expected.reverse
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
describe "#take" do
|
211
|
+
it "returns a relation" do
|
212
|
+
@relation.take(3).should be_a(Arel::Relation)
|
213
|
+
end
|
214
|
+
|
215
|
+
it "returns X items from the collection" do
|
216
|
+
length = @expected.length
|
217
|
+
|
218
|
+
@relation.take(3).each do |resource|
|
219
|
+
@expected.delete_if { |r| r.tuple == resource.tuple }
|
220
|
+
end
|
221
|
+
|
222
|
+
@expected.length.should == length - 3
|
223
|
+
end
|
224
|
+
|
225
|
+
it "works with ordering" do
|
226
|
+
expected = @expected.sort_by { |r| [r[@relation[:age]], r[@relation[:id]]] }.map { |r| r[@relation[:id]] }
|
227
|
+
actual = @relation.order(@relation[:age].asc, @relation[:id].asc).take(3).map { |r| r[@relation[:id]] }
|
228
|
+
|
229
|
+
actual.should == expected[0,3]
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
describe "#skip" do
|
234
|
+
it "returns a relation" do
|
235
|
+
@relation.skip(3).should be_a(Arel::Relation)
|
236
|
+
end
|
237
|
+
|
238
|
+
it "skips X items from the collection" do
|
239
|
+
length = @expected.length
|
240
|
+
|
241
|
+
@relation.skip(3).each do |resource|
|
242
|
+
@expected.delete_if { |r| r.tuple == resource.tuple }
|
243
|
+
end
|
244
|
+
|
245
|
+
@expected.length.should == 3
|
246
|
+
end
|
247
|
+
|
248
|
+
it "works with ordering" do
|
249
|
+
expected = @expected.sort_by { |r| [r[@relation[:age]], r[@relation[:id]]] }.map { |r| r[@relation[:id]] }
|
250
|
+
actual = @relation.order(@relation[:age].asc, @relation[:id].asc).skip(3).map { |r| r[@relation[:id]] }
|
251
|
+
|
252
|
+
actual.should == expected[3..-1]
|
253
|
+
end
|
254
|
+
end
|
255
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
dir = File.dirname(__FILE__)
|
2
|
+
$LOAD_PATH.unshift "#{dir}/../lib"
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'spec'
|
6
|
+
require 'pp'
|
7
|
+
require 'fileutils'
|
8
|
+
require 'arel'
|
9
|
+
|
10
|
+
if adapter = ENV['ADAPTER']
|
11
|
+
require "support/connections/#{adapter}_connection.rb"
|
12
|
+
end
|
13
|
+
|
14
|
+
Dir["#{dir}/{support,shared}/*.rb"].each do |file|
|
15
|
+
require file
|
16
|
+
end
|
17
|
+
|
18
|
+
Spec::Runner.configure do |config|
|
19
|
+
config.include Matchers
|
20
|
+
config.include AdapterGuards
|
21
|
+
config.include Check
|
22
|
+
|
23
|
+
if defined?(ActiveRecord::Base)
|
24
|
+
tmp = File.expand_path('../../tmp', __FILE__)
|
25
|
+
|
26
|
+
FileUtils.mkdir_p(tmp)
|
27
|
+
ActiveRecord::Base.logger = Logger.new("#{tmp}/debug.log")
|
28
|
+
ActiveRecord::Base.establish_connection("unit")
|
29
|
+
|
30
|
+
require "support/schemas/#{ENV['ADAPTER']}_schema.rb"
|
31
|
+
|
32
|
+
config.before do
|
33
|
+
Arel::Table.engine = Arel::Sql::Engine.new(ActiveRecord::Base)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
puts "Using native MySQL"
|
2
|
+
require "active_record"
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
ENV['ADAPTER'] = 'mysql'
|
6
|
+
|
7
|
+
ActiveRecord::Base.configurations = {
|
8
|
+
'unit' => {
|
9
|
+
:adapter => 'mysql',
|
10
|
+
:username => 'root',
|
11
|
+
:encoding => 'utf8',
|
12
|
+
:database => 'arel_unit',
|
13
|
+
}
|
14
|
+
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
puts "Using native Oracle"
|
2
|
+
require "active_record"
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
ENV['ADAPTER'] = 'oracle'
|
6
|
+
|
7
|
+
# Prepend oracle_enhanced local development directory in front of load path
|
8
|
+
$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../../../oracle-enhanced/lib"
|
9
|
+
|
10
|
+
ActiveRecord::Base.configurations = {
|
11
|
+
'unit' => {
|
12
|
+
:adapter => 'oracle_enhanced',
|
13
|
+
:username => 'arel_unit',
|
14
|
+
:password => 'arel_unit',
|
15
|
+
:database => 'orcl',
|
16
|
+
}
|
17
|
+
}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
puts "Using native PostgreSQL"
|
2
|
+
require "active_record"
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
ENV['ADAPTER'] = 'postgresql'
|
6
|
+
|
7
|
+
ActiveRecord::Base.configurations = {
|
8
|
+
'unit' => {
|
9
|
+
:adapter => 'postgresql',
|
10
|
+
:encoding => 'utf8',
|
11
|
+
:database => 'arel_unit',
|
12
|
+
}
|
13
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
puts "Using native SQLite3"
|
2
|
+
require "active_record"
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
ENV['ADAPTER'] = 'sqlite3'
|
6
|
+
|
7
|
+
db_file = "spec/support/fixtures/fixture_database.sqlite3"
|
8
|
+
|
9
|
+
ActiveRecord::Base.configurations = {
|
10
|
+
"unit" => {
|
11
|
+
:adapter => 'sqlite3',
|
12
|
+
:database => db_file,
|
13
|
+
:timeout => 5000
|
14
|
+
}
|
15
|
+
}
|
16
|
+
|
17
|
+
unless File.exist?(db_file)
|
18
|
+
puts "SQLite3 database not found at #{db_file}. Rebuilding it."
|
19
|
+
require 'fileutils'
|
20
|
+
FileUtils.mkdir_p(File.dirname(db_file))
|
21
|
+
sqlite_command = %Q{sqlite3 "#{db_file}" "create table a (a integer); drop table a;"}
|
22
|
+
puts "Executing '#{sqlite_command}'"
|
23
|
+
raise "Seems that there is no sqlite3 executable available" unless system(sqlite_command)
|
24
|
+
end
|