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.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -7
  3. data/.travis.yml +91 -61
  4. data/Gemfile +20 -15
  5. data/README.md +12 -17
  6. data/Rakefile +29 -40
  7. data/appveyor.yml +1 -1
  8. data/arel_extensions.gemspec +3 -3
  9. data/functions.html +3 -3
  10. data/gemfiles/rails3.gemfile +9 -9
  11. data/gemfiles/rails4.gemfile +13 -13
  12. data/gemfiles/rails5_0.gemfile +13 -13
  13. data/gemfiles/rails5_1_4.gemfile +13 -13
  14. data/gemfiles/rails5_2.gemfile +13 -13
  15. data/init/mssql.sql +4 -4
  16. data/init/mysql.sql +38 -38
  17. data/init/postgresql.sql +21 -21
  18. data/lib/arel_extensions.rb +19 -69
  19. data/lib/arel_extensions/attributes.rb +1 -0
  20. data/lib/arel_extensions/boolean_functions.rb +14 -55
  21. data/lib/arel_extensions/common_sql_functions.rb +8 -7
  22. data/lib/arel_extensions/comparators.rb +15 -14
  23. data/lib/arel_extensions/date_duration.rb +5 -4
  24. data/lib/arel_extensions/insert_manager.rb +16 -17
  25. data/lib/arel_extensions/math.rb +12 -11
  26. data/lib/arel_extensions/math_functions.rb +22 -29
  27. data/lib/arel_extensions/nodes.rb +1 -1
  28. data/lib/arel_extensions/nodes/abs.rb +1 -0
  29. data/lib/arel_extensions/nodes/blank.rb +1 -0
  30. data/lib/arel_extensions/nodes/case.rb +8 -11
  31. data/lib/arel_extensions/nodes/cast.rb +2 -4
  32. data/lib/arel_extensions/nodes/ceil.rb +1 -1
  33. data/lib/arel_extensions/nodes/change_case.rb +0 -0
  34. data/lib/arel_extensions/nodes/coalesce.rb +3 -2
  35. data/lib/arel_extensions/nodes/collate.rb +2 -1
  36. data/lib/arel_extensions/nodes/concat.rb +16 -7
  37. data/lib/arel_extensions/nodes/date_diff.rb +13 -10
  38. data/lib/arel_extensions/nodes/duration.rb +3 -0
  39. data/lib/arel_extensions/nodes/find_in_set.rb +1 -0
  40. data/lib/arel_extensions/nodes/floor.rb +1 -1
  41. data/lib/arel_extensions/nodes/format.rb +8 -34
  42. data/lib/arel_extensions/nodes/formatted_number.rb +23 -22
  43. data/lib/arel_extensions/nodes/function.rb +16 -25
  44. data/lib/arel_extensions/nodes/json.rb +36 -43
  45. data/lib/arel_extensions/nodes/length.rb +1 -0
  46. data/lib/arel_extensions/nodes/levenshtein_distance.rb +0 -0
  47. data/lib/arel_extensions/nodes/locate.rb +1 -0
  48. data/lib/arel_extensions/nodes/log10.rb +2 -1
  49. data/lib/arel_extensions/nodes/matches.rb +6 -4
  50. data/lib/arel_extensions/nodes/md5.rb +1 -0
  51. data/lib/arel_extensions/nodes/power.rb +5 -5
  52. data/lib/arel_extensions/nodes/rand.rb +1 -0
  53. data/lib/arel_extensions/nodes/repeat.rb +4 -2
  54. data/lib/arel_extensions/nodes/replace.rb +6 -22
  55. data/lib/arel_extensions/nodes/round.rb +6 -5
  56. data/lib/arel_extensions/nodes/soundex.rb +15 -15
  57. data/lib/arel_extensions/nodes/std.rb +21 -18
  58. data/lib/arel_extensions/nodes/substring.rb +16 -8
  59. data/lib/arel_extensions/nodes/then.rb +0 -0
  60. data/lib/arel_extensions/nodes/trim.rb +5 -3
  61. data/lib/arel_extensions/nodes/union.rb +5 -2
  62. data/lib/arel_extensions/nodes/union_all.rb +3 -0
  63. data/lib/arel_extensions/nodes/wday.rb +4 -0
  64. data/lib/arel_extensions/null_functions.rb +7 -5
  65. data/lib/arel_extensions/predications.rb +34 -35
  66. data/lib/arel_extensions/railtie.rb +5 -5
  67. data/lib/arel_extensions/set_functions.rb +4 -2
  68. data/lib/arel_extensions/string_functions.rb +22 -43
  69. data/lib/arel_extensions/tasks.rb +5 -5
  70. data/lib/arel_extensions/version.rb +1 -1
  71. data/lib/arel_extensions/visitors.rb +60 -68
  72. data/lib/arel_extensions/visitors/ibm_db.rb +12 -5
  73. data/lib/arel_extensions/visitors/mssql.rb +57 -63
  74. data/lib/arel_extensions/visitors/mysql.rb +98 -149
  75. data/lib/arel_extensions/visitors/oracle.rb +68 -71
  76. data/lib/arel_extensions/visitors/oracle12.rb +15 -2
  77. data/lib/arel_extensions/visitors/postgresql.rb +63 -116
  78. data/lib/arel_extensions/visitors/sqlite.rb +70 -83
  79. data/lib/arel_extensions/visitors/to_sql.rb +109 -141
  80. data/test/database.yml +0 -2
  81. data/test/helper.rb +18 -0
  82. data/test/real_db_test.rb +43 -28
  83. data/test/support/fake_record.rb +2 -2
  84. data/test/test_comparators.rb +12 -9
  85. data/test/visitors/test_bulk_insert_oracle.rb +8 -8
  86. data/test/visitors/test_bulk_insert_sqlite.rb +10 -9
  87. data/test/visitors/test_bulk_insert_to_sql.rb +10 -8
  88. data/test/visitors/test_oracle.rb +42 -42
  89. data/test/visitors/test_to_sql.rb +196 -361
  90. data/test/with_ar/all_agnostic_test.rb +160 -195
  91. data/test/with_ar/insert_agnostic_test.rb +4 -3
  92. data/test/with_ar/test_bulk_sqlite.rb +9 -6
  93. data/test/with_ar/test_math_sqlite.rb +12 -8
  94. data/test/with_ar/test_string_mysql.rb +11 -5
  95. data/test/with_ar/test_string_sqlite.rb +12 -4
  96. metadata +11 -22
  97. data/.github/workflows/ruby.yml +0 -102
  98. data/gemfiles/rails6.gemfile +0 -30
  99. data/gemfiles/rails6_1.gemfile +0 -30
  100. data/gemspecs/arel_extensions-v1.gemspec +0 -28
  101. data/gemspecs/arel_extensions-v2.gemspec +0 -28
  102. data/generate_gems.sh +0 -15
  103. data/lib/arel_extensions/nodes/aggregate_function.rb +0 -13
  104. data/lib/arel_extensions/nodes/sum.rb +0 -7
  105. data/lib/arel_extensions/visitors/convert_format.rb +0 -37
  106. data/test/arelx_test_helper.rb +0 -26
  107. data/version_v1.rb +0 -3
  108. data/version_v2.rb +0 -3
@@ -1,8 +1,9 @@
1
- require 'arelx_test_helper'
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
- u = User.create :age => 15, :name => "Justin", :created_at => d, :score => 11.0
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
- # manage the difference between adapters that handle or not json type
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
- # skip "Sqlite version can't load extension for ceil" if $sqlite && $load_extension_disabled
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
- # skip "Sqlite version can't load extension for floor" if $sqlite && $load_extension_disabled
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 9, User.order(Arel.rand).limit(50).count
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 83, User.select((@age.sum + 1).as("res"), User.arel_table[:id].sum).take(50).reorder(@age).first.res
154
- assert_equal 164, User.reorder(nil).select((@age.sum + @age.sum).as("res"), User.arel_table[:id].sum).take(50).first.res
155
- assert_equal 246, User.reorder(nil).select(((@age * 3).sum).as("res"), User.arel_table[:id].sum).take(50).first.res
156
- assert_equal 4234, User.reorder(nil).select(((@age * @age).sum).as("res"), User.arel_table[:id].sum).take(50).first.res
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 83, User.select((@age.sum + 1).as("res")).take(50).first.res
159
- assert_equal 164, User.select((@age.sum + @age.sum).as("res")).take(50).first.res
160
- assert_equal 246, User.select((@age * 3).sum.as("res")).take(50).first.res
161
- assert_equal 4234, User.select(((@age * @age).sum).as("res")).take(50).first.res
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
- # substring should accept string function
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
- # skip "Oracle can't use math operators to compare strings" if @env_db == 'oracle' # use GREATEST ?
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
- # @created_at == 2016-05-23
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
- # @updated_at == 2014-03-03 12:42:00
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
- # @duration == 12:42:21
269
- # puts @laure.select(ArelExtensions::Nodes::Case.new.when(@duration >= '10:10:10').then(1).else(0)).to_sql
270
- # puts @laure.select(ArelExtensions::Nodes::Case.new.when(@duration >= '14:10:10').then(1).else(0)).to_sql
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 7, User.where(@name !~ '^L').count
270
+ assert_equal 6, User.where(@name !~ '^L').count
280
271
  assert_equal 1, User.where(@name =~ /^M/).count
281
- assert_equal 7, User.where(@name !~ /^L/).count
272
+ assert_equal 6, User.where(@name !~ /^L/).count
282
273
  end
283
274
 
284
275
  def test_imatches
285
- # puts User.where(@name.imatches('m%')).to_sql
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 7, User.where(@name.idoes_not_match('L%')).count
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
- # skip "Sqlite version can't load extension for locate" if $sqlite && $load_extension_disabled
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 9, User.where(@name.soundex.eq(@name.soundex)).count
314
- assert_equal 9, User.where(@name.soundex == @name.soundex).count
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 2, User.where(@age > 5).where(@age < 20).count
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 9, User.where(@created_at >= d).count
383
+ assert_equal 8, User.where(@created_at >= d).count
401
384
  end
402
385
 
403
386
  def test_date_duration
404
- # Year
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
- # Month
390
+ #Month
408
391
  assert_equal 5, t(@camille, @created_at.month).to_i
409
- assert_equal 9, User.where(@created_at.month.eq("05")).count
410
- # Week
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 9, User.where(@created_at.month.eq("05")).count
413
- # Day
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
- # skip "manage DATE" if @env_db == 'oracle'
418
- # Hour
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
- # Minute
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
- # Second
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
- # puts (@created_at + durPos).cast(:date).to_sql
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
- # puts (@created_at + @created_at.day).cast(:date).to_sql
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
- # puts (@created_at - @created_at.day).cast(:date).to_sql
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
- t(@lucas,(@updated_at + Arel.duration('s',(@updated_at.hour*60 + @updated_at.minute))))
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
- t(@lucas,(@updated_at + Arel.duration('mn',(@updated_at.hour*60 + @updated_at.minute))))
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
- # puts (@updated_at - durPos).to_sql
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
- # end
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,Arel.when(@duration.cast(:time).cast(:string).eq("12:42:21")).then(1).else(0)) unless @env_db == 'oracle' || @env_db == 'mssql'
491
- assert_equal 1, t(@laure,Arel.when(@duration.cast(:time).eq("12:42:21")).then(1).else(0)) unless @env_db == 'oracle'
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' # locale dependent
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' # DateTime
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
- # puts User.where(@age.is_null).select(@name).to_sql
514
- # puts @age.is_null
515
- # puts @age.is_null.inspect
516
- # puts @age.is_null.to_sql
517
- # puts @age=='34'
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
- # Concat String
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
- # FIXME: should work as expected in Oracle
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
- # concat Integer
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
- # concat Date
539
- # puts((User.arel_table[:created_at] + 1).as("res").to_sql.inspect)
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
- # Datediff
547
- assert_equal 9, User.where((@created_at - @created_at).eq(0)).count
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
- # Substraction
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
- # d = Date.new(2016, 6, 26)
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','') # tr is here because of precision on cast for some DBMS
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
- # score of Arthur = 65.62
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"," ") # some DBMS put no-break space here (it makes sense thus)
616
- assert_equal "123456765,6", t(@arthur, (@score+123456700).format_number("%.1f","fr_FR")).gsub("\u00A0","") # because SqlServer does it like no one else
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
- # AI & CI
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
- # AI & CS
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
- # AS & CI
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
- # AS & CS
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 9, User.where(:name => User.select(:name).order(:name)).count
667
- assert_equal 9, User.where(@ut[:name].in(@ut.project(@ut[:name]).order(@ut[:name]))).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
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
- # assert_equal 6, User.where(:name => User.select(:name).order(:name).offset(2)).count
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
- # if the column is null, the entry will never be selected with not in (like every DBMS does)
726
- # assert_equal false , @test.where(@age.not_in(1)).blank?
727
- # assert_equal false , @test.where(@age.not_in([1])).blank?
728
- # assert_equal false , @test.where(@age.not_in([1,2])).blank?
729
- # assert_equal true , @test.where(@age.not_in(nil)).blank?
730
- # assert_equal true , @test.where(@age.not_in([nil])).blank?
731
- # assert_equal true , @test.where(@age.not_in([nil,1])).blank?
732
- # assert_equal true , @test.where(@age.not_in([nil,1,2])).blank?
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 %Q[SELECT "#{new_alias}"."id" FROM "user_tests" "#{new_alias}"].downcase,
749
- User.select(at[:id]).from(at).to_sql.downcase
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
- # puts t(User.where(nil), @score.average)
756
- # puts t(User.where(nil), @score.variance(unbiased: true))
757
- # puts t(User.where(nil), @score.variance(unbiased: false))
758
- # puts t(User.where(nil), @score.std(unbiased: true))
759
- # puts t(User.where(nil), @score.std(unbiased: false))
760
-
761
- assert ( 15.43222 - t(User.where(nil), @score.average)).abs < 0.01
762
- assert (539.79804 - t(User.where(nil), @score.variance)).abs < 0.01
763
- assert (479.82048 - t(User.where(nil), @score.variance(unbiased: false))).abs < 0.01
764
- assert ( 23.23355 - t(User.where(nil), @score.std)).abs < 0.01
765
- assert ( 21.90480 - t(User.where(nil), @score.std(unbiased: false))).abs < 0.01
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
- # creation
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
- parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16),Arel.json({@age => @name}).group(false)))
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
- parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16),Arel.json({@age => @name,@name => @age}).group(false)))
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
- parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score),Arel.json({@age => @name}).group(true,[@age])))
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
- # puts User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score,Arel.json({@age => @name}).group(true,[@age])).to_sql
798
- # puts User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score,Arel.json({@age => @name}).group(true,[@age])).to_a
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
- # get
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
- # set
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
- # merge
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"] # because of Oracle
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