arel_extensions 2.0.21 → 2.2.2
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/.codeclimate.yml +1 -2
- data/.github/workflows/publish.yml +29 -0
- data/.github/workflows/release.yml +30 -0
- data/.github/workflows/ruby.yml +377 -80
- data/.gitignore +7 -6
- data/.rubocop.yml +62 -1
- data/CONTRIBUTING.md +102 -0
- data/Gemfile +2 -23
- data/NEWS.md +89 -0
- data/README.md +228 -84
- data/Rakefile +11 -4
- data/TODO +0 -1
- data/appveyor.yml +60 -22
- data/arel_extensions.gemspec +11 -12
- data/bin/build +15 -0
- data/bin/compose +6 -0
- data/bin/publish +8 -0
- data/dev/arelx.dockerfile +44 -0
- data/dev/compose.yaml +71 -0
- data/dev/postgres.dockerfile +5 -0
- data/dev/rbenv +189 -0
- data/gemfiles/rails3.gemfile +10 -10
- data/gemfiles/rails4_2.gemfile +38 -0
- data/gemfiles/rails5.gemfile +29 -0
- data/gemfiles/rails5_1_4.gemfile +13 -13
- data/gemfiles/rails5_2.gemfile +16 -14
- data/gemfiles/rails6.gemfile +18 -15
- data/gemfiles/rails6_1.gemfile +18 -15
- data/gemfiles/rails7.gemfile +33 -0
- data/gemfiles/rails7_1.gemfile +33 -0
- data/gemfiles/rails7_2.gemfile +33 -0
- data/gemspecs/arel_extensions-v1.gemspec +12 -13
- data/gemspecs/arel_extensions-v2.gemspec +11 -12
- data/init/mssql.sql +0 -0
- data/init/mysql.sql +0 -0
- data/init/oracle.sql +0 -0
- data/init/postgresql.sql +0 -0
- data/init/sqlite.sql +0 -0
- data/lib/arel_extensions/aliases.rb +14 -0
- data/lib/arel_extensions/attributes.rb +10 -2
- data/lib/arel_extensions/boolean_functions.rb +2 -4
- data/lib/arel_extensions/common_sql_functions.rb +12 -12
- data/lib/arel_extensions/comparators.rb +14 -14
- data/lib/arel_extensions/date_duration.rb +14 -9
- data/lib/arel_extensions/helpers.rb +62 -0
- data/lib/arel_extensions/insert_manager.rb +19 -17
- data/lib/arel_extensions/math.rb +48 -45
- data/lib/arel_extensions/math_functions.rb +18 -18
- data/lib/arel_extensions/nodes/abs.rb +0 -0
- data/lib/arel_extensions/nodes/aggregate_function.rb +0 -0
- data/lib/arel_extensions/nodes/blank.rb +1 -1
- data/lib/arel_extensions/nodes/case.rb +10 -12
- data/lib/arel_extensions/nodes/cast.rb +6 -6
- data/lib/arel_extensions/nodes/ceil.rb +0 -0
- data/lib/arel_extensions/nodes/change_case.rb +0 -0
- data/lib/arel_extensions/nodes/coalesce.rb +1 -1
- data/lib/arel_extensions/nodes/collate.rb +9 -9
- data/lib/arel_extensions/nodes/concat.rb +2 -2
- data/lib/arel_extensions/nodes/date_diff.rb +33 -14
- data/lib/arel_extensions/nodes/duration.rb +0 -0
- data/lib/arel_extensions/nodes/find_in_set.rb +0 -0
- data/lib/arel_extensions/nodes/floor.rb +0 -0
- data/lib/arel_extensions/nodes/format.rb +3 -2
- data/lib/arel_extensions/nodes/formatted_date.rb +42 -0
- data/lib/arel_extensions/nodes/formatted_number.rb +2 -2
- data/lib/arel_extensions/nodes/function.rb +22 -26
- data/lib/arel_extensions/nodes/is_null.rb +0 -0
- data/lib/arel_extensions/nodes/json.rb +15 -9
- data/lib/arel_extensions/nodes/length.rb +6 -0
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
- data/lib/arel_extensions/nodes/locate.rb +1 -1
- data/lib/arel_extensions/nodes/log10.rb +0 -0
- data/lib/arel_extensions/nodes/matches.rb +1 -1
- data/lib/arel_extensions/nodes/md5.rb +0 -0
- data/lib/arel_extensions/nodes/power.rb +0 -0
- data/lib/arel_extensions/nodes/rand.rb +0 -0
- data/lib/arel_extensions/nodes/repeat.rb +2 -2
- data/lib/arel_extensions/nodes/replace.rb +2 -10
- data/lib/arel_extensions/nodes/rollup.rb +36 -0
- data/lib/arel_extensions/nodes/round.rb +0 -0
- data/lib/arel_extensions/nodes/select.rb +10 -0
- data/lib/arel_extensions/nodes/soundex.rb +2 -2
- data/lib/arel_extensions/nodes/std.rb +0 -0
- data/lib/arel_extensions/nodes/substring.rb +1 -1
- data/lib/arel_extensions/nodes/sum.rb +0 -0
- data/lib/arel_extensions/nodes/then.rb +1 -1
- data/lib/arel_extensions/nodes/trim.rb +2 -2
- data/lib/arel_extensions/nodes/union.rb +5 -5
- data/lib/arel_extensions/nodes/union_all.rb +4 -4
- data/lib/arel_extensions/nodes/wday.rb +0 -0
- data/lib/arel_extensions/nodes.rb +0 -0
- data/lib/arel_extensions/null_functions.rb +16 -0
- data/lib/arel_extensions/predications.rb +10 -10
- data/lib/arel_extensions/railtie.rb +1 -1
- data/lib/arel_extensions/set_functions.rb +3 -3
- data/lib/arel_extensions/string_functions.rb +19 -10
- data/lib/arel_extensions/tasks.rb +2 -2
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/convert_format.rb +0 -0
- data/lib/arel_extensions/visitors/ibm_db.rb +20 -20
- data/lib/arel_extensions/visitors/mssql.rb +394 -169
- data/lib/arel_extensions/visitors/mysql.rb +238 -151
- data/lib/arel_extensions/visitors/oracle.rb +170 -131
- data/lib/arel_extensions/visitors/oracle12.rb +16 -16
- data/lib/arel_extensions/visitors/postgresql.rb +170 -140
- data/lib/arel_extensions/visitors/sqlite.rb +88 -87
- data/lib/arel_extensions/visitors/to_sql.rb +185 -156
- data/lib/arel_extensions/visitors.rb +73 -60
- data/lib/arel_extensions.rb +173 -36
- data/test/arelx_test_helper.rb +49 -1
- data/test/database.yml +13 -7
- data/test/real_db_test.rb +101 -83
- data/test/support/fake_record.rb +8 -2
- data/test/test_comparators.rb +5 -5
- data/test/visitors/test_bulk_insert_oracle.rb +5 -5
- data/test/visitors/test_bulk_insert_sqlite.rb +5 -5
- data/test/visitors/test_bulk_insert_to_sql.rb +5 -5
- data/test/visitors/test_oracle.rb +14 -14
- data/test/visitors/test_to_sql.rb +121 -93
- data/test/with_ar/all_agnostic_test.rb +630 -320
- data/test/with_ar/insert_agnostic_test.rb +25 -18
- data/test/with_ar/test_bulk_sqlite.rb +11 -7
- data/test/with_ar/test_math_sqlite.rb +18 -14
- data/test/with_ar/test_string_mysql.rb +26 -22
- data/test/with_ar/test_string_sqlite.rb +26 -22
- data/version_v1.rb +1 -1
- data/version_v2.rb +1 -1
- metadata +24 -26
- data/.travis/oracle/download.js +0 -152
- data/.travis/oracle/download.sh +0 -30
- data/.travis/oracle/download_ojdbc.js +0 -116
- data/.travis/oracle/install.sh +0 -34
- data/.travis/setup_accounts.sh +0 -9
- data/.travis/sqlite3/extension-functions.sh +0 -6
- data/.travis.yml +0 -193
- data/gemfiles/rails4.gemfile +0 -29
- data/gemfiles/rails5_0.gemfile +0 -29
data/test/real_db_test.rb
CHANGED
@@ -8,16 +8,20 @@ require 'arel_extensions'
|
|
8
8
|
def setup_db
|
9
9
|
ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
|
10
10
|
ActiveRecord::Base.establish_connection(ENV['DB'].try(:to_sym) || (RUBY_PLATFORM == 'java' ? :"jdbc-sqlite" : :sqlite))
|
11
|
-
ActiveRecord::
|
11
|
+
if ActiveRecord::VERSION::MAJOR >= 7
|
12
|
+
ActiveRecord.default_timezone = :utc
|
13
|
+
else
|
14
|
+
ActiveRecord::Base.default_timezone = :utc
|
15
|
+
end
|
12
16
|
@cnx = ActiveRecord::Base.connection
|
13
|
-
if ActiveRecord::Base.connection.adapter_name
|
17
|
+
if /sqlite/i.match?(ActiveRecord::Base.connection.adapter_name)
|
14
18
|
$sqlite = true
|
15
19
|
db = @cnx.raw_connection
|
16
20
|
if !$load_extension_disabled
|
17
21
|
begin
|
18
22
|
db.enable_load_extension(1)
|
19
|
-
db.load_extension(
|
20
|
-
db.load_extension(
|
23
|
+
db.load_extension('/usr/lib/sqlite3/pcre.so')
|
24
|
+
db.load_extension('/usr/lib/sqlite3/extension-functions.so')
|
21
25
|
db.enable_load_extension(0)
|
22
26
|
rescue => e
|
23
27
|
$load_extension_disabled = true
|
@@ -25,17 +29,18 @@ def setup_db
|
|
25
29
|
end
|
26
30
|
end
|
27
31
|
# function find_in_set
|
28
|
-
db.create_function(
|
32
|
+
db.create_function('find_in_set', 1) do |func, value1, value2|
|
29
33
|
func.result = value1.index(value2)
|
30
34
|
end
|
31
35
|
end
|
32
36
|
@cnx.drop_table(:users) rescue nil
|
33
37
|
@cnx.create_table :users do |t|
|
34
|
-
|
38
|
+
t.column :age, :integer
|
35
39
|
t.column :name, :string
|
36
40
|
t.column :created_at, :date
|
37
41
|
t.column :updated_at, :date
|
38
42
|
t.column :score, :decimal
|
43
|
+
t.column :updated_at, :datetime
|
39
44
|
end
|
40
45
|
end
|
41
46
|
|
@@ -48,17 +53,18 @@ end
|
|
48
53
|
|
49
54
|
class ListTest < Minitest::Test
|
50
55
|
def setup
|
51
|
-
d = Date.new(2016,05,23)
|
56
|
+
d = Date.new(2016, 05, 23)
|
57
|
+
dt = Time.new(2016, 05, 23, 12, 34, 56)
|
52
58
|
setup_db
|
53
|
-
User.create :
|
54
|
-
User.create :
|
55
|
-
User.create :
|
56
|
-
User.create :
|
57
|
-
u = User.create :
|
58
|
-
@myung = User.where(:
|
59
|
-
User.create :
|
60
|
-
User.create :
|
61
|
-
User.create :
|
59
|
+
User.create age: 5, name: 'Lucas', created_at: d, score: 20.16
|
60
|
+
User.create age: 15, name: 'Sophie', created_at: d, score: 20.16
|
61
|
+
User.create age: 20, name: 'Camille', created_at: d, score: 20.16
|
62
|
+
User.create age: 21, name: 'Arthur', created_at: d, score: 65.62, updated_at: dt
|
63
|
+
u = User.create age: 23, name: 'Myung', created_at: d, score: 20.16
|
64
|
+
@myung = User.where(id: u.id)
|
65
|
+
User.create age: 25, name: 'Laure', created_at: d, score: 20.16
|
66
|
+
User.create age: nil, name: 'Test', created_at: d, score: 1.62
|
67
|
+
User.create age: -0, name: 'Negatif', created_at: d, score: 0.17
|
62
68
|
end
|
63
69
|
|
64
70
|
def teardown
|
@@ -66,83 +72,95 @@ class ListTest < Minitest::Test
|
|
66
72
|
end
|
67
73
|
|
68
74
|
def test_abs
|
69
|
-
assert_equal 0,User.where(User.arel_table[:name].eq(
|
70
|
-
assert_equal 14,User.where(User.arel_table[:name].eq(
|
75
|
+
assert_equal 0, User.where(User.arel_table[:name].eq('Negatif')).select((User.arel_table[:age].abs).as('res')).first.res
|
76
|
+
assert_equal 14, User.where(User.arel_table[:name].eq('Laure')).select(((User.arel_table[:age] - 39).abs).as('res')).first.res
|
71
77
|
end
|
72
78
|
|
73
79
|
def test_ceil
|
74
80
|
if !$sqlite || !$load_extension_disabled
|
75
|
-
assert_equal 1,User.where(User.arel_table[:name].eq(
|
76
|
-
assert_equal 66,User.where(User.arel_table[:name].eq(
|
81
|
+
assert_equal 1, User.where(User.arel_table[:name].eq('Negatif')).select((User.arel_table[:score].ceil).as('res')).first.res
|
82
|
+
assert_equal 66, User.where(User.arel_table[:name].eq('Arthur')).select((User.arel_table[:score].ceil).as('res')).first.res
|
77
83
|
end
|
78
84
|
end
|
79
85
|
|
80
86
|
def test_coalesce
|
81
|
-
if @cnx.adapter_name
|
82
|
-
|
83
|
-
assert_equal
|
87
|
+
if /pgsql/i.match?(@cnx.adapter_name)
|
88
|
+
assert_equal 100, User.where(User.arel_table[:name].eq('Test')).select((User.arel_table[:age].coalesce(100)).as('res')).first.res
|
89
|
+
assert_equal 'Camille', User.where(User.arel_table[:name].eq('Camille')).select((User.arel_table[:name].coalesce('Null', 'default')).as('res')).first.res
|
84
90
|
else
|
85
|
-
assert_equal
|
86
|
-
assert_equal 20,User.where(User.arel_table[:name].eq(
|
91
|
+
assert_equal 'Camille', User.where(User.arel_table[:name].eq('Camille')).select((User.arel_table[:name].coalesce('Null', 20)).as('res')).first.res
|
92
|
+
assert_equal 20, User.where(User.arel_table[:name].eq('Test')).select((User.arel_table[:age].coalesce(nil, 20)).as('res')).first.res
|
87
93
|
end
|
88
94
|
end
|
89
95
|
|
90
|
-
def
|
91
|
-
assert_equal 2,User.where(User.arel_table[:age] < 6).count
|
92
|
-
assert_equal 2,User.where(User.arel_table[:age] <=10).count
|
93
|
-
assert_equal 3,User.where(User.arel_table[:age] > 20).count
|
94
|
-
assert_equal 4,User.where(User.arel_table[:age] >=20).count
|
95
|
-
assert_equal 1,User.where(User.arel_table[:age] > 5).where(User.arel_table[:age] < 20).count
|
96
|
+
def test_comparator
|
97
|
+
assert_equal 2, User.where(User.arel_table[:age] < 6).count
|
98
|
+
assert_equal 2, User.where(User.arel_table[:age] <= 10).count
|
99
|
+
assert_equal 3, User.where(User.arel_table[:age] > 20).count
|
100
|
+
assert_equal 4, User.where(User.arel_table[:age] >= 20).count
|
101
|
+
assert_equal 1, User.where(User.arel_table[:age] > 5).where(User.arel_table[:age] < 20).count
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_date_date_comparator
|
105
|
+
d = Date.new(2016, 05, 24) #after created_at in db
|
106
|
+
assert_equal 8, User.where(User.arel_table[:age] < d).count
|
107
|
+
assert_equal 0, User.where(User.arel_table[:age] > d).count
|
108
|
+
assert_equal 0, User.where(User.arel_table[:age] == d).count
|
109
|
+
d = Date.new(2016, 05, 23)
|
110
|
+
assert_equal 8, User.where(User.arel_table[:age] == d).count
|
111
|
+
dt = Time.new(2016, 05, 23, 12, 35, 00) #after updated_at in db
|
112
|
+
assert_equal 1, User.where(User.arel_table[:update_at] < dt).count
|
113
|
+
assert_equal 0, User.where(User.arel_table[:update_at] > dt).count
|
96
114
|
end
|
97
115
|
|
98
116
|
def test_date_duration
|
99
117
|
# Year
|
100
|
-
assert_equal 2016,User.where(User.arel_table[:name].eq(
|
101
|
-
assert_equal 0,User.where(User.arel_table[:created_at].year.eq(
|
118
|
+
assert_equal 2016, User.where(User.arel_table[:name].eq('Lucas')).select((User.arel_table[:created_at].year).as('res')).first.res.to_i
|
119
|
+
assert_equal 0, User.where(User.arel_table[:created_at].year.eq('2012')).count
|
102
120
|
# Month
|
103
|
-
assert_equal 5,User.where(User.arel_table[:name].eq(
|
104
|
-
assert_equal 8,User.where(User.arel_table[:created_at].month.eq(
|
121
|
+
assert_equal 5, User.where(User.arel_table[:name].eq('Camille')).select((User.arel_table[:created_at].month).as('res')).first.res.to_i
|
122
|
+
assert_equal 8, User.where(User.arel_table[:created_at].month.eq('05')).count
|
105
123
|
# Week
|
106
|
-
assert_equal 21,User.where(User.arel_table[:name].eq(
|
107
|
-
assert_equal 8,User.where(User.arel_table[:created_at].month.eq(
|
124
|
+
assert_equal 21, User.where(User.arel_table[:name].eq('Arthur')).select((User.arel_table[:created_at].week).as('res')).first.res.to_i
|
125
|
+
assert_equal 8, User.where(User.arel_table[:created_at].month.eq('05')).count
|
108
126
|
# Day
|
109
|
-
assert_equal 23,User.where(User.arel_table[:name].eq(
|
110
|
-
assert_equal 0,User.where(User.arel_table[:created_at].day.eq(
|
127
|
+
assert_equal 23, User.where(User.arel_table[:name].eq('Laure')).select((User.arel_table[:created_at].day).as('res')).first.res.to_i
|
128
|
+
assert_equal 0, User.where(User.arel_table[:created_at].day.eq('05')).count
|
111
129
|
end
|
112
130
|
|
113
131
|
def test_length
|
114
|
-
assert_equal 7,User.where(User.arel_table[:name].eq(
|
115
|
-
assert_equal 5,User.where(User.arel_table[:name].eq(
|
132
|
+
assert_equal 7, User.where(User.arel_table[:name].eq('Camille')).select((User.arel_table[:name].length).as('res')).first.res
|
133
|
+
assert_equal 5, User.where(User.arel_table[:name].eq('Laure')).select((User.arel_table[:name].length).as('res')).first.res
|
116
134
|
end
|
117
135
|
|
118
136
|
def test_locate
|
119
137
|
if !$sqlite || !$load_extension_disabled
|
120
|
-
assert_equal 1, User.where(User.arel_table[:name].eq(
|
121
|
-
assert_equal 0, User.where(User.arel_table[:name].eq(
|
122
|
-
assert_equal 5, User.where(User.arel_table[:name].eq(
|
138
|
+
assert_equal 1, User.where(User.arel_table[:name].eq('Camille')).select((User.arel_table[:name].locate('C')).as('res')).first.res
|
139
|
+
assert_equal 0, User.where(User.arel_table[:name].eq('Lucas')).select((User.arel_table[:name].locate('z')).as('res')).first.res
|
140
|
+
assert_equal 5, User.where(User.arel_table[:name].eq('Lucas')).select((User.arel_table[:name].locate('s')).as('res')).first.res
|
123
141
|
end
|
124
142
|
end
|
125
143
|
|
126
144
|
def test_isnull
|
127
|
-
if ActiveRecord::Base.connection.adapter_name
|
128
|
-
assert_equal 100,User.where(User.arel_table[:name].eq(
|
145
|
+
if /pgsql/i.match?(ActiveRecord::Base.connection.adapter_name)
|
146
|
+
assert_equal 100, User.where(User.arel_table[:name].eq('Test')).select((User.arel_table[:age].isnull(100)).as('res')).first.res
|
129
147
|
else
|
130
|
-
assert_equal
|
131
|
-
assert_equal
|
148
|
+
assert_equal 'default', User.where(User.arel_table[:name].eq('Test')).select((User.arel_table[:age].isnull('default')).as('res')).first.res
|
149
|
+
assert_equal 'Test', User.where((User.arel_table[:age].isnull('default')).eq('default')).select(User.arel_table[:name]).first.name.to_s
|
132
150
|
end
|
133
151
|
end
|
134
152
|
|
135
153
|
def test_floor
|
136
154
|
if !$sqlite || !$load_extension_disabled
|
137
|
-
assert_equal 0,User.where(User.arel_table[:name].eq(
|
138
|
-
assert_equal 65,User.where(User.arel_table[:name].eq(
|
155
|
+
assert_equal 0, User.where(User.arel_table[:name].eq('Negatif')).select((User.arel_table[:score].floor).as('res')).first.res
|
156
|
+
assert_equal 65, User.where(User.arel_table[:name].eq('Arthur')).select((User.arel_table[:score].floor).as('res')).first.res
|
139
157
|
end
|
140
158
|
end
|
141
159
|
|
142
160
|
def test_findinset
|
143
161
|
db = ActiveRecord::Base.connection.raw_connection
|
144
|
-
assert_equal 3,db.get_first_value("select find_in_set(name,'i') from users where name = 'Camille'")
|
145
|
-
assert_equal
|
162
|
+
assert_equal 3, db.get_first_value("select find_in_set(name,'i') from users where name = 'Camille'")
|
163
|
+
assert_equal '', db.get_first_value("select find_in_set(name,'p') from users where name = 'Camille'").to_s
|
146
164
|
# number
|
147
165
|
# assert_equal 1,User.select(User.arel_table[:name] & ("l")).count
|
148
166
|
# assert_equal 3,(User.select(User.arel_table[:age] & [5,15,20]))
|
@@ -150,38 +168,38 @@ class ListTest < Minitest::Test
|
|
150
168
|
end
|
151
169
|
|
152
170
|
def test_math_plus
|
153
|
-
d = Date.new(1997,06,15)
|
171
|
+
d = Date.new(1997, 06, 15)
|
154
172
|
# Concat String
|
155
|
-
assert_equal
|
156
|
-
assert_equal
|
157
|
-
assert_equal
|
158
|
-
assert_equal
|
159
|
-
assert_equal
|
160
|
-
assert_equal
|
173
|
+
assert_equal 'SophiePhan', User.where(User.arel_table[:name].eq('Sophie')).select((User.arel_table[:name] + 'Phan').as('res')).first.res
|
174
|
+
assert_equal 'Sophie2', User.where(User.arel_table[:name].eq('Sophie')).select((User.arel_table[:name] + 2).as('res')).first.res
|
175
|
+
assert_equal 'Sophie1997-06-15', User.where(User.arel_table[:name].eq('Sophie')).select((User.arel_table[:name] + d).as('res')).first.res
|
176
|
+
assert_equal 'Sophie15', User.where(User.arel_table[:name].eq('Sophie')).select((User.arel_table[:name] + User.arel_table[:age]).as('res')).first.res
|
177
|
+
assert_equal 'SophieSophie', User.where(User.arel_table[:name].eq('Sophie')).select((User.arel_table[:name] + User.arel_table[:name]).as('res')).first.res
|
178
|
+
assert_equal 'Sophie2016-05-23', User.where(User.arel_table[:name].eq('Sophie')).select((User.arel_table[:name] + User.arel_table[:created_at]).as('res')).first.res
|
161
179
|
# concat Integer
|
162
180
|
assert_equal 1, User.where((User.arel_table[:age] + 10).eq(33)).count
|
163
|
-
assert_equal 1, User.where((User.arel_table[:age] +
|
181
|
+
assert_equal 1, User.where((User.arel_table[:age] + '1').eq(6)).count
|
164
182
|
assert_equal 1, User.where((User.arel_table[:age] + User.arel_table[:age]).eq(10)).count
|
165
183
|
# concat Date
|
166
184
|
# puts((User.arel_table[:created_at] + 1).as("res").to_sql.inspect)
|
167
|
-
assert_equal
|
168
|
-
assert_equal
|
185
|
+
assert_equal '2016-05-24', @myung.select((User.arel_table[:created_at] + 1).as('res')).first.res.to_date.to_s
|
186
|
+
assert_equal '2016-05-25', @myung.select((User.arel_table[:created_at] + 2.day).as('res')).first.res.to_date.to_s
|
169
187
|
end
|
170
188
|
|
171
189
|
def test_math_moins
|
172
|
-
d = Date.new(2016,05,20)
|
190
|
+
d = Date.new(2016, 05, 20)
|
173
191
|
# Datediff
|
174
|
-
assert_equal 8,User.where((User.arel_table[:created_at] - User.arel_table[:created_at]).eq(0)).count
|
175
|
-
assert_equal 3,User.where(User.arel_table[:name].eq(
|
192
|
+
assert_equal 8, User.where((User.arel_table[:created_at] - User.arel_table[:created_at]).eq(0)).count
|
193
|
+
assert_equal 3, User.where(User.arel_table[:name].eq('Laure')).select((User.arel_table[:created_at] - d).as('res')).first.res.abs.to_i
|
176
194
|
# Substraction
|
177
195
|
assert_equal 0, User.where((User.arel_table[:age] - 10).eq(50)).count
|
178
|
-
assert_equal 0, User.where((User.arel_table[:age] -
|
196
|
+
assert_equal 0, User.where((User.arel_table[:age] - '10').eq(50)).count
|
179
197
|
end
|
180
198
|
|
181
199
|
def test_rand
|
182
|
-
assert_equal 5,User.where(User.arel_table[:score].eq(20.16)).select(User.arel_table[:id]).order(Arel.rand).take(50).count
|
200
|
+
assert_equal 5, User.where(User.arel_table[:score].eq(20.16)).select(User.arel_table[:id]).order(Arel.rand).take(50).count
|
183
201
|
# test_alias :random :rand
|
184
|
-
assert_equal 8,User.select(User.arel_table[:name]).order(Arel.rand).take(50).count
|
202
|
+
assert_equal 8, User.select(User.arel_table[:name]).order(Arel.rand).take(50).count
|
185
203
|
end
|
186
204
|
|
187
205
|
def test_regexp_not_regex
|
@@ -192,8 +210,8 @@ class ListTest < Minitest::Test
|
|
192
210
|
end
|
193
211
|
|
194
212
|
def test_replace
|
195
|
-
assert_equal
|
196
|
-
assert_equal
|
213
|
+
assert_equal 'LucaX', User.where(User.arel_table[:name].eq('Lucas')).select((User.arel_table[:name].replace('s', 'X')).as('res')).first.res
|
214
|
+
assert_equal 'replace', User.where(User.arel_table[:name].eq('Lucas')).select((User.arel_table[:name].replace(User.arel_table[:name], 'replace')).as('res')).first.res
|
197
215
|
end
|
198
216
|
|
199
217
|
def test_round
|
@@ -203,30 +221,30 @@ class ListTest < Minitest::Test
|
|
203
221
|
|
204
222
|
def test_Soundex
|
205
223
|
if !$sqlite || !$load_extension_disabled
|
206
|
-
assert_equal
|
207
|
-
assert_equal 8,User.where((User.arel_table[:name].soundex).eq(User.arel_table[:name].soundex)).count
|
224
|
+
assert_equal 'C540', User.where(User.arel_table[:name].eq('Camille')).select((User.arel_table[:name].soundex).as('res')).first.res.to_s
|
225
|
+
assert_equal 8, User.where((User.arel_table[:name].soundex).eq(User.arel_table[:name].soundex)).count
|
208
226
|
end
|
209
227
|
end
|
210
228
|
|
211
229
|
def test_Sum
|
212
230
|
# .take(50) because of limit by ORDER BY
|
213
|
-
assert_equal 110,User.select((User.arel_table[:age].sum + 1).as(
|
214
|
-
assert_equal 218,User.select((User.arel_table[:age].sum + User.arel_table[:age].sum).as(
|
215
|
-
assert_equal 327,User.select(((User.arel_table[:age] * 3).sum).as(
|
216
|
-
assert_equal 2245,User.select(((User.arel_table[:age] * User.arel_table[:age]).sum).as(
|
231
|
+
assert_equal 110, User.select((User.arel_table[:age].sum + 1).as('res')).take(50).first.res
|
232
|
+
assert_equal 218, User.select((User.arel_table[:age].sum + User.arel_table[:age].sum).as('res')).take(50).first.res
|
233
|
+
assert_equal 327, User.select(((User.arel_table[:age] * 3).sum).as('res')).take(50).first.res
|
234
|
+
assert_equal 2245, User.select(((User.arel_table[:age] * User.arel_table[:age]).sum).as('res')).take(50).first.res
|
217
235
|
end
|
218
236
|
|
219
237
|
def test_trim
|
220
|
-
assert_equal
|
221
|
-
assert_equal
|
222
|
-
assert_equal
|
223
|
-
assert_equal
|
238
|
+
assert_equal 'Myun', User.where(User.arel_table[:name].eq('Myung')).select(User.arel_table[:name].rtrim('g').as('res')).first.res
|
239
|
+
assert_equal 'yung', User.where(User.arel_table[:name].eq('Myung')).select(User.arel_table[:name].ltrim('M').as('res')).first.res
|
240
|
+
assert_equal 'yung', User.where(User.arel_table[:name].eq('Myung')).select((User.arel_table[:name] + 'M').trim('M').as('res')).first.res
|
241
|
+
assert_equal '', User.where(User.arel_table[:name].eq('Myung')).select(User.arel_table[:name].rtrim(User.arel_table[:name]).as('res')).first.res
|
224
242
|
|
225
243
|
end
|
226
244
|
|
227
245
|
def test_wday
|
228
|
-
|
229
|
-
assert_equal 1,User.where(User.arel_table[:name].eq(
|
230
|
-
assert_equal 0,User.select(d.wday).as(
|
246
|
+
d = Date.new(2016, 06, 26)
|
247
|
+
assert_equal 1, User.where(User.arel_table[:name].eq('Myung')).select((User.arel_table[:created_at].wday).as('res')).first.res.to_i
|
248
|
+
assert_equal 0, User.select(d.wday).as('res').first.to_i
|
231
249
|
end
|
232
250
|
end
|
data/test/support/fake_record.rb
CHANGED
@@ -66,7 +66,7 @@ module FakeRecord
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def in_clause_length
|
69
|
-
|
69
|
+
10_000
|
70
70
|
end
|
71
71
|
|
72
72
|
def quote thing, column = nil
|
@@ -105,7 +105,7 @@ module FakeRecord
|
|
105
105
|
attr_reader :spec, :connection
|
106
106
|
|
107
107
|
def initialize
|
108
|
-
@spec = Spec.new(:
|
108
|
+
@spec = Spec.new({adapter: 'america'})
|
109
109
|
@connection = Connection.new
|
110
110
|
@connection.visitor = Arel::Visitors::ToSql.new(connection)
|
111
111
|
end
|
@@ -145,5 +145,11 @@ module FakeRecord
|
|
145
145
|
def connection
|
146
146
|
connection_pool.connection
|
147
147
|
end
|
148
|
+
|
149
|
+
if ActiveRecord.version >= Gem::Version.create('7.2')
|
150
|
+
def with_connection(*args, **kwargs, &block)
|
151
|
+
connection_pool.with_connection(*args, **kwargs, &block)
|
152
|
+
end
|
153
|
+
end
|
148
154
|
end
|
149
155
|
end
|
data/test/test_comparators.rb
CHANGED
@@ -17,23 +17,23 @@ module ArelExtensions
|
|
17
17
|
@visitor.accept(node, Arel::Collectors::SQLString.new).value
|
18
18
|
end
|
19
19
|
|
20
|
-
it
|
20
|
+
it '< is equal lt' do
|
21
21
|
_(compile(@table[:id] < 10)).must_be_like('"users"."id" < 10')
|
22
22
|
end
|
23
23
|
|
24
|
-
it
|
24
|
+
it '<= is equal lteq' do
|
25
25
|
_(compile(@table[:id] <= 10)).must_be_like('"users"."id" <= 10')
|
26
26
|
end
|
27
27
|
|
28
|
-
it
|
28
|
+
it '> is equal gt' do
|
29
29
|
_(compile(@table[:id] > 10)).must_be_like('"users"."id" > 10')
|
30
30
|
end
|
31
31
|
|
32
|
-
it
|
32
|
+
it '< is equal gteq' do
|
33
33
|
_(compile(@table[:id] >= 10)).must_be_like('"users"."id" >= 10')
|
34
34
|
end
|
35
35
|
|
36
|
-
it
|
36
|
+
it 'should compare with dates' do
|
37
37
|
_(compile(@table[:created_at] >= Date.new(2016, 3, 31)))
|
38
38
|
.must_be_like %{"users"."created_at" >= '2016-03-31'}
|
39
39
|
end
|
@@ -7,10 +7,10 @@ module ArelExtensions
|
|
7
7
|
@conn = FakeRecord::Base.new
|
8
8
|
@visitor = Arel::Visitors::Oracle.new @conn.connection
|
9
9
|
@table = Arel::Table.new(:users)
|
10
|
-
@cols = [
|
10
|
+
@cols = %w[name comments created_at]
|
11
11
|
@data = [
|
12
|
-
[
|
13
|
-
[
|
12
|
+
%w[nom1 sdfdsfdsfsdf 2016-01-01],
|
13
|
+
%w[nom2 sdfdsfdsfsdf 2016-01-01]
|
14
14
|
]
|
15
15
|
end
|
16
16
|
|
@@ -22,8 +22,8 @@ module ArelExtensions
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
it
|
26
|
-
insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new
|
25
|
+
it 'should import large set of data in Oracle' do
|
26
|
+
insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new.into(@table) : Arel::InsertManager.new(@conn).into(@table)
|
27
27
|
insert_manager.bulk_insert(@cols, @data)
|
28
28
|
_(compile(insert_manager.ast))
|
29
29
|
.must_be_like %Q[INSERT INTO "users" ("name", "comments", "created_at")
|
@@ -8,10 +8,10 @@ module ArelExtensions
|
|
8
8
|
@visitor = Arel::Visitors::SQLite.new @conn.connection
|
9
9
|
@table = Arel::Table.new(:users)
|
10
10
|
Arel::Table.engine = @conn
|
11
|
-
@cols = [
|
11
|
+
@cols = %w[id name comments created_at]
|
12
12
|
@data = [
|
13
|
-
[23, 'nom1',
|
14
|
-
[25, 'nom2',
|
13
|
+
[23, 'nom1', 'sdfdsfdsfsdf', '2016-01-01'],
|
14
|
+
[25, 'nom2', 'sdfdsfdsfsdf', '2016-01-01']
|
15
15
|
]
|
16
16
|
end
|
17
17
|
|
@@ -23,8 +23,8 @@ module ArelExtensions
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
it
|
27
|
-
insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new
|
26
|
+
it 'should import large set of data' do
|
27
|
+
insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new.into(@table) : Arel::InsertManager.new(@conn).into(@table)
|
28
28
|
insert_manager.bulk_insert(@cols, @data)
|
29
29
|
_(compile(insert_manager.ast))
|
30
30
|
.must_be_like %Q[INSERT INTO "users" ("id", "name", "comments", "created_at")
|
@@ -8,10 +8,10 @@ module ArelExtensions
|
|
8
8
|
Arel::Table.engine = @conn
|
9
9
|
@visitor = Arel::Visitors::ToSql.new @conn.connection
|
10
10
|
@table = Arel::Table.new(:users)
|
11
|
-
@cols = [
|
11
|
+
@cols = %w[id name comments created_at]
|
12
12
|
@data = [
|
13
|
-
[23, 'nom1',
|
14
|
-
[25, 'nom2',
|
13
|
+
[23, 'nom1', 'sdfdsfdsfsdf', '2016-01-01'],
|
14
|
+
[25, 'nom2', 'sdfdsfdsfsdf', '2016-01-01']
|
15
15
|
]
|
16
16
|
end
|
17
17
|
|
@@ -24,8 +24,8 @@ module ArelExtensions
|
|
24
24
|
end
|
25
25
|
|
26
26
|
|
27
|
-
it
|
28
|
-
insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new
|
27
|
+
it 'should import large set of data using ToSql' do
|
28
|
+
insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new.into(@table) : Arel::InsertManager.new(@conn).into(@table)
|
29
29
|
insert_manager.bulk_insert(@cols, @data)
|
30
30
|
_(compile(insert_manager.ast))
|
31
31
|
.must_be_like %Q[INSERT INTO "users" ("id", "name", "comments", "created_at") VALUES (23, 'nom1', 'sdfdsfdsfsdf', '2016-01-01'), (25, 'nom2', 'sdfdsfdsfsdf', '2016-01-01')]
|
@@ -22,7 +22,7 @@ module ArelExtensions
|
|
22
22
|
|
23
23
|
# Comparators
|
24
24
|
|
25
|
-
it
|
25
|
+
it 'should accept comparators on integers' do
|
26
26
|
_(compile(@table[:id] == 42)).must_match %{"users"."id" = 42}
|
27
27
|
_(compile(@table[:id] == @table[:id])).must_be_like %{"users"."id" = "users"."id"}
|
28
28
|
_(compile(@table[:id] != 42)).must_match %{"users"."id" != 42}
|
@@ -34,7 +34,7 @@ module ArelExtensions
|
|
34
34
|
_(compile((@table[:id] <= 42).as('new_name'))).must_match %{("users"."id" <= 42) AS new_name}
|
35
35
|
end
|
36
36
|
|
37
|
-
it
|
37
|
+
it 'should accept comparators on dates' do
|
38
38
|
c = @table[:created_at]
|
39
39
|
u = @table[:updated_at]
|
40
40
|
_(compile(c > @date)).must_be_like %{"users"."created_at" > '2016-03-31'}
|
@@ -42,7 +42,7 @@ module ArelExtensions
|
|
42
42
|
_(compile(c < u)).must_be_like %{"users"."created_at" < "users"."updated_at"}
|
43
43
|
end
|
44
44
|
|
45
|
-
it
|
45
|
+
it 'should accept comparators on strings' do
|
46
46
|
c = @table[:name]
|
47
47
|
_(compile(c == 'test')).must_be_like %{"users"."name" = 'test'}
|
48
48
|
_(compile(c != 'test')).must_be_like %{"users"."name" != 'test'}
|
@@ -60,41 +60,41 @@ module ArelExtensions
|
|
60
60
|
|
61
61
|
# Maths
|
62
62
|
# DateDiff
|
63
|
-
it
|
63
|
+
it 'should diff date col and date' do
|
64
64
|
_(compile(@table[:created_at] - Date.new(2016, 3, 31))).must_match %{"users"."created_at" - TO_DATE('2016-03-31')}
|
65
65
|
end
|
66
66
|
|
67
|
-
it
|
67
|
+
it 'should diff date col and datetime col' do
|
68
68
|
_(compile(@table[:created_at] - @table[:updated_at])).must_match %{"users"."created_at" - "users"."updated_at"}
|
69
69
|
end
|
70
70
|
|
71
|
-
it
|
71
|
+
it 'should diff date col and datetime col with AS' do
|
72
72
|
sql = compile((@table[:updated_at] - @table[:created_at]).as('new_name'))
|
73
73
|
# sql.must_be_like %{(TO_DATE("users"."updated_at") - "users"."created_at") * 86400 AS new_name}
|
74
74
|
_(sql).must_be_like %{("users"."updated_at" - "users"."created_at") * (CASE WHEN (TRUNC("users"."updated_at", 'DDD') = "users"."updated_at") THEN 1 ELSE 86400 END) AS new_name}
|
75
75
|
end
|
76
76
|
|
77
|
-
it
|
78
|
-
d2 = Time.new(2015,6,1)
|
79
|
-
d1 = DateTime.new(2015,6,2)
|
80
|
-
_(compile(ArelExtensions::Nodes::DateDiff.new([d1,d2])))
|
77
|
+
it 'should diff between time values' do
|
78
|
+
d2 = Time.new(2015, 6, 1)
|
79
|
+
d1 = DateTime.new(2015, 6, 2)
|
80
|
+
_(compile(ArelExtensions::Nodes::DateDiff.new([d1, d2])))
|
81
81
|
.must_match("TO_DATE('2015-06-02') - TO_DATE('2015-06-01')")
|
82
82
|
end
|
83
83
|
|
84
|
-
it
|
85
|
-
d1 = DateTime.new(2015,6,2)
|
84
|
+
it 'should diff between time values and time col' do
|
85
|
+
d1 = DateTime.new(2015, 6, 2)
|
86
86
|
_(compile(ArelExtensions::Nodes::DateDiff.new([d1, @table[:updated_at]])))
|
87
87
|
.must_match %{TO_DATE('2015-06-02') - "users"."updated_at"}
|
88
88
|
end
|
89
89
|
|
90
|
-
it
|
90
|
+
it 'should accept operators on dates with numbers' do
|
91
91
|
c = @table[:created_at]
|
92
92
|
_(compile(c - 42)).must_be_like %{DATE_SUB("users"."created_at", 42)}
|
93
93
|
_(compile(c - @table[:id])).must_be_like %{DATE_SUB("users"."created_at", "users"."id")}
|
94
94
|
end
|
95
95
|
|
96
96
|
# Maths on sums
|
97
|
-
it
|
97
|
+
it 'should accept math operators on anything' do
|
98
98
|
c = @table[:name]
|
99
99
|
_((c == 'test').to_sql).must_be_like %{"users"."name" = 'test'}
|
100
100
|
_((c != 'test').to_sql).must_be_like %{"users"."name" != 'test'}
|