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.
- data/MIT-LICENSE.txt +20 -0
- data/Manifest.txt +105 -0
- data/README.markdown +12 -32
- data/Rakefile +17 -0
- data/arel.gemspec +39 -0
- data/lib/arel.rb +30 -9
- data/lib/arel/attributes.rb +20 -0
- data/lib/arel/attributes/attribute.rb +190 -0
- data/lib/arel/compatibility/wheres.rb +33 -0
- data/lib/arel/crud.rb +37 -0
- data/lib/arel/delete_manager.rb +22 -0
- data/lib/arel/deprecated.rb +4 -0
- data/lib/arel/expression.rb +4 -0
- data/lib/arel/expressions.rb +23 -0
- data/lib/arel/insert_manager.rb +34 -0
- data/lib/arel/nodes.rb +44 -0
- data/lib/arel/nodes/and.rb +6 -0
- data/lib/arel/nodes/assignment.rb +6 -0
- data/lib/arel/nodes/avg.rb +6 -0
- data/lib/arel/nodes/between.rb +6 -0
- data/lib/arel/nodes/binary.rb +12 -0
- data/lib/arel/nodes/count.rb +13 -0
- data/lib/arel/nodes/delete_statement.rb +17 -0
- data/lib/arel/nodes/does_not_match.rb +6 -0
- data/lib/arel/nodes/equality.rb +9 -0
- data/lib/arel/nodes/exists.rb +11 -0
- data/lib/arel/nodes/function.rb +18 -0
- data/lib/arel/nodes/greater_than.rb +6 -0
- data/lib/arel/nodes/greater_than_or_equal.rb +6 -0
- data/lib/arel/nodes/group.rb +11 -0
- data/lib/arel/nodes/grouping.rb +11 -0
- data/lib/arel/nodes/having.rb +11 -0
- data/lib/arel/nodes/in.rb +6 -0
- data/lib/arel/nodes/inner_join.rb +6 -0
- data/lib/arel/nodes/insert_statement.rb +19 -0
- data/lib/arel/nodes/join.rb +13 -0
- data/lib/arel/nodes/less_than.rb +6 -0
- data/lib/arel/nodes/less_than_or_equal.rb +6 -0
- data/lib/arel/nodes/lock.rb +6 -0
- data/lib/arel/nodes/matches.rb +6 -0
- data/lib/arel/nodes/max.rb +6 -0
- data/lib/arel/nodes/min.rb +6 -0
- data/lib/arel/nodes/node.rb +30 -0
- data/lib/arel/nodes/not_equal.rb +6 -0
- data/lib/arel/nodes/not_in.rb +6 -0
- data/lib/arel/nodes/offset.rb +11 -0
- data/lib/arel/nodes/on.rb +11 -0
- data/lib/arel/nodes/or.rb +6 -0
- data/lib/arel/nodes/ordering.rb +19 -0
- data/lib/arel/nodes/outer_join.rb +6 -0
- data/lib/arel/nodes/select_core.rb +25 -0
- data/lib/arel/nodes/select_statement.rb +22 -0
- data/lib/arel/nodes/sql_literal.rb +7 -0
- data/lib/arel/nodes/string_join.rb +11 -0
- data/lib/arel/nodes/sum.rb +6 -0
- data/lib/arel/nodes/table_alias.rb +21 -0
- data/lib/arel/nodes/unqualified_column.rb +19 -0
- data/lib/arel/nodes/update_statement.rb +21 -0
- data/lib/arel/nodes/values.rb +12 -0
- data/lib/arel/relation.rb +6 -0
- data/lib/arel/select_manager.rb +203 -0
- data/lib/arel/sql/engine.rb +10 -0
- data/lib/arel/sql_literal.rb +1 -10
- data/lib/arel/table.rb +126 -0
- data/lib/arel/tree_manager.rb +26 -0
- data/lib/arel/update_manager.rb +48 -0
- data/lib/arel/visitors.rb +30 -0
- data/lib/arel/visitors/dot.rb +233 -0
- data/lib/arel/visitors/join_sql.rb +38 -0
- data/lib/arel/visitors/mysql.rb +16 -0
- data/lib/arel/visitors/oracle.rb +69 -0
- data/lib/arel/visitors/order_clauses.rb +9 -0
- data/lib/arel/visitors/postgresql.rb +54 -0
- data/lib/arel/visitors/to_sql.rb +301 -0
- data/lib/arel/visitors/where_sql.rb +9 -0
- data/spec/activerecord_compat_spec.rb +18 -0
- data/spec/attributes/attribute_spec.rb +648 -0
- data/spec/attributes_spec.rb +33 -6
- data/spec/crud_spec.rb +69 -0
- data/spec/delete_manager_spec.rb +53 -0
- data/spec/insert_manager_spec.rb +141 -0
- data/spec/nodes/count_spec.rb +18 -0
- data/spec/nodes/delete_statement_spec.rb +15 -0
- data/spec/nodes/equality_spec.rb +72 -0
- data/spec/nodes/insert_statement_spec.rb +18 -0
- data/spec/nodes/or_spec.rb +20 -0
- data/spec/nodes/select_core_spec.rb +21 -0
- data/spec/nodes/select_statement_spec.rb +14 -0
- data/spec/nodes/sql_literal_spec.rb +26 -0
- data/spec/nodes/sum_spec.rb +12 -0
- data/spec/nodes/update_statement_spec.rb +18 -0
- data/spec/select_manager_spec.rb +581 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_helper.rb +6 -21
- data/spec/support/fake_record.rb +89 -0
- data/spec/support/shared/tree_manager_shared.rb +9 -0
- data/spec/table_spec.rb +176 -0
- data/spec/update_manager_spec.rb +89 -0
- data/spec/visitors/join_sql_spec.rb +35 -0
- data/spec/visitors/oracle_spec.rb +111 -0
- data/spec/visitors/to_sql_spec.rb +134 -0
- metadata +160 -260
- data/lib/arel/algebra.rb +0 -10
- data/lib/arel/algebra/attributes.rb +0 -7
- data/lib/arel/algebra/attributes/attribute.rb +0 -304
- data/lib/arel/algebra/attributes/boolean.rb +0 -21
- data/lib/arel/algebra/attributes/decimal.rb +0 -9
- data/lib/arel/algebra/attributes/float.rb +0 -9
- data/lib/arel/algebra/attributes/integer.rb +0 -10
- data/lib/arel/algebra/attributes/string.rb +0 -10
- data/lib/arel/algebra/attributes/time.rb +0 -6
- data/lib/arel/algebra/core_extensions.rb +0 -3
- data/lib/arel/algebra/core_extensions/hash.rb +0 -7
- data/lib/arel/algebra/core_extensions/object.rb +0 -13
- data/lib/arel/algebra/core_extensions/symbol.rb +0 -9
- data/lib/arel/algebra/expression.rb +0 -56
- data/lib/arel/algebra/header.rb +0 -66
- data/lib/arel/algebra/ordering.rb +0 -31
- data/lib/arel/algebra/predicates.rb +0 -306
- data/lib/arel/algebra/relations.rb +0 -16
- data/lib/arel/algebra/relations/operations/from.rb +0 -14
- data/lib/arel/algebra/relations/operations/group.rb +0 -14
- data/lib/arel/algebra/relations/operations/having.rb +0 -14
- data/lib/arel/algebra/relations/operations/join.rb +0 -103
- data/lib/arel/algebra/relations/operations/lock.rb +0 -10
- data/lib/arel/algebra/relations/operations/order.rb +0 -23
- data/lib/arel/algebra/relations/operations/project.rb +0 -20
- data/lib/arel/algebra/relations/operations/skip.rb +0 -14
- data/lib/arel/algebra/relations/operations/take.rb +0 -18
- data/lib/arel/algebra/relations/operations/where.rb +0 -24
- data/lib/arel/algebra/relations/relation.rb +0 -205
- data/lib/arel/algebra/relations/row.rb +0 -29
- data/lib/arel/algebra/relations/utilities/compound.rb +0 -55
- data/lib/arel/algebra/relations/utilities/externalization.rb +0 -26
- data/lib/arel/algebra/relations/utilities/nil.rb +0 -7
- data/lib/arel/algebra/relations/writes.rb +0 -47
- data/lib/arel/algebra/value.rb +0 -53
- data/lib/arel/engines.rb +0 -2
- data/lib/arel/engines/memory.rb +0 -2
- data/lib/arel/engines/memory/engine.rb +0 -10
- data/lib/arel/engines/memory/relations.rb +0 -2
- data/lib/arel/engines/memory/relations/array.rb +0 -37
- data/lib/arel/engines/memory/relations/operations.rb +0 -9
- data/lib/arel/engines/sql.rb +0 -6
- data/lib/arel/engines/sql/attributes.rb +0 -45
- data/lib/arel/engines/sql/christener.rb +0 -20
- data/lib/arel/engines/sql/compilers/ibm_db_compiler.rb +0 -48
- data/lib/arel/engines/sql/compilers/mysql_compiler.rb +0 -11
- data/lib/arel/engines/sql/compilers/oracle_compiler.rb +0 -106
- data/lib/arel/engines/sql/compilers/postgresql_compiler.rb +0 -50
- data/lib/arel/engines/sql/compilers/sqlite_compiler.rb +0 -9
- data/lib/arel/engines/sql/core_extensions.rb +0 -4
- data/lib/arel/engines/sql/core_extensions/array.rb +0 -24
- data/lib/arel/engines/sql/core_extensions/nil_class.rb +0 -15
- data/lib/arel/engines/sql/core_extensions/object.rb +0 -19
- data/lib/arel/engines/sql/core_extensions/range.rb +0 -19
- data/lib/arel/engines/sql/engine.rb +0 -47
- data/lib/arel/engines/sql/formatters.rb +0 -138
- data/lib/arel/engines/sql/relations.rb +0 -3
- data/lib/arel/engines/sql/relations/compiler.rb +0 -153
- data/lib/arel/engines/sql/relations/table.rb +0 -100
- data/lib/arel/engines/sql/relations/utilities/nil.rb +0 -6
- data/lib/arel/recursion/base_case.rb +0 -13
- data/lib/arel/session.rb +0 -35
- data/lib/arel/version.rb +0 -3
- data/spec/algebra/unit/predicates/binary_spec.rb +0 -35
- data/spec/algebra/unit/predicates/equality_spec.rb +0 -29
- data/spec/algebra/unit/predicates/in_spec.rb +0 -12
- data/spec/algebra/unit/predicates/inequality_spec.rb +0 -32
- data/spec/algebra/unit/predicates/predicate_spec.rb +0 -22
- data/spec/algebra/unit/primitives/attribute_spec.rb +0 -175
- data/spec/algebra/unit/primitives/expression_spec.rb +0 -39
- data/spec/algebra/unit/primitives/value_spec.rb +0 -15
- data/spec/algebra/unit/relations/alias_spec.rb +0 -16
- data/spec/algebra/unit/relations/delete_spec.rb +0 -9
- data/spec/algebra/unit/relations/group_spec.rb +0 -10
- data/spec/algebra/unit/relations/insert_spec.rb +0 -9
- data/spec/algebra/unit/relations/join_spec.rb +0 -18
- data/spec/algebra/unit/relations/order_spec.rb +0 -21
- data/spec/algebra/unit/relations/project_spec.rb +0 -34
- data/spec/algebra/unit/relations/relation_spec.rb +0 -241
- data/spec/algebra/unit/relations/skip_spec.rb +0 -10
- data/spec/algebra/unit/relations/table_spec.rb +0 -38
- data/spec/algebra/unit/relations/take_spec.rb +0 -10
- data/spec/algebra/unit/relations/update_spec.rb +0 -9
- data/spec/algebra/unit/relations/where_spec.rb +0 -19
- data/spec/algebra/unit/session/session_spec.rb +0 -84
- data/spec/attributes/boolean_spec.rb +0 -57
- data/spec/attributes/float_spec.rb +0 -119
- data/spec/attributes/header_spec.rb +0 -42
- data/spec/attributes/integer_spec.rb +0 -119
- data/spec/attributes/string_spec.rb +0 -43
- data/spec/attributes/time_spec.rb +0 -24
- data/spec/engines/memory/integration/joins/cross_engine_spec.rb +0 -61
- data/spec/engines/memory/unit/relations/array_spec.rb +0 -33
- data/spec/engines/memory/unit/relations/insert_spec.rb +0 -28
- data/spec/engines/memory/unit/relations/join_spec.rb +0 -32
- data/spec/engines/memory/unit/relations/order_spec.rb +0 -28
- data/spec/engines/memory/unit/relations/project_spec.rb +0 -27
- data/spec/engines/memory/unit/relations/skip_spec.rb +0 -31
- data/spec/engines/memory/unit/relations/take_spec.rb +0 -28
- data/spec/engines/memory/unit/relations/where_spec.rb +0 -43
- data/spec/engines/sql/integration/joins/with_adjacency_spec.rb +0 -258
- data/spec/engines/sql/integration/joins/with_aggregations_spec.rb +0 -221
- data/spec/engines/sql/integration/joins/with_compounds_spec.rb +0 -137
- data/spec/engines/sql/unit/engine_spec.rb +0 -65
- data/spec/engines/sql/unit/predicates/binary_spec.rb +0 -140
- data/spec/engines/sql/unit/predicates/equality_spec.rb +0 -75
- data/spec/engines/sql/unit/predicates/in_spec.rb +0 -179
- data/spec/engines/sql/unit/predicates/noteq_spec.rb +0 -75
- data/spec/engines/sql/unit/predicates/predicates_spec.rb +0 -79
- data/spec/engines/sql/unit/primitives/attribute_spec.rb +0 -36
- data/spec/engines/sql/unit/primitives/expression_spec.rb +0 -28
- data/spec/engines/sql/unit/primitives/literal_spec.rb +0 -43
- data/spec/engines/sql/unit/primitives/value_spec.rb +0 -29
- data/spec/engines/sql/unit/relations/alias_spec.rb +0 -53
- data/spec/engines/sql/unit/relations/delete_spec.rb +0 -83
- data/spec/engines/sql/unit/relations/from_spec.rb +0 -64
- data/spec/engines/sql/unit/relations/group_spec.rb +0 -72
- data/spec/engines/sql/unit/relations/having_spec.rb +0 -78
- data/spec/engines/sql/unit/relations/insert_spec.rb +0 -143
- data/spec/engines/sql/unit/relations/join_spec.rb +0 -180
- data/spec/engines/sql/unit/relations/lock_spec.rb +0 -86
- data/spec/engines/sql/unit/relations/order_spec.rb +0 -161
- data/spec/engines/sql/unit/relations/project_spec.rb +0 -143
- data/spec/engines/sql/unit/relations/skip_spec.rb +0 -41
- data/spec/engines/sql/unit/relations/table_spec.rb +0 -122
- data/spec/engines/sql/unit/relations/take_spec.rb +0 -75
- data/spec/engines/sql/unit/relations/update_spec.rb +0 -203
- data/spec/engines/sql/unit/relations/where_spec.rb +0 -72
- data/spec/relations/join_spec.rb +0 -42
- data/spec/relations/relation_spec.rb +0 -31
- data/spec/shared/relation_spec.rb +0 -255
- data/spec/sql/christener_spec.rb +0 -70
- data/spec/support/connections/mysql_connection.rb +0 -14
- data/spec/support/connections/oracle_connection.rb +0 -17
- data/spec/support/connections/postgresql_connection.rb +0 -13
- data/spec/support/connections/sqlite3_connection.rb +0 -24
- data/spec/support/guards.rb +0 -28
- data/spec/support/matchers/disambiguate_attributes.rb +0 -28
- data/spec/support/matchers/hash_the_same_as.rb +0 -26
- data/spec/support/matchers/have_rows.rb +0 -18
- data/spec/support/model.rb +0 -67
- data/spec/support/schemas/mysql_schema.rb +0 -26
- data/spec/support/schemas/oracle_schema.rb +0 -20
- data/spec/support/schemas/postgresql_schema.rb +0 -26
- data/spec/support/schemas/sqlite3_schema.rb +0 -26
@@ -1,180 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Arel
|
4
|
-
describe Join do
|
5
|
-
before do
|
6
|
-
@relation1 = Table.new(:users)
|
7
|
-
@relation2 = Table.new(:photos)
|
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])
|
15
|
-
end
|
16
|
-
|
17
|
-
describe '#to_sql' do
|
18
|
-
|
19
|
-
describe 'when joining with another relation' do
|
20
|
-
it 'manufactures sql joining the two tables on the predicate' do
|
21
|
-
sql = InnerJoin.new(@relation1, @relation2, @predicate1).to_sql
|
22
|
-
|
23
|
-
adapter_is :mysql do
|
24
|
-
sql.should be_like(%Q{
|
25
|
-
SELECT `users`.`id`, `users`.`name`, `photos`.`id`, `photos`.`user_id`, `photos`.`camera_id`
|
26
|
-
FROM `users`
|
27
|
-
INNER JOIN `photos` ON `users`.`id` = `photos`.`user_id`
|
28
|
-
})
|
29
|
-
end
|
30
|
-
|
31
|
-
adapter_is :oracle do
|
32
|
-
sql.should be_like(%Q{
|
33
|
-
SELECT "USERS"."ID", "USERS"."NAME", "PHOTOS"."ID", "PHOTOS"."USER_ID", "PHOTOS"."CAMERA_ID"
|
34
|
-
FROM "USERS"
|
35
|
-
INNER JOIN "PHOTOS" ON "USERS"."ID" = "PHOTOS"."USER_ID"
|
36
|
-
})
|
37
|
-
end
|
38
|
-
|
39
|
-
adapter_is_not :mysql, :oracle do
|
40
|
-
sql.should be_like(%Q{
|
41
|
-
SELECT "users"."id", "users"."name", "photos"."id", "photos"."user_id", "photos"."camera_id"
|
42
|
-
FROM "users"
|
43
|
-
INNER JOIN "photos" ON "users"."id" = "photos"."user_id"
|
44
|
-
})
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
describe 'when joining with another relation with an aliased table' do
|
49
|
-
it 'manufactures sql joining the two tables on the predicate respecting table aliasing' do
|
50
|
-
sql = InnerJoin.new(@relation3, @relation2, @predicate2).to_sql
|
51
|
-
|
52
|
-
adapter_is :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` `super_users`
|
56
|
-
INNER JOIN `photos` ON `super_users`.`id` = `photos`.`user_id`
|
57
|
-
})
|
58
|
-
end
|
59
|
-
|
60
|
-
adapter_is :oracle do
|
61
|
-
sql.should be_like(%Q{
|
62
|
-
SELECT "SUPER_USERS"."ID", "SUPER_USERS"."NAME", "PHOTOS"."ID", "PHOTOS"."USER_ID", "PHOTOS"."CAMERA_ID"
|
63
|
-
FROM "USERS" "SUPER_USERS"
|
64
|
-
INNER JOIN "PHOTOS" ON "SUPER_USERS"."ID" = "PHOTOS"."USER_ID"
|
65
|
-
})
|
66
|
-
end
|
67
|
-
|
68
|
-
adapter_is_not :mysql, :oracle do
|
69
|
-
sql.should be_like(%Q{
|
70
|
-
SELECT "super_users"."id", "super_users"."name", "photos"."id", "photos"."user_id", "photos"."camera_id"
|
71
|
-
FROM "users" "super_users"
|
72
|
-
INNER JOIN "photos" ON "super_users"."id" = "photos"."user_id"
|
73
|
-
})
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
describe 'when joining with two relations with aliased tables' do
|
79
|
-
it 'manufactures sql joining the two tables on the predicate respecting table aliasing' do
|
80
|
-
sql = InnerJoin.new(@relation3, @relation4, @predicate3).to_sql
|
81
|
-
|
82
|
-
adapter_is :mysql do
|
83
|
-
sql.should be_like(%Q{
|
84
|
-
SELECT `super_users`.`id`, `super_users`.`name`, `super_photos`.`id`, `super_photos`.`user_id`, `super_photos`.`camera_id`
|
85
|
-
FROM `users` `super_users`
|
86
|
-
INNER JOIN `photos` `super_photos` ON `super_users`.`id` = `super_photos`.`user_id`
|
87
|
-
})
|
88
|
-
end
|
89
|
-
|
90
|
-
adapter_is :oracle do
|
91
|
-
sql.should be_like(%Q{
|
92
|
-
SELECT "SUPER_USERS"."ID", "SUPER_USERS"."NAME", "SUPER_PHOTOS"."ID", "SUPER_PHOTOS"."USER_ID", "SUPER_PHOTOS"."CAMERA_ID"
|
93
|
-
FROM "USERS" "SUPER_USERS"
|
94
|
-
INNER JOIN "PHOTOS" "SUPER_PHOTOS" ON "SUPER_USERS"."ID" = "SUPER_PHOTOS"."USER_ID"
|
95
|
-
})
|
96
|
-
end
|
97
|
-
|
98
|
-
adapter_is_not :mysql, :oracle do
|
99
|
-
sql.should be_like(%Q{
|
100
|
-
SELECT "super_users"."id", "super_users"."name", "super_photos"."id", "super_photos"."user_id", "super_photos"."camera_id"
|
101
|
-
FROM "users" "super_users"
|
102
|
-
INNER JOIN "photos" "super_photos" ON "super_users"."id" = "super_photos"."user_id"
|
103
|
-
})
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
end
|
109
|
-
|
110
|
-
describe 'when joining with a string' do
|
111
|
-
it "passes the string through to the where clause" do
|
112
|
-
sql = StringJoin.new(@relation1, "INNER JOIN asdf ON fdsa").to_sql
|
113
|
-
|
114
|
-
adapter_is :mysql do
|
115
|
-
sql.should be_like(%Q{
|
116
|
-
SELECT `users`.`id`, `users`.`name`
|
117
|
-
FROM `users`
|
118
|
-
INNER JOIN asdf ON fdsa
|
119
|
-
})
|
120
|
-
end
|
121
|
-
|
122
|
-
adapter_is :oracle do
|
123
|
-
sql.should be_like(%Q{
|
124
|
-
SELECT "USERS"."ID", "USERS"."NAME"
|
125
|
-
FROM "USERS"
|
126
|
-
INNER JOIN asdf ON fdsa
|
127
|
-
})
|
128
|
-
end
|
129
|
-
|
130
|
-
adapter_is_not :mysql, :oracle do
|
131
|
-
sql.should be_like(%Q{
|
132
|
-
SELECT "users"."id", "users"."name"
|
133
|
-
FROM "users"
|
134
|
-
INNER JOIN asdf ON fdsa
|
135
|
-
})
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
it "passes the string when there are multiple string joins" do
|
140
|
-
relation = StringJoin.new(@relation1, "INNER JOIN asdf ON fdsa")
|
141
|
-
relation = StringJoin.new(relation, "INNER JOIN lifo ON fifo")
|
142
|
-
sql = StringJoin.new(relation, "INNER JOIN hatful ON hallow").to_sql
|
143
|
-
|
144
|
-
adapter_is :mysql do
|
145
|
-
sql.should be_like(%Q{
|
146
|
-
SELECT `users`.`id`, `users`.`name`
|
147
|
-
FROM `users`
|
148
|
-
INNER JOIN asdf ON fdsa
|
149
|
-
INNER JOIN lifo ON fifo
|
150
|
-
INNER JOIN hatful ON hallow
|
151
|
-
})
|
152
|
-
end
|
153
|
-
|
154
|
-
adapter_is :oracle do
|
155
|
-
sql.should be_like(%Q{
|
156
|
-
SELECT "USERS"."ID", "USERS"."NAME"
|
157
|
-
FROM "USERS"
|
158
|
-
INNER JOIN asdf ON fdsa
|
159
|
-
INNER JOIN lifo ON fifo
|
160
|
-
INNER JOIN hatful ON hallow
|
161
|
-
})
|
162
|
-
end
|
163
|
-
|
164
|
-
adapter_is_not :mysql, :oracle do
|
165
|
-
sql.should be_like(%Q{
|
166
|
-
SELECT "users"."id", "users"."name"
|
167
|
-
FROM "users"
|
168
|
-
INNER JOIN asdf ON fdsa
|
169
|
-
INNER JOIN lifo ON fifo
|
170
|
-
INNER JOIN hatful ON hallow
|
171
|
-
})
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
end
|
176
|
-
|
177
|
-
|
178
|
-
end
|
179
|
-
end
|
180
|
-
end
|
@@ -1,86 +0,0 @@
|
|
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
|
-
|
34
|
-
adapter_is :oracle do
|
35
|
-
sql.should be_like(%Q{
|
36
|
-
SELECT "USERS"."ID", "USERS"."NAME"
|
37
|
-
FROM "USERS" FOR UPDATE
|
38
|
-
})
|
39
|
-
|
40
|
-
sql_with_order_by = @relation.order(@relation[:id]).take(1).lock.to_sql
|
41
|
-
sql_with_order_by.should be_like(%Q{
|
42
|
-
SELECT "USERS"."ID", "USERS"."NAME"
|
43
|
-
FROM "USERS"
|
44
|
-
WHERE "ID" IN (select * from
|
45
|
-
(SELECT "ID" FROM "USERS" ORDER BY "USERS"."ID" ASC)
|
46
|
-
where rownum <= 1)
|
47
|
-
FOR UPDATE
|
48
|
-
})
|
49
|
-
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
it "manufactures a select query locking with a given lock" do
|
54
|
-
sql = @relation.lock("LOCK IN SHARE MODE").to_sql
|
55
|
-
|
56
|
-
adapter_is :mysql do
|
57
|
-
sql.should be_like(%Q{
|
58
|
-
SELECT `users`.`id`, `users`.`name`
|
59
|
-
FROM `users` LOCK IN SHARE MODE
|
60
|
-
})
|
61
|
-
end
|
62
|
-
|
63
|
-
adapter_is :postgresql do
|
64
|
-
sql.should be_like(%Q{
|
65
|
-
SELECT "users"."id", "users"."name"
|
66
|
-
FROM "users" LOCK IN SHARE MODE
|
67
|
-
})
|
68
|
-
end
|
69
|
-
|
70
|
-
adapter_is :sqlite3 do
|
71
|
-
sql.should be_like(%Q{
|
72
|
-
SELECT "users"."id", "users"."name"
|
73
|
-
FROM "users"
|
74
|
-
})
|
75
|
-
end
|
76
|
-
|
77
|
-
adapter_is :oracle do
|
78
|
-
sql.should be_like(%Q{
|
79
|
-
SELECT "USERS"."ID", "USERS"."NAME"
|
80
|
-
FROM "USERS" LOCK IN SHARE MODE
|
81
|
-
})
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
@@ -1,161 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Arel
|
4
|
-
describe Order do
|
5
|
-
before do
|
6
|
-
@relation = Table.new(:users)
|
7
|
-
@attribute = @relation[:id]
|
8
|
-
end
|
9
|
-
|
10
|
-
describe '#to_sql' do
|
11
|
-
describe "when given an attribute" do
|
12
|
-
it "manufactures sql with an order clause populated by the attribute" do
|
13
|
-
sql = Order.new(@relation, [@attribute]).to_sql
|
14
|
-
|
15
|
-
adapter_is :mysql do
|
16
|
-
sql.should be_like(%Q{
|
17
|
-
SELECT `users`.`id`, `users`.`name`
|
18
|
-
FROM `users`
|
19
|
-
ORDER BY `users`.`id` ASC
|
20
|
-
})
|
21
|
-
end
|
22
|
-
|
23
|
-
adapter_is :oracle do
|
24
|
-
sql.should be_like(%Q{
|
25
|
-
SELECT "USERS"."ID", "USERS"."NAME"
|
26
|
-
FROM "USERS"
|
27
|
-
ORDER BY "USERS"."ID" ASC
|
28
|
-
})
|
29
|
-
|
30
|
-
distinct_attributes = ActiveRecord::Base.connection.distinct('"USERS"."NAME"', '"USERS"."ID"')
|
31
|
-
@relation.project(distinct_attributes).order(@relation[:id]).to_sql.should be_like(%Q{
|
32
|
-
SELECT DISTINCT "USERS"."NAME",
|
33
|
-
FIRST_VALUE("USERS"."ID") OVER (PARTITION BY "USERS"."NAME" ORDER BY "USERS"."ID") AS alias_0__
|
34
|
-
FROM "USERS"
|
35
|
-
ORDER BY alias_0__
|
36
|
-
})
|
37
|
-
|
38
|
-
distinct_attributes = ActiveRecord::Base.connection.distinct('"USERS"."NAME"', '"USERS"."ID" DESC')
|
39
|
-
@relation.project(distinct_attributes).order('"USERS"."ID" DESC').to_sql.should be_like(%Q{
|
40
|
-
SELECT DISTINCT "USERS"."NAME",
|
41
|
-
FIRST_VALUE("USERS"."ID") OVER (PARTITION BY "USERS"."NAME" ORDER BY "USERS"."ID" DESC) AS alias_0__
|
42
|
-
FROM "USERS"
|
43
|
-
ORDER BY alias_0__ DESC
|
44
|
-
})
|
45
|
-
end
|
46
|
-
|
47
|
-
adapter_is_not :mysql, :oracle do
|
48
|
-
sql.should be_like(%Q{
|
49
|
-
SELECT "users"."id", "users"."name"
|
50
|
-
FROM "users"
|
51
|
-
ORDER BY "users"."id" ASC
|
52
|
-
})
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
describe "when given multiple attributes" do
|
58
|
-
before do
|
59
|
-
@another_attribute = @relation[:name]
|
60
|
-
end
|
61
|
-
|
62
|
-
it "manufactures sql with an order clause populated by comma-separated attributes" do
|
63
|
-
sql = Order.new(@relation, [@attribute, @another_attribute]).to_sql
|
64
|
-
|
65
|
-
adapter_is :mysql do
|
66
|
-
sql.should be_like(%Q{
|
67
|
-
SELECT `users`.`id`, `users`.`name`
|
68
|
-
FROM `users`
|
69
|
-
ORDER BY `users`.`id` ASC, `users`.`name` ASC
|
70
|
-
})
|
71
|
-
end
|
72
|
-
|
73
|
-
adapter_is :oracle do
|
74
|
-
sql.should be_like(%Q{
|
75
|
-
SELECT "USERS"."ID", "USERS"."NAME"
|
76
|
-
FROM "USERS"
|
77
|
-
ORDER BY "USERS"."ID" ASC, "USERS"."NAME" ASC
|
78
|
-
})
|
79
|
-
end
|
80
|
-
|
81
|
-
adapter_is_not :mysql, :oracle do
|
82
|
-
sql.should be_like(%Q{
|
83
|
-
SELECT "users"."id", "users"."name"
|
84
|
-
FROM "users"
|
85
|
-
ORDER BY "users"."id" ASC, "users"."name" ASC
|
86
|
-
})
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
describe "when given a string" do
|
92
|
-
before do
|
93
|
-
@string = "asdf"
|
94
|
-
end
|
95
|
-
|
96
|
-
it "passes the string through to the order clause" do
|
97
|
-
sql = Order.new(@relation, [@string]).to_sql
|
98
|
-
|
99
|
-
adapter_is :mysql do
|
100
|
-
sql.should be_like(%Q{
|
101
|
-
SELECT `users`.`id`, `users`.`name`
|
102
|
-
FROM `users`
|
103
|
-
ORDER BY asdf
|
104
|
-
})
|
105
|
-
end
|
106
|
-
|
107
|
-
adapter_is :oracle do
|
108
|
-
sql.should be_like(%Q{
|
109
|
-
SELECT "USERS"."ID", "USERS"."NAME"
|
110
|
-
FROM "USERS"
|
111
|
-
ORDER BY asdf
|
112
|
-
})
|
113
|
-
end
|
114
|
-
|
115
|
-
adapter_is_not :mysql, :oracle do
|
116
|
-
sql.should be_like(%Q{
|
117
|
-
SELECT "users"."id", "users"."name"
|
118
|
-
FROM "users"
|
119
|
-
ORDER BY asdf
|
120
|
-
})
|
121
|
-
end
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
describe "when ordering an ordered relation" do
|
126
|
-
before do
|
127
|
-
@ordered_relation = Order.new(@relation, [@attribute])
|
128
|
-
@another_attribute = @relation[:name]
|
129
|
-
end
|
130
|
-
|
131
|
-
it "manufactures sql with the order clause of the last ordering preceding the first ordering" do
|
132
|
-
sql = Order.new(@ordered_relation, [@another_attribute]).to_sql
|
133
|
-
|
134
|
-
adapter_is :mysql do
|
135
|
-
sql.should be_like(%Q{
|
136
|
-
SELECT `users`.`id`, `users`.`name`
|
137
|
-
FROM `users`
|
138
|
-
ORDER BY `users`.`name` ASC, `users`.`id` ASC
|
139
|
-
})
|
140
|
-
end
|
141
|
-
|
142
|
-
adapter_is :oracle do
|
143
|
-
sql.should be_like(%Q{
|
144
|
-
SELECT "USERS"."ID", "USERS"."NAME"
|
145
|
-
FROM "USERS"
|
146
|
-
ORDER BY "USERS"."NAME" ASC, "USERS"."ID" ASC
|
147
|
-
})
|
148
|
-
end
|
149
|
-
|
150
|
-
adapter_is_not :mysql, :oracle do
|
151
|
-
sql.should be_like(%Q{
|
152
|
-
SELECT "users"."id", "users"."name"
|
153
|
-
FROM "users"
|
154
|
-
ORDER BY "users"."name" ASC, "users"."id" ASC
|
155
|
-
})
|
156
|
-
end
|
157
|
-
end
|
158
|
-
end
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
@@ -1,143 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Arel
|
4
|
-
describe Project do
|
5
|
-
before do
|
6
|
-
@relation = Table.new(:users)
|
7
|
-
@attribute = @relation[:id]
|
8
|
-
end
|
9
|
-
|
10
|
-
describe '#to_sql' do
|
11
|
-
describe 'when given an attribute' do
|
12
|
-
it "manufactures sql with a limited select clause" do
|
13
|
-
sql = Project.new(@relation, [@attribute]).to_sql
|
14
|
-
|
15
|
-
adapter_is :mysql do
|
16
|
-
sql.should be_like(%Q{
|
17
|
-
SELECT `users`.`id`
|
18
|
-
FROM `users`
|
19
|
-
})
|
20
|
-
end
|
21
|
-
|
22
|
-
adapter_is :oracle do
|
23
|
-
sql.should be_like(%Q{
|
24
|
-
SELECT "USERS"."ID"
|
25
|
-
FROM "USERS"
|
26
|
-
})
|
27
|
-
end
|
28
|
-
|
29
|
-
adapter_is_not :mysql, :oracle do
|
30
|
-
sql.should be_like(%Q{
|
31
|
-
SELECT "users"."id"
|
32
|
-
FROM "users"
|
33
|
-
})
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe 'when given a relation' do
|
39
|
-
before do
|
40
|
-
@scalar_relation = Project.new(@relation, [@relation[:name]])
|
41
|
-
end
|
42
|
-
|
43
|
-
it "manufactures sql with scalar selects" do
|
44
|
-
sql = Project.new(@relation, [@scalar_relation]).to_sql
|
45
|
-
|
46
|
-
adapter_is :mysql do
|
47
|
-
sql.should be_like(%Q{
|
48
|
-
SELECT (SELECT `users`.`name` FROM `users`) AS `users` FROM `users`
|
49
|
-
})
|
50
|
-
end
|
51
|
-
|
52
|
-
adapter_is :oracle do
|
53
|
-
sql.should be_like(%Q{
|
54
|
-
SELECT (SELECT "USERS"."NAME" FROM "USERS") AS "USERS" FROM "USERS"
|
55
|
-
})
|
56
|
-
end
|
57
|
-
|
58
|
-
adapter_is_not :mysql, :oracle do
|
59
|
-
sql.should be_like(%Q{
|
60
|
-
SELECT (SELECT "users"."name" FROM "users") AS "users" FROM "users"
|
61
|
-
})
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
describe 'when given a string' do
|
67
|
-
it "passes the string through to the select clause" do
|
68
|
-
sql = Project.new(@relation, ['asdf']).to_sql
|
69
|
-
|
70
|
-
adapter_is :mysql do
|
71
|
-
sql.should be_like(%Q{
|
72
|
-
SELECT asdf FROM `users`
|
73
|
-
})
|
74
|
-
end
|
75
|
-
|
76
|
-
adapter_is :oracle do
|
77
|
-
sql.should be_like(%Q{
|
78
|
-
SELECT asdf FROM "USERS"
|
79
|
-
})
|
80
|
-
end
|
81
|
-
|
82
|
-
adapter_is_not :mysql, :oracle do
|
83
|
-
sql.should be_like(%Q{
|
84
|
-
SELECT asdf FROM "users"
|
85
|
-
})
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
describe 'when given an expression' do
|
91
|
-
it 'manufactures sql with expressions' do
|
92
|
-
sql = @relation.project(@attribute.count).to_sql
|
93
|
-
|
94
|
-
adapter_is :mysql do
|
95
|
-
sql.should be_like(%Q{
|
96
|
-
SELECT COUNT(`users`.`id`) AS count_id
|
97
|
-
FROM `users`
|
98
|
-
})
|
99
|
-
end
|
100
|
-
|
101
|
-
adapter_is :oracle do
|
102
|
-
sql.should be_like(%Q{
|
103
|
-
SELECT COUNT("USERS"."ID") AS count_id
|
104
|
-
FROM "USERS"
|
105
|
-
})
|
106
|
-
end
|
107
|
-
|
108
|
-
adapter_is_not :mysql, :oracle do
|
109
|
-
sql.should be_like(%Q{
|
110
|
-
SELECT COUNT("users"."id") AS count_id
|
111
|
-
FROM "users"
|
112
|
-
})
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
it 'manufactures sql with distinct expressions' do
|
117
|
-
sql = @relation.project(@attribute.count(true)).to_sql
|
118
|
-
|
119
|
-
adapter_is :mysql do
|
120
|
-
sql.should be_like(%Q{
|
121
|
-
SELECT COUNT(DISTINCT `users`.`id`) AS count_id
|
122
|
-
FROM `users`
|
123
|
-
})
|
124
|
-
end
|
125
|
-
|
126
|
-
adapter_is :oracle do
|
127
|
-
sql.should be_like(%Q{
|
128
|
-
SELECT COUNT(DISTINCT "USERS"."ID") AS count_id
|
129
|
-
FROM "USERS"
|
130
|
-
})
|
131
|
-
end
|
132
|
-
|
133
|
-
adapter_is_not :mysql, :oracle do
|
134
|
-
sql.should be_like(%Q{
|
135
|
-
SELECT COUNT(DISTINCT "users"."id") AS count_id
|
136
|
-
FROM "users"
|
137
|
-
})
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|