arel_extensions 1.2.5 → 1.2.8

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 (51) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +7 -4
  3. data/README.md +7 -2
  4. data/Rakefile +23 -23
  5. data/arel_extensions.gemspec +1 -1
  6. data/functions.html +2 -2
  7. data/gemfiles/rails6.gemfile +30 -0
  8. data/gemspec_v2/arel_extensions-v2.gemspec +28 -0
  9. data/generate_gems.sh +13 -0
  10. data/lib/arel_extensions.rb +4 -1
  11. data/lib/arel_extensions/boolean_functions.rb +0 -2
  12. data/lib/arel_extensions/common_sql_functions.rb +5 -4
  13. data/lib/arel_extensions/insert_manager.rb +24 -24
  14. data/lib/arel_extensions/math.rb +3 -3
  15. data/lib/arel_extensions/math_functions.rb +4 -4
  16. data/lib/arel_extensions/nodes/case.rb +0 -2
  17. data/lib/arel_extensions/nodes/collate.rb +1 -1
  18. data/lib/arel_extensions/nodes/date_diff.rb +1 -3
  19. data/lib/arel_extensions/nodes/duration.rb +0 -2
  20. data/lib/arel_extensions/nodes/formatted_number.rb +20 -20
  21. data/lib/arel_extensions/nodes/json.rb +28 -30
  22. data/lib/arel_extensions/nodes/power.rb +5 -4
  23. data/lib/arel_extensions/nodes/replace.rb +23 -5
  24. data/lib/arel_extensions/nodes/round.rb +5 -5
  25. data/lib/arel_extensions/nodes/soundex.rb +14 -13
  26. data/lib/arel_extensions/nodes/substring.rb +8 -15
  27. data/lib/arel_extensions/nodes/trim.rb +1 -1
  28. data/lib/arel_extensions/nodes/union.rb +0 -1
  29. data/lib/arel_extensions/nodes/union_all.rb +0 -1
  30. data/lib/arel_extensions/predications.rb +16 -17
  31. data/lib/arel_extensions/string_functions.rb +12 -6
  32. data/lib/arel_extensions/tasks.rb +5 -5
  33. data/lib/arel_extensions/version.rb +1 -1
  34. data/lib/arel_extensions/visitors/mssql.rb +13 -12
  35. data/lib/arel_extensions/visitors/mysql.rb +50 -35
  36. data/lib/arel_extensions/visitors/oracle.rb +7 -6
  37. data/lib/arel_extensions/visitors/oracle12.rb +1 -1
  38. data/lib/arel_extensions/visitors/postgresql.rb +45 -27
  39. data/lib/arel_extensions/visitors/sqlite.rb +41 -27
  40. data/lib/arel_extensions/visitors/to_sql.rb +18 -5
  41. data/test/visitors/test_bulk_insert_oracle.rb +6 -6
  42. data/test/visitors/test_bulk_insert_sqlite.rb +5 -5
  43. data/test/visitors/test_to_sql.rb +10 -2
  44. data/test/with_ar/all_agnostic_test.rb +44 -33
  45. data/test/with_ar/test_bulk_sqlite.rb +1 -1
  46. data/test/with_ar/test_math_sqlite.rb +1 -1
  47. data/test/with_ar/test_string_mysql.rb +1 -3
  48. data/test/with_ar/test_string_sqlite.rb +1 -5
  49. data/version_v1.rb +3 -0
  50. data/version_v2.rb +3 -0
  51. metadata +9 -4
@@ -121,7 +121,6 @@ module ArelExtensions
121
121
  compile(@table[:id] < 42).must_match %{"users"."id" < 42}
122
122
  compile(@table[:id] <= 42).must_match %{"users"."id" <= 42}
123
123
  compile((@table[:id] <= 42).as('new_name')).must_match %{("users"."id" <= 42) AS new_name}
124
- puts @table[:id].count.class
125
124
  compile(@table[:id].count.eq 42).must_match %{COUNT("users"."id") = 42}
126
125
  #compile(@table[:id].count == 42).must_match %{COUNT("users"."id") = 42} # TODO
127
126
  #compile(@table[:id].count != 42).must_match %{COUNT("users"."id") != 42}
@@ -334,9 +333,11 @@ module ArelExtensions
334
333
  compile(@table[:id].in(1))
335
334
  .must_be_like %{"users"."id" IN (1)}
336
335
  compile(@table[:id].in([1]))
337
- .must_be_like %{"users"."id" IN (1)}
336
+ .must_be_like %{"users"."id" = 1}
338
337
  compile(@table[:id].in([1,2]))
339
338
  .must_be_like %{"users"."id" IN (1, 2)}
339
+ compile(@table[:id].in([]))
340
+ .must_be_like %{ISNULL("users"."id")}
340
341
  end
341
342
 
342
343
  it "should be possible to correctly use a Range on an IN" do
@@ -346,6 +347,13 @@ module ArelExtensions
346
347
  .must_be_like %{"users"."created_at" BETWEEN ('2016-03-31') AND ('2017-03-31')}
347
348
  end
348
349
 
350
+ it "should be possible to use a list of values and ranges on an IN" do
351
+ compile(@table[:id].in [1..10, 20, 30, 40..50])
352
+ .must_be_like %{(("users"."id" IN (20, 30)) OR ("users"."id" BETWEEN (1) AND (10))) OR ("users"."id" BETWEEN (40) AND (50))}
353
+ # compile(@table[:created_at].in(@date .. Date.new(2017, 3, 31))) # @date = Date.new(2016, 3, 31)
354
+ # .must_be_like %{"users"."created_at" BETWEEN ('2016-03-31') AND ('2017-03-31')}
355
+ end
356
+
349
357
  it "should be possible to add and substract as much as we want" do
350
358
  c = @table[:name]
351
359
  compile(c.locate('test')+1)
@@ -68,7 +68,8 @@ module ArelExtensions
68
68
  @test = User.where(:id => u.id)
69
69
  u = User.create :age => -42, :name => "Negatif", :comments => '1,22,3,42,2', :created_at => d, :updated_at => d.to_time, :score => 0.17
70
70
  @neg = User.where(:id => u.id)
71
-
71
+ u = User.create :age => 15, :name => "Justin", :created_at => d, :score => 11.0
72
+ @justin = User.where(:id => u.id)
72
73
 
73
74
  @age = User.arel_table[:age]
74
75
  @name = User.arel_table[:name]
@@ -121,6 +122,7 @@ module ArelExtensions
121
122
  assert_equal(-20, t(@camille, @score.ceil)) # -20.16
122
123
  assert_equal(-20, t(@camille, (@score - 0.5).ceil)) # -20.16
123
124
  assert_equal 63, t(@arthur, @age.ceil + 42)
125
+ assert_equal 11, t(@justin, @score.ceil) # 11.0
124
126
  end
125
127
 
126
128
  def test_floor
@@ -129,12 +131,14 @@ module ArelExtensions
129
131
  assert_equal 1, t(@test, @score.floor) # 1.62
130
132
  assert_equal(-9, t(@test, (@score - 10).floor)) # 1.62
131
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
132
136
  end
133
137
 
134
138
  def test_rand
135
139
  assert 42 != User.select(Arel.rand.as('res')).first.res
136
140
  assert 0 <= User.select(Arel.rand.abs.as('res')).first.res
137
- assert_equal 8, User.order(Arel.rand).limit(50).count
141
+ assert_equal 9, User.order(Arel.rand).limit(50).count
138
142
  end
139
143
 
140
144
  def test_round
@@ -147,15 +151,15 @@ module ArelExtensions
147
151
  def test_sum
148
152
  if @env_db == 'mssql'
149
153
  skip "SQL Server forces order?" # TODO
150
- assert_equal 68, User.select((@age.sum + 1).as("res"), User.arel_table[:id].sum).take(50).reorder(@age).first.res
151
- assert_equal 134, User.reorder(nil).select((@age.sum + @age.sum).as("res"), User.arel_table[:id].sum).take(50).first.res
152
- assert_equal 201, User.reorder(nil).select(((@age * 3).sum).as("res"), User.arel_table[:id].sum).take(50).first.res
153
- assert_equal 4009, User.reorder(nil).select(((@age * @age).sum).as("res"), User.arel_table[:id].sum).take(50).first.res
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
154
158
  else
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
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
159
163
  end
160
164
  end
161
165
 
@@ -268,21 +272,27 @@ module ArelExtensions
268
272
  skip "Sqlite version can't load extension for regexp" if $sqlite && $load_extension_disabled
269
273
  skip "SQL Server does not know about REGEXP without extensions" if @env_db == 'mssql'
270
274
  assert_equal 1, User.where(@name =~ '^M').count
271
- assert_equal 6, User.where(@name !~ '^L').count
275
+ assert_equal 7, User.where(@name !~ '^L').count
272
276
  assert_equal 1, User.where(@name =~ /^M/).count
273
- assert_equal 6, User.where(@name !~ /^L/).count
277
+ assert_equal 7, User.where(@name !~ /^L/).count
274
278
  end
275
279
 
276
280
  def test_imatches
277
281
  #puts User.where(@name.imatches('m%')).to_sql
278
282
  assert_equal 1, User.where(@name.imatches('m%')).count
279
283
  assert_equal 4, User.where(@name.imatches_any(['L%', '%e'])).count
280
- assert_equal 6, User.where(@name.idoes_not_match('L%')).count
284
+ assert_equal 7, User.where(@name.idoes_not_match('L%')).count
281
285
  end
282
286
 
283
287
  def test_replace
284
288
  assert_equal "LucaX", t(@lucas, @name.replace("s", "X"))
285
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
+ assert_equal "LXcXs", t(@lucas, @name.replace(/[ua]/, "X"))
294
+ assert_equal "LXcXs", t(@lucas, @name.regexp_replace(/[ua]/, "X"))
295
+ assert_equal "LXcXs", t(@lucas, @name.regexp_replace('[ua]', "X"))
286
296
  end
287
297
 
288
298
  def test_replace_once
@@ -295,8 +305,8 @@ module ArelExtensions
295
305
  skip "Sqlite version can't load extension for soundex" if $sqlite && $load_extension_disabled
296
306
  skip "PostgreSql version can't load extension for soundex" if @env_db == 'postgresql'
297
307
  assert_equal "C540", t(@camille, @name.soundex)
298
- assert_equal 8, User.where(@name.soundex.eq(@name.soundex)).count
299
- assert_equal 8, User.where(@name.soundex == @name.soundex).count
308
+ assert_equal 9, User.where(@name.soundex.eq(@name.soundex)).count
309
+ assert_equal 9 , User.where(@name.soundex == @name.soundex).count
300
310
  end
301
311
 
302
312
  def test_change_case
@@ -375,13 +385,13 @@ module ArelExtensions
375
385
  assert_equal 2, User.where(@age <= 10).count
376
386
  assert_equal 3, User.where(@age > 20).count
377
387
  assert_equal 4, User.where(@age >= 20).count
378
- assert_equal 1, User.where(@age > 5).where(@age < 20).count
388
+ assert_equal 2, User.where(@age > 5).where(@age < 20).count
379
389
  end
380
390
 
381
391
  def test_date_comparator
382
392
  d = Date.new(2016, 5, 23)
383
393
  assert_equal 0, User.where(@created_at < d).count
384
- assert_equal 8, User.where(@created_at >= d).count
394
+ assert_equal 9, User.where(@created_at >= d).count
385
395
  end
386
396
 
387
397
  def test_date_duration
@@ -390,10 +400,10 @@ module ArelExtensions
390
400
  assert_equal 0, User.where(@created_at.year.eq("2012")).count
391
401
  #Month
392
402
  assert_equal 5, t(@camille, @created_at.month).to_i
393
- assert_equal 8, User.where(@created_at.month.eq("05")).count
403
+ assert_equal 9, User.where(@created_at.month.eq("05")).count
394
404
  #Week
395
405
  assert_equal(@env_db == 'mssql' ? 22 : 21, t(@arthur, @created_at.week).to_i)
396
- assert_equal 8, User.where(@created_at.month.eq("05")).count
406
+ assert_equal 9, User.where(@created_at.month.eq("05")).count
397
407
  #Day
398
408
  assert_equal 23, t(@laure, @created_at.day).to_i
399
409
  assert_equal 0, User.where(@created_at.day.eq("05")).count
@@ -425,6 +435,7 @@ module ArelExtensions
425
435
  end
426
436
  end
427
437
 
438
+
428
439
  skip "not yet implemented" if $sqlite
429
440
 
430
441
  date1 = Date.new(2016, 5, 23)
@@ -526,7 +537,7 @@ module ArelExtensions
526
537
  def test_math_minus
527
538
  d = Date.new(2016, 5, 20)
528
539
  #Datediff
529
- assert_equal 8, User.where((@created_at - @created_at).eq(0)).count
540
+ assert_equal 9, User.where((@created_at - @created_at).eq(0)).count
530
541
  assert_equal 3, @laure.select((@created_at - d).as("res")).first.res.abs.to_i
531
542
  #Substraction
532
543
  assert_equal 0, User.where((@age - 10).eq(50)).count
@@ -644,8 +655,8 @@ module ArelExtensions
644
655
  end
645
656
 
646
657
  def test_subquery_with_order
647
- assert_equal 8, User.where(:name => User.select(:name).order(:name)).count
648
- assert_equal 8, User.where(@ut[:name].in(@ut.project(@ut[:name]).order(@ut[:name]))).count
658
+ assert_equal 9, User.where(:name => User.select(:name).order(:name)).count
659
+ assert_equal 9, User.where(@ut[:name].in(@ut.project(@ut[:name]).order(@ut[:name]))).count
649
660
  if !['mysql'].include?(@env_db) # MySql can't have limit in IN subquery
650
661
  assert_equal 2, User.where(:name => User.select(:name).order(:name).limit(2)).count
651
662
  #assert_equal 6, User.where(:name => User.select(:name).order(:name).offset(2)).count
@@ -727,16 +738,16 @@ module ArelExtensions
727
738
  def test_stat_functions
728
739
  skip "SQLite doesn't work for most on this functions" if $sqlite
729
740
  #puts t(User.where(nil), @score.average)
730
- #puts t(User.where(nil), @score.variance(true))
731
- #puts t(User.where(nil), @score.variance(false))
732
- #puts t(User.where(nil), @score.std(true))
733
- #puts t(User.where(nil), @score.std(false))
734
-
735
- assert ( 15.98625 - t(User.where(nil), @score.average)).abs < 0.01
736
- assert (613.75488 - t(User.where(nil), @score.variance)).abs < 0.01
737
- assert ( 537.0355 - t(User.where(nil), @score.variance(unbiased: false))).abs < 0.01
738
- assert ( 24.77408 - t(User.where(nil), @score.std)).abs < 0.01
739
- assert ( 23.17403 - t(User.where(nil), @score.std(unbiased: false))).abs < 0.01
741
+ #puts t(User.where(nil), @score.variance(unbiased: true))
742
+ #puts t(User.where(nil), @score.variance(unbiased: false))
743
+ #puts t(User.where(nil), @score.std(unbiased: true))
744
+ #puts t(User.where(nil), @score.std(unbiased: false))
745
+
746
+ assert ( 15.43222 - t(User.where(nil), @score.average)).abs < 0.01
747
+ assert (539.79804 - t(User.where(nil), @score.variance)).abs < 0.01
748
+ assert (479.82048 - t(User.where(nil), @score.variance(unbiased: false))).abs < 0.01
749
+ assert ( 23.23355 - t(User.where(nil), @score.std)).abs < 0.01
750
+ assert ( 21.90480 - t(User.where(nil), @score.std(unbiased: false))).abs < 0.01
740
751
  skip "Not Yet Implemented" if !['postgresql'].include?(@env_db)
741
752
  assert_equal 2, User.select(@score.std(group: Arel.when(@name > "M").then(0).else(1)).as('res')).map(&:res).uniq.length
742
753
  assert_equal 2, User.select(@score.variance(group: Arel.when(@name > "M").then(0).else(1)).as('res')).map(&:res).uniq.length
@@ -798,7 +809,7 @@ module ArelExtensions
798
809
  end
799
810
 
800
811
  def test_exists_in_subquery
801
- assert User.where(User.where(nil).exists).first
812
+ assert User.where(User.where(nil).arel.exists).first
802
813
  end
803
814
 
804
815
 
@@ -45,4 +45,4 @@ module ArelExtensions
45
45
  end
46
46
 
47
47
  end
48
- end
48
+ end
@@ -61,4 +61,4 @@ module ArelExtensions
61
61
  end
62
62
 
63
63
  end
64
- end
64
+ end
@@ -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
@@ -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
data/version_v1.rb ADDED
@@ -0,0 +1,3 @@
1
+ module ArelExtensions
2
+ VERSION = "1.2.8".freeze
3
+ end
data/version_v2.rb ADDED
@@ -0,0 +1,3 @@
1
+ module ArelExtensions
2
+ VERSION = "2.0.4".freeze
3
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arel_extensions
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.5
4
+ version: 1.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yann Azoury
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2019-11-06 00:00:00.000000000 Z
13
+ date: 2020-04-22 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: arel
@@ -60,14 +60,14 @@ dependencies:
60
60
  requirements:
61
61
  - - "~>"
62
62
  - !ruby/object:Gem::Version
63
- version: '11'
63
+ version: 12.3.3
64
64
  type: :development
65
65
  prerelease: false
66
66
  version_requirements: !ruby/object:Gem::Requirement
67
67
  requirements:
68
68
  - - "~>"
69
69
  - !ruby/object:Gem::Version
70
- version: '11'
70
+ version: 12.3.3
71
71
  description: Adds new features to Arel
72
72
  email:
73
73
  - yann.azoury@faveod.com
@@ -104,6 +104,9 @@ files:
104
104
  - gemfiles/rails5_0.gemfile
105
105
  - gemfiles/rails5_1_4.gemfile
106
106
  - gemfiles/rails5_2.gemfile
107
+ - gemfiles/rails6.gemfile
108
+ - gemspec_v2/arel_extensions-v2.gemspec
109
+ - generate_gems.sh
107
110
  - init/mssql.sql
108
111
  - init/mysql.sql
109
112
  - init/oracle.sql
@@ -192,6 +195,8 @@ files:
192
195
  - test/with_ar/test_math_sqlite.rb
193
196
  - test/with_ar/test_string_mysql.rb
194
197
  - test/with_ar/test_string_sqlite.rb
198
+ - version_v1.rb
199
+ - version_v2.rb
195
200
  homepage: https://github.com/Faveod/arel-extensions
196
201
  licenses:
197
202
  - MIT