arel_extensions 1.2.2 → 1.2.13

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 (94) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +7 -4
  3. data/.travis.yml +59 -91
  4. data/Gemfile +2 -2
  5. data/README.md +17 -12
  6. data/Rakefile +38 -27
  7. data/appveyor.yml +1 -1
  8. data/arel_extensions.gemspec +1 -1
  9. data/functions.html +3 -3
  10. data/gemfiles/rails4.gemfile +1 -1
  11. data/gemfiles/rails6.gemfile +30 -0
  12. data/gemspec_v2/arel_extensions-v2.gemspec +28 -0
  13. data/generate_gems.sh +14 -0
  14. data/init/mssql.sql +4 -4
  15. data/init/mysql.sql +38 -38
  16. data/init/postgresql.sql +21 -21
  17. data/lib/arel_extensions.rb +63 -19
  18. data/lib/arel_extensions/attributes.rb +0 -1
  19. data/lib/arel_extensions/boolean_functions.rb +38 -13
  20. data/lib/arel_extensions/common_sql_functions.rb +5 -4
  21. data/lib/arel_extensions/comparators.rb +4 -2
  22. data/lib/arel_extensions/insert_manager.rb +26 -24
  23. data/lib/arel_extensions/math.rb +3 -3
  24. data/lib/arel_extensions/math_functions.rb +10 -5
  25. data/lib/arel_extensions/nodes.rb +1 -1
  26. data/lib/arel_extensions/nodes/abs.rb +0 -0
  27. data/lib/arel_extensions/nodes/aggregate_function.rb +14 -0
  28. data/lib/arel_extensions/nodes/blank.rb +14 -11
  29. data/lib/arel_extensions/nodes/case.rb +8 -4
  30. data/lib/arel_extensions/nodes/ceil.rb +0 -0
  31. data/lib/arel_extensions/nodes/change_case.rb +2 -2
  32. data/lib/arel_extensions/nodes/coalesce.rb +2 -2
  33. data/lib/arel_extensions/nodes/collate.rb +12 -12
  34. data/lib/arel_extensions/nodes/concat.rb +6 -13
  35. data/lib/arel_extensions/nodes/date_diff.rb +3 -5
  36. data/lib/arel_extensions/nodes/duration.rb +0 -2
  37. data/lib/arel_extensions/nodes/find_in_set.rb +0 -0
  38. data/lib/arel_extensions/nodes/floor.rb +0 -0
  39. data/lib/arel_extensions/nodes/format.rb +8 -8
  40. data/lib/arel_extensions/nodes/formatted_number.rb +23 -23
  41. data/lib/arel_extensions/nodes/function.rb +10 -0
  42. data/lib/arel_extensions/nodes/is_null.rb +10 -8
  43. data/lib/arel_extensions/nodes/json.rb +28 -30
  44. data/lib/arel_extensions/nodes/length.rb +0 -0
  45. data/lib/arel_extensions/nodes/levenshtein_distance.rb +5 -5
  46. data/lib/arel_extensions/nodes/locate.rb +7 -7
  47. data/lib/arel_extensions/nodes/matches.rb +4 -4
  48. data/lib/arel_extensions/nodes/power.rb +6 -5
  49. data/lib/arel_extensions/nodes/rand.rb +0 -0
  50. data/lib/arel_extensions/nodes/repeat.rb +2 -2
  51. data/lib/arel_extensions/nodes/replace.rb +24 -6
  52. data/lib/arel_extensions/nodes/round.rb +5 -5
  53. data/lib/arel_extensions/nodes/soundex.rb +16 -15
  54. data/lib/arel_extensions/nodes/std.rb +19 -21
  55. data/lib/arel_extensions/nodes/substring.rb +8 -15
  56. data/lib/arel_extensions/nodes/sum.rb +7 -0
  57. data/lib/arel_extensions/nodes/trim.rb +3 -3
  58. data/lib/arel_extensions/nodes/union.rb +2 -3
  59. data/lib/arel_extensions/nodes/union_all.rb +1 -2
  60. data/lib/arel_extensions/nodes/wday.rb +0 -0
  61. data/lib/arel_extensions/null_functions.rb +2 -2
  62. data/lib/arel_extensions/predications.rb +35 -33
  63. data/lib/arel_extensions/set_functions.rb +16 -16
  64. data/lib/arel_extensions/string_functions.rb +34 -12
  65. data/lib/arel_extensions/tasks.rb +5 -5
  66. data/lib/arel_extensions/version.rb +1 -1
  67. data/lib/arel_extensions/visitors.rb +1 -1
  68. data/lib/arel_extensions/visitors/ibm_db.rb +1 -1
  69. data/lib/arel_extensions/visitors/mssql.rb +18 -17
  70. data/lib/arel_extensions/visitors/mysql.rb +92 -46
  71. data/lib/arel_extensions/visitors/oracle.rb +40 -28
  72. data/lib/arel_extensions/visitors/oracle12.rb +1 -1
  73. data/lib/arel_extensions/visitors/postgresql.rb +80 -34
  74. data/lib/arel_extensions/visitors/sqlite.rb +54 -46
  75. data/lib/arel_extensions/visitors/to_sql.rb +75 -62
  76. data/test/arelx_test_helper.rb +28 -0
  77. data/test/real_db_test.rb +1 -1
  78. data/test/support/fake_record.rb +4 -0
  79. data/test/test_comparators.rb +9 -8
  80. data/test/visitors/test_bulk_insert_oracle.rb +8 -7
  81. data/test/visitors/test_bulk_insert_sqlite.rb +9 -8
  82. data/test/visitors/test_bulk_insert_to_sql.rb +8 -10
  83. data/test/visitors/test_oracle.rb +41 -40
  84. data/test/visitors/test_to_sql.rb +367 -193
  85. data/test/with_ar/all_agnostic_test.rb +85 -39
  86. data/test/with_ar/insert_agnostic_test.rb +3 -2
  87. data/test/with_ar/test_bulk_sqlite.rb +6 -5
  88. data/test/with_ar/test_math_sqlite.rb +4 -4
  89. data/test/with_ar/test_string_mysql.rb +4 -6
  90. data/test/with_ar/test_string_sqlite.rb +3 -7
  91. data/version_v1.rb +3 -0
  92. data/version_v2.rb +3 -0
  93. metadata +13 -7
  94. data/test/helper.rb +0 -18
@@ -1,4 +1,4 @@
1
- require 'helper'
1
+ require 'arelx_test_helper'
2
2
  require 'date'
3
3
 
4
4
  module ArelExtensions
@@ -32,6 +32,7 @@ module ArelExtensions
32
32
  t.column :created_at, :date
33
33
  t.column :updated_at, :datetime
34
34
  t.column :duration, :time
35
+ t.column :other, :string
35
36
  t.column :score, :decimal, :precision => 20, :scale => 10
36
37
  end
37
38
  @cnx.drop_table(:product_tests) rescue nil
@@ -63,11 +64,12 @@ module ArelExtensions
63
64
  @myung = User.where(:id => u.id)
64
65
  u = User.create :age => 25, :name => "Laure", :created_at => d, :score => 20.16, :duration => Time.utc(2001, 1, 1, 12, 42, 21),:updated_at => Time.utc(2014, 3, 3, 12, 42, 0)
65
66
  @laure = User.where(:id => u.id)
66
- u = User.create :age => nil, :name => "Test", :created_at => d, :score => 1.62
67
+ u = User.create :age => nil, :name => "Test", :created_at => d, :score => 1.62, :other => 'toto'
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
+ u = User.create :age => 15, :name => "Justin", :created_at => d, :score => 11.0
72
+ @justin = User.where(:id => u.id)
71
73
 
72
74
  @age = User.arel_table[:age]
73
75
  @name = User.arel_table[:name]
@@ -77,6 +79,7 @@ module ArelExtensions
77
79
  @comments = User.arel_table[:comments]
78
80
  @duration = User.arel_table[:duration]
79
81
  @price = Product.arel_table[:price]
82
+ @other = User.arel_table[:other]
80
83
  @not_in_table = User.arel_table[:not_in_table]
81
84
 
82
85
  @ut = User.arel_table
@@ -119,6 +122,7 @@ module ArelExtensions
119
122
  assert_equal(-20, t(@camille, @score.ceil)) # -20.16
120
123
  assert_equal(-20, t(@camille, (@score - 0.5).ceil)) # -20.16
121
124
  assert_equal 63, t(@arthur, @age.ceil + 42)
125
+ assert_equal 11, t(@justin, @score.ceil) # 11.0
122
126
  end
123
127
 
124
128
  def test_floor
@@ -127,12 +131,14 @@ module ArelExtensions
127
131
  assert_equal 1, t(@test, @score.floor) # 1.62
128
132
  assert_equal(-9, t(@test, (@score - 10).floor)) # 1.62
129
133
  assert_equal 42, t(@arthur, @score.floor - 23)
134
+ assert_equal 11, t(@justin, @score.floor) # 11.0
135
+ assert_equal(-21, t(@camille, @score.floor)) # # -20.16
130
136
  end
131
137
 
132
138
  def test_rand
133
139
  assert 42 != User.select(Arel.rand.as('res')).first.res
134
140
  assert 0 <= User.select(Arel.rand.abs.as('res')).first.res
135
- assert_equal 8, User.order(Arel.rand).limit(50).count
141
+ assert_equal 9, User.order(Arel.rand).limit(50).count
136
142
  end
137
143
 
138
144
  def test_round
@@ -145,15 +151,15 @@ module ArelExtensions
145
151
  def test_sum
146
152
  if @env_db == 'mssql'
147
153
  skip "SQL Server forces order?" # TODO
148
- assert_equal 68, User.select((@age.sum + 1).as("res"), User.arel_table[:id].sum).take(50).reorder(@age).first.res
149
- assert_equal 134, User.reorder(nil).select((@age.sum + @age.sum).as("res"), User.arel_table[:id].sum).take(50).first.res
150
- assert_equal 201, User.reorder(nil).select(((@age * 3).sum).as("res"), User.arel_table[:id].sum).take(50).first.res
151
- assert_equal 4009, User.reorder(nil).select(((@age * @age).sum).as("res"), User.arel_table[:id].sum).take(50).first.res
154
+ assert_equal 83, User.select((@age.sum + 1).as("res"), User.arel_table[:id].sum).take(50).reorder(@age).first.res
155
+ assert_equal 164, User.reorder(nil).select((@age.sum + @age.sum).as("res"), User.arel_table[:id].sum).take(50).first.res
156
+ assert_equal 246, User.reorder(nil).select(((@age * 3).sum).as("res"), User.arel_table[:id].sum).take(50).first.res
157
+ assert_equal 4234, User.reorder(nil).select(((@age * @age).sum).as("res"), User.arel_table[:id].sum).take(50).first.res
152
158
  else
153
- assert_equal 68, User.select((@age.sum + 1).as("res")).take(50).first.res
154
- assert_equal 134, User.select((@age.sum + @age.sum).as("res")).take(50).first.res
155
- assert_equal 201, User.select(((@age * 3).sum).as("res")).take(50).first.res
156
- assert_equal 4009, User.select(((@age * @age).sum).as("res")).take(50).first.res
159
+ assert_equal 83, User.select((@age.sum + 1).as("res")).take(50).first.res
160
+ assert_equal 164, User.select((@age.sum + @age.sum).as("res")).take(50).first.res
161
+ assert_equal 246, User.select((@age * 3).sum.as("res")).take(50).first.res
162
+ assert_equal 4234, User.select(((@age * @age).sum).as("res")).take(50).first.res
157
163
  end
158
164
  end
159
165
 
@@ -173,6 +179,7 @@ module ArelExtensions
173
179
  assert_equal "Sophie,Lucas,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',@name.desc))
174
180
  assert_equal "Lucas,Sophie,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',[@score.asc,@name.asc]))
175
181
  assert_equal "Lucas,Sophie,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',@score.asc,@name.asc))
182
+ assert_equal "Lucas,Sophie,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',order: [@score.asc,@name.asc]))
176
183
  end
177
184
 
178
185
  def test_length
@@ -265,21 +272,28 @@ module ArelExtensions
265
272
  skip "Sqlite version can't load extension for regexp" if $sqlite && $load_extension_disabled
266
273
  skip "SQL Server does not know about REGEXP without extensions" if @env_db == 'mssql'
267
274
  assert_equal 1, User.where(@name =~ '^M').count
268
- assert_equal 6, User.where(@name !~ '^L').count
275
+ assert_equal 7, User.where(@name !~ '^L').count
269
276
  assert_equal 1, User.where(@name =~ /^M/).count
270
- assert_equal 6, User.where(@name !~ /^L/).count
277
+ assert_equal 7, User.where(@name !~ /^L/).count
271
278
  end
272
279
 
273
280
  def test_imatches
274
281
  #puts User.where(@name.imatches('m%')).to_sql
275
282
  assert_equal 1, User.where(@name.imatches('m%')).count
276
283
  assert_equal 4, User.where(@name.imatches_any(['L%', '%e'])).count
277
- assert_equal 6, User.where(@name.idoes_not_match('L%')).count
284
+ assert_equal 7, User.where(@name.idoes_not_match('L%')).count
278
285
  end
279
286
 
280
287
  def test_replace
281
288
  assert_equal "LucaX", t(@lucas, @name.replace("s", "X"))
282
289
  assert_equal "replace", t(@lucas, @name.replace(@name, "replace"))
290
+
291
+ skip "Sqlite does not seem to support regexp_replace" if $sqlite
292
+ skip "SQL Server does not know about REGEXP without extensions" if @env_db == 'mssql'
293
+ skip "Travis mysql version does not support REGEXP_REPLACE" if @env_db == 'mysql'
294
+ assert_equal "LXcXs", t(@lucas, @name.replace(/[ua]/, "X"))
295
+ assert_equal "LXcXs", t(@lucas, @name.regexp_replace(/[ua]/, "X"))
296
+ assert_equal "LXcXs", t(@lucas, @name.regexp_replace('[ua]', "X"))
283
297
  end
284
298
 
285
299
  def test_replace_once
@@ -292,8 +306,8 @@ module ArelExtensions
292
306
  skip "Sqlite version can't load extension for soundex" if $sqlite && $load_extension_disabled
293
307
  skip "PostgreSql version can't load extension for soundex" if @env_db == 'postgresql'
294
308
  assert_equal "C540", t(@camille, @name.soundex)
295
- assert_equal 8, User.where(@name.soundex.eq(@name.soundex)).count
296
- assert_equal 8, User.where(@name.soundex == @name.soundex).count
309
+ assert_equal 9, User.where(@name.soundex.eq(@name.soundex)).count
310
+ assert_equal 9 , User.where(@name.soundex == @name.soundex).count
297
311
  end
298
312
 
299
313
  def test_change_case
@@ -347,12 +361,16 @@ module ArelExtensions
347
361
  def test_coalesce
348
362
  assert_equal 'Camille concat', t(@camille, @name.coalesce(nil, "default") + ' concat')
349
363
 
364
+ assert_equal 'toto', t(@test, @other.coalesce(""))
365
+
350
366
  assert_equal ' ', t(@myung, @comments.coalesce("Myung").coalesce('ignored'))
351
367
  assert_equal 'Laure', t(@laure, @comments.coalesce("Laure"))
352
368
  if @env_db == 'oracle'
353
369
  assert_nil t(@laure, @comments.coalesce(""))
370
+ assert_nil t(@camille, @other.coalesce(""))
354
371
  else
355
372
  assert_equal('', t(@laure, @comments.coalesce("")))
373
+ assert_equal '', t(@camille, @other.coalesce(""))
356
374
  end
357
375
  assert_equal 100, t(@test, @age.coalesce(100))
358
376
  assert_equal "Camille", t(@camille, @name.coalesce(nil, "default"))
@@ -368,13 +386,13 @@ module ArelExtensions
368
386
  assert_equal 2, User.where(@age <= 10).count
369
387
  assert_equal 3, User.where(@age > 20).count
370
388
  assert_equal 4, User.where(@age >= 20).count
371
- assert_equal 1, User.where(@age > 5).where(@age < 20).count
389
+ assert_equal 2, User.where(@age > 5).where(@age < 20).count
372
390
  end
373
391
 
374
392
  def test_date_comparator
375
393
  d = Date.new(2016, 5, 23)
376
394
  assert_equal 0, User.where(@created_at < d).count
377
- assert_equal 8, User.where(@created_at >= d).count
395
+ assert_equal 9, User.where(@created_at >= d).count
378
396
  end
379
397
 
380
398
  def test_date_duration
@@ -383,10 +401,10 @@ module ArelExtensions
383
401
  assert_equal 0, User.where(@created_at.year.eq("2012")).count
384
402
  #Month
385
403
  assert_equal 5, t(@camille, @created_at.month).to_i
386
- assert_equal 8, User.where(@created_at.month.eq("05")).count
404
+ assert_equal 9, User.where(@created_at.month.eq("05")).count
387
405
  #Week
388
406
  assert_equal(@env_db == 'mssql' ? 22 : 21, t(@arthur, @created_at.week).to_i)
389
- assert_equal 8, User.where(@created_at.month.eq("05")).count
407
+ assert_equal 9, User.where(@created_at.month.eq("05")).count
390
408
  #Day
391
409
  assert_equal 23, t(@laure, @created_at.day).to_i
392
410
  assert_equal 0, User.where(@created_at.day.eq("05")).count
@@ -418,6 +436,7 @@ module ArelExtensions
418
436
  end
419
437
  end
420
438
 
439
+
421
440
  skip "not yet implemented" if $sqlite
422
441
 
423
442
  date1 = Date.new(2016, 5, 23)
@@ -461,29 +480,37 @@ module ArelExtensions
461
480
  # TODO; cast types
462
481
  def test_cast_types
463
482
  assert_equal "5", t(@lucas, @age.cast(:string))
483
+ skip "jdbc adapters does not work properly here (v52 works fine)" if RUBY_PLATFORM =~ /java/i
464
484
  if @env_db == 'mysql' || @env_db == 'postgresql' || @env_db == 'oracle' || @env_db == 'mssql'
465
- 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'
466
- 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'
485
+ 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'
486
+ assert_equal 1, t(@laure,Arel.when(@duration.cast(:time).eq("12:42:21")).then(1).else(0)) unless @env_db == 'oracle'
467
487
  assert_equal "20.16", t(@laure,@score.cast(:string)).gsub(/[0]*\z/,'')
468
488
  assert_equal "20.161", t(@laure,@score.cast(:string)+1).gsub(/[0]*1\z/,'1')
469
489
  assert_equal 21.16, t(@laure,@score.cast(:string).cast(:decimal)+1)
470
490
  assert_equal 21, t(@laure,@score.cast(:string).cast(:int)+1)
471
491
 
472
492
  assert_equal String, t(@lucas,@updated_at.cast(:string)).class
473
- assert_equal Date, t(@lucas,@updated_at.cast(:date)).class unless @env_db == 'oracle'
493
+
494
+ assert_equal Date, t(@lucas,@updated_at.cast(:date)).class unless @env_db == 'oracle' # DateTime
474
495
  assert_equal Time, t(@lucas,@updated_at.cast(:string).cast(:datetime)).class
475
496
  assert_equal Time, t(@lucas,@updated_at.cast(:time)).class
476
497
 
477
498
  assert_equal "2014-03-03 12:42:00", t(@lucas,@updated_at.cast(:string)) unless @env_db == 'mssql' #locale dependent
499
+ assert_equal Date.parse("2014-03-03"), t(@lucas,Arel::Nodes.build_quoted('2014-03-03').cast(:date))
500
+ assert_equal Date.parse("5014-03-03"), t(@lucas,(@age.cast(:string) + '014-03-03').cast(:date))
478
501
  assert_equal Time.parse("2014-03-03 12:42:00 UTC"), t(@lucas,@updated_at.cast(:string).cast(:datetime))
479
502
  assert_equal Date.parse("2014-03-03"), t(@lucas,@updated_at.cast(:date))
480
- assert_equal "12:42:00", t(@lucas,@updated_at.cast(:time).cast(:string)).split('.').first unless @env_db == 'oracle'
503
+ assert_equal "12:42:00", t(@lucas,@updated_at.cast(:time).cast(:string)).split('.').first unless @env_db == 'oracle' #DateTime
481
504
  end
482
505
  end
483
506
 
484
507
  def test_is_null
485
508
  #puts User.where(@age.is_null).select(@name).to_sql
486
- assert_equal "Test", User.where(@age.is_null).select(@name).first.name
509
+ #puts @age.is_null
510
+ #puts @age.is_null.inspect
511
+ #puts @age.is_null.to_sql
512
+ #puts @age=='34'
513
+ assert_equal "Test", User.select(@name).where(@age.is_null.to_sql).first.name
487
514
  end
488
515
 
489
516
  def test_math_plus
@@ -513,7 +540,7 @@ module ArelExtensions
513
540
  def test_math_minus
514
541
  d = Date.new(2016, 5, 20)
515
542
  #Datediff
516
- assert_equal 8, User.where((@created_at - @created_at).eq(0)).count
543
+ assert_equal 9, User.where((@created_at - @created_at).eq(0)).count
517
544
  assert_equal 3, @laure.select((@created_at - d).as("res")).first.res.abs.to_i
518
545
  #Substraction
519
546
  assert_equal 0, User.where((@age - 10).eq(50)).count
@@ -554,6 +581,7 @@ module ArelExtensions
554
581
  # Case clause
555
582
  def test_case
556
583
  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)
584
+ assert_equal 4, User.where(@score.when(20.16).then(1).else(0).eq(1)).count
557
585
  assert_equal 2, t(@arthur, @score.when(65.62,1).else(0)+1)
558
586
  assert_equal 0, t(@arthur, @score.when(65.62,1).else(0)-1)
559
587
  assert_equal "11", t(@arthur, @score.when(65.62).then("1").else("0")+"1")
@@ -631,8 +659,8 @@ module ArelExtensions
631
659
  end
632
660
 
633
661
  def test_subquery_with_order
634
- assert_equal 8, User.where(:name => User.select(:name).order(:name)).count
635
- assert_equal 8, User.where(@ut[:name].in(@ut.project(@ut[:name]).order(@ut[:name]))).count
662
+ assert_equal 9, User.where(:name => User.select(:name).order(:name)).count
663
+ assert_equal 9, User.where(@ut[:name].in(@ut.project(@ut[:name]).order(@ut[:name]))).count
636
664
  if !['mysql'].include?(@env_db) # MySql can't have limit in IN subquery
637
665
  assert_equal 2, User.where(:name => User.select(:name).order(:name).limit(2)).count
638
666
  #assert_equal 6, User.where(:name => User.select(:name).order(:name).offset(2)).count
@@ -700,6 +728,13 @@ module ArelExtensions
700
728
  #assert_equal true , @test.where(@age.not_in([nil,1,2])).blank?
701
729
  end
702
730
 
731
+ def test_in_on_grouping
732
+ skip "We should modify the visitor of IN to make it work" if $sqlite || @env_db == 'mssql'
733
+ assert_equal 2 , User.where(Arel.tuple(@name,@age).in(Arel.tuple('Myung',23),Arel.tuple('Arthur',21))).count
734
+ assert_equal 1 , User.where(Arel.tuple(@name,@age).in(Arel.tuple('Myung',23))).count
735
+ assert_equal 0 , User.where(Arel.tuple(@name,@age).in([])).count
736
+ end
737
+
703
738
  def test_alias_shortened
704
739
  if ['postgresql','oracle'].include?(@env_db)
705
740
  new_alias = Arel.shorten('azerty' * 15)
@@ -714,16 +749,21 @@ module ArelExtensions
714
749
  def test_stat_functions
715
750
  skip "SQLite doesn't work for most on this functions" if $sqlite
716
751
  #puts t(User.where(nil), @score.average)
717
- #puts t(User.where(nil), @score.variance(true))
718
- #puts t(User.where(nil), @score.variance(false))
719
- #puts t(User.where(nil), @score.std(true))
720
- #puts t(User.where(nil), @score.std(false))
721
-
722
- assert ( 15.98625 - t(User.where(nil), @score.average)).abs < 0.01
723
- assert (613.75488 - t(User.where(nil), @score.variance)).abs < 0.01
724
- assert ( 537.0355 - t(User.where(nil), @score.variance(false))).abs < 0.01
725
- assert ( 24.77408 - t(User.where(nil), @score.std)).abs < 0.01
726
- assert ( 23.17403 - t(User.where(nil), @score.std(false))).abs < 0.01
752
+ #puts t(User.where(nil), @score.variance(unbiased: true))
753
+ #puts t(User.where(nil), @score.variance(unbiased: false))
754
+ #puts t(User.where(nil), @score.std(unbiased: true))
755
+ #puts t(User.where(nil), @score.std(unbiased: false))
756
+
757
+ assert ( 15.43222 - t(User.where(nil), @score.average)).abs < 0.01
758
+ assert (539.79804 - t(User.where(nil), @score.variance)).abs < 0.01
759
+ assert (479.82048 - t(User.where(nil), @score.variance(unbiased: false))).abs < 0.01
760
+ assert ( 23.23355 - t(User.where(nil), @score.std)).abs < 0.01
761
+ assert ( 21.90480 - t(User.where(nil), @score.std(unbiased: false))).abs < 0.01
762
+ skip "Not Yet Implemented" #if !['postgresql'].include?(@env_db)
763
+ assert_equal 2, User.select(@score.std(group: Arel.when(@name > "M").then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
764
+ assert_equal 2, User.select(@score.variance(group: Arel.when(@name > "M").then(0).else(1)).as('res')).map{|e|e['res']}.uniq.length
765
+ assert_equal 2, User.select(@score.sum(group: Arel.when(@name > "M").then(0).else(1)).as('res')).map{|e|e['res']}.uniq.length
766
+ 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
727
767
  end
728
768
 
729
769
  def test_levenshtein_distance
@@ -778,6 +818,12 @@ module ArelExtensions
778
818
  assert_equal 'Arthur', @arthur.select(@name.as('Na Me')).first.attributes["Na Me"]
779
819
  assert_equal 'ArthurArthur', @arthur.select((@name+@name).as('Na-Me')).first.attributes["Na-Me"]
780
820
  end
821
+
822
+ def test_exists_in_subquery
823
+ assert User.where(User.where(nil).arel.exists).first
824
+ end
825
+
826
+
781
827
  end
782
828
  end
783
829
  end
@@ -1,4 +1,4 @@
1
- require 'helper'
1
+ require 'arelx_test_helper'
2
2
  require 'date'
3
3
 
4
4
  module ArelExtensions
@@ -23,7 +23,7 @@ module ArelExtensions
23
23
  @cnx.execute(sql) rescue $stderr << "can't create functions\n"
24
24
  end
25
25
  end
26
- @cnx.drop_table(:user_tests) rescue nil
26
+ @cnx.drop_table(:user_tests) rescue nil
27
27
  @cnx.create_table :user_tests do |t|
28
28
  t.column :age, :integer
29
29
  t.column :name, :string
@@ -77,6 +77,7 @@ END;])
77
77
  insert_manager.bulk_insert(@cols2, @data2)
78
78
  @cnx.execute(insert_manager.to_sql)
79
79
  assert_equal 4, User.count, "insertions failed"
80
+
80
81
  end
81
82
 
82
83
  end
@@ -1,4 +1,4 @@
1
- require 'helper'
1
+ require 'arelx_test_helper'
2
2
 
3
3
  module ArelExtensions
4
4
  module WthAr
@@ -12,7 +12,7 @@ module ArelExtensions
12
12
  @cnx = ActiveRecord::Base.connection
13
13
  Arel::Table.engine = ActiveRecord::Base
14
14
  @cnx.drop_table(:users) rescue nil
15
- @cnx.drop_table(:products) rescue nil
15
+ @cnx.drop_table(:products) rescue nil
16
16
  @cnx.create_table :users do |t|
17
17
  t.column :age, :integer
18
18
  t.column :name, :string
@@ -38,11 +38,12 @@ module ArelExtensions
38
38
  it "should import large set of data" do
39
39
  insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new().into(@table) : Arel::InsertManager.new(ActiveRecord::Base).into(@table)
40
40
  insert_manager.bulk_insert(@cols, @data)
41
- sql = insert_manager.to_sql
42
- sql.must_be_like %Q[INSERT INTO "users" ("id", "name", "comments", "created_at") SELECT 23 AS 'id', 'nom1' AS 'name', 'sdfdsfdsfsdf' AS 'comments', '2016-01-01' AS 'created_at' UNION ALL SELECT 25, 'nom2', 'sdfdsfdsfsdf', '2016-01-01']
41
+ _(insert_manager.to_sql)
42
+ .must_be_like %Q[INSERT INTO "users" ("id", "name", "comments", "created_at")
43
+ SELECT 23 AS 'id', 'nom1' AS 'name', 'sdfdsfdsfsdf' AS 'comments', '2016-01-01' AS 'created_at' UNION ALL SELECT 25, 'nom2', 'sdfdsfdsfsdf', '2016-01-01']
43
44
  end
44
45
 
45
46
  end
46
47
 
47
48
  end
48
- end
49
+ end
@@ -1,4 +1,4 @@
1
- require 'helper'
1
+ require 'arelx_test_helper'
2
2
 
3
3
  module ArelExtensions
4
4
  module WthAr
@@ -11,8 +11,8 @@ module ArelExtensions
11
11
  ActiveRecord::Base.default_timezone = :utc
12
12
  Arel::Table.engine = ActiveRecord::Base
13
13
  @cnx = ActiveRecord::Base.connection
14
- @cnx.drop_table(:users) rescue nil
15
- @cnx.drop_table(:products) rescue nil
14
+ @cnx.drop_table(:users) rescue nil
15
+ @cnx.drop_table(:products) rescue nil
16
16
  @cnx.create_table :users do |t|
17
17
  t.column :age, :integer
18
18
  t.column :name, :string
@@ -61,4 +61,4 @@ module ArelExtensions
61
61
  end
62
62
 
63
63
  end
64
- end
64
+ end
@@ -1,4 +1,4 @@
1
- require 'helper'
1
+ require 'arelx_test_helper'
2
2
  require 'date'
3
3
 
4
4
  module ArelExtensions
@@ -10,7 +10,7 @@ module ArelExtensions
10
10
  ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
11
11
  ActiveRecord::Base.establish_connection(ENV['DB'] || (RUBY_PLATFORM == 'java' ? :"jdbc-mysql" : :mysql))
12
12
  ActiveRecord::Base.default_timezone = :utc
13
- begin
13
+ begin
14
14
  @cnx = ActiveRecord::Base.connection
15
15
  rescue => e
16
16
  puts "\n#{e.inspect}"
@@ -19,7 +19,7 @@ module ArelExtensions
19
19
  end
20
20
  Arel::Table.engine = ActiveRecord::Base
21
21
  @cnx.drop_table(:users) rescue nil
22
- @cnx.drop_table(:products) rescue nil
22
+ @cnx.drop_table(:products) rescue nil
23
23
  @cnx.create_table :users do |t|
24
24
  t.column :age, :integer
25
25
  t.column :name, :string
@@ -67,11 +67,9 @@ module ArelExtensions
67
67
  # Replace
68
68
  assert_equal "LucaX", User.where(:id => @lucas).select(@name.replace("s","X").as("res")).first.res
69
69
  assert_equal "replace", User.where(:id => @lucas).select(@name.replace(@name,"replace").as("res")).first.res
70
-
71
- #
72
70
  end
73
71
 
74
72
  end
75
73
 
76
74
  end
77
- end
75
+ end
@@ -1,4 +1,4 @@
1
- require 'helper'
1
+ require 'arelx_test_helper'
2
2
  require 'date'
3
3
 
4
4
  module ArelExtensions
@@ -12,7 +12,7 @@ module ArelExtensions
12
12
  ActiveRecord::Base.default_timezone = :utc
13
13
  @cnx = ActiveRecord::Base.connection
14
14
  Arel::Table.engine = ActiveRecord::Base
15
- @cnx.drop_table(:users) rescue nil
15
+ @cnx.drop_table(:users) rescue nil
16
16
  @cnx.create_table :users do |t|
17
17
  t.column :age, :integer
18
18
  t.column :name, :string
@@ -57,16 +57,12 @@ module ArelExtensions
57
57
  assert_equal 1, User.where((User.arel_table[:age] + "1").eq(6)).count
58
58
  assert_equal 1, User.where((User.arel_table[:age] + User.arel_table[:age]).eq(10)).count
59
59
 
60
-
61
-
62
60
  # Replace
63
61
  assert_equal "LucaX", User.where(:id => @lucas).select(@name.replace("s","X").as("res")).first.res
64
62
  assert_equal "replace", User.where(:id => @lucas).select(@name.replace(@name,"replace").as("res")).first.res
65
-
66
- #
67
63
  end
68
64
 
69
65
  end
70
66
 
71
67
  end
72
- end
68
+ end