arel_extensions 1.4.0 → 2.0.0.rc3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.codeclimate.yml +2 -1
- data/.gitignore +6 -7
- data/.rubocop.yml +3 -67
- data/.travis/oracle/download.js +152 -0
- data/.travis/oracle/download.sh +30 -0
- data/.travis/oracle/download_ojdbc.js +116 -0
- data/.travis/oracle/install.sh +34 -0
- data/.travis/setup_accounts.sh +9 -0
- data/.travis/sqlite3/extension-functions.sh +6 -0
- data/.travis.yml +223 -0
- data/Gemfile +28 -2
- data/README.md +90 -239
- data/Rakefile +30 -48
- data/TODO +1 -0
- data/appveyor.yml +22 -60
- data/arel_extensions.gemspec +14 -13
- data/functions.html +3 -3
- data/gemfiles/rails3.gemfile +10 -10
- data/gemfiles/rails4.gemfile +29 -0
- data/gemfiles/rails5_0.gemfile +29 -0
- data/gemfiles/rails5_1_4.gemfile +14 -14
- data/gemfiles/rails5_2.gemfile +14 -16
- data/init/mssql.sql +4 -4
- data/init/mysql.sql +38 -38
- data/init/oracle.sql +0 -0
- data/init/postgresql.sql +21 -21
- data/init/sqlite.sql +0 -0
- data/lib/arel_extensions/attributes.rb +3 -15
- data/lib/arel_extensions/boolean_functions.rb +14 -53
- data/lib/arel_extensions/common_sql_functions.rb +17 -16
- data/lib/arel_extensions/comparators.rb +28 -27
- data/lib/arel_extensions/date_duration.rb +13 -17
- data/lib/arel_extensions/insert_manager.rb +15 -18
- data/lib/arel_extensions/math.rb +53 -55
- data/lib/arel_extensions/math_functions.rb +39 -46
- data/lib/arel_extensions/nodes/abs.rb +1 -0
- data/lib/arel_extensions/nodes/blank.rb +2 -1
- data/lib/arel_extensions/nodes/case.rb +19 -20
- data/lib/arel_extensions/nodes/cast.rb +8 -10
- data/lib/arel_extensions/nodes/ceil.rb +1 -1
- data/lib/arel_extensions/nodes/coalesce.rb +4 -3
- data/lib/arel_extensions/nodes/collate.rb +10 -9
- data/lib/arel_extensions/nodes/concat.rb +18 -9
- data/lib/arel_extensions/nodes/date_diff.rb +26 -42
- data/lib/arel_extensions/nodes/duration.rb +3 -0
- data/lib/arel_extensions/nodes/find_in_set.rb +1 -0
- data/lib/arel_extensions/nodes/floor.rb +1 -1
- data/lib/arel_extensions/nodes/format.rb +8 -35
- data/lib/arel_extensions/nodes/formatted_number.rb +23 -22
- data/lib/arel_extensions/nodes/function.rb +37 -42
- data/lib/arel_extensions/nodes/is_null.rb +0 -0
- data/lib/arel_extensions/nodes/json.rb +39 -52
- data/lib/arel_extensions/nodes/length.rb +0 -5
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
- data/lib/arel_extensions/nodes/locate.rb +2 -1
- data/lib/arel_extensions/nodes/log10.rb +2 -1
- data/lib/arel_extensions/nodes/matches.rb +7 -5
- data/lib/arel_extensions/nodes/md5.rb +1 -0
- data/lib/arel_extensions/nodes/power.rb +5 -5
- data/lib/arel_extensions/nodes/rand.rb +1 -0
- data/lib/arel_extensions/nodes/repeat.rb +5 -3
- data/lib/arel_extensions/nodes/replace.rb +8 -16
- data/lib/arel_extensions/nodes/round.rb +6 -5
- data/lib/arel_extensions/nodes/soundex.rb +15 -15
- data/lib/arel_extensions/nodes/std.rb +21 -18
- data/lib/arel_extensions/nodes/substring.rb +16 -8
- data/lib/arel_extensions/nodes/then.rb +1 -1
- data/lib/arel_extensions/nodes/trim.rb +6 -4
- data/lib/arel_extensions/nodes/union.rb +8 -5
- data/lib/arel_extensions/nodes/union_all.rb +7 -4
- data/lib/arel_extensions/nodes/wday.rb +4 -0
- data/lib/arel_extensions/nodes.rb +1 -1
- data/lib/arel_extensions/null_functions.rb +5 -19
- data/lib/arel_extensions/predications.rb +43 -44
- data/lib/arel_extensions/railtie.rb +5 -5
- data/lib/arel_extensions/set_functions.rb +7 -5
- data/lib/arel_extensions/string_functions.rb +29 -59
- data/lib/arel_extensions/tasks.rb +6 -6
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/ibm_db.rb +31 -24
- data/lib/arel_extensions/visitors/mssql.rb +191 -422
- data/lib/arel_extensions/visitors/mysql.rb +212 -350
- data/lib/arel_extensions/visitors/oracle.rb +178 -220
- data/lib/arel_extensions/visitors/oracle12.rb +31 -18
- data/lib/arel_extensions/visitors/postgresql.rb +173 -256
- data/lib/arel_extensions/visitors/sqlite.rb +126 -140
- data/lib/arel_extensions/visitors/to_sql.rb +237 -298
- data/lib/arel_extensions/visitors.rb +62 -83
- data/lib/arel_extensions.rb +31 -224
- data/test/database.yml +7 -15
- data/test/helper.rb +18 -0
- data/test/real_db_test.rb +117 -120
- data/test/support/fake_record.rb +3 -9
- data/test/test_comparators.rb +17 -14
- data/test/visitors/test_bulk_insert_oracle.rb +11 -11
- data/test/visitors/test_bulk_insert_sqlite.rb +13 -12
- data/test/visitors/test_bulk_insert_to_sql.rb +13 -11
- data/test/visitors/test_oracle.rb +55 -55
- data/test/visitors/test_to_sql.rb +226 -419
- data/test/with_ar/all_agnostic_test.rb +366 -709
- data/test/with_ar/insert_agnostic_test.rb +21 -27
- data/test/with_ar/test_bulk_sqlite.rb +16 -17
- data/test/with_ar/test_math_sqlite.rb +26 -26
- data/test/with_ar/test_string_mysql.rb +33 -31
- data/test/with_ar/test_string_sqlite.rb +34 -30
- metadata +34 -43
- data/.github/workflows/publish.yml +0 -29
- data/.github/workflows/release.yml +0 -30
- data/.github/workflows/ruby.yml +0 -399
- data/CONTRIBUTING.md +0 -102
- data/NEWS.md +0 -78
- data/bin/build +0 -15
- data/bin/compose +0 -6
- data/bin/publish +0 -8
- data/dev/arelx.dockerfile +0 -44
- data/dev/compose.yaml +0 -71
- data/dev/postgres.dockerfile +0 -5
- data/dev/rbenv +0 -189
- data/gemfiles/rails4_2.gemfile +0 -38
- data/gemfiles/rails5.gemfile +0 -29
- data/gemfiles/rails6.gemfile +0 -33
- data/gemfiles/rails6_1.gemfile +0 -33
- data/gemfiles/rails7.gemfile +0 -33
- data/gemfiles/rails7_1.gemfile +0 -33
- data/gemfiles/rails7_2.gemfile +0 -33
- data/gemspecs/arel_extensions-v1.gemspec +0 -27
- data/gemspecs/arel_extensions-v2.gemspec +0 -27
- data/generate_gems.sh +0 -15
- data/lib/arel_extensions/aliases.rb +0 -14
- data/lib/arel_extensions/helpers.rb +0 -62
- data/lib/arel_extensions/nodes/aggregate_function.rb +0 -13
- data/lib/arel_extensions/nodes/formatted_date.rb +0 -42
- data/lib/arel_extensions/nodes/rollup.rb +0 -36
- data/lib/arel_extensions/nodes/select.rb +0 -10
- data/lib/arel_extensions/nodes/sum.rb +0 -7
- data/lib/arel_extensions/visitors/convert_format.rb +0 -37
- data/test/arelx_test_helper.rb +0 -74
- data/version_v1.rb +0 -3
- data/version_v2.rb +0 -3
@@ -1,23 +1,21 @@
|
|
1
|
-
require '
|
1
|
+
require 'helper'
|
2
2
|
require 'date'
|
3
3
|
|
4
4
|
module ArelExtensions
|
5
|
-
module
|
5
|
+
module WthAr
|
6
|
+
|
6
7
|
class ListTest < Minitest::Test
|
8
|
+
require 'minitest/pride'
|
7
9
|
def connect_db
|
8
10
|
ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
|
9
|
-
if ENV['DB'] == 'oracle' && ((defined?(RUBY_ENGINE) && RUBY_ENGINE ==
|
10
|
-
@env_db = (RUBY_PLATFORM == 'java' ?
|
11
|
-
skip "Platform not supported
|
11
|
+
if ENV['DB'] == 'oracle' && ((defined?(RUBY_ENGINE) && RUBY_ENGINE == "rbx") || (RUBY_PLATFORM == 'java')) # not supported
|
12
|
+
@env_db = (RUBY_PLATFORM == 'java' ? "jdbc-sqlite" : 'sqlite')
|
13
|
+
skip "Platform not supported"
|
12
14
|
else
|
13
15
|
@env_db = ENV['DB']
|
14
16
|
end
|
15
17
|
ActiveRecord::Base.establish_connection(@env_db.try(:to_sym) || (RUBY_PLATFORM == 'java' ? :"jdbc-sqlite" : :sqlite))
|
16
|
-
|
17
|
-
ActiveRecord.default_timezone = :utc
|
18
|
-
else
|
19
|
-
ActiveRecord::Base.default_timezone = :utc
|
20
|
-
end
|
18
|
+
ActiveRecord::Base.default_timezone = :utc
|
21
19
|
@cnx = ActiveRecord::Base.connection
|
22
20
|
$sqlite = @cnx.adapter_name =~ /sqlite/i
|
23
21
|
$load_extension_disabled ||= false
|
@@ -32,14 +30,14 @@ module ArelExtensions
|
|
32
30
|
t.column :name, :string
|
33
31
|
t.column :comments, :text
|
34
32
|
t.column :created_at, :date
|
35
|
-
t.column :updated_at, :datetime
|
33
|
+
t.column :updated_at, :datetime
|
36
34
|
t.column :duration, :time
|
37
35
|
t.column :other, :string
|
38
|
-
t.column :score, :decimal, precision
|
36
|
+
t.column :score, :decimal, :precision => 20, :scale => 10
|
39
37
|
end
|
40
38
|
@cnx.drop_table(:product_tests) rescue nil
|
41
39
|
@cnx.create_table :product_tests do |t|
|
42
|
-
t.column :price, :decimal, precision
|
40
|
+
t.column :price, :decimal, :precision => 20, :scale => 10
|
43
41
|
end
|
44
42
|
end
|
45
43
|
|
@@ -54,26 +52,23 @@ module ArelExtensions
|
|
54
52
|
d = Date.new(2016, 5, 23)
|
55
53
|
connect_db
|
56
54
|
setup_db
|
57
|
-
u = User.create age
|
58
|
-
@lucas = User.where(id
|
59
|
-
u = User.create age
|
60
|
-
@sophie = User.where(id
|
61
|
-
u = User.create age
|
62
|
-
@camille = User.where(id
|
63
|
-
u = User.create age
|
64
|
-
@arthur = User.where(id
|
65
|
-
u = User.create age
|
66
|
-
@myung = User.where(id
|
67
|
-
u = User.create age
|
68
|
-
@laure = User.where(id
|
69
|
-
u = User.create age
|
70
|
-
@test = User.where(id
|
71
|
-
u = User.create age
|
72
|
-
@neg = User.where(id
|
73
|
-
|
74
|
-
@justin = User.where(id: u.id)
|
75
|
-
u = User.create age: nil, name: 'nilly', created_at: nil, score: nil
|
76
|
-
@nilly = User.where(id: u.id)
|
55
|
+
u = User.create :age => 5, :name => "Lucas", :created_at => d, :score => 20.16, :updated_at => Time.utc(2014, 3, 3, 12, 42, 0)
|
56
|
+
@lucas = User.where(:id => u.id)
|
57
|
+
u = User.create :age => 15, :name => "Sophie", :created_at => d, :score => 20.16
|
58
|
+
@sophie = User.where(:id => u.id)
|
59
|
+
u = User.create :age => 20, :name => "Camille", :created_at => d, :score => -20.16, :comments => ''
|
60
|
+
@camille = User.where(:id => u.id)
|
61
|
+
u = User.create :age => 21, :name => "Arthur", :created_at => d, :score => 65.62, :comments => 'arrêté'
|
62
|
+
@arthur = User.where(:id => u.id)
|
63
|
+
u = User.create :age => 23, :name => "Myung", :created_at => d, :score => 20.16, :comments => ' '
|
64
|
+
@myung = User.where(:id => u.id)
|
65
|
+
u = User.create :age => 25, :name => "Laure", :created_at => d, :score => 20.16, :duration => Time.utc(2001, 1, 1, 12, 42, 21),:updated_at => Time.utc(2014, 3, 3, 12, 42, 0)
|
66
|
+
@laure = User.where(:id => u.id)
|
67
|
+
u = User.create :age => nil, :name => "Test", :created_at => d, :score => 1.62, :other => 'toto'
|
68
|
+
@test = User.where(:id => u.id)
|
69
|
+
u = User.create :age => -42, :name => "Negatif", :comments => '1,22,3,42,2', :created_at => d, :updated_at => d.to_time, :score => 0.17
|
70
|
+
@neg = User.where(:id => u.id)
|
71
|
+
|
77
72
|
|
78
73
|
@age = User.arel_table[:age]
|
79
74
|
@name = User.arel_table[:name]
|
@@ -99,7 +94,7 @@ module ArelExtensions
|
|
99
94
|
scope.select(node.as('res')).to_a.first.res
|
100
95
|
end
|
101
96
|
|
102
|
-
#
|
97
|
+
#manage the difference between adapters that handle or not json type
|
103
98
|
def parse_json(h)
|
104
99
|
if @env_db != 'postgresql'
|
105
100
|
JSON.parse("{\"res\":#{h}}")['res']
|
@@ -108,14 +103,6 @@ module ArelExtensions
|
|
108
103
|
end
|
109
104
|
end
|
110
105
|
|
111
|
-
# Connection and column info
|
112
|
-
def test_column_of
|
113
|
-
assert_nil Arel.column_of('chupa', 'maflavla'), 'Non-existent table and column should return nil'
|
114
|
-
assert_nil Arel.column_of('chupa', 'updated_at'), 'Non-existent table but existent column should return nil'
|
115
|
-
assert_nil Arel.column_of('user_tests', 'maflavla'), 'Existent table but non-existent column should return nil'
|
116
|
-
assert_equal 'updated_at', Arel.column_of('user_tests', 'updated_at').name, 'An existing column name should be returned'
|
117
|
-
end
|
118
|
-
|
119
106
|
# Math Functions
|
120
107
|
def test_classical_arel
|
121
108
|
assert_in_epsilon 42.16, t(@laure, @score + 22), 0.01
|
@@ -129,28 +116,25 @@ module ArelExtensions
|
|
129
116
|
end
|
130
117
|
|
131
118
|
def test_ceil
|
132
|
-
|
119
|
+
# skip "Sqlite version can't load extension for ceil" if $sqlite && $load_extension_disabled
|
133
120
|
assert_equal 2, t(@test, @score.ceil) # 1.62
|
134
121
|
assert_equal(-20, t(@camille, @score.ceil)) # -20.16
|
135
122
|
assert_equal(-20, t(@camille, (@score - 0.5).ceil)) # -20.16
|
136
123
|
assert_equal 63, t(@arthur, @age.ceil + 42)
|
137
|
-
assert_equal 11, t(@justin, @score.ceil) # 11.0
|
138
124
|
end
|
139
125
|
|
140
126
|
def test_floor
|
141
|
-
|
127
|
+
# skip "Sqlite version can't load extension for floor" if $sqlite && $load_extension_disabled
|
142
128
|
assert_equal 0, t(@neg, @score.floor)
|
143
129
|
assert_equal 1, t(@test, @score.floor) # 1.62
|
144
130
|
assert_equal(-9, t(@test, (@score - 10).floor)) # 1.62
|
145
131
|
assert_equal 42, t(@arthur, @score.floor - 23)
|
146
|
-
assert_equal 11, t(@justin, @score.floor) # 11.0
|
147
|
-
assert_equal(-21, t(@camille, @score.floor)) # # -20.16
|
148
132
|
end
|
149
133
|
|
150
134
|
def test_rand
|
151
135
|
assert 42 != User.select(Arel.rand.as('res')).first.res
|
152
136
|
assert 0 <= User.select(Arel.rand.abs.as('res')).first.res
|
153
|
-
assert_equal
|
137
|
+
assert_equal 8, User.order(Arel.rand).limit(50).count
|
154
138
|
end
|
155
139
|
|
156
140
|
def test_round
|
@@ -162,91 +146,35 @@ module ArelExtensions
|
|
162
146
|
|
163
147
|
def test_sum
|
164
148
|
if @env_db == 'mssql'
|
165
|
-
skip
|
166
|
-
assert_equal
|
167
|
-
assert_equal
|
168
|
-
assert_equal
|
169
|
-
assert_equal
|
149
|
+
skip "SQL Server forces order?" # TODO
|
150
|
+
assert_equal 68, User.select((@age.sum + 1).as("res"), User.arel_table[:id].sum).take(50).reorder(@age).first.res
|
151
|
+
assert_equal 134, User.reorder(nil).select((@age.sum + @age.sum).as("res"), User.arel_table[:id].sum).take(50).first.res
|
152
|
+
assert_equal 201, User.reorder(nil).select(((@age * 3).sum).as("res"), User.arel_table[:id].sum).take(50).first.res
|
153
|
+
assert_equal 4009, User.reorder(nil).select(((@age * @age).sum).as("res"), User.arel_table[:id].sum).take(50).first.res
|
170
154
|
else
|
171
|
-
assert_equal
|
172
|
-
assert_equal
|
173
|
-
assert_equal
|
174
|
-
assert_equal
|
155
|
+
assert_equal 68, User.select((@age.sum + 1).as("res")).take(50).first.res
|
156
|
+
assert_equal 134, User.select((@age.sum + @age.sum).as("res")).take(50).first.res
|
157
|
+
assert_equal 201, User.select(((@age * 3).sum).as("res")).take(50).first.res
|
158
|
+
assert_equal 4009, User.select(((@age * @age).sum).as("res")).take(50).first.res
|
175
159
|
end
|
176
160
|
end
|
177
161
|
|
178
|
-
def test_aggregation_with_ar_calculation
|
179
|
-
# Since Arel10 (Rails6.1), some unwanted behaviors on aggregated calculation were present.
|
180
|
-
# This should works no matter which version of rails is used
|
181
|
-
assert User.group(:score).average(:id).values.all?{|e| !e.nil?}
|
182
|
-
|
183
|
-
# Since Rails 7, a patch to calculations.rb has tirggered a double
|
184
|
-
# quoting of the alias name. See https://github.com/rails/rails/commit/7e6e9091e55c3357b0162d44b6ab955ed0c718d5
|
185
|
-
# Before the patch that fixed this the following error would occur:
|
186
|
-
# ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: zero-length delimited identifier at or near """"
|
187
|
-
assert User.group(:score).count(:id).values.all?{|e| !e.nil?}
|
188
|
-
end
|
189
|
-
|
190
|
-
def test_rollup
|
191
|
-
skip "sqlite not supported" if $sqlite
|
192
|
-
at = User.arel_table
|
193
|
-
# single
|
194
|
-
q = User.select(at[:name], at[:age].sum).group(Arel::Nodes::RollUp.new([at[:name]]))
|
195
|
-
assert q.to_a.length > 0
|
196
|
-
|
197
|
-
# multi
|
198
|
-
q = User.select(at[:name], at[:score], at[:age].sum).group(Arel::Nodes::RollUp.new([at[:score], at[:name]]))
|
199
|
-
assert q.to_a.length > 0
|
200
|
-
|
201
|
-
# hybrid
|
202
|
-
q = User.select(at[:name], at[:score], at[:age].sum).group(at[:score], Arel::Nodes::RollUp.new([at[:name]]))
|
203
|
-
assert q.to_a.length > 0
|
204
|
-
|
205
|
-
## Using Arel.rollup which is less verbose than the original way
|
206
|
-
|
207
|
-
# simple
|
208
|
-
q = User.select(at[:name], at[:age].sum).group(Arel.rollup(at[:name]))
|
209
|
-
assert q.to_a.length > 0
|
210
|
-
|
211
|
-
# multi
|
212
|
-
q = User.select(at[:name], at[:score], at[:age].sum).group(Arel.rollup([at[:score], at[:name]]))
|
213
|
-
assert q.to_a.length > 0
|
214
|
-
|
215
|
-
# hybrid
|
216
|
-
q = User.select(at[:name], at[:score], at[:age].sum).group(at[:score], Arel.rollup([at[:name]]))
|
217
|
-
assert q.to_a.length > 0
|
218
|
-
|
219
|
-
## Using at[:col].rollup which is handy for single column rollups
|
220
|
-
|
221
|
-
# simple
|
222
|
-
q = User.select(at[:name], at[:age].sum).group(at[:name].rollup)
|
223
|
-
assert q.to_a.length > 0
|
224
|
-
|
225
|
-
q = User.select(at[:name], at[:score], at[:age].sum).group(at[:name].rollup, at[:score].rollup)
|
226
|
-
assert q.to_a.length > 0
|
227
|
-
|
228
|
-
# hybrid
|
229
|
-
q = User.select(at[:name], at[:score], at[:age].sum).group(at[:name], at[:score].rollup)
|
230
|
-
assert q.to_a.length > 0
|
231
|
-
end
|
232
|
-
|
233
162
|
# String Functions
|
234
163
|
def test_concat
|
235
164
|
assert_equal 'Camille Camille', t(@camille, @name + ' ' + @name)
|
236
165
|
assert_equal 'Laure 2', t(@laure, @name + ' ' + 2)
|
237
|
-
assert_equal 'Test Laure', t(@laure, Arel.
|
238
|
-
|
239
|
-
skip
|
240
|
-
assert_equal
|
241
|
-
assert_equal
|
242
|
-
assert_equal
|
243
|
-
|
244
|
-
skip
|
245
|
-
assert_equal
|
246
|
-
assert_equal
|
247
|
-
assert_equal
|
248
|
-
assert_equal
|
249
|
-
assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', order: [@score.asc, @name.asc]))
|
166
|
+
assert_equal 'Test Laure', t(@laure, Arel::Nodes.build_quoted('Test ') + @name)
|
167
|
+
|
168
|
+
skip "No group_concat in SqlServer before 2017" if @env_db == 'mssql'
|
169
|
+
assert_equal "Lucas Sophie", t(User.where(:name => ['Lucas', 'Sophie']), @name.group_concat(' '))
|
170
|
+
assert_equal "Lucas,Sophie", t(User.where(:name => ['Lucas', 'Sophie']), @name.group_concat(','))
|
171
|
+
assert_equal "Lucas,Sophie", t(User.where(:name => ['Lucas', 'Sophie']), @name.group_concat)
|
172
|
+
|
173
|
+
skip "No order in group_concat in SqlLite" if $sqlite
|
174
|
+
assert_equal "Arthur,Lucas,Sophie", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',@name.asc))
|
175
|
+
assert_equal "Sophie,Lucas,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',@name.desc))
|
176
|
+
assert_equal "Lucas,Sophie,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',[@score.asc,@name.asc]))
|
177
|
+
assert_equal "Lucas,Sophie,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',@score.asc,@name.asc))
|
250
178
|
end
|
251
179
|
|
252
180
|
def test_length
|
@@ -257,15 +185,15 @@ module ArelExtensions
|
|
257
185
|
|
258
186
|
def test_md5
|
259
187
|
skip "Sqlite can't do md5" if $sqlite
|
260
|
-
assert_equal
|
261
|
-
assert_equal
|
188
|
+
assert_equal "e2cf99ca82a7e829d2a4ac85c48154d0", t(@camille, @name.md5)
|
189
|
+
assert_equal "c3d41bf5efb468a1bcce53bd53726c85", t(@lucas, @name.md5)
|
262
190
|
end
|
263
191
|
|
264
192
|
def test_locate
|
265
193
|
skip "Sqlite version can't load extension for locate" if $sqlite && $load_extension_disabled
|
266
|
-
assert_equal 1, t(@camille, @name.locate(
|
267
|
-
assert_equal 0, t(@lucas, @name.locate(
|
268
|
-
assert_equal 5, t(@lucas, @name.locate(
|
194
|
+
assert_equal 1, t(@camille, @name.locate("C"))
|
195
|
+
assert_equal 0, t(@lucas, @name.locate("z"))
|
196
|
+
assert_equal 5, t(@lucas, @name.locate("s"))
|
269
197
|
end
|
270
198
|
|
271
199
|
def test_substring
|
@@ -275,7 +203,7 @@ module ArelExtensions
|
|
275
203
|
else
|
276
204
|
assert_equal('', t(@lucas, @name.substring(42)))
|
277
205
|
end
|
278
|
-
assert_equal 'Lu', t(@lucas, @name.substring(1,
|
206
|
+
assert_equal 'Lu', t(@lucas, @name.substring(1,2))
|
279
207
|
|
280
208
|
assert_equal 'C', t(@camille, @name[0, 1])
|
281
209
|
assert_equal 'C', t(@camille, @name[0])
|
@@ -284,32 +212,32 @@ module ArelExtensions
|
|
284
212
|
else
|
285
213
|
assert_equal('', t(@lucas, @name[42]))
|
286
214
|
end
|
287
|
-
assert_equal 'Lu', t(@lucas, @name[0,
|
215
|
+
assert_equal 'Lu', t(@lucas, @name[0,2])
|
288
216
|
assert_equal 'Lu', t(@lucas, @name[0..1])
|
289
217
|
|
290
|
-
#
|
218
|
+
#substring should accept string function
|
291
219
|
assert_equal 'Ce', t(@camille, @name.substring(1, 1).concat('e'))
|
292
|
-
assert_equal 'Ce', t(@camille, @name.substring(1, 1)
|
220
|
+
assert_equal 'Ce', t(@camille, @name.substring(1, 1)+'e')
|
293
221
|
end
|
294
222
|
|
295
223
|
def test_find_in_set
|
296
224
|
skip "Sqlite version can't load extension for find_in_set" if $sqlite && $load_extension_disabled
|
297
|
-
skip
|
225
|
+
skip "SQL Server does not know about FIND_IN_SET" if @env_db == 'mssql'
|
298
226
|
assert_equal 5, t(@neg, @comments & 2)
|
299
227
|
assert_equal 0, t(@neg, @comments & 6) # not found
|
300
228
|
end
|
301
229
|
|
302
230
|
def test_string_comparators
|
303
|
-
#
|
231
|
+
#skip "Oracle can't use math operators to compare strings" if @env_db == 'oracle' # use GREATEST ?
|
304
232
|
skip "SQL Server can't use math operators to compare strings" if @env_db == 'mssql' # use GREATEST ?
|
305
233
|
if @env_db == 'postgresql' # may return real boolean
|
306
234
|
assert t(@neg, @name >= 'Mest') == true || t(@neg, @name >= 'Mest') == 't' # depends of ar version
|
307
235
|
assert t(@neg, @name <= (@name + 'Z')) == true || t(@neg, @name <= (@name + 'Z')) == 't'
|
308
236
|
elsif @env_db == 'oracle'
|
309
|
-
assert_equal 1, t(@neg,
|
310
|
-
assert_equal 1, t(@neg,
|
311
|
-
assert_equal 1, t(@neg,
|
312
|
-
assert_equal 1, t(@neg,
|
237
|
+
assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name >= 'Mest').then(1).else(0))
|
238
|
+
assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name <= (@name + 'Z')).then(1).else(0))
|
239
|
+
assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name > 'Mest').then(1).else(0))
|
240
|
+
assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name < (@name + 'Z')).then(1).else(0))
|
313
241
|
else
|
314
242
|
assert_equal 1, t(@neg, @name >= 'Mest')
|
315
243
|
assert_equal 1, t(@neg, @name <= (@name + 'Z'))
|
@@ -321,75 +249,69 @@ module ArelExtensions
|
|
321
249
|
def test_compare_on_date_time_types
|
322
250
|
skip "Sqlite can't compare time" if $sqlite
|
323
251
|
skip "Oracle can't compare time" if @env_db == 'oracle'
|
324
|
-
|
325
|
-
assert_includes [true,
|
326
|
-
assert_includes [false,
|
327
|
-
|
328
|
-
assert_includes [true,
|
329
|
-
assert_includes [false,
|
330
|
-
|
331
|
-
#
|
332
|
-
#
|
333
|
-
assert_includes [true,
|
334
|
-
assert_includes [false,
|
252
|
+
#@created_at == 2016-05-23
|
253
|
+
assert_includes [true,'t',1], t(@laure, ArelExtensions::Nodes::Case.new.when(@created_at >= '2014-01-01').then(1).else(0))
|
254
|
+
assert_includes [false,'f',0], t(@laure, ArelExtensions::Nodes::Case.new.when(@created_at >= '2018-01-01').then(1).else(0))
|
255
|
+
#@updated_at == 2014-03-03 12:42:00
|
256
|
+
assert_includes [true,'t',1], t(@laure, ArelExtensions::Nodes::Case.new.when(@updated_at >= '2014-03-03 10:10:10').then(1).else(0))
|
257
|
+
assert_includes [false,'f',0], t(@laure, ArelExtensions::Nodes::Case.new.when(@updated_at >= '2014-03-03 13:10:10').then(1).else(0))
|
258
|
+
#@duration == 12:42:21
|
259
|
+
#puts @laure.select(ArelExtensions::Nodes::Case.new.when(@duration >= '10:10:10').then(1).else(0)).to_sql
|
260
|
+
#puts @laure.select(ArelExtensions::Nodes::Case.new.when(@duration >= '14:10:10').then(1).else(0)).to_sql
|
261
|
+
assert_includes [true,'t',1], t(@laure, ArelExtensions::Nodes::Case.new.when(@duration >= '10:10:10').then(1).else(0))
|
262
|
+
assert_includes [false,'f',0], t(@laure, ArelExtensions::Nodes::Case.new.when(@duration >= '14:10:10').then(1).else(0))
|
335
263
|
end
|
336
264
|
|
265
|
+
|
337
266
|
def test_regexp_not_regexp
|
338
267
|
skip "Sqlite version can't load extension for regexp" if $sqlite && $load_extension_disabled
|
339
|
-
skip
|
268
|
+
skip "SQL Server does not know about REGEXP without extensions" if @env_db == 'mssql'
|
340
269
|
assert_equal 1, User.where(@name =~ '^M').count
|
341
|
-
assert_equal
|
270
|
+
assert_equal 6, User.where(@name !~ '^L').count
|
342
271
|
assert_equal 1, User.where(@name =~ /^M/).count
|
343
|
-
assert_equal
|
272
|
+
assert_equal 6, User.where(@name !~ /^L/).count
|
344
273
|
end
|
345
274
|
|
346
275
|
def test_imatches
|
347
|
-
#
|
276
|
+
#puts User.where(@name.imatches('m%')).to_sql
|
348
277
|
assert_equal 1, User.where(@name.imatches('m%')).count
|
349
278
|
assert_equal 4, User.where(@name.imatches_any(['L%', '%e'])).count
|
350
|
-
assert_equal
|
279
|
+
assert_equal 6, User.where(@name.idoes_not_match('L%')).count
|
351
280
|
end
|
352
281
|
|
353
282
|
def test_replace
|
354
|
-
assert_equal
|
355
|
-
assert_equal
|
356
|
-
|
357
|
-
skip 'Sqlite does not seem to support regexp_replace' if $sqlite
|
358
|
-
skip 'SQL Server does not know about REGEXP without extensions' if @env_db == 'mssql'
|
359
|
-
skip 'Travis mysql version does not support REGEXP_REPLACE' if @env_db == 'mysql'
|
360
|
-
assert_equal 'LXcXs', t(@lucas, @name.replace(/[ua]/, 'X'))
|
361
|
-
assert_equal 'LXcXs', t(@lucas, @name.regexp_replace(/[ua]/, 'X'))
|
362
|
-
assert_equal 'LXcXs', t(@lucas, @name.regexp_replace('[ua]', 'X'))
|
283
|
+
assert_equal "LucaX", t(@lucas, @name.replace("s", "X"))
|
284
|
+
assert_equal "replace", t(@lucas, @name.replace(@name, "replace"))
|
363
285
|
end
|
364
286
|
|
365
287
|
def test_replace_once
|
366
|
-
skip
|
367
|
-
#
|
368
|
-
assert_equal
|
288
|
+
skip "TODO"
|
289
|
+
#skip "Sqlite version can't load extension for locate" if $sqlite && $load_extension_disabled
|
290
|
+
assert_equal "LuCas", t(@lucas, @name.substring(1, @name.locate('c') - 1) + 'C' + @name.substring(@name.locate('c') + 1, @name.length))
|
369
291
|
end
|
370
292
|
|
371
293
|
def test_soundex
|
372
294
|
skip "Sqlite version can't load extension for soundex" if $sqlite && $load_extension_disabled
|
373
295
|
skip "PostgreSql version can't load extension for soundex" if @env_db == 'postgresql'
|
374
|
-
assert_equal
|
375
|
-
assert_equal
|
376
|
-
assert_equal
|
296
|
+
assert_equal "C540", t(@camille, @name.soundex)
|
297
|
+
assert_equal 8, User.where(@name.soundex.eq(@name.soundex)).count
|
298
|
+
assert_equal 8, User.where(@name.soundex == @name.soundex).count
|
377
299
|
end
|
378
300
|
|
379
301
|
def test_change_case
|
380
|
-
assert_equal
|
381
|
-
assert_equal
|
382
|
-
assert_equal
|
302
|
+
assert_equal "myung", t(@myung, @name.downcase)
|
303
|
+
assert_equal "MYUNG", t(@myung, @name.upcase)
|
304
|
+
assert_equal "myung", t(@myung, @name.upcase.downcase)
|
383
305
|
end
|
384
306
|
|
385
307
|
def test_trim
|
386
|
-
assert_equal
|
387
|
-
assert_equal
|
388
|
-
assert_equal
|
389
|
-
assert_equal
|
390
|
-
assert_equal
|
391
|
-
skip
|
392
|
-
assert_equal
|
308
|
+
assert_equal "Myung", t(@myung, @name.trim)
|
309
|
+
assert_equal "Myung", t(@myung, @name.trim.ltrim.rtrim)
|
310
|
+
assert_equal "Myun", t(@myung, @name.rtrim("g"))
|
311
|
+
assert_equal "yung", t(@myung, @name.ltrim("M"))
|
312
|
+
assert_equal "yung", t(@myung, (@name + "M").trim("M"))
|
313
|
+
skip "Oracle does not accept multi char trim" if @env_db == 'oracle'
|
314
|
+
assert_equal "", t(@myung, @name.rtrim(@name))
|
393
315
|
end
|
394
316
|
|
395
317
|
def test_blank
|
@@ -418,244 +340,32 @@ module ArelExtensions
|
|
418
340
|
assert_equal 'true', t(@neg, @comments.not_blank.then('true', 'false'))
|
419
341
|
end
|
420
342
|
|
421
|
-
# This test repeats a lot of `test_blank` cases.
|
422
|
-
def test_present
|
423
|
-
if @env_db == 'postgresql'
|
424
|
-
assert_includes [true, 't'], t(@myung, @name.present) # depends of adapter
|
425
|
-
assert_includes [false, 'f'], t(@myung, @comments.present)
|
426
|
-
end
|
427
|
-
assert_equal 1, @myung.where(@name.present).count
|
428
|
-
assert_equal 0, @myung.where(@comments.present).count
|
429
|
-
assert_equal 0, @sophie.where(@comments.present).count
|
430
|
-
assert_equal 0, @camille.where(@comments.present).count
|
431
|
-
|
432
|
-
assert_equal 1, @neg.where(@comments.present).count
|
433
|
-
assert_equal 'true', t(@myung, @name.present.then('true', 'false'))
|
434
|
-
assert_equal 'false', t(@myung, @comments.present.then('true', 'false'))
|
435
|
-
assert_equal 'true', t(@neg, @comments.present.then('true', 'false'))
|
436
|
-
end
|
437
|
-
|
438
343
|
def test_format
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
assert_equal '12:42%', t(@lucas, @updated_at.send(method, '%R%%'))
|
443
|
-
|
444
|
-
# The following tests will ensure proper conversion of timestamps to
|
445
|
-
# requested timezones.
|
446
|
-
#
|
447
|
-
# The names of the timezones is highly dependant on the underlying
|
448
|
-
# operating system, and this is why we need to handle each database
|
449
|
-
# separately: the images we're using to test these databases are
|
450
|
-
# different. So don't rely on the provided examples. Your setup is your
|
451
|
-
# reference.
|
452
|
-
#
|
453
|
-
# One could always have portable code if s/he uses standard
|
454
|
-
# abbreviations, like:
|
455
|
-
#
|
456
|
-
# 1. CET => Central European Time
|
457
|
-
# 2. CEST => Central European Summer Time
|
458
|
-
#
|
459
|
-
# Which implies that the caller should handle daylight saving detection.
|
460
|
-
# In fact, CET will handle daylight saving in MySQL but not Postgres.
|
461
|
-
#
|
462
|
-
# It looks like the posix convention is supported by mysql and
|
463
|
-
# postgresql, e.g.:
|
464
|
-
#
|
465
|
-
# posix/Europe/Paris
|
466
|
-
# posix/America/Nipigon
|
467
|
-
#
|
468
|
-
# so it looks like a more reliably portable way of specifying it.
|
469
|
-
time_zones = {
|
470
|
-
'mssql' => {
|
471
|
-
'utc' => 'UTC',
|
472
|
-
'sao_paulo' => 'Argentina Standard Time',
|
473
|
-
'tahiti' => 'Hawaiian Standard Time',
|
474
|
-
'paris' => 'Central European Standard Time'
|
475
|
-
},
|
476
|
-
'posix' => {
|
477
|
-
'utc' => 'UTC',
|
478
|
-
'sao_paulo' => 'America/Sao_Paulo',
|
479
|
-
'tahiti' => 'Pacific/Tahiti',
|
480
|
-
'paris' => 'Europe/Paris'
|
481
|
-
}
|
482
|
-
}
|
483
|
-
|
484
|
-
skip "Unsupported timezone conversion for DB=#{ENV['DB']}" if !%w[mssql mysql oracle postgresql].include?(ENV['DB'])
|
485
|
-
# TODO: Standarize timezone conversion across all databases.
|
486
|
-
# This test case will be refactored and should work the same across all vendors.
|
487
|
-
if ENV['DB'] == 'mssql' && /Microsoft SQL Server (\d+)/.match(ActiveRecord::Base.connection.select_value('SELECT @@version'))[1].to_i < 2016
|
488
|
-
skip "SQL Server < 2016 is not currently supported"
|
489
|
-
end
|
490
|
-
|
491
|
-
tz = ENV['DB'] == 'mssql' ? time_zones['mssql'] : time_zones['posix']
|
492
|
-
|
493
|
-
assert_equal '2014/03/03 12:42:00', t(@lucas, @updated_at.send(method, '%Y/%m/%d %H:%M:%S', tz['utc']))
|
494
|
-
assert_equal '2014/03/03 09:42:00', t(@lucas, @updated_at.send(method, '%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['sao_paulo']}))
|
495
|
-
assert_equal '2014/03/03 02:42:00', t(@lucas, @updated_at.send(method, '%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['tahiti']}))
|
496
|
-
|
497
|
-
# Skipping conversion from UTC to the desired timezones fails in SQL
|
498
|
-
# Server and Postgres. This is mainly due to the fact that timezone
|
499
|
-
# information is not preserved in the column itself.
|
500
|
-
#
|
501
|
-
# MySQL is happy to consider that times by default are in UTC.
|
502
|
-
assert_equal '2014/03/03 13:42:00', t(@lucas, @updated_at.send(method, '%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
|
503
|
-
refute_equal '2014/03/03 13:42:00', t(@lucas, @updated_at.send(method, '%Y/%m/%d %H:%M:%S', tz['paris'])) if !%w[mysql postgresql].include?(ENV['DB'])
|
504
|
-
|
505
|
-
# Winter/Summer time
|
506
|
-
assert_equal '2014/08/03 14:42:00', t(@lucas, (@updated_at + 5.months).send(method, '%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
|
507
|
-
if ENV['DB'] == 'mssql'
|
508
|
-
assert_equal '2022/02/01 11:42:00', t(@lucas, Arel.quoted('2022-02-01 10:42:00').cast(:datetime).send(method, '%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
|
509
|
-
assert_equal '2022/08/01 12:42:00', t(@lucas, Arel.quoted('2022-08-01 10:42:00').cast(:datetime).send(method, '%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
|
510
|
-
else
|
511
|
-
assert_equal '2022/02/01 11:42:00', t(@lucas, Arel.quoted('2022-02-01 10:42:00').cast(:datetime).send(method, '%Y/%m/%d %H:%M:%S', tz['paris']))
|
512
|
-
assert_equal '2022/08/01 12:42:00', t(@lucas, Arel.quoted('2022-08-01 10:42:00').cast(:datetime).send(method, '%Y/%m/%d %H:%M:%S', tz['paris']))
|
513
|
-
end
|
514
|
-
end
|
515
|
-
end
|
516
|
-
|
517
|
-
def test_format_iso_week
|
518
|
-
%i[format format_date].each do |method|
|
519
|
-
skip "Unsupported ISO week number for DB=#{ENV['DB']}" if ['sqlite'].include?(ENV['DB'])
|
520
|
-
assert_equal '10', t(@lucas, @updated_at.send(method, '%V'))
|
521
|
-
{
|
522
|
-
'2024-01-01 10:42:00' => '01', # Monday
|
523
|
-
'2030-01-01 10:42:00' => '01', # Tuesday
|
524
|
-
'2025-01-01 10:42:00' => '01', # Wednesday
|
525
|
-
'2026-01-01 10:42:00' => '01', # Thursday
|
526
|
-
'2027-01-01 10:42:00' => '53', # Friday
|
527
|
-
'2028-01-01 10:42:00' => '52', # Saturday
|
528
|
-
'2034-01-01 10:42:00' => '52', # Sunday
|
529
|
-
}.each do |date, exp|
|
530
|
-
assert_equal exp, t(@lucas, Arel.quoted(date).cast(:datetime).send(method, '%V'))
|
531
|
-
end
|
532
|
-
end
|
533
|
-
end
|
534
|
-
|
535
|
-
def test_format_iso_year_of_week
|
536
|
-
skip "Unsupported ISO year of week for DB=#{ENV['DB']}" if %w[mssql sqlite].include?(ENV['DB'])
|
537
|
-
%i[format format_date].each do |method|
|
538
|
-
assert_equal '2014', t(@lucas, @updated_at.send(method, '%G'))
|
539
|
-
|
540
|
-
{
|
541
|
-
'2024-01-01 10:42:00' => '2024', # Monday
|
542
|
-
'2030-01-01 10:42:00' => '2030', # Tuesday
|
543
|
-
'2025-01-01 10:42:00' => '2025', # Wednesday
|
544
|
-
'2026-01-01 10:42:00' => '2026', # Thursday
|
545
|
-
'2027-01-01 10:42:00' => '2026', # Friday
|
546
|
-
'2028-01-01 10:42:00' => '2027', # Saturday
|
547
|
-
'2034-01-01 10:42:00' => '2033', # Sunday
|
548
|
-
}.each do |date, exp|
|
549
|
-
assert_equal exp, t(@lucas, Arel.quoted(date).cast(:datetime).send(method, '%G'))
|
550
|
-
end
|
551
|
-
end
|
552
|
-
end
|
553
|
-
|
554
|
-
def test_format_date_with_names
|
555
|
-
skip "#{ENV['DB']} does not support a variety of word-based formatting for month and day names" if %w[mssql sqlite].include?(ENV['DB'])
|
556
|
-
%i[format format_date].each do |method|
|
557
|
-
assert_equal 'Mon, 03 Mar 14', t(@lucas, @updated_at.send(method, '%a, %d %b %y'))
|
558
|
-
assert_equal 'Monday, 03 March 14', t(@lucas, @updated_at.send(method, '%A, %d %B %y'))
|
559
|
-
end
|
560
|
-
|
561
|
-
skip "#{ENV['DB']} does not support ALLCAPS month and day names" if ['mysql'].include?(ENV['DB'])
|
562
|
-
%i[format format_date].each do |method|
|
563
|
-
|
564
|
-
assert_equal 'Mon, 03 MAR 14', t(@lucas, @updated_at.send(method, '%a, %d %^b %y'))
|
565
|
-
assert_equal 'Monday, 03 MARCH 14', t(@lucas, @updated_at.send(method, '%A, %d %^B %y'))
|
566
|
-
end
|
567
|
-
end
|
568
|
-
|
569
|
-
def switch_to_lang(lang)
|
570
|
-
languages = {
|
571
|
-
'mssql' => {en: 'English', fr: 'French'},
|
572
|
-
'mysql' => {en: 'en_US', fr: 'fr_FR'},
|
573
|
-
'postgresql' => {en: 'en_US.utf8', fr: 'fr_FR.utf8'}
|
574
|
-
}
|
575
|
-
|
576
|
-
sql = {
|
577
|
-
'mssql' => ->(l) { "SET LANGUAGE #{l};" },
|
578
|
-
'mysql' => ->(l) { "SET lc_time_names = '#{l}';" },
|
579
|
-
'postgresql' => ->(l) { "SET lc_time to '#{l}';" }
|
580
|
-
}
|
581
|
-
|
582
|
-
User.connection.execute(sql[ENV['DB']][languages[ENV['DB']][lang]])
|
583
|
-
end
|
584
|
-
|
585
|
-
def test_format_date_with_names_and_lang_switch
|
586
|
-
skip "#{ENV['DB']} does not support word-based formatting for month and day names" if ['sqlite'].include?(ENV['DB'])
|
587
|
-
|
588
|
-
# the begin-rescue block is here to make sure we set the db back to en_US
|
589
|
-
# if we fail, so that other tests don't get contaminated.
|
590
|
-
#
|
591
|
-
# Tests should assert one single thing in principle, but until we
|
592
|
-
# refactor this whole thing, we'll have to do tricks of this sort.
|
593
|
-
%i[format format_date].each do |method|
|
594
|
-
begin
|
595
|
-
switch_to_lang(:en)
|
596
|
-
case ENV['DB']
|
597
|
-
when 'mysql', 'postgresql'
|
598
|
-
assert_equal 'Mon, 03 Mar 14', t(@lucas, @updated_at.send(method, '%a, %d %b %y'))
|
599
|
-
assert_equal 'Monday, 03 March 14', t(@lucas, @updated_at.send(method, '%A, %d %B %y'))
|
600
|
-
when 'mssql'
|
601
|
-
assert_equal 'Monday, 03 March 2014', t(@lucas, @updated_at.send(method, '%A, %d %B %y'))
|
602
|
-
end
|
603
|
-
switch_to_lang(:fr)
|
604
|
-
case ENV['DB']
|
605
|
-
when 'mysql'
|
606
|
-
assert_equal 'lun, 03 mar 14', t(@lucas, @updated_at.send(method, '%a, %d %b %y'))
|
607
|
-
assert_equal 'lundi, 03 mars 14', t(@lucas, @updated_at.send(method, '%A, %d %B %y'))
|
608
|
-
when 'postgresql'
|
609
|
-
assert_equal 'Lun., 03 Mars 14', t(@lucas, @updated_at.send(method, '%a, %d %b %y'))
|
610
|
-
assert_equal 'Lundi, 03 Mars 14', t(@lucas, @updated_at.send(method, '%A, %d %B %y'))
|
611
|
-
when 'mssql'
|
612
|
-
assert_equal 'lundi, 03 mars 2014', t(@lucas, @updated_at.send(method, '%A, %d %B %y'))
|
613
|
-
end
|
614
|
-
ensure
|
615
|
-
switch_to_lang(:en)
|
616
|
-
end
|
617
|
-
end
|
344
|
+
assert_equal '2016-05-23', t(@lucas, @created_at.format('%Y-%m-%d'))
|
345
|
+
skip "SQL Server does not accept any format" if @env_db == 'mssql'
|
346
|
+
assert_equal '2014/03/03 12:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S'))
|
618
347
|
end
|
619
348
|
|
620
349
|
def test_coalesce
|
621
|
-
assert_equal 'Camille concat', t(@camille, @name.coalesce(nil,
|
350
|
+
assert_equal 'Camille concat', t(@camille, @name.coalesce(nil, "default") + ' concat')
|
622
351
|
|
623
|
-
assert_equal 'toto', t(@test, @other.coalesce(
|
352
|
+
assert_equal 'toto', t(@test, @other.coalesce(""))
|
624
353
|
|
625
|
-
assert_equal ' ', t(@myung, @comments.coalesce(
|
626
|
-
assert_equal 'Laure', t(@laure, @comments.coalesce(
|
354
|
+
assert_equal ' ', t(@myung, @comments.coalesce("Myung").coalesce('ignored'))
|
355
|
+
assert_equal 'Laure', t(@laure, @comments.coalesce("Laure"))
|
627
356
|
if @env_db == 'oracle'
|
628
|
-
assert_nil t(@laure, @comments.coalesce(
|
629
|
-
assert_nil t(@camille, @other.coalesce(
|
357
|
+
assert_nil t(@laure, @comments.coalesce(""))
|
358
|
+
assert_nil t(@camille, @other.coalesce(""))
|
630
359
|
else
|
631
|
-
assert_equal('', t(@laure, @comments.coalesce(
|
632
|
-
assert_equal '', t(@camille, @other.coalesce(
|
360
|
+
assert_equal('', t(@laure, @comments.coalesce("")))
|
361
|
+
assert_equal '', t(@camille, @other.coalesce(""))
|
633
362
|
end
|
634
363
|
assert_equal 100, t(@test, @age.coalesce(100))
|
635
|
-
assert_equal
|
364
|
+
assert_equal "Camille", t(@camille, @name.coalesce(nil, "default"))
|
636
365
|
assert_equal 20, t(@test, @age.coalesce(nil, 20))
|
637
366
|
|
638
|
-
assert_equal 20, t(@test, @age.coalesce(10)
|
639
|
-
assert_equal 'Laure10', t(@laure, @comments.coalesce(
|
640
|
-
end
|
641
|
-
|
642
|
-
def test_coalesce_blank
|
643
|
-
assert_equal 'Myung', t(@myung, @comments.coalesce_blank('Myung').coalesce_blank('ignored'))
|
644
|
-
assert_equal 'Myung', t(@myung, @comments.coalesce_blank('', ' ', ' ').coalesce_blank('Myung'))
|
645
|
-
assert_equal 'Myung', t(@myung, @comments.coalesce_blank('', ' ', ' ', 'Myung'))
|
646
|
-
assert_equal '2016-05-23', t(@myung, @created_at.coalesce_blank(Date.new(2022, 1, 1)).format('%Y-%m-%d'))
|
647
|
-
assert_equal '2016-05-23', t(@myung, @created_at.coalesce_blank(Date.new(2022, 1, 1)).format_date('%Y-%m-%d'))
|
648
|
-
assert_equal 'Laure', t(@laure, @comments.coalesce_blank('Laure'))
|
649
|
-
assert_equal 100, t(@test, @age.coalesce_blank(100))
|
650
|
-
assert_equal 20, t(@test, @age.coalesce_blank(20))
|
651
|
-
assert_equal 20, t(@test, @age.coalesce_blank(10) + 10)
|
652
|
-
assert_equal 'Laure10', t(@laure, @comments.coalesce_blank('Laure') + 10)
|
653
|
-
|
654
|
-
skip 'mssql does not support null in case results' if @env_db == 'mssql'
|
655
|
-
|
656
|
-
assert_equal 'Camille concat', t(@camille, @name.coalesce_blank(Arel.null, 'default') + ' concat')
|
657
|
-
assert_equal 'Myung', t(@myung, @comments.coalesce_blank(Arel.null, 'Myung'))
|
658
|
-
assert_equal 'Camille', t(@camille, @name.coalesce_blank(Arel.null, 'default'))
|
367
|
+
assert_equal 20, t(@test, @age.coalesce(10)+10)
|
368
|
+
assert_equal 'Laure10', t(@laure, @comments.coalesce("Laure") + 10)
|
659
369
|
end
|
660
370
|
|
661
371
|
# Comparators
|
@@ -664,44 +374,37 @@ module ArelExtensions
|
|
664
374
|
assert_equal 2, User.where(@age <= 10).count
|
665
375
|
assert_equal 3, User.where(@age > 20).count
|
666
376
|
assert_equal 4, User.where(@age >= 20).count
|
667
|
-
assert_equal
|
377
|
+
assert_equal 1, User.where(@age > 5).where(@age < 20).count
|
668
378
|
end
|
669
379
|
|
670
380
|
def test_date_comparator
|
671
381
|
d = Date.new(2016, 5, 23)
|
672
382
|
assert_equal 0, User.where(@created_at < d).count
|
673
|
-
assert_equal
|
383
|
+
assert_equal 8, User.where(@created_at >= d).count
|
674
384
|
end
|
675
385
|
|
676
386
|
def test_date_duration
|
677
|
-
#
|
678
|
-
# activerecord will give it the current date.
|
679
|
-
#
|
680
|
-
# So depending on the month when we run this test, we will get different
|
681
|
-
# results for `User.where(@created_at.month.eq('05'))`.
|
682
|
-
count_for_may = Time.now.month == 5 ? 10 : 9
|
683
|
-
|
684
|
-
# Year
|
387
|
+
#Year
|
685
388
|
assert_equal 2016, t(@lucas, @created_at.year).to_i
|
686
|
-
assert_equal 0, User.where(@created_at.year.eq(
|
687
|
-
#
|
389
|
+
assert_equal 0, User.where(@created_at.year.eq("2012")).count
|
390
|
+
#Month
|
688
391
|
assert_equal 5, t(@camille, @created_at.month).to_i
|
689
|
-
assert_equal
|
690
|
-
#
|
392
|
+
assert_equal 8, User.where(@created_at.month.eq("05")).count
|
393
|
+
#Week
|
691
394
|
assert_equal(@env_db == 'mssql' ? 22 : 21, t(@arthur, @created_at.week).to_i)
|
692
|
-
assert_equal
|
693
|
-
#
|
395
|
+
assert_equal 8, User.where(@created_at.month.eq("05")).count
|
396
|
+
#Day
|
694
397
|
assert_equal 23, t(@laure, @created_at.day).to_i
|
695
|
-
assert_equal 0, User.where(@created_at.day.eq(
|
398
|
+
assert_equal 0, User.where(@created_at.day.eq("05")).count
|
696
399
|
|
697
|
-
#
|
698
|
-
#
|
400
|
+
#skip "manage DATE" if @env_db == 'oracle'
|
401
|
+
#Hour
|
699
402
|
assert_equal 0, t(@laure, @created_at.hour).to_i
|
700
403
|
assert_equal 12, t(@lucas, @updated_at.hour).to_i
|
701
|
-
#
|
404
|
+
#Minute
|
702
405
|
assert_equal 0, t(@laure, @created_at.minute).to_i
|
703
406
|
assert_equal 42, t(@lucas, @updated_at.minute).to_i
|
704
|
-
#
|
407
|
+
#Second
|
705
408
|
assert_equal 0, t(@laure, @created_at.second).to_i
|
706
409
|
assert_equal 0, t(@lucas, @updated_at.second).to_i
|
707
410
|
end
|
@@ -709,8 +412,8 @@ module ArelExtensions
|
|
709
412
|
def test_datetime_diff
|
710
413
|
assert_equal 0, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 42)).to_i
|
711
414
|
if @env_db == 'oracle' && Arel::VERSION.to_i > 6 # in rails 5, result is multiplied by 24*60*60 = 86400...
|
712
|
-
assert_equal 42 *
|
713
|
-
assert_equal(-3600 *
|
415
|
+
assert_equal 42 * 86400, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 41, 18)).to_i
|
416
|
+
assert_equal(-3600 * 86400, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 13, 42)).to_i)
|
714
417
|
else
|
715
418
|
assert_equal 42, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 41, 18)).to_i
|
716
419
|
assert_equal(-3600, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 13, 42)).to_i)
|
@@ -721,8 +424,7 @@ module ArelExtensions
|
|
721
424
|
end
|
722
425
|
end
|
723
426
|
|
724
|
-
|
725
|
-
skip 'not yet implemented' if $sqlite
|
427
|
+
skip "not yet implemented" if $sqlite
|
726
428
|
|
727
429
|
date1 = Date.new(2016, 5, 23)
|
728
430
|
durPos = 10.years
|
@@ -734,134 +436,106 @@ module ArelExtensions
|
|
734
436
|
|
735
437
|
datetime1 = Time.utc(2014, 3, 3, 12, 42, 0)
|
736
438
|
# Pull Request #5 tests
|
737
|
-
#
|
738
|
-
assert_includes [date2,
|
739
|
-
assert_includes [date3,
|
439
|
+
#puts (@created_at + durPos).cast(:date).to_sql
|
440
|
+
assert_includes [date2,"2026-05-23"], t(@test,(@created_at + durPos).cast(:date))
|
441
|
+
assert_includes [date3,"2006-05-23"], t(@test,(@created_at + durNeg).cast(:date))
|
740
442
|
|
741
|
-
#
|
742
|
-
assert_includes [date4,
|
743
|
-
#
|
744
|
-
assert_includes [date5,
|
443
|
+
#puts (@created_at + @created_at.day).cast(:date).to_sql
|
444
|
+
assert_includes [date4,"2016-06-15"], t(@test,(@created_at + @created_at.day).cast(:date))
|
445
|
+
#puts (@created_at - @created_at.day).cast(:date).to_sql
|
446
|
+
assert_includes [date5,"2016-04-30"], t(@test,(@created_at - @created_at.day).cast(:date))
|
745
447
|
|
746
|
-
assert_includes [datetime1 + 42.seconds,
|
747
|
-
assert_includes [datetime1 - 42.seconds,
|
448
|
+
assert_includes [datetime1 + 42.seconds,"2014-03-03 12:42:42 UTC"], t(@lucas,(@updated_at + @updated_at.minute))
|
449
|
+
assert_includes [datetime1 - 42.seconds,"2014-03-03 12:41:18 UTC"], t(@lucas,(@updated_at - @updated_at.minute))
|
748
450
|
|
749
451
|
# (@updated_at + Arel.duration('s',(@updated_at.hour*60 + @updated_at.minute))).to_sql
|
750
|
-
assert_includes [datetime1 + (12
|
751
|
-
|
452
|
+
assert_includes [datetime1 + (12*60+42).seconds,"2014-03-03 12:54:42 UTC"],
|
453
|
+
t(@lucas,(@updated_at + Arel.duration('s',(@updated_at.hour*60 + @updated_at.minute))))
|
752
454
|
|
753
|
-
assert_includes [datetime1 + (12
|
754
|
-
|
455
|
+
assert_includes [datetime1 + (12*60+42).minutes,"2014-03-04 01:24:00 UTC"],
|
456
|
+
t(@lucas,(@updated_at + Arel.duration('mn',(@updated_at.hour*60 + @updated_at.minute))))
|
755
457
|
|
756
|
-
assert_includes [
|
757
|
-
|
758
|
-
|
759
|
-
assert_includes ['2004-03-03'], t(@lucas, (@updated_at - durPos).format('%Y-%m-%d'))
|
760
|
-
assert_includes ['2004-03-03'], t(@lucas, (@updated_at - durPos).format_date('%Y-%m-%d'))
|
458
|
+
assert_includes ["2024-03-03"], t(@lucas,(@updated_at + durPos).format('%Y-%m-%d'))
|
459
|
+
#puts (@updated_at - durPos).to_sql
|
460
|
+
assert_includes ["2004-03-03"], t(@lucas,(@updated_at - durPos).format('%Y-%m-%d'))
|
761
461
|
|
762
462
|
|
763
463
|
# we test with the ruby object or the string because some adapters don't return an object Date
|
764
|
-
|
464
|
+
# end
|
765
465
|
end
|
766
466
|
|
767
467
|
# TODO; cast types
|
768
468
|
def test_cast_types
|
769
|
-
assert_equal
|
770
|
-
skip 'jdbc adapters does not work properly here (v52 works fine)' if RUBY_PLATFORM.match?(/java/i)
|
469
|
+
assert_equal "5", t(@lucas, @age.cast(:string))
|
771
470
|
if @env_db == 'mysql' || @env_db == 'postgresql' || @env_db == 'oracle' || @env_db == 'mssql'
|
772
|
-
assert_equal 1, t(@laure,
|
773
|
-
assert_equal 1, t(@laure,
|
774
|
-
assert_equal
|
775
|
-
assert_equal
|
776
|
-
assert_equal 21.16, t(@laure
|
777
|
-
assert_equal 21, t(@laure
|
778
|
-
|
779
|
-
assert_equal String, t(@lucas
|
780
|
-
|
781
|
-
assert_equal
|
782
|
-
assert_equal Time, t(@lucas
|
783
|
-
|
784
|
-
|
785
|
-
|
786
|
-
assert_equal
|
787
|
-
assert_equal
|
788
|
-
assert_equal Date.parse(
|
789
|
-
assert_equal
|
790
|
-
assert_equal Date.parse('2014-03-03'), t(@lucas, @updated_at.cast(:date))
|
791
|
-
assert_equal '12:42:00', t(@lucas, @updated_at.cast(:time).cast(:string)).split('.').first unless @env_db == 'oracle' # DateTime
|
792
|
-
end
|
793
|
-
end
|
794
|
-
|
795
|
-
def test_if_present
|
796
|
-
assert_nil t(@myung, @comments.if_present)
|
797
|
-
assert_equal 0, t(@myung, @comments.if_present.count)
|
798
|
-
assert_equal 20.16, t(@myung, @score.if_present)
|
799
|
-
assert_equal '2016-05-23', t(@myung, @created_at.if_present.format('%Y-%m-%d'))
|
800
|
-
assert_equal '2016-05-23', t(@myung, @created_at.if_present.format_date('%Y-%m-%d'))
|
801
|
-
assert_nil t(@laure, @comments.if_present)
|
802
|
-
|
803
|
-
assert_nil t(@nilly, @duration.if_present.format('%Y-%m-%d'))
|
804
|
-
assert_nil t(@nilly, @duration.if_present.format_date('%Y-%m-%d'))
|
805
|
-
|
806
|
-
# NOTE: here we're testing the capacity to format a nil value,
|
807
|
-
# however, @comments is a text field, and not a date/datetime field,
|
808
|
-
# so Postgres will rightfully complain when we format the text:
|
809
|
-
# we need to cast it first.
|
810
|
-
if @env_db == 'postgresql'
|
811
|
-
assert_nil t(@laure, @comments.cast(:date).if_present.format('%Y-%m-%d'))
|
812
|
-
assert_nil t(@laure, @comments.cast(:date).if_present.format_date('%Y-%m-%d'))
|
813
|
-
else
|
814
|
-
assert_nil t(@laure, @comments.if_present.format('%Y-%m-%d'))
|
815
|
-
assert_nil t(@laure, @comments.if_present.format_date('%Y-%m-%d'))
|
471
|
+
assert_equal 1, t(@laure,ArelExtensions::Nodes::Case.new.when(@duration.cast(:time).cast(:string).eq("12:42:21")).then(1).else(0)) unless @env_db == 'oracle' || @env_db == 'mssql'
|
472
|
+
assert_equal 1, t(@laure,ArelExtensions::Nodes::Case.new.when(@duration.cast(:time).eq("12:42:21")).then(1).else(0)) unless @env_db == 'oracle'
|
473
|
+
assert_equal "20.16", t(@laure,@score.cast(:string)).gsub(/[0]*\z/,'')
|
474
|
+
assert_equal "20.161", t(@laure,@score.cast(:string)+1).gsub(/[0]*1\z/,'1')
|
475
|
+
assert_equal 21.16, t(@laure,@score.cast(:string).cast(:decimal)+1)
|
476
|
+
assert_equal 21, t(@laure,@score.cast(:string).cast(:int)+1)
|
477
|
+
|
478
|
+
assert_equal String, t(@lucas,@updated_at.cast(:string)).class
|
479
|
+
assert_equal Date, t(@lucas,@updated_at.cast(:date)).class unless @env_db == 'oracle' # DateTime
|
480
|
+
assert_equal Time, t(@lucas,@updated_at.cast(:string).cast(:datetime)).class
|
481
|
+
assert_equal Time, t(@lucas,@updated_at.cast(:time)).class
|
482
|
+
|
483
|
+
assert_equal "2014-03-03 12:42:00", t(@lucas,@updated_at.cast(:string)) unless @env_db == 'mssql' #locale dependent
|
484
|
+
assert_equal Date.parse("2014-03-03"), t(@lucas,Arel::Nodes.build_quoted('2014-03-03').cast(:date))
|
485
|
+
assert_equal Date.parse("5014-03-03"), t(@lucas,(@age.cast(:string) + '014-03-03').cast(:date))
|
486
|
+
assert_equal Time.parse("2014-03-03 12:42:00 UTC"), t(@lucas,@updated_at.cast(:string).cast(:datetime))
|
487
|
+
assert_equal Date.parse("2014-03-03"), t(@lucas,@updated_at.cast(:date))
|
488
|
+
assert_equal "12:42:00", t(@lucas,@updated_at.cast(:time).cast(:string)).split('.').first unless @env_db == 'oracle' #DateTime
|
816
489
|
end
|
817
490
|
end
|
818
491
|
|
819
492
|
def test_is_null
|
820
|
-
#
|
821
|
-
#
|
822
|
-
#
|
823
|
-
#
|
824
|
-
#
|
825
|
-
assert_equal
|
493
|
+
#puts User.where(@age.is_null).select(@name).to_sql
|
494
|
+
#puts @age.is_null
|
495
|
+
#puts @age.is_null.inspect
|
496
|
+
#puts @age.is_null.to_sql
|
497
|
+
#puts @age=='34'
|
498
|
+
assert_equal "Test", User.select(@name).where(@age.is_null.to_sql).first.name
|
826
499
|
end
|
827
500
|
|
828
501
|
def test_math_plus
|
829
502
|
d = Date.new(1997, 6, 15)
|
830
|
-
#
|
831
|
-
assert_equal
|
832
|
-
assert_equal
|
833
|
-
assert_equal
|
834
|
-
assert_equal
|
835
|
-
assert_equal
|
836
|
-
assert_equal
|
837
|
-
assert_equal
|
838
|
-
assert_equal
|
839
|
-
#
|
840
|
-
assert_equal
|
841
|
-
#
|
503
|
+
#Concat String
|
504
|
+
assert_equal "SophiePhan", t(@sophie, @name + "Phan")
|
505
|
+
assert_equal "Sophie2", t(@sophie, @name + 2)
|
506
|
+
assert_equal "Sophie1997-06-15", t(@sophie, @name + d)
|
507
|
+
assert_equal "Sophie15", t(@sophie, @name + @age)
|
508
|
+
assert_equal "SophieSophie", t(@sophie, @name + @name)
|
509
|
+
assert_equal "SophieSophieSophie", t(@sophie, @name + @name + @name)
|
510
|
+
assert_equal "SophieSophieSophie", t(@sophie, @name.concat(@name.concat(@name)))
|
511
|
+
assert_equal "SophieSophieSophie", t(@sophie, @name.concat(@name).concat(@name))
|
512
|
+
#FIXME: should work as expected in Oracle
|
513
|
+
assert_equal "Sophie2016-05-23", t(@sophie, @name + @created_at) unless @env_db == 'oracle'
|
514
|
+
#concat Integer
|
842
515
|
assert_equal 1, User.where((@age + 10).eq(33)).count
|
843
|
-
assert_equal 1, User.where((@age +
|
516
|
+
assert_equal 1, User.where((@age + "1").eq(6)).count
|
844
517
|
assert_equal 1, User.where((@age + @age).eq(10)).count
|
845
|
-
#
|
846
|
-
#
|
847
|
-
assert_equal
|
848
|
-
assert_equal
|
518
|
+
#concat Date
|
519
|
+
#puts((User.arel_table[:created_at] + 1).as("res").to_sql.inspect)
|
520
|
+
assert_equal "2016-05-24", t(@myung, @created_at + 1).to_date.to_s
|
521
|
+
assert_equal "2016-05-25", t(@myung, @created_at + 2.day).to_date.to_s
|
849
522
|
end
|
850
523
|
|
524
|
+
|
851
525
|
def test_math_minus
|
852
526
|
d = Date.new(2016, 5, 20)
|
853
|
-
#
|
854
|
-
assert_equal
|
855
|
-
assert_equal 3, @laure.select((@created_at - d).as(
|
856
|
-
#
|
527
|
+
#Datediff
|
528
|
+
assert_equal 8, User.where((@created_at - @created_at).eq(0)).count
|
529
|
+
assert_equal 3, @laure.select((@created_at - d).as("res")).first.res.abs.to_i
|
530
|
+
#Substraction
|
857
531
|
assert_equal 0, User.where((@age - 10).eq(50)).count
|
858
|
-
assert_equal 0, User.where((@age -
|
532
|
+
assert_equal 0, User.where((@age - "10").eq(50)).count
|
859
533
|
# assert_equal 0, User.where((@age - 9.5).eq(50.5)).count # should work: TODO
|
860
|
-
assert_equal 0, User.where((@age -
|
534
|
+
assert_equal 0, User.where((@age - "9.5").eq(50.5)).count
|
861
535
|
end
|
862
536
|
|
863
537
|
def test_wday
|
864
|
-
#
|
538
|
+
#d = Date.new(2016, 6, 26)
|
865
539
|
assert_equal(@env_db == 'oracle' || @env_db == 'mssql' ? 2 : 1, t(@myung, @created_at.wday).to_i) # monday
|
866
540
|
end
|
867
541
|
|
@@ -880,8 +554,8 @@ module ArelExtensions
|
|
880
554
|
assert_equal 3, User.select('*').from((@ut.project(@age).where(@age.eq(20)) + @ut.project(@age).where(@age.eq(23)) + @ut.project(@age).where(@age.eq(21))).as('my_union')).length
|
881
555
|
assert_equal 2, User.select('*').from((@ut.project(@age).where(@age.eq(20)) + @ut.project(@age).where(@age.eq(20)) + @ut.project(@age).where(@age.eq(21))).as('my_union')).length
|
882
556
|
|
883
|
-
assert_equal 3, User.find_by_sql(@ut.project(@age).where(@age.gt(22)).union_all(@ut.project(@age).where(@age.lt(0))).to_sql).length
|
884
|
-
assert_equal 3, User.find_by_sql(@ut.project(@age).where(@age.eq(20)).union_all(@ut.project(@age).where(@age.eq(20))).union_all(@ut.project(@age).where(@age.eq(21))).to_sql).length
|
557
|
+
assert_equal 3, User.find_by_sql((@ut.project(@age).where(@age.gt(22)).union_all(@ut.project(@age).where(@age.lt(0)))).to_sql).length
|
558
|
+
assert_equal 3, User.find_by_sql((@ut.project(@age).where(@age.eq(20)).union_all(@ut.project(@age).where(@age.eq(20))).union_all(@ut.project(@age).where(@age.eq(21)))).to_sql).length
|
885
559
|
assert_equal 3, User.select('*').from((@ut.project(@age).where(@age.gt(22)).union_all(@ut.project(@age).where(@age.lt(0)))).as('my_union')).length
|
886
560
|
assert_equal 3, User.select('*').from((@ut.project(@age).where(@age.eq(20)).union_all(@ut.project(@age).where(@age.eq(23))).union_all(@ut.project(@age).where(@age.eq(21)))).as('my_union')).length
|
887
561
|
assert_equal 3, User.select('*').from((@ut.project(@age).where(@age.eq(20)).union_all(@ut.project(@age).where(@age.eq(20))).union_all(@ut.project(@age).where(@age.eq(21)))).as('my_union')).length
|
@@ -892,118 +566,116 @@ module ArelExtensions
|
|
892
566
|
# Case clause
|
893
567
|
def test_case
|
894
568
|
assert_equal 4, User.find_by_sql(@ut.project(@score.when(20.16).then(1).else(0).as('score_bin')).to_sql).sum(&:score_bin)
|
895
|
-
assert_equal
|
896
|
-
assert_equal
|
897
|
-
assert_equal
|
898
|
-
assert_equal
|
899
|
-
assert_equal
|
900
|
-
assert_equal '65.621', t(@arthur, @score.when(65.62).then(@score.cast(:string)).else(@score.cast(:string)) + 1).tr('0', '') # tr is here because of precision on cast for some DBMS
|
569
|
+
assert_equal 2, t(@arthur, @score.when(65.62,1).else(0)+1)
|
570
|
+
assert_equal 0, t(@arthur, @score.when(65.62,1).else(0)-1)
|
571
|
+
assert_equal "11", t(@arthur, @score.when(65.62).then("1").else("0")+"1")
|
572
|
+
assert_equal 66.62, t(@arthur, @score.when(65.62).then(@score).else(@score)+1)
|
573
|
+
assert_equal "65.621", t(@arthur, @score.when(65.62).then(@score.cast(:string)).else(@score.cast(:string))+1).tr('0','') #tr is here because of precision on cast for some DBMS
|
901
574
|
end
|
902
575
|
|
903
576
|
def test_format_numbers
|
904
|
-
#
|
905
|
-
skip
|
906
|
-
|
907
|
-
assert_equal
|
908
|
-
assert_equal
|
909
|
-
assert_equal
|
910
|
-
assert_equal
|
911
|
-
assert_equal
|
912
|
-
assert_equal
|
913
|
-
assert_equal
|
914
|
-
assert_equal
|
915
|
-
assert_equal
|
916
|
-
assert_equal
|
917
|
-
assert_equal
|
918
|
-
assert_equal
|
919
|
-
assert_includes [
|
920
|
-
assert_includes [
|
921
|
-
assert_includes [
|
922
|
-
assert_equal
|
923
|
-
assert_equal
|
924
|
-
assert_equal
|
925
|
-
assert_equal
|
926
|
-
assert_equal
|
927
|
-
assert_equal
|
577
|
+
#score of Arthur = 65.62
|
578
|
+
skip " Works with SQLite if the version used knows printf" if $sqlite
|
579
|
+
|
580
|
+
assert_equal "Wrong Format" , t(@arthur, @score.format_number("$ %...234.6F €","fr_FR"))
|
581
|
+
assert_equal "AZERTY65,62" , t(@arthur, @score.format_number("AZERTY%.2f","fr_FR"))
|
582
|
+
assert_equal "65,62AZERTY" , t(@arthur, @score.format_number("%.2fAZERTY","fr_FR"))
|
583
|
+
assert_equal "$ 65.62 €" , t(@arthur, @score.format_number("$ %.2f €","en_US"))
|
584
|
+
assert_equal "$ 66 €" , t(@arthur, @score.format_number("$ %.0f €","en_US"))
|
585
|
+
assert_equal "$ 0065,62 €" , t(@arthur, @score.format_number("$ %07.2f €","fr_FR"))
|
586
|
+
assert_equal "$ 65,62 €" , t(@arthur, @score.format_number("$ %-07.2f €","fr_FR"))
|
587
|
+
assert_equal "$ 65,62 €" , t(@arthur, @score.format_number("$ %-7.2f €","fr_FR"))
|
588
|
+
assert_equal "$ 65,62 €" , t(@arthur, @score.format_number("$ % 7.2f €","fr_FR"))
|
589
|
+
assert_equal "$ 65,6 €" , t(@arthur, @score.format_number("$ % 7.1f €","fr_FR"))
|
590
|
+
assert_equal "$ +65,62 €" , t(@arthur, @score.format_number("$ % +7.2f €","fr_FR"))
|
591
|
+
assert_equal "$ +065,62 €" , t(@arthur, @score.format_number("$ %0+7.2f €","fr_FR"))
|
592
|
+
assert_includes ["$ 6,56e1 €","$ 6,56e+01 €"], t(@arthur, @score.format_number("$ %.2e €","fr_FR"))
|
593
|
+
assert_includes ["$ 6,56E1 €","$ 6,56E+01 €"], t(@arthur, @score.format_number("$ %.2E €","fr_FR"))
|
594
|
+
assert_includes ["$ 6,562E1 €","$ 6,562E+01 €"], t(@arthur, @score.format_number("$ %.3E €","fr_FR"))
|
595
|
+
assert_equal "123 456 765,6" , t(@arthur, (@score+123456700).format_number("%.1f","sv_SE")).gsub("\u00A0"," ") #some DBMS put no-break space here (it makes sense thus)
|
596
|
+
assert_equal "123456765,6" , t(@arthur, (@score+123456700).format_number("%.1f","fr_FR")).gsub("\u00A0","") #because SqlServer does it like no one else
|
597
|
+
assert_equal "123,456,765.6" , t(@arthur, (@score+123456700).format_number("%.1f","en_US"))
|
598
|
+
assert_equal " 123,456,765.6" , t(@arthur, (@score+123456700).format_number("%16.1f","en_US"))
|
599
|
+
assert_equal "$ 0,00 €" , t(@arthur, @score.when(65.62).then(Arel.sql("null")).else(1).format_number("$ %.2f €","fr_FR"))
|
600
|
+
assert_equal "$ 0,00 €" , t(@arthur, (@score-65.62).format_number("$ %.2f €","fr_FR"))
|
928
601
|
end
|
929
602
|
|
930
603
|
def test_accent_insensitive
|
931
|
-
skip
|
932
|
-
skip
|
604
|
+
skip "SQLite is natively Case Insensitive and Accent Sensitive" if $sqlite
|
605
|
+
skip "Not finished" if @env_db == 'mysql'
|
933
606
|
# actual comments value: "arrêté"
|
934
|
-
#
|
607
|
+
#AI & CI
|
935
608
|
if !['postgresql'].include?(@env_db) # Extension unaccent required on PG
|
936
|
-
assert_equal
|
937
|
-
assert_equal
|
938
|
-
assert_equal
|
939
|
-
assert_equal
|
940
|
-
assert_equal
|
941
|
-
assert_equal
|
942
|
-
#
|
943
|
-
assert_equal
|
944
|
-
assert_equal
|
945
|
-
assert_equal
|
946
|
-
assert_equal
|
947
|
-
if
|
948
|
-
assert_equal
|
949
|
-
assert_equal
|
609
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("arrêté")).then("1").else("0"))
|
610
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("arrete")).then("1").else("0"))
|
611
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("àrrétè")).then("1").else("0"))
|
612
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("arretez")).then("1").else("0"))
|
613
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("Arrete")).then("1").else("0"))
|
614
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("Arrêté")).then("1").else("0"))
|
615
|
+
#AI & CS
|
616
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("arrêté")).then("1").else("0"))
|
617
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("arrete")).then("1").else("0"))
|
618
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("àrrétè")).then("1").else("0"))
|
619
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("arretez")).then("1").else("0"))
|
620
|
+
if !['oracle','postgresql','mysql'].include?(@env_db) # AI => CI
|
621
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("Arrete")).then("1").else("0"))
|
622
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("Arrêté")).then("1").else("0"))
|
950
623
|
end
|
951
624
|
end
|
952
|
-
#
|
953
|
-
assert_equal
|
625
|
+
#AS & CI
|
626
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("arrêté")).then("1").else("0"))
|
954
627
|
if !['mysql'].include?(@env_db) # CI => AI in utf8 (AI not possible in latin1)
|
955
|
-
assert_equal
|
956
|
-
assert_equal
|
628
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("arrete")).then("1").else("0"))
|
629
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("àrrétè")).then("1").else("0"))
|
957
630
|
end
|
958
|
-
assert_equal
|
631
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("arretez")).then("1").else("0"))
|
959
632
|
if !['mysql'].include?(@env_db) # CI => AI in utf8 (AI not possible in latin1)
|
960
|
-
assert_equal
|
633
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("Arrete")).then("1").else("0"))
|
961
634
|
end
|
962
|
-
assert_equal
|
963
|
-
#
|
964
|
-
assert_equal
|
965
|
-
assert_equal
|
966
|
-
assert_equal
|
967
|
-
assert_equal
|
968
|
-
assert_equal
|
969
|
-
assert_equal
|
635
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("Arrêté")).then("1").else("0"))
|
636
|
+
#AS & CS
|
637
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("arrêté")).then("1").else("0"))
|
638
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("arrete")).then("1").else("0"))
|
639
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("àrrétè")).then("1").else("0"))
|
640
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("arretez")).then("1").else("0"))
|
641
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("Arrete")).then("1").else("0"))
|
642
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("Arrêté")).then("1").else("0"))
|
970
643
|
end
|
971
644
|
|
972
645
|
def test_subquery_with_order
|
973
|
-
|
974
|
-
assert_equal
|
975
|
-
|
976
|
-
|
977
|
-
assert_equal
|
978
|
-
# assert_equal 6, User.where(name: User.select(:name).order(:name).offset(2)).count
|
646
|
+
assert_equal 8, User.where(:name => User.select(:name).order(:name)).count
|
647
|
+
assert_equal 8, User.where(@ut[:name].in(@ut.project(@ut[:name]).order(@ut[:name]))).count
|
648
|
+
if !['mysql'].include?(@env_db) # MySql can't have limit in IN subquery
|
649
|
+
assert_equal 2, User.where(:name => User.select(:name).order(:name).limit(2)).count
|
650
|
+
#assert_equal 6, User.where(:name => User.select(:name).order(:name).offset(2)).count
|
979
651
|
end
|
980
652
|
end
|
981
653
|
|
982
654
|
def test_in_with_nil
|
983
|
-
|
984
|
-
|
985
|
-
|
986
|
-
|
987
|
-
|
988
|
-
|
989
|
-
|
990
|
-
|
991
|
-
|
992
|
-
|
993
|
-
|
994
|
-
|
995
|
-
|
996
|
-
|
997
|
-
|
998
|
-
|
999
|
-
|
1000
|
-
|
655
|
+
assert_equal true , @myung.where(@age.in(1)).blank?
|
656
|
+
assert_equal false , @myung.where(@age.in(23)).blank?
|
657
|
+
assert_equal true , @myung.where(@age.in([1])).blank?
|
658
|
+
assert_equal true , @myung.where(@age.in([1,2])).blank?
|
659
|
+
assert_equal false , @myung.where(@age.in([1,23])).blank?
|
660
|
+
assert_equal true , @myung.where(@age.in(nil)).blank?
|
661
|
+
assert_equal true , @myung.where(@age.in([nil])).blank?
|
662
|
+
assert_equal true , @myung.where(@age.in([nil,1])).blank?
|
663
|
+
assert_equal false , @myung.where(@age.in([nil,23])).blank?
|
664
|
+
assert_equal true , @myung.where(@age.in([nil,1,2])).blank?
|
665
|
+
assert_equal false , @myung.where(@age.in([nil,1,23])).blank?
|
666
|
+
assert_equal true , @test.where(@age.in(1)).blank?
|
667
|
+
assert_equal true , @test.where(@age.in([1])).blank?
|
668
|
+
assert_equal true , @test.where(@age.in([1,2])).blank?
|
669
|
+
assert_equal false , @test.where(@age.in(nil)).blank?
|
670
|
+
assert_equal false , @test.where(@age.in([nil])).blank?
|
671
|
+
assert_equal false , @test.where(@age.in([nil,1])).blank?
|
672
|
+
assert_equal false , @test.where(@age.in([nil,1,2])).blank?
|
1001
673
|
end
|
1002
674
|
|
1003
675
|
def test_scope_with_in_plus_new
|
1004
676
|
begin
|
1005
|
-
@test.where(@age.in([1,
|
1006
|
-
@test.where(@age.not_in([1,
|
677
|
+
@test.where(@age.in([1,2])).new
|
678
|
+
@test.where(@age.not_in([1,2])).new
|
1007
679
|
assert true
|
1008
680
|
rescue
|
1009
681
|
assert false
|
@@ -1011,129 +683,114 @@ module ArelExtensions
|
|
1011
683
|
end
|
1012
684
|
|
1013
685
|
def test_is_not_null
|
1014
|
-
|
1015
|
-
|
686
|
+
assert_equal false , @myung.where(@age.is_not_null).blank?
|
687
|
+
assert_equal true , @test.where(@age.is_not_null).blank?
|
1016
688
|
end
|
1017
689
|
|
1018
690
|
def test_not_in_with_nil
|
1019
|
-
|
1020
|
-
|
1021
|
-
|
1022
|
-
|
1023
|
-
|
1024
|
-
|
1025
|
-
|
1026
|
-
|
1027
|
-
|
1028
|
-
|
1029
|
-
|
1030
|
-
|
1031
|
-
|
1032
|
-
|
1033
|
-
#
|
1034
|
-
#
|
1035
|
-
#
|
1036
|
-
#
|
1037
|
-
#
|
1038
|
-
#
|
1039
|
-
#
|
1040
|
-
#
|
1041
|
-
end
|
1042
|
-
|
1043
|
-
def test_in_on_grouping
|
1044
|
-
skip 'We should modify the visitor of IN to make it work' if $sqlite || @env_db == 'mssql'
|
1045
|
-
assert_equal 2, User.where(Arel.tuple(@name, @age).in(Arel.tuple('Myung', 23), Arel.tuple('Arthur', 21))).count
|
1046
|
-
assert_equal 1, User.where(Arel.tuple(@name, @age).in(Arel.tuple('Myung', 23))).count
|
1047
|
-
assert_equal 0, User.where(Arel.tuple(@name, @age).in([])).count
|
691
|
+
assert_equal false , @myung.where(@age.not_in(1)).blank?
|
692
|
+
assert_equal true , @myung.where(@age.not_in(23)).blank?
|
693
|
+
assert_equal false , @myung.where(@age.not_in([1])).blank?
|
694
|
+
assert_equal false , @myung.where(@age.not_in([1,2])).blank?
|
695
|
+
assert_equal true , @myung.where(@age.not_in([1,23])).blank?
|
696
|
+
assert_equal false , @myung.where(@age.not_in(nil)).blank?
|
697
|
+
assert_equal false , @myung.where(@age.not_in([nil])).blank?
|
698
|
+
assert_equal false , @myung.where(@age.not_in([nil,1])).blank?
|
699
|
+
assert_equal true , @myung.where(@age.not_in([nil,23])).blank?
|
700
|
+
assert_equal false , @myung.where(@age.not_in([nil,1,2])).blank?
|
701
|
+
assert_equal true , @myung.where(@age.not_in([nil,1,23])).blank?
|
702
|
+
|
703
|
+
assert_equal false , @myung.where(@age.not_in(1..2)).blank?
|
704
|
+
|
705
|
+
#if the column is null, the entry will never be selected with not in (like every DBMS does)
|
706
|
+
#assert_equal false , @test.where(@age.not_in(1)).blank?
|
707
|
+
#assert_equal false , @test.where(@age.not_in([1])).blank?
|
708
|
+
#assert_equal false , @test.where(@age.not_in([1,2])).blank?
|
709
|
+
#assert_equal true , @test.where(@age.not_in(nil)).blank?
|
710
|
+
#assert_equal true , @test.where(@age.not_in([nil])).blank?
|
711
|
+
#assert_equal true , @test.where(@age.not_in([nil,1])).blank?
|
712
|
+
#assert_equal true , @test.where(@age.not_in([nil,1,2])).blank?
|
1048
713
|
end
|
1049
714
|
|
1050
715
|
def test_alias_shortened
|
1051
|
-
if
|
716
|
+
if ['postgresql','oracle'].include?(@env_db)
|
1052
717
|
new_alias = Arel.shorten('azerty' * 15)
|
1053
718
|
at = User.arel_table.alias('azerty' * 15)
|
1054
719
|
assert_equal "\"user_tests\" \"#{new_alias}\"".downcase, User.arel_table.alias('azerty' * 15).to_sql.downcase
|
1055
720
|
assert_equal '"user_tests" "u"'.downcase, User.arel_table.alias('u').to_sql.downcase
|
1056
|
-
assert_equal
|
1057
|
-
|
721
|
+
assert_equal %Q[SELECT "#{new_alias}"."id" FROM "user_tests" "#{new_alias}"].downcase,
|
722
|
+
User.select(at[:id]).from(at).to_sql.downcase
|
1058
723
|
end
|
1059
724
|
end
|
1060
725
|
|
1061
726
|
def test_stat_functions
|
1062
727
|
skip "SQLite doesn't work for most on this functions" if $sqlite
|
1063
|
-
#
|
1064
|
-
#
|
1065
|
-
#
|
1066
|
-
#
|
1067
|
-
#
|
1068
|
-
|
1069
|
-
assert ( 15.
|
1070
|
-
assert (
|
1071
|
-
assert (
|
1072
|
-
assert (
|
1073
|
-
assert (
|
1074
|
-
skip 'Not Yet Implemented' # if !['postgresql'].include?(@env_db)
|
1075
|
-
assert_equal 2, User.select(@score.std(group: Arel.when(@name > 'M').then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
|
1076
|
-
assert_equal 2, User.select(@score.variance(group: Arel.when(@name > 'M').then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
|
1077
|
-
assert_equal 2, User.select(@score.sum(group: Arel.when(@name > 'M').then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
|
1078
|
-
assert_equal 2, User.select(@comments.group_concat(group: Arel.when(@name > 'M').then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
|
728
|
+
#puts t(User.where(nil), @score.average)
|
729
|
+
#puts t(User.where(nil), @score.variance(true))
|
730
|
+
#puts t(User.where(nil), @score.variance(false))
|
731
|
+
#puts t(User.where(nil), @score.std(true))
|
732
|
+
#puts t(User.where(nil), @score.std(false))
|
733
|
+
|
734
|
+
assert ( 15.98625 - t(User.where(nil), @score.average)).abs < 0.01
|
735
|
+
assert (613.75488 - t(User.where(nil), @score.variance)).abs < 0.01
|
736
|
+
assert ( 537.0355 - t(User.where(nil), @score.variance(false))).abs < 0.01
|
737
|
+
assert ( 24.77408 - t(User.where(nil), @score.std)).abs < 0.01
|
738
|
+
assert ( 23.17403 - t(User.where(nil), @score.std(false))).abs < 0.01
|
1079
739
|
end
|
1080
740
|
|
1081
741
|
def test_levenshtein_distance
|
1082
|
-
skip
|
1083
|
-
assert_equal 0, t(@arthur
|
1084
|
-
assert_equal 2, t(@arthur
|
1085
|
-
assert_equal 1, t(@arthur
|
742
|
+
skip "Not Yet Implemented" if $sqlite
|
743
|
+
assert_equal 0, t(@arthur,@name.levenshtein_distance("Arthur"))
|
744
|
+
assert_equal 2, t(@arthur,@name.levenshtein_distance("Artoor"))
|
745
|
+
assert_equal 1, t(@arthur,@name.levenshtein_distance("Artehur"))
|
1086
746
|
end
|
1087
747
|
|
1088
748
|
def test_json
|
1089
749
|
skip "Can't be tested on travis"
|
1090
|
-
#
|
1091
|
-
assert_equal 'Arthur', t(@arthur,
|
1092
|
-
assert_equal
|
1093
|
-
assert_equal ({
|
1094
|
-
assert_equal ({
|
1095
|
-
assert_equal [{
|
750
|
+
#creation
|
751
|
+
assert_equal 'Arthur', t(@arthur,Arel.json(@name))
|
752
|
+
assert_equal ["Arthur","Arthur"], parse_json(t(@arthur,Arel.json(@name,@name)))
|
753
|
+
assert_equal ({"Arthur" => "Arthur", "Arthur2" => "ArthurArthur"}), parse_json(t(@arthur,Arel.json({@name => @name,@name+"2" => @name+@name})))
|
754
|
+
assert_equal ({"Arthur" => "Arthur","Arthur2" => 1}), parse_json(t(@arthur,Arel.json({@name => @name,@name+"2" => 1})))
|
755
|
+
assert_equal ([{"age" => 21},{"name" => "Arthur","score" => 65.62}]), parse_json(t(@arthur,Arel.json([{age: @age},{name: @name,score: @score}])))
|
1096
756
|
|
1097
757
|
# aggregate
|
1098
|
-
assert_equal ({
|
1099
|
-
|
1100
|
-
assert_equal ({
|
1101
|
-
|
1102
|
-
assert_equal [{
|
1103
|
-
|
1104
|
-
|
1105
|
-
#
|
1106
|
-
#
|
1107
|
-
|
1108
|
-
skip
|
1109
|
-
#
|
1110
|
-
h1 = Arel.json({@name => @name
|
1111
|
-
assert_equal
|
1112
|
-
h2 = Arel.json([{age: @age},
|
1113
|
-
assert_equal ({
|
1114
|
-
assert_equal 21, parse_json(t(@arthur,
|
1115
|
-
assert_nil t(@arthur,
|
1116
|
-
#
|
1117
|
-
assert_equal ({
|
1118
|
-
assert_equal ({
|
1119
|
-
assert_equal ({
|
1120
|
-
assert_equal ({
|
1121
|
-
#
|
1122
|
-
assert_equal ({
|
1123
|
-
assert_equal ({
|
1124
|
-
assert_equal ({
|
758
|
+
assert_equal ({"5" => "Lucas", "15" => "Sophie", "23" => "Myung", "25" => "Laure"}),
|
759
|
+
parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16),Arel.json({@age => @name}).group(false)))
|
760
|
+
assert_equal ({"5" => "Lucas", "15" => "Sophie", "23" => "Myung", "25" => "Laure", "Laure"=>25, "Lucas"=>5, "Myung"=>23, "Sophie"=>15}),
|
761
|
+
parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16),Arel.json({@age => @name,@name => @age}).group(false)))
|
762
|
+
assert_equal ([{"5" => "Lucas"},{ "15" => "Sophie"},{ "23" => "Myung"},{ "25" => "Laure"}]),
|
763
|
+
parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score),Arel.json({@age => @name}).group(true,[@age])))
|
764
|
+
|
765
|
+
#puts User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score,Arel.json({@age => @name}).group(true,[@age])).to_sql
|
766
|
+
#puts User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score,Arel.json({@age => @name}).group(true,[@age])).to_a
|
767
|
+
|
768
|
+
skip "Not Yet Implemented" if $sqlite || ['oracle','mssql'].include?(@env_db)
|
769
|
+
#get
|
770
|
+
h1 = Arel.json({@name => @name+@name,@name+"2" => 1})
|
771
|
+
assert_equal "ArthurArthur", parse_json(t(@arthur,h1.get(@name)))
|
772
|
+
h2 = Arel.json([{age: @age},{name: @name,score: @score}])
|
773
|
+
assert_equal ({"age" => 21}), parse_json(t(@arthur,h2.get(0)))
|
774
|
+
assert_equal 21, parse_json(t(@arthur,h2.get(0).get('age')))
|
775
|
+
assert_nil t(@arthur,h2.get('age'))
|
776
|
+
#set
|
777
|
+
assert_equal ({"Arthur" => ["toto", "tata"], "Arthur2" => 1}), parse_json(t(@arthur,h1.set(@name, ['toto','tata'])))
|
778
|
+
assert_equal ({"Arthur" => "ArthurArthur", "Arthur2" => 1, "Arthur3" => 2}), parse_json(t(@arthur,h1.set(@name+"3",2)))
|
779
|
+
assert_equal ({"Arthur" => "ArthurArthur", "Arthur2" => 1, "Arthur3" => nil}), parse_json(t(@arthur,h1.set(@name+"3",nil)))
|
780
|
+
assert_equal ({"Arthur" => "ArthurArthur", "Arthur2" => 1, "Arthur3" => {"a" => 2}}), parse_json(t(@arthur,h1.set(@name+"3",{a: 2})))
|
781
|
+
#merge
|
782
|
+
assert_equal ({"Arthur" => ["toto", "tata"], "Arthur2" => 1, "Arthur3" => 2}), parse_json(t(@arthur,h1.merge({@name => ['toto','tata']},{@name+"3" => 2})))
|
783
|
+
assert_equal ({"Arthur" => ["toto", "tata"], "Arthur2" => 1, "Arthur3" => 2}), parse_json(t(@arthur,h1.merge({@name => ['toto','tata'], @name+"3" => 2})))
|
784
|
+
assert_equal ({"Arthur" => "ArthurArthur","Arthur2" => 1}), parse_json(t(@arthur,h1.merge({})))
|
1125
785
|
end
|
1126
786
|
|
1127
787
|
def test_as_on_everything
|
1128
788
|
name = @arthur.select(@name.as('NaMe')).first.attributes
|
1129
|
-
assert_equal 'Arthur', name[
|
1130
|
-
assert_equal 'Arthur', @arthur.select(@name.as('Na Me')).first.attributes[
|
1131
|
-
assert_equal 'ArthurArthur', @arthur.select((@name
|
789
|
+
assert_equal 'Arthur', name["NaMe"] || name["name"] #because of Oracle
|
790
|
+
assert_equal 'Arthur', @arthur.select(@name.as('Na Me')).first.attributes["Na Me"]
|
791
|
+
assert_equal 'ArthurArthur', @arthur.select((@name+@name).as('Na-Me')).first.attributes["Na-Me"]
|
1132
792
|
end
|
1133
793
|
|
1134
|
-
def test_exists_in_subquery
|
1135
|
-
assert User.where(User.where(nil).arel.exists).first
|
1136
|
-
end
|
1137
794
|
end
|
1138
795
|
end
|
1139
796
|
end
|