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.
- checksums.yaml +4 -4
- data/.rubocop.yml +7 -4
- data/README.md +7 -2
- data/Rakefile +23 -23
- data/arel_extensions.gemspec +1 -1
- data/functions.html +2 -2
- data/gemfiles/rails6.gemfile +30 -0
- data/gemspec_v2/arel_extensions-v2.gemspec +28 -0
- data/generate_gems.sh +13 -0
- data/lib/arel_extensions.rb +4 -1
- data/lib/arel_extensions/boolean_functions.rb +0 -2
- data/lib/arel_extensions/common_sql_functions.rb +5 -4
- data/lib/arel_extensions/insert_manager.rb +24 -24
- data/lib/arel_extensions/math.rb +3 -3
- data/lib/arel_extensions/math_functions.rb +4 -4
- data/lib/arel_extensions/nodes/case.rb +0 -2
- data/lib/arel_extensions/nodes/collate.rb +1 -1
- data/lib/arel_extensions/nodes/date_diff.rb +1 -3
- data/lib/arel_extensions/nodes/duration.rb +0 -2
- data/lib/arel_extensions/nodes/formatted_number.rb +20 -20
- data/lib/arel_extensions/nodes/json.rb +28 -30
- data/lib/arel_extensions/nodes/power.rb +5 -4
- data/lib/arel_extensions/nodes/replace.rb +23 -5
- data/lib/arel_extensions/nodes/round.rb +5 -5
- data/lib/arel_extensions/nodes/soundex.rb +14 -13
- data/lib/arel_extensions/nodes/substring.rb +8 -15
- data/lib/arel_extensions/nodes/trim.rb +1 -1
- data/lib/arel_extensions/nodes/union.rb +0 -1
- data/lib/arel_extensions/nodes/union_all.rb +0 -1
- data/lib/arel_extensions/predications.rb +16 -17
- data/lib/arel_extensions/string_functions.rb +12 -6
- data/lib/arel_extensions/tasks.rb +5 -5
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/mssql.rb +13 -12
- data/lib/arel_extensions/visitors/mysql.rb +50 -35
- data/lib/arel_extensions/visitors/oracle.rb +7 -6
- data/lib/arel_extensions/visitors/oracle12.rb +1 -1
- data/lib/arel_extensions/visitors/postgresql.rb +45 -27
- data/lib/arel_extensions/visitors/sqlite.rb +41 -27
- data/lib/arel_extensions/visitors/to_sql.rb +18 -5
- data/test/visitors/test_bulk_insert_oracle.rb +6 -6
- data/test/visitors/test_bulk_insert_sqlite.rb +5 -5
- data/test/visitors/test_to_sql.rb +10 -2
- data/test/with_ar/all_agnostic_test.rb +44 -33
- data/test/with_ar/test_bulk_sqlite.rb +1 -1
- data/test/with_ar/test_math_sqlite.rb +1 -1
- data/test/with_ar/test_string_mysql.rb +1 -3
- data/test/with_ar/test_string_sqlite.rb +1 -5
- data/version_v1.rb +3 -0
- data/version_v2.rb +3 -0
- 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"
|
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
|
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
|
151
|
-
assert_equal
|
152
|
-
assert_equal
|
153
|
-
assert_equal
|
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
|
156
|
-
assert_equal
|
157
|
-
assert_equal
|
158
|
-
assert_equal
|
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
|
275
|
+
assert_equal 7, User.where(@name !~ '^L').count
|
272
276
|
assert_equal 1, User.where(@name =~ /^M/).count
|
273
|
-
assert_equal
|
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
|
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
|
299
|
-
assert_equal
|
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
|
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
|
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
|
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
|
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
|
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
|
648
|
-
assert_equal
|
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.
|
736
|
-
assert (
|
737
|
-
assert (
|
738
|
-
assert (
|
739
|
-
assert (
|
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
|
|
@@ -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
data/version_v2.rb
ADDED
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.
|
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:
|
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:
|
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:
|
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
|