arel_extensions 1.2.23 → 2.0.0.rc3
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +4 -7
- data/.travis.yml +91 -61
- data/Gemfile +20 -15
- data/README.md +12 -17
- data/Rakefile +29 -40
- data/appveyor.yml +1 -1
- data/arel_extensions.gemspec +3 -3
- data/functions.html +3 -3
- data/gemfiles/rails3.gemfile +9 -9
- data/gemfiles/rails4.gemfile +13 -13
- data/gemfiles/rails5_0.gemfile +13 -13
- data/gemfiles/rails5_1_4.gemfile +13 -13
- data/gemfiles/rails5_2.gemfile +13 -13
- data/init/mssql.sql +4 -4
- data/init/mysql.sql +38 -38
- data/init/postgresql.sql +21 -21
- data/lib/arel_extensions.rb +19 -69
- data/lib/arel_extensions/attributes.rb +1 -0
- data/lib/arel_extensions/boolean_functions.rb +14 -55
- data/lib/arel_extensions/common_sql_functions.rb +8 -7
- data/lib/arel_extensions/comparators.rb +15 -14
- data/lib/arel_extensions/date_duration.rb +5 -4
- data/lib/arel_extensions/insert_manager.rb +16 -17
- data/lib/arel_extensions/math.rb +12 -11
- data/lib/arel_extensions/math_functions.rb +22 -29
- data/lib/arel_extensions/nodes.rb +1 -1
- data/lib/arel_extensions/nodes/abs.rb +1 -0
- data/lib/arel_extensions/nodes/blank.rb +1 -0
- data/lib/arel_extensions/nodes/case.rb +8 -11
- data/lib/arel_extensions/nodes/cast.rb +2 -4
- data/lib/arel_extensions/nodes/ceil.rb +1 -1
- data/lib/arel_extensions/nodes/change_case.rb +0 -0
- data/lib/arel_extensions/nodes/coalesce.rb +3 -2
- data/lib/arel_extensions/nodes/collate.rb +2 -1
- data/lib/arel_extensions/nodes/concat.rb +16 -7
- data/lib/arel_extensions/nodes/date_diff.rb +13 -10
- 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 -34
- data/lib/arel_extensions/nodes/formatted_number.rb +23 -22
- data/lib/arel_extensions/nodes/function.rb +16 -25
- data/lib/arel_extensions/nodes/json.rb +36 -43
- data/lib/arel_extensions/nodes/length.rb +1 -0
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +0 -0
- data/lib/arel_extensions/nodes/locate.rb +1 -0
- data/lib/arel_extensions/nodes/log10.rb +2 -1
- data/lib/arel_extensions/nodes/matches.rb +6 -4
- 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 +4 -2
- data/lib/arel_extensions/nodes/replace.rb +6 -22
- 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 +0 -0
- data/lib/arel_extensions/nodes/trim.rb +5 -3
- data/lib/arel_extensions/nodes/union.rb +5 -2
- data/lib/arel_extensions/nodes/union_all.rb +3 -0
- data/lib/arel_extensions/nodes/wday.rb +4 -0
- data/lib/arel_extensions/null_functions.rb +7 -5
- data/lib/arel_extensions/predications.rb +34 -35
- data/lib/arel_extensions/railtie.rb +5 -5
- data/lib/arel_extensions/set_functions.rb +4 -2
- data/lib/arel_extensions/string_functions.rb +22 -43
- data/lib/arel_extensions/tasks.rb +5 -5
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors.rb +60 -68
- data/lib/arel_extensions/visitors/ibm_db.rb +12 -5
- data/lib/arel_extensions/visitors/mssql.rb +57 -63
- data/lib/arel_extensions/visitors/mysql.rb +98 -149
- data/lib/arel_extensions/visitors/oracle.rb +68 -71
- data/lib/arel_extensions/visitors/oracle12.rb +15 -2
- data/lib/arel_extensions/visitors/postgresql.rb +63 -116
- data/lib/arel_extensions/visitors/sqlite.rb +70 -83
- data/lib/arel_extensions/visitors/to_sql.rb +109 -141
- data/test/database.yml +0 -2
- data/test/helper.rb +18 -0
- data/test/real_db_test.rb +43 -28
- data/test/support/fake_record.rb +2 -2
- data/test/test_comparators.rb +12 -9
- data/test/visitors/test_bulk_insert_oracle.rb +8 -8
- data/test/visitors/test_bulk_insert_sqlite.rb +10 -9
- data/test/visitors/test_bulk_insert_to_sql.rb +10 -8
- data/test/visitors/test_oracle.rb +42 -42
- data/test/visitors/test_to_sql.rb +196 -361
- data/test/with_ar/all_agnostic_test.rb +160 -195
- data/test/with_ar/insert_agnostic_test.rb +4 -3
- data/test/with_ar/test_bulk_sqlite.rb +9 -6
- data/test/with_ar/test_math_sqlite.rb +12 -8
- data/test/with_ar/test_string_mysql.rb +11 -5
- data/test/with_ar/test_string_sqlite.rb +12 -4
- metadata +11 -22
- data/.github/workflows/ruby.yml +0 -102
- data/gemfiles/rails6.gemfile +0 -30
- data/gemfiles/rails6_1.gemfile +0 -30
- data/gemspecs/arel_extensions-v1.gemspec +0 -28
- data/gemspecs/arel_extensions-v2.gemspec +0 -28
- data/generate_gems.sh +0 -15
- data/lib/arel_extensions/nodes/aggregate_function.rb +0 -13
- 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 -26
- data/version_v1.rb +0 -3
- data/version_v2.rb +0 -3
@@ -1,8 +1,9 @@
|
|
1
|
-
require '
|
1
|
+
require 'helper'
|
2
2
|
require 'date'
|
3
3
|
|
4
4
|
module ArelExtensions
|
5
5
|
module WthAr
|
6
|
+
|
6
7
|
class ListTest < Minitest::Test
|
7
8
|
require 'minitest/pride'
|
8
9
|
def connect_db
|
@@ -67,8 +68,7 @@ module ArelExtensions
|
|
67
68
|
@test = User.where(:id => u.id)
|
68
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
|
69
70
|
@neg = User.where(:id => u.id)
|
70
|
-
|
71
|
-
@justin = User.where(:id => u.id)
|
71
|
+
|
72
72
|
|
73
73
|
@age = User.arel_table[:age]
|
74
74
|
@name = User.arel_table[:name]
|
@@ -94,7 +94,7 @@ module ArelExtensions
|
|
94
94
|
scope.select(node.as('res')).to_a.first.res
|
95
95
|
end
|
96
96
|
|
97
|
-
#
|
97
|
+
#manage the difference between adapters that handle or not json type
|
98
98
|
def parse_json(h)
|
99
99
|
if @env_db != 'postgresql'
|
100
100
|
JSON.parse("{\"res\":#{h}}")['res']
|
@@ -116,28 +116,25 @@ module ArelExtensions
|
|
116
116
|
end
|
117
117
|
|
118
118
|
def test_ceil
|
119
|
-
|
119
|
+
# skip "Sqlite version can't load extension for ceil" if $sqlite && $load_extension_disabled
|
120
120
|
assert_equal 2, t(@test, @score.ceil) # 1.62
|
121
121
|
assert_equal(-20, t(@camille, @score.ceil)) # -20.16
|
122
122
|
assert_equal(-20, t(@camille, (@score - 0.5).ceil)) # -20.16
|
123
123
|
assert_equal 63, t(@arthur, @age.ceil + 42)
|
124
|
-
assert_equal 11, t(@justin, @score.ceil) # 11.0
|
125
124
|
end
|
126
125
|
|
127
126
|
def test_floor
|
128
|
-
|
127
|
+
# skip "Sqlite version can't load extension for floor" if $sqlite && $load_extension_disabled
|
129
128
|
assert_equal 0, t(@neg, @score.floor)
|
130
129
|
assert_equal 1, t(@test, @score.floor) # 1.62
|
131
130
|
assert_equal(-9, t(@test, (@score - 10).floor)) # 1.62
|
132
131
|
assert_equal 42, t(@arthur, @score.floor - 23)
|
133
|
-
assert_equal 11, t(@justin, @score.floor) # 11.0
|
134
|
-
assert_equal(-21, t(@camille, @score.floor)) # # -20.16
|
135
132
|
end
|
136
133
|
|
137
134
|
def test_rand
|
138
135
|
assert 42 != User.select(Arel.rand.as('res')).first.res
|
139
136
|
assert 0 <= User.select(Arel.rand.abs.as('res')).first.res
|
140
|
-
assert_equal
|
137
|
+
assert_equal 8, User.order(Arel.rand).limit(50).count
|
141
138
|
end
|
142
139
|
|
143
140
|
def test_round
|
@@ -150,24 +147,18 @@ module ArelExtensions
|
|
150
147
|
def test_sum
|
151
148
|
if @env_db == 'mssql'
|
152
149
|
skip "SQL Server forces order?" # TODO
|
153
|
-
assert_equal
|
154
|
-
assert_equal
|
155
|
-
assert_equal
|
156
|
-
assert_equal
|
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
|
157
154
|
else
|
158
|
-
assert_equal
|
159
|
-
assert_equal
|
160
|
-
assert_equal
|
161
|
-
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
|
162
159
|
end
|
163
160
|
end
|
164
161
|
|
165
|
-
def test_aggregation_with_ar_calculation
|
166
|
-
# Since Arel10 (Rails6.1), some unwanted behaviors on aggregated calculation were present.
|
167
|
-
# This should works no matter which version of rails is used
|
168
|
-
assert User.group(:score).average(:id).values.all?{|e| !e.nil?}
|
169
|
-
end
|
170
|
-
|
171
162
|
# String Functions
|
172
163
|
def test_concat
|
173
164
|
assert_equal 'Camille Camille', t(@camille, @name + ' ' + @name)
|
@@ -184,7 +175,6 @@ module ArelExtensions
|
|
184
175
|
assert_equal "Sophie,Lucas,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',@name.desc))
|
185
176
|
assert_equal "Lucas,Sophie,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',[@score.asc,@name.asc]))
|
186
177
|
assert_equal "Lucas,Sophie,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',@score.asc,@name.asc))
|
187
|
-
assert_equal "Lucas,Sophie,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',order: [@score.asc,@name.asc]))
|
188
178
|
end
|
189
179
|
|
190
180
|
def test_length
|
@@ -225,7 +215,7 @@ module ArelExtensions
|
|
225
215
|
assert_equal 'Lu', t(@lucas, @name[0,2])
|
226
216
|
assert_equal 'Lu', t(@lucas, @name[0..1])
|
227
217
|
|
228
|
-
#
|
218
|
+
#substring should accept string function
|
229
219
|
assert_equal 'Ce', t(@camille, @name.substring(1, 1).concat('e'))
|
230
220
|
assert_equal 'Ce', t(@camille, @name.substring(1, 1)+'e')
|
231
221
|
end
|
@@ -238,7 +228,7 @@ module ArelExtensions
|
|
238
228
|
end
|
239
229
|
|
240
230
|
def test_string_comparators
|
241
|
-
#
|
231
|
+
#skip "Oracle can't use math operators to compare strings" if @env_db == 'oracle' # use GREATEST ?
|
242
232
|
skip "SQL Server can't use math operators to compare strings" if @env_db == 'mssql' # use GREATEST ?
|
243
233
|
if @env_db == 'postgresql' # may return real boolean
|
244
234
|
assert t(@neg, @name >= 'Mest') == true || t(@neg, @name >= 'Mest') == 't' # depends of ar version
|
@@ -259,50 +249,44 @@ module ArelExtensions
|
|
259
249
|
def test_compare_on_date_time_types
|
260
250
|
skip "Sqlite can't compare time" if $sqlite
|
261
251
|
skip "Oracle can't compare time" if @env_db == 'oracle'
|
262
|
-
|
252
|
+
#@created_at == 2016-05-23
|
263
253
|
assert_includes [true,'t',1], t(@laure, ArelExtensions::Nodes::Case.new.when(@created_at >= '2014-01-01').then(1).else(0))
|
264
254
|
assert_includes [false,'f',0], t(@laure, ArelExtensions::Nodes::Case.new.when(@created_at >= '2018-01-01').then(1).else(0))
|
265
|
-
|
255
|
+
#@updated_at == 2014-03-03 12:42:00
|
266
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))
|
267
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))
|
268
|
-
|
269
|
-
#
|
270
|
-
#
|
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
|
271
261
|
assert_includes [true,'t',1], t(@laure, ArelExtensions::Nodes::Case.new.when(@duration >= '10:10:10').then(1).else(0))
|
272
262
|
assert_includes [false,'f',0], t(@laure, ArelExtensions::Nodes::Case.new.when(@duration >= '14:10:10').then(1).else(0))
|
273
263
|
end
|
274
264
|
|
265
|
+
|
275
266
|
def test_regexp_not_regexp
|
276
267
|
skip "Sqlite version can't load extension for regexp" if $sqlite && $load_extension_disabled
|
277
268
|
skip "SQL Server does not know about REGEXP without extensions" if @env_db == 'mssql'
|
278
269
|
assert_equal 1, User.where(@name =~ '^M').count
|
279
|
-
assert_equal
|
270
|
+
assert_equal 6, User.where(@name !~ '^L').count
|
280
271
|
assert_equal 1, User.where(@name =~ /^M/).count
|
281
|
-
assert_equal
|
272
|
+
assert_equal 6, User.where(@name !~ /^L/).count
|
282
273
|
end
|
283
274
|
|
284
275
|
def test_imatches
|
285
|
-
#
|
276
|
+
#puts User.where(@name.imatches('m%')).to_sql
|
286
277
|
assert_equal 1, User.where(@name.imatches('m%')).count
|
287
278
|
assert_equal 4, User.where(@name.imatches_any(['L%', '%e'])).count
|
288
|
-
assert_equal
|
279
|
+
assert_equal 6, User.where(@name.idoes_not_match('L%')).count
|
289
280
|
end
|
290
281
|
|
291
282
|
def test_replace
|
292
283
|
assert_equal "LucaX", t(@lucas, @name.replace("s", "X"))
|
293
284
|
assert_equal "replace", t(@lucas, @name.replace(@name, "replace"))
|
294
|
-
|
295
|
-
skip "Sqlite does not seem to support regexp_replace" if $sqlite
|
296
|
-
skip "SQL Server does not know about REGEXP without extensions" if @env_db == 'mssql'
|
297
|
-
skip "Travis mysql version does not support REGEXP_REPLACE" if @env_db == 'mysql'
|
298
|
-
assert_equal "LXcXs", t(@lucas, @name.replace(/[ua]/, "X"))
|
299
|
-
assert_equal "LXcXs", t(@lucas, @name.regexp_replace(/[ua]/, "X"))
|
300
|
-
assert_equal "LXcXs", t(@lucas, @name.regexp_replace('[ua]', "X"))
|
301
285
|
end
|
302
286
|
|
303
287
|
def test_replace_once
|
304
288
|
skip "TODO"
|
305
|
-
#
|
289
|
+
#skip "Sqlite version can't load extension for locate" if $sqlite && $load_extension_disabled
|
306
290
|
assert_equal "LuCas", t(@lucas, @name.substring(1, @name.locate('c') - 1) + 'C' + @name.substring(@name.locate('c') + 1, @name.length))
|
307
291
|
end
|
308
292
|
|
@@ -310,8 +294,8 @@ module ArelExtensions
|
|
310
294
|
skip "Sqlite version can't load extension for soundex" if $sqlite && $load_extension_disabled
|
311
295
|
skip "PostgreSql version can't load extension for soundex" if @env_db == 'postgresql'
|
312
296
|
assert_equal "C540", t(@camille, @name.soundex)
|
313
|
-
assert_equal
|
314
|
-
assert_equal
|
297
|
+
assert_equal 8, User.where(@name.soundex.eq(@name.soundex)).count
|
298
|
+
assert_equal 8, User.where(@name.soundex == @name.soundex).count
|
315
299
|
end
|
316
300
|
|
317
301
|
def test_change_case
|
@@ -360,7 +344,6 @@ module ArelExtensions
|
|
360
344
|
assert_equal '2016-05-23', t(@lucas, @created_at.format('%Y-%m-%d'))
|
361
345
|
skip "SQL Server does not accept any format" if @env_db == 'mssql'
|
362
346
|
assert_equal '2014/03/03 12:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S'))
|
363
|
-
assert_equal '12:42%', t(@lucas, @updated_at.format('%R%%'))
|
364
347
|
end
|
365
348
|
|
366
349
|
def test_coalesce
|
@@ -391,37 +374,37 @@ module ArelExtensions
|
|
391
374
|
assert_equal 2, User.where(@age <= 10).count
|
392
375
|
assert_equal 3, User.where(@age > 20).count
|
393
376
|
assert_equal 4, User.where(@age >= 20).count
|
394
|
-
assert_equal
|
377
|
+
assert_equal 1, User.where(@age > 5).where(@age < 20).count
|
395
378
|
end
|
396
379
|
|
397
380
|
def test_date_comparator
|
398
381
|
d = Date.new(2016, 5, 23)
|
399
382
|
assert_equal 0, User.where(@created_at < d).count
|
400
|
-
assert_equal
|
383
|
+
assert_equal 8, User.where(@created_at >= d).count
|
401
384
|
end
|
402
385
|
|
403
386
|
def test_date_duration
|
404
|
-
#
|
387
|
+
#Year
|
405
388
|
assert_equal 2016, t(@lucas, @created_at.year).to_i
|
406
389
|
assert_equal 0, User.where(@created_at.year.eq("2012")).count
|
407
|
-
#
|
390
|
+
#Month
|
408
391
|
assert_equal 5, t(@camille, @created_at.month).to_i
|
409
|
-
assert_equal
|
410
|
-
#
|
392
|
+
assert_equal 8, User.where(@created_at.month.eq("05")).count
|
393
|
+
#Week
|
411
394
|
assert_equal(@env_db == 'mssql' ? 22 : 21, t(@arthur, @created_at.week).to_i)
|
412
|
-
assert_equal
|
413
|
-
#
|
395
|
+
assert_equal 8, User.where(@created_at.month.eq("05")).count
|
396
|
+
#Day
|
414
397
|
assert_equal 23, t(@laure, @created_at.day).to_i
|
415
398
|
assert_equal 0, User.where(@created_at.day.eq("05")).count
|
416
399
|
|
417
|
-
#
|
418
|
-
#
|
400
|
+
#skip "manage DATE" if @env_db == 'oracle'
|
401
|
+
#Hour
|
419
402
|
assert_equal 0, t(@laure, @created_at.hour).to_i
|
420
403
|
assert_equal 12, t(@lucas, @updated_at.hour).to_i
|
421
|
-
#
|
404
|
+
#Minute
|
422
405
|
assert_equal 0, t(@laure, @created_at.minute).to_i
|
423
406
|
assert_equal 42, t(@lucas, @updated_at.minute).to_i
|
424
|
-
#
|
407
|
+
#Second
|
425
408
|
assert_equal 0, t(@laure, @created_at.second).to_i
|
426
409
|
assert_equal 0, t(@lucas, @updated_at.second).to_i
|
427
410
|
end
|
@@ -441,7 +424,6 @@ module ArelExtensions
|
|
441
424
|
end
|
442
425
|
end
|
443
426
|
|
444
|
-
|
445
427
|
skip "not yet implemented" if $sqlite
|
446
428
|
|
447
429
|
date1 = Date.new(2016, 5, 23)
|
@@ -454,13 +436,13 @@ module ArelExtensions
|
|
454
436
|
|
455
437
|
datetime1 = Time.utc(2014, 3, 3, 12, 42, 0)
|
456
438
|
# Pull Request #5 tests
|
457
|
-
#
|
439
|
+
#puts (@created_at + durPos).cast(:date).to_sql
|
458
440
|
assert_includes [date2,"2026-05-23"], t(@test,(@created_at + durPos).cast(:date))
|
459
441
|
assert_includes [date3,"2006-05-23"], t(@test,(@created_at + durNeg).cast(:date))
|
460
442
|
|
461
|
-
#
|
443
|
+
#puts (@created_at + @created_at.day).cast(:date).to_sql
|
462
444
|
assert_includes [date4,"2016-06-15"], t(@test,(@created_at + @created_at.day).cast(:date))
|
463
|
-
#
|
445
|
+
#puts (@created_at - @created_at.day).cast(:date).to_sql
|
464
446
|
assert_includes [date5,"2016-04-30"], t(@test,(@created_at - @created_at.day).cast(:date))
|
465
447
|
|
466
448
|
assert_includes [datetime1 + 42.seconds,"2014-03-03 12:42:42 UTC"], t(@lucas,(@updated_at + @updated_at.minute))
|
@@ -468,59 +450,57 @@ module ArelExtensions
|
|
468
450
|
|
469
451
|
# (@updated_at + Arel.duration('s',(@updated_at.hour*60 + @updated_at.minute))).to_sql
|
470
452
|
assert_includes [datetime1 + (12*60+42).seconds,"2014-03-03 12:54:42 UTC"],
|
471
|
-
|
453
|
+
t(@lucas,(@updated_at + Arel.duration('s',(@updated_at.hour*60 + @updated_at.minute))))
|
472
454
|
|
473
455
|
assert_includes [datetime1 + (12*60+42).minutes,"2014-03-04 01:24:00 UTC"],
|
474
|
-
|
456
|
+
t(@lucas,(@updated_at + Arel.duration('mn',(@updated_at.hour*60 + @updated_at.minute))))
|
475
457
|
|
476
458
|
assert_includes ["2024-03-03"], t(@lucas,(@updated_at + durPos).format('%Y-%m-%d'))
|
477
|
-
#
|
459
|
+
#puts (@updated_at - durPos).to_sql
|
478
460
|
assert_includes ["2004-03-03"], t(@lucas,(@updated_at - durPos).format('%Y-%m-%d'))
|
479
461
|
|
480
462
|
|
481
463
|
# we test with the ruby object or the string because some adapters don't return an object Date
|
482
|
-
|
464
|
+
# end
|
483
465
|
end
|
484
466
|
|
485
467
|
# TODO; cast types
|
486
468
|
def test_cast_types
|
487
469
|
assert_equal "5", t(@lucas, @age.cast(:string))
|
488
|
-
skip "jdbc adapters does not work properly here (v52 works fine)" if RUBY_PLATFORM =~ /java/i
|
489
470
|
if @env_db == 'mysql' || @env_db == 'postgresql' || @env_db == 'oracle' || @env_db == 'mssql'
|
490
|
-
assert_equal 1, t(@laure,
|
491
|
-
assert_equal 1, t(@laure,
|
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'
|
492
473
|
assert_equal "20.16", t(@laure,@score.cast(:string)).gsub(/[0]*\z/,'')
|
493
474
|
assert_equal "20.161", t(@laure,@score.cast(:string)+1).gsub(/[0]*1\z/,'1')
|
494
475
|
assert_equal 21.16, t(@laure,@score.cast(:string).cast(:decimal)+1)
|
495
476
|
assert_equal 21, t(@laure,@score.cast(:string).cast(:int)+1)
|
496
477
|
|
497
478
|
assert_equal String, t(@lucas,@updated_at.cast(:string)).class
|
498
|
-
|
499
479
|
assert_equal Date, t(@lucas,@updated_at.cast(:date)).class unless @env_db == 'oracle' # DateTime
|
500
480
|
assert_equal Time, t(@lucas,@updated_at.cast(:string).cast(:datetime)).class
|
501
481
|
assert_equal Time, t(@lucas,@updated_at.cast(:time)).class
|
502
482
|
|
503
|
-
assert_equal "2014-03-03 12:42:00", t(@lucas,@updated_at.cast(:string)) unless @env_db == 'mssql' #
|
483
|
+
assert_equal "2014-03-03 12:42:00", t(@lucas,@updated_at.cast(:string)) unless @env_db == 'mssql' #locale dependent
|
504
484
|
assert_equal Date.parse("2014-03-03"), t(@lucas,Arel::Nodes.build_quoted('2014-03-03').cast(:date))
|
505
485
|
assert_equal Date.parse("5014-03-03"), t(@lucas,(@age.cast(:string) + '014-03-03').cast(:date))
|
506
486
|
assert_equal Time.parse("2014-03-03 12:42:00 UTC"), t(@lucas,@updated_at.cast(:string).cast(:datetime))
|
507
487
|
assert_equal Date.parse("2014-03-03"), t(@lucas,@updated_at.cast(:date))
|
508
|
-
assert_equal "12:42:00", t(@lucas,@updated_at.cast(:time).cast(:string)).split('.').first unless @env_db == 'oracle' #
|
488
|
+
assert_equal "12:42:00", t(@lucas,@updated_at.cast(:time).cast(:string)).split('.').first unless @env_db == 'oracle' #DateTime
|
509
489
|
end
|
510
490
|
end
|
511
491
|
|
512
492
|
def test_is_null
|
513
|
-
#
|
514
|
-
#
|
515
|
-
#
|
516
|
-
#
|
517
|
-
#
|
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'
|
518
498
|
assert_equal "Test", User.select(@name).where(@age.is_null.to_sql).first.name
|
519
499
|
end
|
520
500
|
|
521
501
|
def test_math_plus
|
522
502
|
d = Date.new(1997, 6, 15)
|
523
|
-
#
|
503
|
+
#Concat String
|
524
504
|
assert_equal "SophiePhan", t(@sophie, @name + "Phan")
|
525
505
|
assert_equal "Sophie2", t(@sophie, @name + 2)
|
526
506
|
assert_equal "Sophie1997-06-15", t(@sophie, @name + d)
|
@@ -529,24 +509,25 @@ module ArelExtensions
|
|
529
509
|
assert_equal "SophieSophieSophie", t(@sophie, @name + @name + @name)
|
530
510
|
assert_equal "SophieSophieSophie", t(@sophie, @name.concat(@name.concat(@name)))
|
531
511
|
assert_equal "SophieSophieSophie", t(@sophie, @name.concat(@name).concat(@name))
|
532
|
-
#
|
512
|
+
#FIXME: should work as expected in Oracle
|
533
513
|
assert_equal "Sophie2016-05-23", t(@sophie, @name + @created_at) unless @env_db == 'oracle'
|
534
|
-
#
|
514
|
+
#concat Integer
|
535
515
|
assert_equal 1, User.where((@age + 10).eq(33)).count
|
536
516
|
assert_equal 1, User.where((@age + "1").eq(6)).count
|
537
517
|
assert_equal 1, User.where((@age + @age).eq(10)).count
|
538
|
-
#
|
539
|
-
#
|
518
|
+
#concat Date
|
519
|
+
#puts((User.arel_table[:created_at] + 1).as("res").to_sql.inspect)
|
540
520
|
assert_equal "2016-05-24", t(@myung, @created_at + 1).to_date.to_s
|
541
521
|
assert_equal "2016-05-25", t(@myung, @created_at + 2.day).to_date.to_s
|
542
522
|
end
|
543
523
|
|
524
|
+
|
544
525
|
def test_math_minus
|
545
526
|
d = Date.new(2016, 5, 20)
|
546
|
-
#
|
547
|
-
assert_equal
|
527
|
+
#Datediff
|
528
|
+
assert_equal 8, User.where((@created_at - @created_at).eq(0)).count
|
548
529
|
assert_equal 3, @laure.select((@created_at - d).as("res")).first.res.abs.to_i
|
549
|
-
#
|
530
|
+
#Substraction
|
550
531
|
assert_equal 0, User.where((@age - 10).eq(50)).count
|
551
532
|
assert_equal 0, User.where((@age - "10").eq(50)).count
|
552
533
|
# assert_equal 0, User.where((@age - 9.5).eq(50.5)).count # should work: TODO
|
@@ -554,7 +535,7 @@ module ArelExtensions
|
|
554
535
|
end
|
555
536
|
|
556
537
|
def test_wday
|
557
|
-
#
|
538
|
+
#d = Date.new(2016, 6, 26)
|
558
539
|
assert_equal(@env_db == 'oracle' || @env_db == 'mssql' ? 2 : 1, t(@myung, @created_at.wday).to_i) # monday
|
559
540
|
end
|
560
541
|
|
@@ -585,46 +566,45 @@ module ArelExtensions
|
|
585
566
|
# Case clause
|
586
567
|
def test_case
|
587
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)
|
588
|
-
assert_equal 4, User.where(@score.when(20.16).then(1).else(0).eq(1)).count
|
589
569
|
assert_equal 2, t(@arthur, @score.when(65.62,1).else(0)+1)
|
590
570
|
assert_equal 0, t(@arthur, @score.when(65.62,1).else(0)-1)
|
591
571
|
assert_equal "11", t(@arthur, @score.when(65.62).then("1").else("0")+"1")
|
592
572
|
assert_equal 66.62, t(@arthur, @score.when(65.62).then(@score).else(@score)+1)
|
593
|
-
assert_equal "65.621", t(@arthur, @score.when(65.62).then(@score.cast(:string)).else(@score.cast(:string))+1).tr('0','') #
|
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
|
594
574
|
end
|
595
575
|
|
596
576
|
def test_format_numbers
|
597
|
-
#
|
577
|
+
#score of Arthur = 65.62
|
598
578
|
skip " Works with SQLite if the version used knows printf" if $sqlite
|
599
579
|
|
600
|
-
assert_equal "Wrong Format", t(@arthur, @score.format_number("$ %...234.6F €","fr_FR"))
|
601
|
-
assert_equal "AZERTY65,62", t(@arthur, @score.format_number("AZERTY%.2f","fr_FR"))
|
602
|
-
assert_equal "65,62AZERTY", t(@arthur, @score.format_number("%.2fAZERTY","fr_FR"))
|
603
|
-
assert_equal "$ 65.62 €", t(@arthur, @score.format_number("$ %.2f €","en_US"))
|
604
|
-
assert_equal "$ 66 €", t(@arthur, @score.format_number("$ %.0f €","en_US"))
|
605
|
-
assert_equal "$ 0065,62 €", t(@arthur, @score.format_number("$ %07.2f €","fr_FR"))
|
606
|
-
assert_equal "$ 65,62 €", t(@arthur, @score.format_number("$ %-07.2f €","fr_FR"))
|
607
|
-
assert_equal "$ 65,62 €", t(@arthur, @score.format_number("$ %-7.2f €","fr_FR"))
|
608
|
-
assert_equal "$ 65,62 €", t(@arthur, @score.format_number("$ % 7.2f €","fr_FR"))
|
609
|
-
assert_equal "$ 65,6 €", t(@arthur, @score.format_number("$ % 7.1f €","fr_FR"))
|
610
|
-
assert_equal "$ +65,62 €", t(@arthur, @score.format_number("$ % +7.2f €","fr_FR"))
|
611
|
-
assert_equal "$ +065,62 €", t(@arthur, @score.format_number("$ %0+7.2f €","fr_FR"))
|
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"))
|
612
592
|
assert_includes ["$ 6,56e1 €","$ 6,56e+01 €"], t(@arthur, @score.format_number("$ %.2e €","fr_FR"))
|
613
593
|
assert_includes ["$ 6,56E1 €","$ 6,56E+01 €"], t(@arthur, @score.format_number("$ %.2E €","fr_FR"))
|
614
594
|
assert_includes ["$ 6,562E1 €","$ 6,562E+01 €"], t(@arthur, @score.format_number("$ %.3E €","fr_FR"))
|
615
|
-
assert_equal "123 456 765,6", t(@arthur, (@score+123456700).format_number("%.1f","sv_SE")).gsub("\u00A0"," ") #
|
616
|
-
assert_equal "123456765,6", t(@arthur, (@score+123456700).format_number("%.1f","fr_FR")).gsub("\u00A0","") #
|
617
|
-
assert_equal "123,456,765.6", t(@arthur, (@score+123456700).format_number("%.1f","en_US"))
|
618
|
-
assert_equal " 123,456,765.6", t(@arthur, (@score+123456700).format_number("%16.1f","en_US"))
|
619
|
-
assert_equal "$ 0,00 €", t(@arthur, @score.when(65.62).then(Arel.sql("null")).else(1).format_number("$ %.2f €","fr_FR"))
|
620
|
-
assert_equal "$ 0,00 €", t(@arthur, (@score-65.62).format_number("$ %.2f €","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"))
|
621
601
|
end
|
622
602
|
|
623
603
|
def test_accent_insensitive
|
624
604
|
skip "SQLite is natively Case Insensitive and Accent Sensitive" if $sqlite
|
625
605
|
skip "Not finished" if @env_db == 'mysql'
|
626
606
|
# actual comments value: "arrêté"
|
627
|
-
#
|
607
|
+
#AI & CI
|
628
608
|
if !['postgresql'].include?(@env_db) # Extension unaccent required on PG
|
629
609
|
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("arrêté")).then("1").else("0"))
|
630
610
|
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("arrete")).then("1").else("0"))
|
@@ -632,7 +612,7 @@ module ArelExtensions
|
|
632
612
|
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("arretez")).then("1").else("0"))
|
633
613
|
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("Arrete")).then("1").else("0"))
|
634
614
|
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("Arrêté")).then("1").else("0"))
|
635
|
-
#
|
615
|
+
#AI & CS
|
636
616
|
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("arrêté")).then("1").else("0"))
|
637
617
|
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("arrete")).then("1").else("0"))
|
638
618
|
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("àrrétè")).then("1").else("0"))
|
@@ -642,7 +622,7 @@ module ArelExtensions
|
|
642
622
|
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("Arrêté")).then("1").else("0"))
|
643
623
|
end
|
644
624
|
end
|
645
|
-
#
|
625
|
+
#AS & CI
|
646
626
|
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("arrêté")).then("1").else("0"))
|
647
627
|
if !['mysql'].include?(@env_db) # CI => AI in utf8 (AI not possible in latin1)
|
648
628
|
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("arrete")).then("1").else("0"))
|
@@ -653,7 +633,7 @@ module ArelExtensions
|
|
653
633
|
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("Arrete")).then("1").else("0"))
|
654
634
|
end
|
655
635
|
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("Arrêté")).then("1").else("0"))
|
656
|
-
#
|
636
|
+
#AS & CS
|
657
637
|
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("arrêté")).then("1").else("0"))
|
658
638
|
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("arrete")).then("1").else("0"))
|
659
639
|
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("àrrétè")).then("1").else("0"))
|
@@ -663,33 +643,33 @@ module ArelExtensions
|
|
663
643
|
end
|
664
644
|
|
665
645
|
def test_subquery_with_order
|
666
|
-
assert_equal
|
667
|
-
assert_equal
|
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
|
668
648
|
if !['mysql'].include?(@env_db) # MySql can't have limit in IN subquery
|
669
649
|
assert_equal 2, User.where(:name => User.select(:name).order(:name).limit(2)).count
|
670
|
-
#
|
650
|
+
#assert_equal 6, User.where(:name => User.select(:name).order(:name).offset(2)).count
|
671
651
|
end
|
672
652
|
end
|
673
653
|
|
674
654
|
def test_in_with_nil
|
675
|
-
assert_equal true, @myung.where(@age.in(1)).blank?
|
676
|
-
assert_equal false, @myung.where(@age.in(23)).blank?
|
677
|
-
assert_equal true, @myung.where(@age.in([1])).blank?
|
678
|
-
assert_equal true, @myung.where(@age.in([1,2])).blank?
|
679
|
-
assert_equal false, @myung.where(@age.in([1,23])).blank?
|
680
|
-
assert_equal true, @myung.where(@age.in(nil)).blank?
|
681
|
-
assert_equal true, @myung.where(@age.in([nil])).blank?
|
682
|
-
assert_equal true, @myung.where(@age.in([nil,1])).blank?
|
683
|
-
assert_equal false, @myung.where(@age.in([nil,23])).blank?
|
684
|
-
assert_equal true, @myung.where(@age.in([nil,1,2])).blank?
|
685
|
-
assert_equal false, @myung.where(@age.in([nil,1,23])).blank?
|
686
|
-
assert_equal true, @test.where(@age.in(1)).blank?
|
687
|
-
assert_equal true, @test.where(@age.in([1])).blank?
|
688
|
-
assert_equal true, @test.where(@age.in([1,2])).blank?
|
689
|
-
assert_equal false, @test.where(@age.in(nil)).blank?
|
690
|
-
assert_equal false, @test.where(@age.in([nil])).blank?
|
691
|
-
assert_equal false, @test.where(@age.in([nil,1])).blank?
|
692
|
-
assert_equal false, @test.where(@age.in([nil,1,2])).blank?
|
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?
|
693
673
|
end
|
694
674
|
|
695
675
|
def test_scope_with_in_plus_new
|
@@ -703,40 +683,33 @@ module ArelExtensions
|
|
703
683
|
end
|
704
684
|
|
705
685
|
def test_is_not_null
|
706
|
-
assert_equal false, @myung.where(@age.is_not_null).blank?
|
707
|
-
assert_equal true, @test.where(@age.is_not_null).blank?
|
686
|
+
assert_equal false , @myung.where(@age.is_not_null).blank?
|
687
|
+
assert_equal true , @test.where(@age.is_not_null).blank?
|
708
688
|
end
|
709
689
|
|
710
690
|
def test_not_in_with_nil
|
711
|
-
assert_equal false, @myung.where(@age.not_in(1)).blank?
|
712
|
-
assert_equal true, @myung.where(@age.not_in(23)).blank?
|
713
|
-
assert_equal false, @myung.where(@age.not_in([1])).blank?
|
714
|
-
assert_equal false, @myung.where(@age.not_in([1,2])).blank?
|
715
|
-
assert_equal true, @myung.where(@age.not_in([1,23])).blank?
|
716
|
-
assert_equal false, @myung.where(@age.not_in(nil)).blank?
|
717
|
-
assert_equal false, @myung.where(@age.not_in([nil])).blank?
|
718
|
-
assert_equal false, @myung.where(@age.not_in([nil,1])).blank?
|
719
|
-
assert_equal true, @myung.where(@age.not_in([nil,23])).blank?
|
720
|
-
assert_equal false, @myung.where(@age.not_in([nil,1,2])).blank?
|
721
|
-
assert_equal true, @myung.where(@age.not_in([nil,1,23])).blank?
|
722
|
-
|
723
|
-
assert_equal false, @myung.where(@age.not_in(1..2)).blank?
|
724
|
-
|
725
|
-
#
|
726
|
-
#
|
727
|
-
#
|
728
|
-
#
|
729
|
-
#
|
730
|
-
#
|
731
|
-
#
|
732
|
-
#
|
733
|
-
end
|
734
|
-
|
735
|
-
def test_in_on_grouping
|
736
|
-
skip "We should modify the visitor of IN to make it work" if $sqlite || @env_db == 'mssql'
|
737
|
-
assert_equal 2, User.where(Arel.tuple(@name,@age).in(Arel.tuple('Myung',23),Arel.tuple('Arthur',21))).count
|
738
|
-
assert_equal 1, User.where(Arel.tuple(@name,@age).in(Arel.tuple('Myung',23))).count
|
739
|
-
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?
|
740
713
|
end
|
741
714
|
|
742
715
|
def test_alias_shortened
|
@@ -745,29 +718,24 @@ module ArelExtensions
|
|
745
718
|
at = User.arel_table.alias('azerty' * 15)
|
746
719
|
assert_equal "\"user_tests\" \"#{new_alias}\"".downcase, User.arel_table.alias('azerty' * 15).to_sql.downcase
|
747
720
|
assert_equal '"user_tests" "u"'.downcase, User.arel_table.alias('u').to_sql.downcase
|
748
|
-
assert_equal
|
749
|
-
|
721
|
+
assert_equal %Q[SELECT "#{new_alias}"."id" FROM "user_tests" "#{new_alias}"].downcase,
|
722
|
+
User.select(at[:id]).from(at).to_sql.downcase
|
750
723
|
end
|
751
724
|
end
|
752
725
|
|
753
726
|
def test_stat_functions
|
754
727
|
skip "SQLite doesn't work for most on this functions" if $sqlite
|
755
|
-
#
|
756
|
-
#
|
757
|
-
#
|
758
|
-
#
|
759
|
-
#
|
760
|
-
|
761
|
-
assert ( 15.
|
762
|
-
assert (
|
763
|
-
assert (
|
764
|
-
assert (
|
765
|
-
assert (
|
766
|
-
skip "Not Yet Implemented" # if !['postgresql'].include?(@env_db)
|
767
|
-
assert_equal 2, User.select(@score.std(group: Arel.when(@name > "M").then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
|
768
|
-
assert_equal 2, User.select(@score.variance(group: Arel.when(@name > "M").then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
|
769
|
-
assert_equal 2, User.select(@score.sum(group: Arel.when(@name > "M").then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
|
770
|
-
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
|
771
739
|
end
|
772
740
|
|
773
741
|
def test_levenshtein_distance
|
@@ -779,7 +747,7 @@ module ArelExtensions
|
|
779
747
|
|
780
748
|
def test_json
|
781
749
|
skip "Can't be tested on travis"
|
782
|
-
#
|
750
|
+
#creation
|
783
751
|
assert_equal 'Arthur', t(@arthur,Arel.json(@name))
|
784
752
|
assert_equal ["Arthur","Arthur"], parse_json(t(@arthur,Arel.json(@name,@name)))
|
785
753
|
assert_equal ({"Arthur" => "Arthur", "Arthur2" => "ArthurArthur"}), parse_json(t(@arthur,Arel.json({@name => @name,@name+"2" => @name+@name})))
|
@@ -788,29 +756,29 @@ module ArelExtensions
|
|
788
756
|
|
789
757
|
# aggregate
|
790
758
|
assert_equal ({"5" => "Lucas", "15" => "Sophie", "23" => "Myung", "25" => "Laure"}),
|
791
|
-
|
759
|
+
parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16),Arel.json({@age => @name}).group(false)))
|
792
760
|
assert_equal ({"5" => "Lucas", "15" => "Sophie", "23" => "Myung", "25" => "Laure", "Laure"=>25, "Lucas"=>5, "Myung"=>23, "Sophie"=>15}),
|
793
|
-
|
761
|
+
parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16),Arel.json({@age => @name,@name => @age}).group(false)))
|
794
762
|
assert_equal ([{"5" => "Lucas"},{ "15" => "Sophie"},{ "23" => "Myung"},{ "25" => "Laure"}]),
|
795
|
-
|
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])))
|
796
764
|
|
797
|
-
#
|
798
|
-
#
|
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
|
799
767
|
|
800
768
|
skip "Not Yet Implemented" if $sqlite || ['oracle','mssql'].include?(@env_db)
|
801
|
-
#
|
769
|
+
#get
|
802
770
|
h1 = Arel.json({@name => @name+@name,@name+"2" => 1})
|
803
771
|
assert_equal "ArthurArthur", parse_json(t(@arthur,h1.get(@name)))
|
804
772
|
h2 = Arel.json([{age: @age},{name: @name,score: @score}])
|
805
773
|
assert_equal ({"age" => 21}), parse_json(t(@arthur,h2.get(0)))
|
806
774
|
assert_equal 21, parse_json(t(@arthur,h2.get(0).get('age')))
|
807
775
|
assert_nil t(@arthur,h2.get('age'))
|
808
|
-
#
|
776
|
+
#set
|
809
777
|
assert_equal ({"Arthur" => ["toto", "tata"], "Arthur2" => 1}), parse_json(t(@arthur,h1.set(@name, ['toto','tata'])))
|
810
778
|
assert_equal ({"Arthur" => "ArthurArthur", "Arthur2" => 1, "Arthur3" => 2}), parse_json(t(@arthur,h1.set(@name+"3",2)))
|
811
779
|
assert_equal ({"Arthur" => "ArthurArthur", "Arthur2" => 1, "Arthur3" => nil}), parse_json(t(@arthur,h1.set(@name+"3",nil)))
|
812
780
|
assert_equal ({"Arthur" => "ArthurArthur", "Arthur2" => 1, "Arthur3" => {"a" => 2}}), parse_json(t(@arthur,h1.set(@name+"3",{a: 2})))
|
813
|
-
#
|
781
|
+
#merge
|
814
782
|
assert_equal ({"Arthur" => ["toto", "tata"], "Arthur2" => 1, "Arthur3" => 2}), parse_json(t(@arthur,h1.merge({@name => ['toto','tata']},{@name+"3" => 2})))
|
815
783
|
assert_equal ({"Arthur" => ["toto", "tata"], "Arthur2" => 1, "Arthur3" => 2}), parse_json(t(@arthur,h1.merge({@name => ['toto','tata'], @name+"3" => 2})))
|
816
784
|
assert_equal ({"Arthur" => "ArthurArthur","Arthur2" => 1}), parse_json(t(@arthur,h1.merge({})))
|
@@ -818,14 +786,11 @@ module ArelExtensions
|
|
818
786
|
|
819
787
|
def test_as_on_everything
|
820
788
|
name = @arthur.select(@name.as('NaMe')).first.attributes
|
821
|
-
assert_equal 'Arthur', name["NaMe"] || name["name"] #
|
789
|
+
assert_equal 'Arthur', name["NaMe"] || name["name"] #because of Oracle
|
822
790
|
assert_equal 'Arthur', @arthur.select(@name.as('Na Me')).first.attributes["Na Me"]
|
823
791
|
assert_equal 'ArthurArthur', @arthur.select((@name+@name).as('Na-Me')).first.attributes["Na-Me"]
|
824
792
|
end
|
825
793
|
|
826
|
-
def test_exists_in_subquery
|
827
|
-
assert User.where(User.where(nil).arel.exists).first
|
828
|
-
end
|
829
794
|
end
|
830
795
|
end
|
831
796
|
end
|