arel 1.0.1 → 2.0.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.
Files changed (247) hide show
  1. data/MIT-LICENSE.txt +20 -0
  2. data/Manifest.txt +105 -0
  3. data/README.markdown +12 -32
  4. data/Rakefile +17 -0
  5. data/arel.gemspec +39 -0
  6. data/lib/arel.rb +30 -9
  7. data/lib/arel/attributes.rb +20 -0
  8. data/lib/arel/attributes/attribute.rb +190 -0
  9. data/lib/arel/compatibility/wheres.rb +33 -0
  10. data/lib/arel/crud.rb +37 -0
  11. data/lib/arel/delete_manager.rb +22 -0
  12. data/lib/arel/deprecated.rb +4 -0
  13. data/lib/arel/expression.rb +4 -0
  14. data/lib/arel/expressions.rb +23 -0
  15. data/lib/arel/insert_manager.rb +34 -0
  16. data/lib/arel/nodes.rb +44 -0
  17. data/lib/arel/nodes/and.rb +6 -0
  18. data/lib/arel/nodes/assignment.rb +6 -0
  19. data/lib/arel/nodes/avg.rb +6 -0
  20. data/lib/arel/nodes/between.rb +6 -0
  21. data/lib/arel/nodes/binary.rb +12 -0
  22. data/lib/arel/nodes/count.rb +13 -0
  23. data/lib/arel/nodes/delete_statement.rb +17 -0
  24. data/lib/arel/nodes/does_not_match.rb +6 -0
  25. data/lib/arel/nodes/equality.rb +9 -0
  26. data/lib/arel/nodes/exists.rb +11 -0
  27. data/lib/arel/nodes/function.rb +18 -0
  28. data/lib/arel/nodes/greater_than.rb +6 -0
  29. data/lib/arel/nodes/greater_than_or_equal.rb +6 -0
  30. data/lib/arel/nodes/group.rb +11 -0
  31. data/lib/arel/nodes/grouping.rb +11 -0
  32. data/lib/arel/nodes/having.rb +11 -0
  33. data/lib/arel/nodes/in.rb +6 -0
  34. data/lib/arel/nodes/inner_join.rb +6 -0
  35. data/lib/arel/nodes/insert_statement.rb +19 -0
  36. data/lib/arel/nodes/join.rb +13 -0
  37. data/lib/arel/nodes/less_than.rb +6 -0
  38. data/lib/arel/nodes/less_than_or_equal.rb +6 -0
  39. data/lib/arel/nodes/lock.rb +6 -0
  40. data/lib/arel/nodes/matches.rb +6 -0
  41. data/lib/arel/nodes/max.rb +6 -0
  42. data/lib/arel/nodes/min.rb +6 -0
  43. data/lib/arel/nodes/node.rb +30 -0
  44. data/lib/arel/nodes/not_equal.rb +6 -0
  45. data/lib/arel/nodes/not_in.rb +6 -0
  46. data/lib/arel/nodes/offset.rb +11 -0
  47. data/lib/arel/nodes/on.rb +11 -0
  48. data/lib/arel/nodes/or.rb +6 -0
  49. data/lib/arel/nodes/ordering.rb +19 -0
  50. data/lib/arel/nodes/outer_join.rb +6 -0
  51. data/lib/arel/nodes/select_core.rb +25 -0
  52. data/lib/arel/nodes/select_statement.rb +22 -0
  53. data/lib/arel/nodes/sql_literal.rb +7 -0
  54. data/lib/arel/nodes/string_join.rb +11 -0
  55. data/lib/arel/nodes/sum.rb +6 -0
  56. data/lib/arel/nodes/table_alias.rb +21 -0
  57. data/lib/arel/nodes/unqualified_column.rb +19 -0
  58. data/lib/arel/nodes/update_statement.rb +21 -0
  59. data/lib/arel/nodes/values.rb +12 -0
  60. data/lib/arel/relation.rb +6 -0
  61. data/lib/arel/select_manager.rb +203 -0
  62. data/lib/arel/sql/engine.rb +10 -0
  63. data/lib/arel/sql_literal.rb +1 -10
  64. data/lib/arel/table.rb +126 -0
  65. data/lib/arel/tree_manager.rb +26 -0
  66. data/lib/arel/update_manager.rb +48 -0
  67. data/lib/arel/visitors.rb +30 -0
  68. data/lib/arel/visitors/dot.rb +233 -0
  69. data/lib/arel/visitors/join_sql.rb +38 -0
  70. data/lib/arel/visitors/mysql.rb +16 -0
  71. data/lib/arel/visitors/oracle.rb +69 -0
  72. data/lib/arel/visitors/order_clauses.rb +9 -0
  73. data/lib/arel/visitors/postgresql.rb +54 -0
  74. data/lib/arel/visitors/to_sql.rb +301 -0
  75. data/lib/arel/visitors/where_sql.rb +9 -0
  76. data/spec/activerecord_compat_spec.rb +18 -0
  77. data/spec/attributes/attribute_spec.rb +648 -0
  78. data/spec/attributes_spec.rb +33 -6
  79. data/spec/crud_spec.rb +69 -0
  80. data/spec/delete_manager_spec.rb +53 -0
  81. data/spec/insert_manager_spec.rb +141 -0
  82. data/spec/nodes/count_spec.rb +18 -0
  83. data/spec/nodes/delete_statement_spec.rb +15 -0
  84. data/spec/nodes/equality_spec.rb +72 -0
  85. data/spec/nodes/insert_statement_spec.rb +18 -0
  86. data/spec/nodes/or_spec.rb +20 -0
  87. data/spec/nodes/select_core_spec.rb +21 -0
  88. data/spec/nodes/select_statement_spec.rb +14 -0
  89. data/spec/nodes/sql_literal_spec.rb +26 -0
  90. data/spec/nodes/sum_spec.rb +12 -0
  91. data/spec/nodes/update_statement_spec.rb +18 -0
  92. data/spec/select_manager_spec.rb +581 -0
  93. data/spec/spec.opts +3 -0
  94. data/spec/spec_helper.rb +6 -21
  95. data/spec/support/fake_record.rb +89 -0
  96. data/spec/support/shared/tree_manager_shared.rb +9 -0
  97. data/spec/table_spec.rb +176 -0
  98. data/spec/update_manager_spec.rb +89 -0
  99. data/spec/visitors/join_sql_spec.rb +35 -0
  100. data/spec/visitors/oracle_spec.rb +111 -0
  101. data/spec/visitors/to_sql_spec.rb +134 -0
  102. metadata +160 -260
  103. data/lib/arel/algebra.rb +0 -10
  104. data/lib/arel/algebra/attributes.rb +0 -7
  105. data/lib/arel/algebra/attributes/attribute.rb +0 -304
  106. data/lib/arel/algebra/attributes/boolean.rb +0 -21
  107. data/lib/arel/algebra/attributes/decimal.rb +0 -9
  108. data/lib/arel/algebra/attributes/float.rb +0 -9
  109. data/lib/arel/algebra/attributes/integer.rb +0 -10
  110. data/lib/arel/algebra/attributes/string.rb +0 -10
  111. data/lib/arel/algebra/attributes/time.rb +0 -6
  112. data/lib/arel/algebra/core_extensions.rb +0 -3
  113. data/lib/arel/algebra/core_extensions/hash.rb +0 -7
  114. data/lib/arel/algebra/core_extensions/object.rb +0 -13
  115. data/lib/arel/algebra/core_extensions/symbol.rb +0 -9
  116. data/lib/arel/algebra/expression.rb +0 -56
  117. data/lib/arel/algebra/header.rb +0 -66
  118. data/lib/arel/algebra/ordering.rb +0 -31
  119. data/lib/arel/algebra/predicates.rb +0 -306
  120. data/lib/arel/algebra/relations.rb +0 -16
  121. data/lib/arel/algebra/relations/operations/from.rb +0 -14
  122. data/lib/arel/algebra/relations/operations/group.rb +0 -14
  123. data/lib/arel/algebra/relations/operations/having.rb +0 -14
  124. data/lib/arel/algebra/relations/operations/join.rb +0 -103
  125. data/lib/arel/algebra/relations/operations/lock.rb +0 -10
  126. data/lib/arel/algebra/relations/operations/order.rb +0 -23
  127. data/lib/arel/algebra/relations/operations/project.rb +0 -20
  128. data/lib/arel/algebra/relations/operations/skip.rb +0 -14
  129. data/lib/arel/algebra/relations/operations/take.rb +0 -18
  130. data/lib/arel/algebra/relations/operations/where.rb +0 -24
  131. data/lib/arel/algebra/relations/relation.rb +0 -205
  132. data/lib/arel/algebra/relations/row.rb +0 -29
  133. data/lib/arel/algebra/relations/utilities/compound.rb +0 -55
  134. data/lib/arel/algebra/relations/utilities/externalization.rb +0 -26
  135. data/lib/arel/algebra/relations/utilities/nil.rb +0 -7
  136. data/lib/arel/algebra/relations/writes.rb +0 -47
  137. data/lib/arel/algebra/value.rb +0 -53
  138. data/lib/arel/engines.rb +0 -2
  139. data/lib/arel/engines/memory.rb +0 -2
  140. data/lib/arel/engines/memory/engine.rb +0 -10
  141. data/lib/arel/engines/memory/relations.rb +0 -2
  142. data/lib/arel/engines/memory/relations/array.rb +0 -37
  143. data/lib/arel/engines/memory/relations/operations.rb +0 -9
  144. data/lib/arel/engines/sql.rb +0 -6
  145. data/lib/arel/engines/sql/attributes.rb +0 -45
  146. data/lib/arel/engines/sql/christener.rb +0 -20
  147. data/lib/arel/engines/sql/compilers/ibm_db_compiler.rb +0 -48
  148. data/lib/arel/engines/sql/compilers/mysql_compiler.rb +0 -11
  149. data/lib/arel/engines/sql/compilers/oracle_compiler.rb +0 -106
  150. data/lib/arel/engines/sql/compilers/postgresql_compiler.rb +0 -50
  151. data/lib/arel/engines/sql/compilers/sqlite_compiler.rb +0 -9
  152. data/lib/arel/engines/sql/core_extensions.rb +0 -4
  153. data/lib/arel/engines/sql/core_extensions/array.rb +0 -24
  154. data/lib/arel/engines/sql/core_extensions/nil_class.rb +0 -15
  155. data/lib/arel/engines/sql/core_extensions/object.rb +0 -19
  156. data/lib/arel/engines/sql/core_extensions/range.rb +0 -19
  157. data/lib/arel/engines/sql/engine.rb +0 -47
  158. data/lib/arel/engines/sql/formatters.rb +0 -138
  159. data/lib/arel/engines/sql/relations.rb +0 -3
  160. data/lib/arel/engines/sql/relations/compiler.rb +0 -153
  161. data/lib/arel/engines/sql/relations/table.rb +0 -100
  162. data/lib/arel/engines/sql/relations/utilities/nil.rb +0 -6
  163. data/lib/arel/recursion/base_case.rb +0 -13
  164. data/lib/arel/session.rb +0 -35
  165. data/lib/arel/version.rb +0 -3
  166. data/spec/algebra/unit/predicates/binary_spec.rb +0 -35
  167. data/spec/algebra/unit/predicates/equality_spec.rb +0 -29
  168. data/spec/algebra/unit/predicates/in_spec.rb +0 -12
  169. data/spec/algebra/unit/predicates/inequality_spec.rb +0 -32
  170. data/spec/algebra/unit/predicates/predicate_spec.rb +0 -22
  171. data/spec/algebra/unit/primitives/attribute_spec.rb +0 -175
  172. data/spec/algebra/unit/primitives/expression_spec.rb +0 -39
  173. data/spec/algebra/unit/primitives/value_spec.rb +0 -15
  174. data/spec/algebra/unit/relations/alias_spec.rb +0 -16
  175. data/spec/algebra/unit/relations/delete_spec.rb +0 -9
  176. data/spec/algebra/unit/relations/group_spec.rb +0 -10
  177. data/spec/algebra/unit/relations/insert_spec.rb +0 -9
  178. data/spec/algebra/unit/relations/join_spec.rb +0 -18
  179. data/spec/algebra/unit/relations/order_spec.rb +0 -21
  180. data/spec/algebra/unit/relations/project_spec.rb +0 -34
  181. data/spec/algebra/unit/relations/relation_spec.rb +0 -241
  182. data/spec/algebra/unit/relations/skip_spec.rb +0 -10
  183. data/spec/algebra/unit/relations/table_spec.rb +0 -38
  184. data/spec/algebra/unit/relations/take_spec.rb +0 -10
  185. data/spec/algebra/unit/relations/update_spec.rb +0 -9
  186. data/spec/algebra/unit/relations/where_spec.rb +0 -19
  187. data/spec/algebra/unit/session/session_spec.rb +0 -84
  188. data/spec/attributes/boolean_spec.rb +0 -57
  189. data/spec/attributes/float_spec.rb +0 -119
  190. data/spec/attributes/header_spec.rb +0 -42
  191. data/spec/attributes/integer_spec.rb +0 -119
  192. data/spec/attributes/string_spec.rb +0 -43
  193. data/spec/attributes/time_spec.rb +0 -24
  194. data/spec/engines/memory/integration/joins/cross_engine_spec.rb +0 -61
  195. data/spec/engines/memory/unit/relations/array_spec.rb +0 -33
  196. data/spec/engines/memory/unit/relations/insert_spec.rb +0 -28
  197. data/spec/engines/memory/unit/relations/join_spec.rb +0 -32
  198. data/spec/engines/memory/unit/relations/order_spec.rb +0 -28
  199. data/spec/engines/memory/unit/relations/project_spec.rb +0 -27
  200. data/spec/engines/memory/unit/relations/skip_spec.rb +0 -31
  201. data/spec/engines/memory/unit/relations/take_spec.rb +0 -28
  202. data/spec/engines/memory/unit/relations/where_spec.rb +0 -43
  203. data/spec/engines/sql/integration/joins/with_adjacency_spec.rb +0 -258
  204. data/spec/engines/sql/integration/joins/with_aggregations_spec.rb +0 -221
  205. data/spec/engines/sql/integration/joins/with_compounds_spec.rb +0 -137
  206. data/spec/engines/sql/unit/engine_spec.rb +0 -65
  207. data/spec/engines/sql/unit/predicates/binary_spec.rb +0 -140
  208. data/spec/engines/sql/unit/predicates/equality_spec.rb +0 -75
  209. data/spec/engines/sql/unit/predicates/in_spec.rb +0 -179
  210. data/spec/engines/sql/unit/predicates/noteq_spec.rb +0 -75
  211. data/spec/engines/sql/unit/predicates/predicates_spec.rb +0 -79
  212. data/spec/engines/sql/unit/primitives/attribute_spec.rb +0 -36
  213. data/spec/engines/sql/unit/primitives/expression_spec.rb +0 -28
  214. data/spec/engines/sql/unit/primitives/literal_spec.rb +0 -43
  215. data/spec/engines/sql/unit/primitives/value_spec.rb +0 -29
  216. data/spec/engines/sql/unit/relations/alias_spec.rb +0 -53
  217. data/spec/engines/sql/unit/relations/delete_spec.rb +0 -83
  218. data/spec/engines/sql/unit/relations/from_spec.rb +0 -64
  219. data/spec/engines/sql/unit/relations/group_spec.rb +0 -72
  220. data/spec/engines/sql/unit/relations/having_spec.rb +0 -78
  221. data/spec/engines/sql/unit/relations/insert_spec.rb +0 -143
  222. data/spec/engines/sql/unit/relations/join_spec.rb +0 -180
  223. data/spec/engines/sql/unit/relations/lock_spec.rb +0 -86
  224. data/spec/engines/sql/unit/relations/order_spec.rb +0 -161
  225. data/spec/engines/sql/unit/relations/project_spec.rb +0 -143
  226. data/spec/engines/sql/unit/relations/skip_spec.rb +0 -41
  227. data/spec/engines/sql/unit/relations/table_spec.rb +0 -122
  228. data/spec/engines/sql/unit/relations/take_spec.rb +0 -75
  229. data/spec/engines/sql/unit/relations/update_spec.rb +0 -203
  230. data/spec/engines/sql/unit/relations/where_spec.rb +0 -72
  231. data/spec/relations/join_spec.rb +0 -42
  232. data/spec/relations/relation_spec.rb +0 -31
  233. data/spec/shared/relation_spec.rb +0 -255
  234. data/spec/sql/christener_spec.rb +0 -70
  235. data/spec/support/connections/mysql_connection.rb +0 -14
  236. data/spec/support/connections/oracle_connection.rb +0 -17
  237. data/spec/support/connections/postgresql_connection.rb +0 -13
  238. data/spec/support/connections/sqlite3_connection.rb +0 -24
  239. data/spec/support/guards.rb +0 -28
  240. data/spec/support/matchers/disambiguate_attributes.rb +0 -28
  241. data/spec/support/matchers/hash_the_same_as.rb +0 -26
  242. data/spec/support/matchers/have_rows.rb +0 -18
  243. data/spec/support/model.rb +0 -67
  244. data/spec/support/schemas/mysql_schema.rb +0 -26
  245. data/spec/support/schemas/oracle_schema.rb +0 -20
  246. data/spec/support/schemas/postgresql_schema.rb +0 -26
  247. data/spec/support/schemas/sqlite3_schema.rb +0 -26
@@ -1,42 +0,0 @@
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
@@ -1,31 +0,0 @@
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
@@ -1,255 +0,0 @@
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
@@ -1,70 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Arel
4
- module Sql
5
- describe "Christener" do
6
- it "returns the first name" do
7
- christener = Christener.new
8
- table = Table.new 'users'
9
- table2 = Table.new 'pictures'
10
- christener.name_for(table).should == 'users'
11
- christener.name_for(table2).should == 'pictures'
12
- christener.name_for(table).should == 'users'
13
- end
14
-
15
- it "returns a unique name for an alias" do
16
- christener = Christener.new
17
- table = Table.new 'users'
18
- table2 = Table.new 'users', :as => 'friends'
19
- christener.name_for(table).should == 'users'
20
- christener.name_for(table2).should == 'friends'
21
- end
22
-
23
- it "returns a unique name for an alias with same name" do
24
- christener = Christener.new
25
- table = Table.new 'users'
26
- table2 = Table.new 'friends', :as => 'users'
27
- christener.name_for(table).should == 'users'
28
- christener.name_for(table2).should == 'users_2'
29
- end
30
-
31
- it "returns alias name" do
32
- christener = Christener.new
33
- table = Table.new 'users'
34
- aliaz = Alias.new table
35
-
36
- christener.name_for(table).should == 'users'
37
- christener.name_for(aliaz).should == 'users_2'
38
- end
39
-
40
- it "returns alias first" do
41
- christener = Christener.new
42
- table = Table.new 'users'
43
- aliaz = Alias.new table
44
-
45
- christener.name_for(aliaz).should == 'users'
46
- christener.name_for(table).should == 'users_2'
47
- end
48
-
49
- it "returns externalization name" do
50
- christener = Christener.new
51
- table = Table.new 'users'
52
- ext = Externalization.new table
53
-
54
- christener.name_for(table).should == 'users'
55
- christener.name_for(ext).should == 'users_external'
56
- end
57
-
58
- it "returns aliases externalizations and tables" do
59
- christener = Christener.new
60
- table = Table.new 'users'
61
- aliaz = Alias.new table
62
- ext = Externalization.new table
63
-
64
- christener.name_for(table).should == 'users'
65
- christener.name_for(aliaz).should == 'users_2'
66
- christener.name_for(ext).should == 'users_external'
67
- end
68
- end
69
- end
70
- end
@@ -1,14 +0,0 @@
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
- }
@@ -1,17 +0,0 @@
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
- }
@@ -1,13 +0,0 @@
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
- }