arel_extensions 1.2.2 → 1.2.13

Sign up to get free protection for your applications and to get access to all the features.
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