arel_extensions 1.6.0 → 2.0.0.rc3
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 +2 -1
- data/.gitignore +6 -7
- data/.rubocop.yml +3 -67
- data/.travis/oracle/download.js +152 -0
- data/.travis/oracle/download.sh +30 -0
- data/.travis/oracle/download_ojdbc.js +116 -0
- data/.travis/oracle/install.sh +34 -0
- data/.travis/setup_accounts.sh +9 -0
- data/.travis/sqlite3/extension-functions.sh +6 -0
- data/.travis.yml +223 -0
- data/Gemfile +28 -2
- data/README.md +91 -258
- data/Rakefile +30 -48
- data/TODO +1 -0
- data/appveyor.yml +22 -60
- data/arel_extensions.gemspec +14 -13
- data/functions.html +3 -3
- data/gemfiles/rails3.gemfile +20 -0
- data/gemfiles/rails4.gemfile +29 -0
- data/gemfiles/rails5_0.gemfile +29 -0
- data/gemfiles/rails5_1_4.gemfile +14 -14
- data/gemfiles/rails5_2.gemfile +14 -16
- data/init/mssql.sql +4 -4
- data/init/mysql.sql +38 -38
- data/init/oracle.sql +0 -0
- data/init/postgresql.sql +25 -24
- data/init/sqlite.sql +0 -0
- data/lib/arel_extensions/attributes.rb +3 -7
- data/lib/arel_extensions/boolean_functions.rb +14 -53
- data/lib/arel_extensions/common_sql_functions.rb +17 -16
- data/lib/arel_extensions/comparators.rb +28 -29
- data/lib/arel_extensions/date_duration.rb +13 -17
- data/lib/arel_extensions/insert_manager.rb +15 -18
- data/lib/arel_extensions/math.rb +53 -55
- data/lib/arel_extensions/math_functions.rb +39 -46
- data/lib/arel_extensions/nodes/abs.rb +1 -0
- data/lib/arel_extensions/nodes/blank.rb +2 -1
- data/lib/arel_extensions/nodes/case.rb +19 -20
- data/lib/arel_extensions/nodes/cast.rb +8 -10
- data/lib/arel_extensions/nodes/ceil.rb +1 -1
- data/lib/arel_extensions/nodes/coalesce.rb +4 -3
- data/lib/arel_extensions/nodes/collate.rb +10 -9
- data/lib/arel_extensions/nodes/concat.rb +18 -9
- data/lib/arel_extensions/nodes/date_diff.rb +26 -42
- data/lib/arel_extensions/nodes/duration.rb +3 -0
- data/lib/arel_extensions/nodes/find_in_set.rb +1 -0
- data/lib/arel_extensions/nodes/floor.rb +1 -1
- data/lib/arel_extensions/nodes/format.rb +8 -35
- data/lib/arel_extensions/nodes/formatted_number.rb +23 -22
- data/lib/arel_extensions/nodes/function.rb +37 -46
- data/lib/arel_extensions/nodes/is_null.rb +0 -0
- data/lib/arel_extensions/nodes/json.rb +39 -52
- data/lib/arel_extensions/nodes/length.rb +0 -5
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
- data/lib/arel_extensions/nodes/locate.rb +2 -1
- data/lib/arel_extensions/nodes/log10.rb +2 -1
- data/lib/arel_extensions/nodes/matches.rb +8 -6
- data/lib/arel_extensions/nodes/md5.rb +1 -0
- data/lib/arel_extensions/nodes/power.rb +5 -5
- data/lib/arel_extensions/nodes/rand.rb +1 -0
- data/lib/arel_extensions/nodes/repeat.rb +5 -3
- data/lib/arel_extensions/nodes/replace.rb +8 -16
- data/lib/arel_extensions/nodes/round.rb +6 -5
- data/lib/arel_extensions/nodes/soundex.rb +15 -15
- data/lib/arel_extensions/nodes/std.rb +21 -18
- data/lib/arel_extensions/nodes/substring.rb +16 -8
- data/lib/arel_extensions/nodes/then.rb +1 -1
- data/lib/arel_extensions/nodes/trim.rb +6 -4
- data/lib/arel_extensions/nodes/union.rb +8 -5
- data/lib/arel_extensions/nodes/union_all.rb +7 -4
- data/lib/arel_extensions/nodes/wday.rb +4 -0
- data/lib/arel_extensions/nodes.rb +1 -1
- data/lib/arel_extensions/null_functions.rb +5 -19
- data/lib/arel_extensions/predications.rb +44 -45
- data/lib/arel_extensions/railtie.rb +5 -5
- data/lib/arel_extensions/set_functions.rb +7 -5
- data/lib/arel_extensions/string_functions.rb +35 -91
- data/lib/arel_extensions/tasks.rb +6 -6
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/ibm_db.rb +31 -24
- data/lib/arel_extensions/visitors/mssql.rb +194 -440
- data/lib/arel_extensions/visitors/mysql.rb +212 -368
- data/lib/arel_extensions/visitors/oracle.rb +179 -236
- data/lib/arel_extensions/visitors/oracle12.rb +31 -18
- data/lib/arel_extensions/visitors/postgresql.rb +173 -271
- data/lib/arel_extensions/visitors/sqlite.rb +127 -157
- data/lib/arel_extensions/visitors/to_sql.rb +238 -300
- data/lib/arel_extensions/visitors.rb +62 -83
- data/lib/arel_extensions.rb +31 -235
- data/test/database.yml +10 -20
- data/test/helper.rb +18 -0
- data/test/real_db_test.rb +118 -121
- data/test/support/fake_record.rb +3 -11
- data/test/test_comparators.rb +17 -14
- data/test/visitors/test_bulk_insert_oracle.rb +12 -12
- data/test/visitors/test_bulk_insert_sqlite.rb +14 -13
- data/test/visitors/test_bulk_insert_to_sql.rb +13 -11
- data/test/visitors/test_oracle.rb +55 -55
- data/test/visitors/test_to_sql.rb +226 -419
- data/test/with_ar/all_agnostic_test.rb +370 -773
- data/test/with_ar/insert_agnostic_test.rb +22 -28
- data/test/with_ar/test_bulk_sqlite.rb +17 -18
- data/test/with_ar/test_math_sqlite.rb +27 -27
- data/test/with_ar/test_string_mysql.rb +34 -32
- data/test/with_ar/test_string_sqlite.rb +35 -31
- metadata +38 -52
- data/.github/workflows/publish.yml +0 -30
- data/.github/workflows/release.yml +0 -30
- data/.github/workflows/ruby.yml +0 -452
- data/CONTRIBUTING.md +0 -102
- data/Makefile +0 -18
- data/NEWS.md +0 -116
- data/bin/build +0 -15
- data/bin/publish +0 -8
- data/dev/arelx.dockerfile +0 -41
- data/dev/compose.yaml +0 -69
- data/dev/postgres.dockerfile +0 -5
- data/dev/rbenv +0 -189
- data/gemfiles/rails5.gemfile +0 -29
- data/gemfiles/rails6.gemfile +0 -34
- data/gemfiles/rails6_1.gemfile +0 -42
- data/gemfiles/rails7.gemfile +0 -42
- data/gemfiles/rails7_1.gemfile +0 -41
- data/gemfiles/rails7_2.gemfile +0 -41
- data/gemfiles/rails8.gemfile +0 -40
- data/gemfiles/rails8_1.gemfile +0 -41
- data/gemspecs/arel_extensions-v1.gemspec +0 -27
- data/gemspecs/arel_extensions-v2.gemspec +0 -27
- data/generate_gems.sh +0 -15
- data/lib/arel_extensions/aliases.rb +0 -14
- data/lib/arel_extensions/constants.rb +0 -13
- data/lib/arel_extensions/helpers.rb +0 -61
- data/lib/arel_extensions/nodes/aggregate_function.rb +0 -13
- data/lib/arel_extensions/nodes/byte_size.rb +0 -11
- data/lib/arel_extensions/nodes/char_length.rb +0 -11
- data/lib/arel_extensions/nodes/formatted_date.rb +0 -42
- data/lib/arel_extensions/nodes/rollup.rb +0 -36
- data/lib/arel_extensions/nodes/select.rb +0 -10
- data/lib/arel_extensions/nodes/sum.rb +0 -7
- data/lib/arel_extensions/visitors/convert_format.rb +0 -37
- data/lib/arel_extensions/warning.rb +0 -42
- data/test/arelx_test_helper.rb +0 -94
- data/test/config_loader.rb +0 -9
- data/version_v1.rb +0 -3
- data/version_v2.rb +0 -3
|
@@ -1,39 +1,21 @@
|
|
|
1
|
-
require '
|
|
1
|
+
require 'helper'
|
|
2
2
|
require 'date'
|
|
3
3
|
|
|
4
|
-
# class ActiveRecord::ConnectionAdapters::SQLServerAdapter
|
|
5
|
-
# # We use *args to avoid breaking signature changes between versions.
|
|
6
|
-
# # internal_exec_sql_query(sql, name = "SQL", binds = [], prepare: false)
|
|
7
|
-
# def internal_exec_sql_query(*args)
|
|
8
|
-
# sql = args.first
|
|
9
|
-
# puts "[DEBUG] MSSQL Query: #{sql}\n"
|
|
10
|
-
|
|
11
|
-
# # Call original implementation (defined in the DatabaseStatements module included in this class)
|
|
12
|
-
# super
|
|
13
|
-
# rescue => e
|
|
14
|
-
# # Catch the crash to print the specific query that caused it one last time
|
|
15
|
-
# puts "[CRASH]: #{args.first}\n"
|
|
16
|
-
# raise e
|
|
17
|
-
# end
|
|
18
|
-
# end
|
|
19
|
-
|
|
20
4
|
module ArelExtensions
|
|
21
|
-
module
|
|
5
|
+
module WthAr
|
|
6
|
+
|
|
22
7
|
class ListTest < Minitest::Test
|
|
8
|
+
require 'minitest/pride'
|
|
23
9
|
def connect_db
|
|
24
|
-
ActiveRecord::Base.configurations =
|
|
25
|
-
if ENV['DB'] == 'oracle' && ((defined?(RUBY_ENGINE) && RUBY_ENGINE ==
|
|
26
|
-
@env_db = (RUBY_PLATFORM == 'java' ?
|
|
27
|
-
skip "Platform not supported
|
|
10
|
+
ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
|
|
11
|
+
if ENV['DB'] == 'oracle' && ((defined?(RUBY_ENGINE) && RUBY_ENGINE == "rbx") || (RUBY_PLATFORM == 'java')) # not supported
|
|
12
|
+
@env_db = (RUBY_PLATFORM == 'java' ? "jdbc-sqlite" : 'sqlite')
|
|
13
|
+
skip "Platform not supported"
|
|
28
14
|
else
|
|
29
15
|
@env_db = ENV['DB']
|
|
30
16
|
end
|
|
31
17
|
ActiveRecord::Base.establish_connection(@env_db.try(:to_sym) || (RUBY_PLATFORM == 'java' ? :"jdbc-sqlite" : :sqlite))
|
|
32
|
-
|
|
33
|
-
ActiveRecord.default_timezone = :utc
|
|
34
|
-
else
|
|
35
|
-
ActiveRecord::Base.default_timezone = :utc
|
|
36
|
-
end
|
|
18
|
+
ActiveRecord::Base.default_timezone = :utc
|
|
37
19
|
@cnx = ActiveRecord::Base.connection
|
|
38
20
|
$sqlite = @cnx.adapter_name =~ /sqlite/i
|
|
39
21
|
$load_extension_disabled ||= false
|
|
@@ -48,14 +30,14 @@ module ArelExtensions
|
|
|
48
30
|
t.column :name, :string
|
|
49
31
|
t.column :comments, :text
|
|
50
32
|
t.column :created_at, :date
|
|
51
|
-
t.column :updated_at, :datetime
|
|
33
|
+
t.column :updated_at, :datetime
|
|
52
34
|
t.column :duration, :time
|
|
53
35
|
t.column :other, :string
|
|
54
|
-
t.column :score, :decimal, precision
|
|
36
|
+
t.column :score, :decimal, :precision => 20, :scale => 10
|
|
55
37
|
end
|
|
56
38
|
@cnx.drop_table(:product_tests) rescue nil
|
|
57
39
|
@cnx.create_table :product_tests do |t|
|
|
58
|
-
t.column :price, :decimal, precision
|
|
40
|
+
t.column :price, :decimal, :precision => 20, :scale => 10
|
|
59
41
|
end
|
|
60
42
|
end
|
|
61
43
|
|
|
@@ -70,34 +52,24 @@ module ArelExtensions
|
|
|
70
52
|
d = Date.new(2016, 5, 23)
|
|
71
53
|
connect_db
|
|
72
54
|
setup_db
|
|
73
|
-
u = User.create age
|
|
74
|
-
@lucas = User.where(id
|
|
75
|
-
u = User.create age
|
|
76
|
-
@sophie = User.where(id
|
|
77
|
-
u = User.create age
|
|
78
|
-
@camille = User.where(id
|
|
79
|
-
u = User.create age
|
|
80
|
-
@arthur = User.where(id
|
|
81
|
-
u = User.create age
|
|
82
|
-
@myung = User.where(id
|
|
83
|
-
u = User.create age
|
|
84
|
-
@laure = User.where(id
|
|
85
|
-
u = User.create age
|
|
86
|
-
@test = User.where(id
|
|
87
|
-
u = User.create age
|
|
88
|
-
@neg = User.where(id
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
u = User.create age: nil, name: 'nilly', created_at: nil, score: nil
|
|
92
|
-
@nilly = User.where(id: u.id)
|
|
93
|
-
u = User.create age: nil, name: 'esmé', created_at: nil, score: nil
|
|
94
|
-
@esme = User.where(id: u.id)
|
|
95
|
-
u = User.create age: nil, name: 'esmé ', created_at: nil, score: nil
|
|
96
|
-
@esme2 = User.where(id: u.id)
|
|
97
|
-
u = User.create age: nil, name: nil, created_at: nil, score: nil
|
|
98
|
-
@all_nil = User.where(id: u.id)
|
|
99
|
-
|
|
100
|
-
@id = User.arel_table[:id]
|
|
55
|
+
u = User.create :age => 5, :name => "Lucas", :created_at => d, :score => 20.16, :updated_at => Time.utc(2014, 3, 3, 12, 42, 0)
|
|
56
|
+
@lucas = User.where(:id => u.id)
|
|
57
|
+
u = User.create :age => 15, :name => "Sophie", :created_at => d, :score => 20.16
|
|
58
|
+
@sophie = User.where(:id => u.id)
|
|
59
|
+
u = User.create :age => 20, :name => "Camille", :created_at => d, :score => -20.16, :comments => ''
|
|
60
|
+
@camille = User.where(:id => u.id)
|
|
61
|
+
u = User.create :age => 21, :name => "Arthur", :created_at => d, :score => 65.62, :comments => 'arrêté'
|
|
62
|
+
@arthur = User.where(:id => u.id)
|
|
63
|
+
u = User.create :age => 23, :name => "Myung", :created_at => d, :score => 20.16, :comments => ' '
|
|
64
|
+
@myung = User.where(:id => u.id)
|
|
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)
|
|
66
|
+
@laure = User.where(:id => u.id)
|
|
67
|
+
u = User.create :age => nil, :name => "Test", :created_at => d, :score => 1.62, :other => 'toto'
|
|
68
|
+
@test = User.where(:id => u.id)
|
|
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
|
+
@neg = User.where(:id => u.id)
|
|
71
|
+
|
|
72
|
+
|
|
101
73
|
@age = User.arel_table[:age]
|
|
102
74
|
@name = User.arel_table[:name]
|
|
103
75
|
@score = User.arel_table[:score]
|
|
@@ -119,12 +91,10 @@ module ArelExtensions
|
|
|
119
91
|
end
|
|
120
92
|
|
|
121
93
|
def t(scope, node)
|
|
122
|
-
|
|
123
|
-
# puts "[scope] #{res.to_sql}"
|
|
124
|
-
res.to_a.first.res
|
|
94
|
+
scope.select(node.as('res')).to_a.first.res
|
|
125
95
|
end
|
|
126
96
|
|
|
127
|
-
#
|
|
97
|
+
#manage the difference between adapters that handle or not json type
|
|
128
98
|
def parse_json(h)
|
|
129
99
|
if @env_db != 'postgresql'
|
|
130
100
|
JSON.parse("{\"res\":#{h}}")['res']
|
|
@@ -133,14 +103,6 @@ module ArelExtensions
|
|
|
133
103
|
end
|
|
134
104
|
end
|
|
135
105
|
|
|
136
|
-
# Connection and column info
|
|
137
|
-
def test_column_of
|
|
138
|
-
assert_nil Arel.column_of('chupa', 'maflavla'), 'Non-existent table and column should return nil'
|
|
139
|
-
assert_nil Arel.column_of('chupa', 'updated_at'), 'Non-existent table but existent column should return nil'
|
|
140
|
-
assert_nil Arel.column_of('user_tests', 'maflavla'), 'Existent table but non-existent column should return nil'
|
|
141
|
-
assert_equal 'updated_at', Arel.column_of('user_tests', 'updated_at').name, 'An existing column name should be returned'
|
|
142
|
-
end
|
|
143
|
-
|
|
144
106
|
# Math Functions
|
|
145
107
|
def test_classical_arel
|
|
146
108
|
assert_in_epsilon 42.16, t(@laure, @score + 22), 0.01
|
|
@@ -154,28 +116,25 @@ module ArelExtensions
|
|
|
154
116
|
end
|
|
155
117
|
|
|
156
118
|
def test_ceil
|
|
157
|
-
|
|
119
|
+
# skip "Sqlite version can't load extension for ceil" if $sqlite && $load_extension_disabled
|
|
158
120
|
assert_equal 2, t(@test, @score.ceil) # 1.62
|
|
159
121
|
assert_equal(-20, t(@camille, @score.ceil)) # -20.16
|
|
160
122
|
assert_equal(-20, t(@camille, (@score - 0.5).ceil)) # -20.16
|
|
161
123
|
assert_equal 63, t(@arthur, @age.ceil + 42)
|
|
162
|
-
assert_equal 11, t(@justin, @score.ceil) # 11.0
|
|
163
124
|
end
|
|
164
125
|
|
|
165
126
|
def test_floor
|
|
166
|
-
|
|
127
|
+
# skip "Sqlite version can't load extension for floor" if $sqlite && $load_extension_disabled
|
|
167
128
|
assert_equal 0, t(@neg, @score.floor)
|
|
168
129
|
assert_equal 1, t(@test, @score.floor) # 1.62
|
|
169
130
|
assert_equal(-9, t(@test, (@score - 10).floor)) # 1.62
|
|
170
131
|
assert_equal 42, t(@arthur, @score.floor - 23)
|
|
171
|
-
assert_equal 11, t(@justin, @score.floor) # 11.0
|
|
172
|
-
assert_equal(-21, t(@camille, @score.floor)) # # -20.16
|
|
173
132
|
end
|
|
174
133
|
|
|
175
134
|
def test_rand
|
|
176
135
|
assert 42 != User.select(Arel.rand.as('res')).first.res
|
|
177
136
|
assert 0 <= User.select(Arel.rand.abs.as('res')).first.res
|
|
178
|
-
assert_equal
|
|
137
|
+
assert_equal 8, User.order(Arel.rand).limit(50).count
|
|
179
138
|
end
|
|
180
139
|
|
|
181
140
|
def test_round
|
|
@@ -187,124 +146,54 @@ module ArelExtensions
|
|
|
187
146
|
|
|
188
147
|
def test_sum
|
|
189
148
|
if @env_db == 'mssql'
|
|
190
|
-
skip
|
|
191
|
-
assert_equal
|
|
192
|
-
assert_equal
|
|
193
|
-
assert_equal
|
|
194
|
-
assert_equal
|
|
149
|
+
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
|
|
195
154
|
else
|
|
196
|
-
assert_equal
|
|
197
|
-
assert_equal
|
|
198
|
-
assert_equal
|
|
199
|
-
assert_equal
|
|
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
|
|
200
159
|
end
|
|
201
160
|
end
|
|
202
161
|
|
|
203
|
-
def test_aggregation_with_ar_calculation
|
|
204
|
-
# Since Arel10 (Rails6.1), some unwanted behaviors on aggregated calculation were present.
|
|
205
|
-
# This should works no matter which version of rails is used
|
|
206
|
-
assert User.group(:score).average(:id).values.all?{|e| !e.nil?}
|
|
207
|
-
|
|
208
|
-
# Since Rails 7, a patch to calculations.rb has tirggered a double
|
|
209
|
-
# quoting of the alias name. See https://github.com/rails/rails/commit/7e6e9091e55c3357b0162d44b6ab955ed0c718d5
|
|
210
|
-
# Before the patch that fixed this the following error would occur:
|
|
211
|
-
# ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: zero-length delimited identifier at or near """"
|
|
212
|
-
assert User.group(:score).count(:id).values.all?{|e| !e.nil?}
|
|
213
|
-
end
|
|
214
|
-
|
|
215
|
-
def test_rollup
|
|
216
|
-
skip "sqlite not supported" if $sqlite
|
|
217
|
-
at = User.arel_table
|
|
218
|
-
# single
|
|
219
|
-
q = User.select(at[:name], at[:age].sum).group(Arel::Nodes::RollUp.new([at[:name]]))
|
|
220
|
-
assert q.to_a.length > 0
|
|
221
|
-
|
|
222
|
-
# multi
|
|
223
|
-
q = User.select(at[:name], at[:score], at[:age].sum).group(Arel::Nodes::RollUp.new([at[:score], at[:name]]))
|
|
224
|
-
assert q.to_a.length > 0
|
|
225
|
-
|
|
226
|
-
# hybrid
|
|
227
|
-
q = User.select(at[:name], at[:score], at[:age].sum).group(at[:score], Arel::Nodes::RollUp.new([at[:name]]))
|
|
228
|
-
assert q.to_a.length > 0
|
|
229
|
-
|
|
230
|
-
## Using Arel.rollup which is less verbose than the original way
|
|
231
|
-
|
|
232
|
-
# simple
|
|
233
|
-
q = User.select(at[:name], at[:age].sum).group(Arel.rollup(at[:name]))
|
|
234
|
-
assert q.to_a.length > 0
|
|
235
|
-
|
|
236
|
-
# multi
|
|
237
|
-
q = User.select(at[:name], at[:score], at[:age].sum).group(Arel.rollup([at[:score], at[:name]]))
|
|
238
|
-
assert q.to_a.length > 0
|
|
239
|
-
|
|
240
|
-
# hybrid
|
|
241
|
-
q = User.select(at[:name], at[:score], at[:age].sum).group(at[:score], Arel.rollup([at[:name]]))
|
|
242
|
-
assert q.to_a.length > 0
|
|
243
|
-
|
|
244
|
-
## Using at[:col].rollup which is handy for single column rollups
|
|
245
|
-
|
|
246
|
-
# simple
|
|
247
|
-
q = User.select(at[:name], at[:age].sum).group(at[:name].rollup)
|
|
248
|
-
assert q.to_a.length > 0
|
|
249
|
-
|
|
250
|
-
q = User.select(at[:name], at[:score], at[:age].sum).group(at[:name].rollup, at[:score].rollup)
|
|
251
|
-
assert q.to_a.length > 0
|
|
252
|
-
|
|
253
|
-
# hybrid
|
|
254
|
-
q = User.select(at[:name], at[:score], at[:age].sum).group(at[:name], at[:score].rollup)
|
|
255
|
-
assert q.to_a.length > 0
|
|
256
|
-
end
|
|
257
|
-
|
|
258
162
|
# String Functions
|
|
259
163
|
def test_concat
|
|
260
164
|
assert_equal 'Camille Camille', t(@camille, @name + ' ' + @name)
|
|
261
165
|
assert_equal 'Laure 2', t(@laure, @name + ' ' + 2)
|
|
262
|
-
assert_equal 'Test Laure', t(@laure, Arel.
|
|
263
|
-
|
|
264
|
-
skip
|
|
265
|
-
assert_equal
|
|
266
|
-
assert_equal
|
|
267
|
-
assert_equal
|
|
268
|
-
|
|
269
|
-
skip
|
|
270
|
-
assert_equal
|
|
271
|
-
assert_equal
|
|
272
|
-
assert_equal
|
|
273
|
-
assert_equal
|
|
274
|
-
assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', order: [@score.asc, @name.asc]))
|
|
166
|
+
assert_equal 'Test Laure', t(@laure, Arel::Nodes.build_quoted('Test ') + @name)
|
|
167
|
+
|
|
168
|
+
skip "No group_concat in SqlServer before 2017" if @env_db == 'mssql'
|
|
169
|
+
assert_equal "Lucas Sophie", t(User.where(:name => ['Lucas', 'Sophie']), @name.group_concat(' '))
|
|
170
|
+
assert_equal "Lucas,Sophie", t(User.where(:name => ['Lucas', 'Sophie']), @name.group_concat(','))
|
|
171
|
+
assert_equal "Lucas,Sophie", t(User.where(:name => ['Lucas', 'Sophie']), @name.group_concat)
|
|
172
|
+
|
|
173
|
+
skip "No order in group_concat in SqlLite" if $sqlite
|
|
174
|
+
assert_equal "Arthur,Lucas,Sophie", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',@name.asc))
|
|
175
|
+
assert_equal "Sophie,Lucas,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',@name.desc))
|
|
176
|
+
assert_equal "Lucas,Sophie,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',[@score.asc,@name.asc]))
|
|
177
|
+
assert_equal "Lucas,Sophie,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',@score.asc,@name.asc))
|
|
275
178
|
end
|
|
276
179
|
|
|
277
180
|
def test_length
|
|
278
181
|
assert_equal 7, t(@camille, @name.length)
|
|
279
182
|
assert_equal 7, t(@camille, @name.length.round.abs)
|
|
280
183
|
assert_equal 42, t(@laure, @name.length + 37)
|
|
281
|
-
|
|
282
|
-
if @env_db == 'mssql'
|
|
283
|
-
# By default it's UTF-16, and configuring the CI to be UTF-8 is a bit of a hassle.
|
|
284
|
-
assert_equal 4, t(@esme, @name.byte_size)
|
|
285
|
-
assert_equal 5, t(@esme2, @name.byte_size)
|
|
286
|
-
else
|
|
287
|
-
assert_equal 5, t(@esme, @name.byte_size)
|
|
288
|
-
assert_equal 6, t(@esme2, @name.byte_size)
|
|
289
|
-
end
|
|
290
|
-
assert_equal 0, t(@all_nil, @name.byte_size)
|
|
291
|
-
|
|
292
|
-
assert_equal 4, t(@esme, @name.char_length)
|
|
293
|
-
assert_equal 5, t(@esme2, @name.char_length)
|
|
294
|
-
assert_equal 0, t(@all_nil, @name.char_length)
|
|
295
184
|
end
|
|
296
185
|
|
|
297
186
|
def test_md5
|
|
298
187
|
skip "Sqlite can't do md5" if $sqlite
|
|
299
|
-
assert_equal
|
|
300
|
-
assert_equal
|
|
188
|
+
assert_equal "e2cf99ca82a7e829d2a4ac85c48154d0", t(@camille, @name.md5)
|
|
189
|
+
assert_equal "c3d41bf5efb468a1bcce53bd53726c85", t(@lucas, @name.md5)
|
|
301
190
|
end
|
|
302
191
|
|
|
303
192
|
def test_locate
|
|
304
193
|
skip "Sqlite version can't load extension for locate" if $sqlite && $load_extension_disabled
|
|
305
|
-
assert_equal 1, t(@camille, @name.locate(
|
|
306
|
-
assert_equal 0, t(@lucas, @name.locate(
|
|
307
|
-
assert_equal 5, t(@lucas, @name.locate(
|
|
194
|
+
assert_equal 1, t(@camille, @name.locate("C"))
|
|
195
|
+
assert_equal 0, t(@lucas, @name.locate("z"))
|
|
196
|
+
assert_equal 5, t(@lucas, @name.locate("s"))
|
|
308
197
|
end
|
|
309
198
|
|
|
310
199
|
def test_substring
|
|
@@ -314,7 +203,7 @@ module ArelExtensions
|
|
|
314
203
|
else
|
|
315
204
|
assert_equal('', t(@lucas, @name.substring(42)))
|
|
316
205
|
end
|
|
317
|
-
assert_equal 'Lu', t(@lucas, @name.substring(1,
|
|
206
|
+
assert_equal 'Lu', t(@lucas, @name.substring(1,2))
|
|
318
207
|
|
|
319
208
|
assert_equal 'C', t(@camille, @name[0, 1])
|
|
320
209
|
assert_equal 'C', t(@camille, @name[0])
|
|
@@ -323,35 +212,32 @@ module ArelExtensions
|
|
|
323
212
|
else
|
|
324
213
|
assert_equal('', t(@lucas, @name[42]))
|
|
325
214
|
end
|
|
326
|
-
assert_equal 'Lu', t(@lucas, @name[0,
|
|
215
|
+
assert_equal 'Lu', t(@lucas, @name[0,2])
|
|
327
216
|
assert_equal 'Lu', t(@lucas, @name[0..1])
|
|
328
217
|
|
|
329
|
-
#
|
|
218
|
+
#substring should accept string function
|
|
330
219
|
assert_equal 'Ce', t(@camille, @name.substring(1, 1).concat('e'))
|
|
331
|
-
assert_equal 'Ce', t(@camille, @name.substring(1, 1)
|
|
220
|
+
assert_equal 'Ce', t(@camille, @name.substring(1, 1)+'e')
|
|
332
221
|
end
|
|
333
222
|
|
|
334
223
|
def test_find_in_set
|
|
335
224
|
skip "Sqlite version can't load extension for find_in_set" if $sqlite && $load_extension_disabled
|
|
336
|
-
skip
|
|
225
|
+
skip "SQL Server does not know about FIND_IN_SET" if @env_db == 'mssql'
|
|
337
226
|
assert_equal 5, t(@neg, @comments & 2)
|
|
338
227
|
assert_equal 0, t(@neg, @comments & 6) # not found
|
|
339
|
-
assert_equal 5, t(@neg, @comments & '2')
|
|
340
|
-
assert_equal 0, t(@neg, @comments & '6') # not found
|
|
341
|
-
assert_equal 5, t(@neg, @comments & @other)
|
|
342
228
|
end
|
|
343
229
|
|
|
344
230
|
def test_string_comparators
|
|
345
|
-
#
|
|
231
|
+
#skip "Oracle can't use math operators to compare strings" if @env_db == 'oracle' # use GREATEST ?
|
|
346
232
|
skip "SQL Server can't use math operators to compare strings" if @env_db == 'mssql' # use GREATEST ?
|
|
347
233
|
if @env_db == 'postgresql' # may return real boolean
|
|
348
234
|
assert t(@neg, @name >= 'Mest') == true || t(@neg, @name >= 'Mest') == 't' # depends of ar version
|
|
349
235
|
assert t(@neg, @name <= (@name + 'Z')) == true || t(@neg, @name <= (@name + 'Z')) == 't'
|
|
350
236
|
elsif @env_db == 'oracle'
|
|
351
|
-
assert_equal 1, t(@neg,
|
|
352
|
-
assert_equal 1, t(@neg,
|
|
353
|
-
assert_equal 1, t(@neg,
|
|
354
|
-
assert_equal 1, t(@neg,
|
|
237
|
+
assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name >= 'Mest').then(1).else(0))
|
|
238
|
+
assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name <= (@name + 'Z')).then(1).else(0))
|
|
239
|
+
assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name > 'Mest').then(1).else(0))
|
|
240
|
+
assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name < (@name + 'Z')).then(1).else(0))
|
|
355
241
|
else
|
|
356
242
|
assert_equal 1, t(@neg, @name >= 'Mest')
|
|
357
243
|
assert_equal 1, t(@neg, @name <= (@name + 'Z'))
|
|
@@ -363,86 +249,69 @@ module ArelExtensions
|
|
|
363
249
|
def test_compare_on_date_time_types
|
|
364
250
|
skip "Sqlite can't compare time" if $sqlite
|
|
365
251
|
skip "Oracle can't compare time" if @env_db == 'oracle'
|
|
366
|
-
|
|
367
|
-
assert_includes [true,
|
|
368
|
-
assert_includes [false,
|
|
369
|
-
|
|
370
|
-
assert_includes [true,
|
|
371
|
-
assert_includes [false,
|
|
372
|
-
|
|
373
|
-
#
|
|
374
|
-
#
|
|
375
|
-
assert_includes [true,
|
|
376
|
-
assert_includes [false,
|
|
252
|
+
#@created_at == 2016-05-23
|
|
253
|
+
assert_includes [true,'t',1], t(@laure, ArelExtensions::Nodes::Case.new.when(@created_at >= '2014-01-01').then(1).else(0))
|
|
254
|
+
assert_includes [false,'f',0], t(@laure, ArelExtensions::Nodes::Case.new.when(@created_at >= '2018-01-01').then(1).else(0))
|
|
255
|
+
#@updated_at == 2014-03-03 12:42:00
|
|
256
|
+
assert_includes [true,'t',1], t(@laure, ArelExtensions::Nodes::Case.new.when(@updated_at >= '2014-03-03 10:10:10').then(1).else(0))
|
|
257
|
+
assert_includes [false,'f',0], t(@laure, ArelExtensions::Nodes::Case.new.when(@updated_at >= '2014-03-03 13:10:10').then(1).else(0))
|
|
258
|
+
#@duration == 12:42:21
|
|
259
|
+
#puts @laure.select(ArelExtensions::Nodes::Case.new.when(@duration >= '10:10:10').then(1).else(0)).to_sql
|
|
260
|
+
#puts @laure.select(ArelExtensions::Nodes::Case.new.when(@duration >= '14:10:10').then(1).else(0)).to_sql
|
|
261
|
+
assert_includes [true,'t',1], t(@laure, ArelExtensions::Nodes::Case.new.when(@duration >= '10:10:10').then(1).else(0))
|
|
262
|
+
assert_includes [false,'f',0], t(@laure, ArelExtensions::Nodes::Case.new.when(@duration >= '14:10:10').then(1).else(0))
|
|
377
263
|
end
|
|
378
264
|
|
|
265
|
+
|
|
379
266
|
def test_regexp_not_regexp
|
|
380
267
|
skip "Sqlite version can't load extension for regexp" if $sqlite && $load_extension_disabled
|
|
381
|
-
skip
|
|
268
|
+
skip "SQL Server does not know about REGEXP without extensions" if @env_db == 'mssql'
|
|
382
269
|
assert_equal 1, User.where(@name =~ '^M').count
|
|
383
|
-
assert_equal
|
|
270
|
+
assert_equal 6, User.where(@name !~ '^L').count
|
|
384
271
|
assert_equal 1, User.where(@name =~ /^M/).count
|
|
385
|
-
assert_equal
|
|
386
|
-
end
|
|
387
|
-
|
|
388
|
-
def test_regex_matches
|
|
389
|
-
skip "Sqlite version can't load extension for regexp" if $sqlite && $load_extension_disabled
|
|
390
|
-
skip 'SQL Server does not know about REGEXP without extensions' if @env_db == 'mssql'
|
|
391
|
-
assert_equal 1, User.where(@name.regex_matches '^M').count
|
|
392
|
-
assert_equal 1, User.where(@name.regex_matches /^M/).count
|
|
272
|
+
assert_equal 6, User.where(@name !~ /^L/).count
|
|
393
273
|
end
|
|
394
274
|
|
|
395
275
|
def test_imatches
|
|
396
|
-
#
|
|
276
|
+
#puts User.where(@name.imatches('m%')).to_sql
|
|
397
277
|
assert_equal 1, User.where(@name.imatches('m%')).count
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
else
|
|
401
|
-
assert_equal 4, User.where(@name.imatches_any(['L%', '%e'])).count
|
|
402
|
-
end
|
|
403
|
-
assert_equal 10, User.where(@name.idoes_not_match('L%')).count
|
|
278
|
+
assert_equal 4, User.where(@name.imatches_any(['L%', '%e'])).count
|
|
279
|
+
assert_equal 6, User.where(@name.idoes_not_match('L%')).count
|
|
404
280
|
end
|
|
405
281
|
|
|
406
282
|
def test_replace
|
|
407
|
-
assert_equal
|
|
408
|
-
assert_equal
|
|
409
|
-
|
|
410
|
-
skip 'Sqlite does not seem to support regexp_replace' if $sqlite
|
|
411
|
-
skip 'SQL Server does not know about REGEXP without extensions' if @env_db == 'mssql'
|
|
412
|
-
skip 'Travis mysql version does not support REGEXP_REPLACE' if @env_db == 'mysql'
|
|
413
|
-
assert_equal 'LXcXs', t(@lucas, @name.replace(/[ua]/, 'X'))
|
|
414
|
-
assert_equal 'LXcXs', t(@lucas, @name.regexp_replace(/[ua]/, 'X'))
|
|
415
|
-
assert_equal 'LXcXs', t(@lucas, @name.regexp_replace('[ua]', 'X'))
|
|
283
|
+
assert_equal "LucaX", t(@lucas, @name.replace("s", "X"))
|
|
284
|
+
assert_equal "replace", t(@lucas, @name.replace(@name, "replace"))
|
|
416
285
|
end
|
|
417
286
|
|
|
418
287
|
def test_replace_once
|
|
419
|
-
skip
|
|
420
|
-
#
|
|
421
|
-
assert_equal
|
|
288
|
+
skip "TODO"
|
|
289
|
+
#skip "Sqlite version can't load extension for locate" if $sqlite && $load_extension_disabled
|
|
290
|
+
assert_equal "LuCas", t(@lucas, @name.substring(1, @name.locate('c') - 1) + 'C' + @name.substring(@name.locate('c') + 1, @name.length))
|
|
422
291
|
end
|
|
423
292
|
|
|
424
293
|
def test_soundex
|
|
425
294
|
skip "Sqlite version can't load extension for soundex" if $sqlite && $load_extension_disabled
|
|
426
295
|
skip "PostgreSql version can't load extension for soundex" if @env_db == 'postgresql'
|
|
427
|
-
assert_equal
|
|
428
|
-
assert_equal
|
|
429
|
-
assert_equal
|
|
296
|
+
assert_equal "C540", t(@camille, @name.soundex)
|
|
297
|
+
assert_equal 8, User.where(@name.soundex.eq(@name.soundex)).count
|
|
298
|
+
assert_equal 8, User.where(@name.soundex == @name.soundex).count
|
|
430
299
|
end
|
|
431
300
|
|
|
432
301
|
def test_change_case
|
|
433
|
-
assert_equal
|
|
434
|
-
assert_equal
|
|
435
|
-
assert_equal
|
|
302
|
+
assert_equal "myung", t(@myung, @name.downcase)
|
|
303
|
+
assert_equal "MYUNG", t(@myung, @name.upcase)
|
|
304
|
+
assert_equal "myung", t(@myung, @name.upcase.downcase)
|
|
436
305
|
end
|
|
437
306
|
|
|
438
307
|
def test_trim
|
|
439
|
-
assert_equal
|
|
440
|
-
assert_equal
|
|
441
|
-
assert_equal
|
|
442
|
-
assert_equal
|
|
443
|
-
assert_equal
|
|
444
|
-
skip
|
|
445
|
-
assert_equal
|
|
308
|
+
assert_equal "Myung", t(@myung, @name.trim)
|
|
309
|
+
assert_equal "Myung", t(@myung, @name.trim.ltrim.rtrim)
|
|
310
|
+
assert_equal "Myun", t(@myung, @name.rtrim("g"))
|
|
311
|
+
assert_equal "yung", t(@myung, @name.ltrim("M"))
|
|
312
|
+
assert_equal "yung", t(@myung, (@name + "M").trim("M"))
|
|
313
|
+
skip "Oracle does not accept multi char trim" if @env_db == 'oracle'
|
|
314
|
+
assert_equal "", t(@myung, @name.rtrim(@name))
|
|
446
315
|
end
|
|
447
316
|
|
|
448
317
|
def test_blank
|
|
@@ -471,244 +340,32 @@ module ArelExtensions
|
|
|
471
340
|
assert_equal 'true', t(@neg, @comments.not_blank.then('true', 'false'))
|
|
472
341
|
end
|
|
473
342
|
|
|
474
|
-
# This test repeats a lot of `test_blank` cases.
|
|
475
|
-
def test_present
|
|
476
|
-
if @env_db == 'postgresql'
|
|
477
|
-
assert_includes [true, 't'], t(@myung, @name.present) # depends of adapter
|
|
478
|
-
assert_includes [false, 'f'], t(@myung, @comments.present)
|
|
479
|
-
end
|
|
480
|
-
assert_equal 1, @myung.where(@name.present).count
|
|
481
|
-
assert_equal 0, @myung.where(@comments.present).count
|
|
482
|
-
assert_equal 0, @sophie.where(@comments.present).count
|
|
483
|
-
assert_equal 0, @camille.where(@comments.present).count
|
|
484
|
-
|
|
485
|
-
assert_equal 1, @neg.where(@comments.present).count
|
|
486
|
-
assert_equal 'true', t(@myung, @name.present.then('true', 'false'))
|
|
487
|
-
assert_equal 'false', t(@myung, @comments.present.then('true', 'false'))
|
|
488
|
-
assert_equal 'true', t(@neg, @comments.present.then('true', 'false'))
|
|
489
|
-
end
|
|
490
|
-
|
|
491
343
|
def test_format
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
assert_equal '12:42%', t(@lucas, @updated_at.send(method, '%R%%'))
|
|
496
|
-
|
|
497
|
-
# The following tests will ensure proper conversion of timestamps to
|
|
498
|
-
# requested timezones.
|
|
499
|
-
#
|
|
500
|
-
# The names of the timezones is highly dependant on the underlying
|
|
501
|
-
# operating system, and this is why we need to handle each database
|
|
502
|
-
# separately: the images we're using to test these databases are
|
|
503
|
-
# different. So don't rely on the provided examples. Your setup is your
|
|
504
|
-
# reference.
|
|
505
|
-
#
|
|
506
|
-
# One could always have portable code if s/he uses standard
|
|
507
|
-
# abbreviations, like:
|
|
508
|
-
#
|
|
509
|
-
# 1. CET => Central European Time
|
|
510
|
-
# 2. CEST => Central European Summer Time
|
|
511
|
-
#
|
|
512
|
-
# Which implies that the caller should handle daylight saving detection.
|
|
513
|
-
# In fact, CET will handle daylight saving in MySQL but not Postgres.
|
|
514
|
-
#
|
|
515
|
-
# It looks like the posix convention is supported by mysql and
|
|
516
|
-
# postgresql, e.g.:
|
|
517
|
-
#
|
|
518
|
-
# posix/Europe/Paris
|
|
519
|
-
# posix/America/Nipigon
|
|
520
|
-
#
|
|
521
|
-
# so it looks like a more reliably portable way of specifying it.
|
|
522
|
-
time_zones = {
|
|
523
|
-
'mssql' => {
|
|
524
|
-
'utc' => 'UTC',
|
|
525
|
-
'sao_paulo' => 'Argentina Standard Time',
|
|
526
|
-
'tahiti' => 'Hawaiian Standard Time',
|
|
527
|
-
'paris' => 'Central European Standard Time'
|
|
528
|
-
},
|
|
529
|
-
'posix' => {
|
|
530
|
-
'utc' => 'UTC',
|
|
531
|
-
'sao_paulo' => 'America/Sao_Paulo',
|
|
532
|
-
'tahiti' => 'Pacific/Tahiti',
|
|
533
|
-
'paris' => 'Europe/Paris'
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
skip "Unsupported timezone conversion for DB=#{ENV['DB']}" if !%w[mssql mysql oracle postgresql].include?(ENV['DB'])
|
|
538
|
-
# TODO: Standarize timezone conversion across all databases.
|
|
539
|
-
# This test case will be refactored and should work the same across all vendors.
|
|
540
|
-
if ENV['DB'] == 'mssql' && /Microsoft SQL Server (\d+)/.match(ActiveRecord::Base.connection.select_value('SELECT @@version'))[1].to_i < 2016
|
|
541
|
-
skip "SQL Server < 2016 is not currently supported"
|
|
542
|
-
end
|
|
543
|
-
|
|
544
|
-
tz = ENV['DB'] == 'mssql' ? time_zones['mssql'] : time_zones['posix']
|
|
545
|
-
|
|
546
|
-
assert_equal '2014/03/03 12:42:00', t(@lucas, @updated_at.send(method, '%Y/%m/%d %H:%M:%S', tz['utc']))
|
|
547
|
-
assert_equal '2014/03/03 09:42:00', t(@lucas, @updated_at.send(method, '%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['sao_paulo']}))
|
|
548
|
-
assert_equal '2014/03/03 02:42:00', t(@lucas, @updated_at.send(method, '%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['tahiti']}))
|
|
549
|
-
|
|
550
|
-
# Skipping conversion from UTC to the desired timezones fails in SQL
|
|
551
|
-
# Server and Postgres. This is mainly due to the fact that timezone
|
|
552
|
-
# information is not preserved in the column itself.
|
|
553
|
-
#
|
|
554
|
-
# MySQL is happy to consider that times by default are in UTC.
|
|
555
|
-
assert_equal '2014/03/03 13:42:00', t(@lucas, @updated_at.send(method, '%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
|
|
556
|
-
refute_equal '2014/03/03 13:42:00', t(@lucas, @updated_at.send(method, '%Y/%m/%d %H:%M:%S', tz['paris'])) if !%w[mysql postgresql].include?(ENV['DB'])
|
|
557
|
-
|
|
558
|
-
# Winter/Summer time
|
|
559
|
-
assert_equal '2014/08/03 14:42:00', t(@lucas, (@updated_at + 5.months).send(method, '%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
|
|
560
|
-
if ENV['DB'] == 'mssql'
|
|
561
|
-
assert_equal '2022/02/01 11:42:00', t(@lucas, Arel.quoted('2022-02-01 10:42:00').cast(:datetime).send(method, '%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
|
|
562
|
-
assert_equal '2022/08/01 12:42:00', t(@lucas, Arel.quoted('2022-08-01 10:42:00').cast(:datetime).send(method, '%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
|
|
563
|
-
else
|
|
564
|
-
assert_equal '2022/02/01 11:42:00', t(@lucas, Arel.quoted('2022-02-01 10:42:00').cast(:datetime).send(method, '%Y/%m/%d %H:%M:%S', tz['paris']))
|
|
565
|
-
assert_equal '2022/08/01 12:42:00', t(@lucas, Arel.quoted('2022-08-01 10:42:00').cast(:datetime).send(method, '%Y/%m/%d %H:%M:%S', tz['paris']))
|
|
566
|
-
end
|
|
567
|
-
end
|
|
568
|
-
end
|
|
569
|
-
|
|
570
|
-
def test_format_iso_week
|
|
571
|
-
%i[format format_date].each do |method|
|
|
572
|
-
skip "Unsupported ISO week number for DB=#{ENV['DB']}" if ['sqlite'].include?(ENV['DB'])
|
|
573
|
-
assert_equal '10', t(@lucas, @updated_at.send(method, '%V'))
|
|
574
|
-
{
|
|
575
|
-
'2024-01-01 10:42:00' => '01', # Monday
|
|
576
|
-
'2030-01-01 10:42:00' => '01', # Tuesday
|
|
577
|
-
'2025-01-01 10:42:00' => '01', # Wednesday
|
|
578
|
-
'2026-01-01 10:42:00' => '01', # Thursday
|
|
579
|
-
'2027-01-01 10:42:00' => '53', # Friday
|
|
580
|
-
'2028-01-01 10:42:00' => '52', # Saturday
|
|
581
|
-
'2034-01-01 10:42:00' => '52', # Sunday
|
|
582
|
-
}.each do |date, exp|
|
|
583
|
-
assert_equal exp, t(@lucas, Arel.quoted(date).cast(:datetime).send(method, '%V'))
|
|
584
|
-
end
|
|
585
|
-
end
|
|
586
|
-
end
|
|
587
|
-
|
|
588
|
-
def test_format_iso_year_of_week
|
|
589
|
-
skip "Unsupported ISO year of week for DB=#{ENV['DB']}" if %w[mssql sqlite].include?(ENV['DB'])
|
|
590
|
-
%i[format format_date].each do |method|
|
|
591
|
-
assert_equal '2014', t(@lucas, @updated_at.send(method, '%G'))
|
|
592
|
-
|
|
593
|
-
{
|
|
594
|
-
'2024-01-01 10:42:00' => '2024', # Monday
|
|
595
|
-
'2030-01-01 10:42:00' => '2030', # Tuesday
|
|
596
|
-
'2025-01-01 10:42:00' => '2025', # Wednesday
|
|
597
|
-
'2026-01-01 10:42:00' => '2026', # Thursday
|
|
598
|
-
'2027-01-01 10:42:00' => '2026', # Friday
|
|
599
|
-
'2028-01-01 10:42:00' => '2027', # Saturday
|
|
600
|
-
'2034-01-01 10:42:00' => '2033', # Sunday
|
|
601
|
-
}.each do |date, exp|
|
|
602
|
-
assert_equal exp, t(@lucas, Arel.quoted(date).cast(:datetime).send(method, '%G'))
|
|
603
|
-
end
|
|
604
|
-
end
|
|
605
|
-
end
|
|
606
|
-
|
|
607
|
-
def test_format_date_with_names
|
|
608
|
-
skip "#{ENV['DB']} does not support a variety of word-based formatting for month and day names" if %w[mssql sqlite].include?(ENV['DB'])
|
|
609
|
-
%i[format format_date].each do |method|
|
|
610
|
-
assert_equal 'Mon, 03 Mar 14', t(@lucas, @updated_at.send(method, '%a, %d %b %y'))
|
|
611
|
-
assert_equal 'Monday, 03 March 14', t(@lucas, @updated_at.send(method, '%A, %d %B %y'))
|
|
612
|
-
end
|
|
613
|
-
|
|
614
|
-
skip "#{ENV['DB']} does not support ALLCAPS month and day names" if ['mysql'].include?(ENV['DB'])
|
|
615
|
-
%i[format format_date].each do |method|
|
|
616
|
-
|
|
617
|
-
assert_equal 'Mon, 03 MAR 14', t(@lucas, @updated_at.send(method, '%a, %d %^b %y'))
|
|
618
|
-
assert_equal 'Monday, 03 MARCH 14', t(@lucas, @updated_at.send(method, '%A, %d %^B %y'))
|
|
619
|
-
end
|
|
620
|
-
end
|
|
621
|
-
|
|
622
|
-
def switch_to_lang(lang)
|
|
623
|
-
languages = {
|
|
624
|
-
'mssql' => {en: 'English', fr: 'French'},
|
|
625
|
-
'mysql' => {en: 'en_US', fr: 'fr_FR'},
|
|
626
|
-
'postgresql' => {en: 'en_US.utf8', fr: 'fr_FR.utf8'}
|
|
627
|
-
}
|
|
628
|
-
|
|
629
|
-
sql = {
|
|
630
|
-
'mssql' => ->(l) { "SET LANGUAGE #{l};" },
|
|
631
|
-
'mysql' => ->(l) { "SET lc_time_names = '#{l}';" },
|
|
632
|
-
'postgresql' => ->(l) { "SET lc_time to '#{l}';" }
|
|
633
|
-
}
|
|
634
|
-
|
|
635
|
-
User.connection.execute(sql[ENV['DB']][languages[ENV['DB']][lang]])
|
|
636
|
-
end
|
|
637
|
-
|
|
638
|
-
def test_format_date_with_names_and_lang_switch
|
|
639
|
-
skip "#{ENV['DB']} does not support word-based formatting for month and day names" if ['sqlite'].include?(ENV['DB'])
|
|
640
|
-
|
|
641
|
-
# the begin-rescue block is here to make sure we set the db back to en_US
|
|
642
|
-
# if we fail, so that other tests don't get contaminated.
|
|
643
|
-
#
|
|
644
|
-
# Tests should assert one single thing in principle, but until we
|
|
645
|
-
# refactor this whole thing, we'll have to do tricks of this sort.
|
|
646
|
-
%i[format format_date].each do |method|
|
|
647
|
-
begin
|
|
648
|
-
switch_to_lang(:en)
|
|
649
|
-
case ENV['DB']
|
|
650
|
-
when 'mysql', 'postgresql'
|
|
651
|
-
assert_equal 'Mon, 03 Mar 14', t(@lucas, @updated_at.send(method, '%a, %d %b %y'))
|
|
652
|
-
assert_equal 'Monday, 03 March 14', t(@lucas, @updated_at.send(method, '%A, %d %B %y'))
|
|
653
|
-
when 'mssql'
|
|
654
|
-
assert_equal 'Monday, 03 March 2014', t(@lucas, @updated_at.send(method, '%A, %d %B %y'))
|
|
655
|
-
end
|
|
656
|
-
switch_to_lang(:fr)
|
|
657
|
-
case ENV['DB']
|
|
658
|
-
when 'mysql'
|
|
659
|
-
assert_equal 'lun, 03 mar 14', t(@lucas, @updated_at.send(method, '%a, %d %b %y'))
|
|
660
|
-
assert_equal 'lundi, 03 mars 14', t(@lucas, @updated_at.send(method, '%A, %d %B %y'))
|
|
661
|
-
when 'postgresql'
|
|
662
|
-
assert_equal 'Lun., 03 Mars 14', t(@lucas, @updated_at.send(method, '%a, %d %b %y'))
|
|
663
|
-
assert_equal 'Lundi, 03 Mars 14', t(@lucas, @updated_at.send(method, '%A, %d %B %y'))
|
|
664
|
-
when 'mssql'
|
|
665
|
-
assert_equal 'lundi, 03 mars 2014', t(@lucas, @updated_at.send(method, '%A, %d %B %y'))
|
|
666
|
-
end
|
|
667
|
-
ensure
|
|
668
|
-
switch_to_lang(:en)
|
|
669
|
-
end
|
|
670
|
-
end
|
|
344
|
+
assert_equal '2016-05-23', t(@lucas, @created_at.format('%Y-%m-%d'))
|
|
345
|
+
skip "SQL Server does not accept any format" if @env_db == 'mssql'
|
|
346
|
+
assert_equal '2014/03/03 12:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S'))
|
|
671
347
|
end
|
|
672
348
|
|
|
673
349
|
def test_coalesce
|
|
674
|
-
assert_equal 'Camille concat', t(@camille, @name.coalesce(nil,
|
|
350
|
+
assert_equal 'Camille concat', t(@camille, @name.coalesce(nil, "default") + ' concat')
|
|
675
351
|
|
|
676
|
-
assert_equal 'toto', t(@test, @other.coalesce(
|
|
352
|
+
assert_equal 'toto', t(@test, @other.coalesce(""))
|
|
677
353
|
|
|
678
|
-
assert_equal ' ', t(@myung, @comments.coalesce(
|
|
679
|
-
assert_equal 'Laure', t(@laure, @comments.coalesce(
|
|
354
|
+
assert_equal ' ', t(@myung, @comments.coalesce("Myung").coalesce('ignored'))
|
|
355
|
+
assert_equal 'Laure', t(@laure, @comments.coalesce("Laure"))
|
|
680
356
|
if @env_db == 'oracle'
|
|
681
|
-
assert_nil t(@laure, @comments.coalesce(
|
|
682
|
-
assert_nil t(@camille, @other.coalesce(
|
|
357
|
+
assert_nil t(@laure, @comments.coalesce(""))
|
|
358
|
+
assert_nil t(@camille, @other.coalesce(""))
|
|
683
359
|
else
|
|
684
|
-
assert_equal('', t(@laure, @comments.coalesce(
|
|
685
|
-
assert_equal '', t(@camille, @other.coalesce(
|
|
360
|
+
assert_equal('', t(@laure, @comments.coalesce("")))
|
|
361
|
+
assert_equal '', t(@camille, @other.coalesce(""))
|
|
686
362
|
end
|
|
687
363
|
assert_equal 100, t(@test, @age.coalesce(100))
|
|
688
|
-
assert_equal
|
|
364
|
+
assert_equal "Camille", t(@camille, @name.coalesce(nil, "default"))
|
|
689
365
|
assert_equal 20, t(@test, @age.coalesce(nil, 20))
|
|
690
366
|
|
|
691
|
-
assert_equal 20, t(@test, @age.coalesce(10)
|
|
692
|
-
assert_equal 'Laure10', t(@laure, @comments.coalesce(
|
|
693
|
-
end
|
|
694
|
-
|
|
695
|
-
def test_coalesce_blank
|
|
696
|
-
assert_equal 'Myung', t(@myung, @comments.coalesce_blank('Myung').coalesce_blank('ignored'))
|
|
697
|
-
assert_equal 'Myung', t(@myung, @comments.coalesce_blank('', ' ', ' ').coalesce_blank('Myung'))
|
|
698
|
-
assert_equal 'Myung', t(@myung, @comments.coalesce_blank('', ' ', ' ', 'Myung'))
|
|
699
|
-
assert_equal '2016-05-23', t(@myung, @created_at.coalesce_blank(Date.new(2022, 1, 1)).format('%Y-%m-%d'))
|
|
700
|
-
assert_equal '2016-05-23', t(@myung, @created_at.coalesce_blank(Date.new(2022, 1, 1)).format_date('%Y-%m-%d'))
|
|
701
|
-
assert_equal 'Laure', t(@laure, @comments.coalesce_blank('Laure'))
|
|
702
|
-
assert_equal 100, t(@test, @age.coalesce_blank(100))
|
|
703
|
-
assert_equal 20, t(@test, @age.coalesce_blank(20))
|
|
704
|
-
assert_equal 20, t(@test, @age.coalesce_blank(10) + 10)
|
|
705
|
-
assert_equal 'Laure10', t(@laure, @comments.coalesce_blank('Laure') + 10)
|
|
706
|
-
|
|
707
|
-
skip 'mssql does not support null in case results' if @env_db == 'mssql'
|
|
708
|
-
|
|
709
|
-
assert_equal 'Camille concat', t(@camille, @name.coalesce_blank(Arel.null, 'default') + ' concat')
|
|
710
|
-
assert_equal 'Myung', t(@myung, @comments.coalesce_blank(Arel.null, 'Myung'))
|
|
711
|
-
assert_equal 'Camille', t(@camille, @name.coalesce_blank(Arel.null, 'default'))
|
|
367
|
+
assert_equal 20, t(@test, @age.coalesce(10)+10)
|
|
368
|
+
assert_equal 'Laure10', t(@laure, @comments.coalesce("Laure") + 10)
|
|
712
369
|
end
|
|
713
370
|
|
|
714
371
|
# Comparators
|
|
@@ -717,46 +374,37 @@ module ArelExtensions
|
|
|
717
374
|
assert_equal 2, User.where(@age <= 10).count
|
|
718
375
|
assert_equal 3, User.where(@age > 20).count
|
|
719
376
|
assert_equal 4, User.where(@age >= 20).count
|
|
720
|
-
assert_equal
|
|
377
|
+
assert_equal 1, User.where(@age > 5).where(@age < 20).count
|
|
721
378
|
end
|
|
722
379
|
|
|
723
380
|
def test_date_comparator
|
|
724
381
|
d = Date.new(2016, 5, 23)
|
|
725
382
|
assert_equal 0, User.where(@created_at < d).count
|
|
726
|
-
assert_equal
|
|
383
|
+
assert_equal 8, User.where(@created_at >= d).count
|
|
727
384
|
end
|
|
728
385
|
|
|
729
386
|
def test_date_duration
|
|
730
|
-
#
|
|
731
|
-
# activerecord will give it the current date.
|
|
732
|
-
#
|
|
733
|
-
# So depending on the month when we run this test, we will get different
|
|
734
|
-
# results for `User.where(@created_at.month.eq('05'))`.
|
|
735
|
-
count_for_may = Date.today.month == 5 ? 10 : 9
|
|
736
|
-
count_for_day = Date.today.day == 5 ? 1 : 0
|
|
737
|
-
|
|
738
|
-
# Year
|
|
387
|
+
#Year
|
|
739
388
|
assert_equal 2016, t(@lucas, @created_at.year).to_i
|
|
740
|
-
assert_equal 0, User.where(@created_at.year.eq(
|
|
741
|
-
#
|
|
389
|
+
assert_equal 0, User.where(@created_at.year.eq("2012")).count
|
|
390
|
+
#Month
|
|
742
391
|
assert_equal 5, t(@camille, @created_at.month).to_i
|
|
743
|
-
assert_equal
|
|
744
|
-
#
|
|
392
|
+
assert_equal 8, User.where(@created_at.month.eq("05")).count
|
|
393
|
+
#Week
|
|
745
394
|
assert_equal(@env_db == 'mssql' ? 22 : 21, t(@arthur, @created_at.week).to_i)
|
|
746
|
-
assert_equal
|
|
747
|
-
#
|
|
395
|
+
assert_equal 8, User.where(@created_at.month.eq("05")).count
|
|
396
|
+
#Day
|
|
748
397
|
assert_equal 23, t(@laure, @created_at.day).to_i
|
|
749
|
-
|
|
750
|
-
assert_equal count_for_day, User.where(@created_at.day.eq('05')).count
|
|
398
|
+
assert_equal 0, User.where(@created_at.day.eq("05")).count
|
|
751
399
|
|
|
752
|
-
#
|
|
753
|
-
#
|
|
400
|
+
#skip "manage DATE" if @env_db == 'oracle'
|
|
401
|
+
#Hour
|
|
754
402
|
assert_equal 0, t(@laure, @created_at.hour).to_i
|
|
755
403
|
assert_equal 12, t(@lucas, @updated_at.hour).to_i
|
|
756
|
-
#
|
|
404
|
+
#Minute
|
|
757
405
|
assert_equal 0, t(@laure, @created_at.minute).to_i
|
|
758
406
|
assert_equal 42, t(@lucas, @updated_at.minute).to_i
|
|
759
|
-
#
|
|
407
|
+
#Second
|
|
760
408
|
assert_equal 0, t(@laure, @created_at.second).to_i
|
|
761
409
|
assert_equal 0, t(@lucas, @updated_at.second).to_i
|
|
762
410
|
end
|
|
@@ -764,8 +412,8 @@ module ArelExtensions
|
|
|
764
412
|
def test_datetime_diff
|
|
765
413
|
assert_equal 0, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 42)).to_i
|
|
766
414
|
if @env_db == 'oracle' && Arel::VERSION.to_i > 6 # in rails 5, result is multiplied by 24*60*60 = 86400...
|
|
767
|
-
assert_equal 42 *
|
|
768
|
-
assert_equal(-3600 *
|
|
415
|
+
assert_equal 42 * 86400, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 41, 18)).to_i
|
|
416
|
+
assert_equal(-3600 * 86400, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 13, 42)).to_i)
|
|
769
417
|
else
|
|
770
418
|
assert_equal 42, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 41, 18)).to_i
|
|
771
419
|
assert_equal(-3600, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 13, 42)).to_i)
|
|
@@ -776,8 +424,7 @@ module ArelExtensions
|
|
|
776
424
|
end
|
|
777
425
|
end
|
|
778
426
|
|
|
779
|
-
|
|
780
|
-
skip 'not yet implemented' if $sqlite
|
|
427
|
+
skip "not yet implemented" if $sqlite
|
|
781
428
|
|
|
782
429
|
date1 = Date.new(2016, 5, 23)
|
|
783
430
|
durPos = 10.years
|
|
@@ -789,134 +436,106 @@ module ArelExtensions
|
|
|
789
436
|
|
|
790
437
|
datetime1 = Time.utc(2014, 3, 3, 12, 42, 0)
|
|
791
438
|
# Pull Request #5 tests
|
|
792
|
-
#
|
|
793
|
-
assert_includes [date2,
|
|
794
|
-
assert_includes [date3,
|
|
439
|
+
#puts (@created_at + durPos).cast(:date).to_sql
|
|
440
|
+
assert_includes [date2,"2026-05-23"], t(@test,(@created_at + durPos).cast(:date))
|
|
441
|
+
assert_includes [date3,"2006-05-23"], t(@test,(@created_at + durNeg).cast(:date))
|
|
795
442
|
|
|
796
|
-
#
|
|
797
|
-
assert_includes [date4,
|
|
798
|
-
#
|
|
799
|
-
assert_includes [date5,
|
|
443
|
+
#puts (@created_at + @created_at.day).cast(:date).to_sql
|
|
444
|
+
assert_includes [date4,"2016-06-15"], t(@test,(@created_at + @created_at.day).cast(:date))
|
|
445
|
+
#puts (@created_at - @created_at.day).cast(:date).to_sql
|
|
446
|
+
assert_includes [date5,"2016-04-30"], t(@test,(@created_at - @created_at.day).cast(:date))
|
|
800
447
|
|
|
801
|
-
assert_includes [datetime1 + 42.seconds,
|
|
802
|
-
assert_includes [datetime1 - 42.seconds,
|
|
448
|
+
assert_includes [datetime1 + 42.seconds,"2014-03-03 12:42:42 UTC"], t(@lucas,(@updated_at + @updated_at.minute))
|
|
449
|
+
assert_includes [datetime1 - 42.seconds,"2014-03-03 12:41:18 UTC"], t(@lucas,(@updated_at - @updated_at.minute))
|
|
803
450
|
|
|
804
451
|
# (@updated_at + Arel.duration('s',(@updated_at.hour*60 + @updated_at.minute))).to_sql
|
|
805
|
-
assert_includes [datetime1 + (12
|
|
806
|
-
|
|
452
|
+
assert_includes [datetime1 + (12*60+42).seconds,"2014-03-03 12:54:42 UTC"],
|
|
453
|
+
t(@lucas,(@updated_at + Arel.duration('s',(@updated_at.hour*60 + @updated_at.minute))))
|
|
807
454
|
|
|
808
|
-
assert_includes [datetime1 + (12
|
|
809
|
-
|
|
455
|
+
assert_includes [datetime1 + (12*60+42).minutes,"2014-03-04 01:24:00 UTC"],
|
|
456
|
+
t(@lucas,(@updated_at + Arel.duration('mn',(@updated_at.hour*60 + @updated_at.minute))))
|
|
810
457
|
|
|
811
|
-
assert_includes [
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
assert_includes ['2004-03-03'], t(@lucas, (@updated_at - durPos).format('%Y-%m-%d'))
|
|
815
|
-
assert_includes ['2004-03-03'], t(@lucas, (@updated_at - durPos).format_date('%Y-%m-%d'))
|
|
458
|
+
assert_includes ["2024-03-03"], t(@lucas,(@updated_at + durPos).format('%Y-%m-%d'))
|
|
459
|
+
#puts (@updated_at - durPos).to_sql
|
|
460
|
+
assert_includes ["2004-03-03"], t(@lucas,(@updated_at - durPos).format('%Y-%m-%d'))
|
|
816
461
|
|
|
817
462
|
|
|
818
463
|
# we test with the ruby object or the string because some adapters don't return an object Date
|
|
819
|
-
|
|
464
|
+
# end
|
|
820
465
|
end
|
|
821
466
|
|
|
822
467
|
# TODO; cast types
|
|
823
468
|
def test_cast_types
|
|
824
|
-
assert_equal
|
|
825
|
-
skip 'jdbc adapters does not work properly here (v52 works fine)' if RUBY_PLATFORM.match?(/java/i)
|
|
469
|
+
assert_equal "5", t(@lucas, @age.cast(:string))
|
|
826
470
|
if @env_db == 'mysql' || @env_db == 'postgresql' || @env_db == 'oracle' || @env_db == 'mssql'
|
|
827
|
-
assert_equal 1, t(@laure,
|
|
828
|
-
assert_equal 1, t(@laure,
|
|
829
|
-
assert_equal
|
|
830
|
-
assert_equal
|
|
831
|
-
assert_equal 21.16, t(@laure
|
|
832
|
-
assert_equal 21, t(@laure
|
|
833
|
-
|
|
834
|
-
assert_equal String, t(@lucas
|
|
835
|
-
|
|
836
|
-
assert_equal
|
|
837
|
-
assert_equal Time, t(@lucas
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
assert_equal
|
|
842
|
-
assert_equal
|
|
843
|
-
assert_equal Date.parse(
|
|
844
|
-
assert_equal
|
|
845
|
-
assert_equal Date.parse('2014-03-03'), t(@lucas, @updated_at.cast(:date))
|
|
846
|
-
assert_equal '12:42:00', t(@lucas, @updated_at.cast(:time).cast(:string)).split('.').first unless @env_db == 'oracle' # DateTime
|
|
847
|
-
end
|
|
848
|
-
end
|
|
849
|
-
|
|
850
|
-
def test_if_present
|
|
851
|
-
assert_nil t(@myung, @comments.if_present)
|
|
852
|
-
assert_equal 0, t(@myung, @comments.if_present.count)
|
|
853
|
-
assert_equal 20.16, t(@myung, @score.if_present)
|
|
854
|
-
assert_equal '2016-05-23', t(@myung, @created_at.if_present.format('%Y-%m-%d'))
|
|
855
|
-
assert_equal '2016-05-23', t(@myung, @created_at.if_present.format_date('%Y-%m-%d'))
|
|
856
|
-
assert_nil t(@laure, @comments.if_present)
|
|
857
|
-
|
|
858
|
-
assert_nil t(@nilly, @duration.if_present.format('%Y-%m-%d'))
|
|
859
|
-
assert_nil t(@nilly, @duration.if_present.format_date('%Y-%m-%d'))
|
|
860
|
-
|
|
861
|
-
# NOTE: here we're testing the capacity to format a nil value,
|
|
862
|
-
# however, @comments is a text field, and not a date/datetime field,
|
|
863
|
-
# so Postgres will rightfully complain when we format the text:
|
|
864
|
-
# we need to cast it first.
|
|
865
|
-
if @env_db == 'postgresql'
|
|
866
|
-
assert_nil t(@laure, @comments.cast(:date).if_present.format('%Y-%m-%d'))
|
|
867
|
-
assert_nil t(@laure, @comments.cast(:date).if_present.format_date('%Y-%m-%d'))
|
|
868
|
-
else
|
|
869
|
-
assert_nil t(@laure, @comments.if_present.format('%Y-%m-%d'))
|
|
870
|
-
assert_nil t(@laure, @comments.if_present.format_date('%Y-%m-%d'))
|
|
471
|
+
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'
|
|
472
|
+
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'
|
|
473
|
+
assert_equal "20.16", t(@laure,@score.cast(:string)).gsub(/[0]*\z/,'')
|
|
474
|
+
assert_equal "20.161", t(@laure,@score.cast(:string)+1).gsub(/[0]*1\z/,'1')
|
|
475
|
+
assert_equal 21.16, t(@laure,@score.cast(:string).cast(:decimal)+1)
|
|
476
|
+
assert_equal 21, t(@laure,@score.cast(:string).cast(:int)+1)
|
|
477
|
+
|
|
478
|
+
assert_equal String, t(@lucas,@updated_at.cast(:string)).class
|
|
479
|
+
assert_equal Date, t(@lucas,@updated_at.cast(:date)).class unless @env_db == 'oracle' # DateTime
|
|
480
|
+
assert_equal Time, t(@lucas,@updated_at.cast(:string).cast(:datetime)).class
|
|
481
|
+
assert_equal Time, t(@lucas,@updated_at.cast(:time)).class
|
|
482
|
+
|
|
483
|
+
assert_equal "2014-03-03 12:42:00", t(@lucas,@updated_at.cast(:string)) unless @env_db == 'mssql' #locale dependent
|
|
484
|
+
assert_equal Date.parse("2014-03-03"), t(@lucas,Arel::Nodes.build_quoted('2014-03-03').cast(:date))
|
|
485
|
+
assert_equal Date.parse("5014-03-03"), t(@lucas,(@age.cast(:string) + '014-03-03').cast(:date))
|
|
486
|
+
assert_equal Time.parse("2014-03-03 12:42:00 UTC"), t(@lucas,@updated_at.cast(:string).cast(:datetime))
|
|
487
|
+
assert_equal Date.parse("2014-03-03"), t(@lucas,@updated_at.cast(:date))
|
|
488
|
+
assert_equal "12:42:00", t(@lucas,@updated_at.cast(:time).cast(:string)).split('.').first unless @env_db == 'oracle' #DateTime
|
|
871
489
|
end
|
|
872
490
|
end
|
|
873
491
|
|
|
874
492
|
def test_is_null
|
|
875
|
-
#
|
|
876
|
-
#
|
|
877
|
-
#
|
|
878
|
-
#
|
|
879
|
-
#
|
|
880
|
-
assert_equal
|
|
493
|
+
#puts User.where(@age.is_null).select(@name).to_sql
|
|
494
|
+
#puts @age.is_null
|
|
495
|
+
#puts @age.is_null.inspect
|
|
496
|
+
#puts @age.is_null.to_sql
|
|
497
|
+
#puts @age=='34'
|
|
498
|
+
assert_equal "Test", User.select(@name).where(@age.is_null.to_sql).first.name
|
|
881
499
|
end
|
|
882
500
|
|
|
883
501
|
def test_math_plus
|
|
884
502
|
d = Date.new(1997, 6, 15)
|
|
885
|
-
#
|
|
886
|
-
assert_equal
|
|
887
|
-
assert_equal
|
|
888
|
-
assert_equal
|
|
889
|
-
assert_equal
|
|
890
|
-
assert_equal
|
|
891
|
-
assert_equal
|
|
892
|
-
assert_equal
|
|
893
|
-
assert_equal
|
|
894
|
-
#
|
|
895
|
-
assert_equal
|
|
896
|
-
#
|
|
503
|
+
#Concat String
|
|
504
|
+
assert_equal "SophiePhan", t(@sophie, @name + "Phan")
|
|
505
|
+
assert_equal "Sophie2", t(@sophie, @name + 2)
|
|
506
|
+
assert_equal "Sophie1997-06-15", t(@sophie, @name + d)
|
|
507
|
+
assert_equal "Sophie15", t(@sophie, @name + @age)
|
|
508
|
+
assert_equal "SophieSophie", t(@sophie, @name + @name)
|
|
509
|
+
assert_equal "SophieSophieSophie", t(@sophie, @name + @name + @name)
|
|
510
|
+
assert_equal "SophieSophieSophie", t(@sophie, @name.concat(@name.concat(@name)))
|
|
511
|
+
assert_equal "SophieSophieSophie", t(@sophie, @name.concat(@name).concat(@name))
|
|
512
|
+
#FIXME: should work as expected in Oracle
|
|
513
|
+
assert_equal "Sophie2016-05-23", t(@sophie, @name + @created_at) unless @env_db == 'oracle'
|
|
514
|
+
#concat Integer
|
|
897
515
|
assert_equal 1, User.where((@age + 10).eq(33)).count
|
|
898
|
-
assert_equal 1, User.where((@age +
|
|
516
|
+
assert_equal 1, User.where((@age + "1").eq(6)).count
|
|
899
517
|
assert_equal 1, User.where((@age + @age).eq(10)).count
|
|
900
|
-
#
|
|
901
|
-
#
|
|
902
|
-
assert_equal
|
|
903
|
-
assert_equal
|
|
518
|
+
#concat Date
|
|
519
|
+
#puts((User.arel_table[:created_at] + 1).as("res").to_sql.inspect)
|
|
520
|
+
assert_equal "2016-05-24", t(@myung, @created_at + 1).to_date.to_s
|
|
521
|
+
assert_equal "2016-05-25", t(@myung, @created_at + 2.day).to_date.to_s
|
|
904
522
|
end
|
|
905
523
|
|
|
524
|
+
|
|
906
525
|
def test_math_minus
|
|
907
526
|
d = Date.new(2016, 5, 20)
|
|
908
|
-
#
|
|
909
|
-
assert_equal
|
|
910
|
-
assert_equal 3, @laure.select((@created_at - d).as(
|
|
911
|
-
#
|
|
527
|
+
#Datediff
|
|
528
|
+
assert_equal 8, User.where((@created_at - @created_at).eq(0)).count
|
|
529
|
+
assert_equal 3, @laure.select((@created_at - d).as("res")).first.res.abs.to_i
|
|
530
|
+
#Substraction
|
|
912
531
|
assert_equal 0, User.where((@age - 10).eq(50)).count
|
|
913
|
-
assert_equal 0, User.where((@age -
|
|
532
|
+
assert_equal 0, User.where((@age - "10").eq(50)).count
|
|
914
533
|
# assert_equal 0, User.where((@age - 9.5).eq(50.5)).count # should work: TODO
|
|
915
|
-
assert_equal 0, User.where((@age -
|
|
534
|
+
assert_equal 0, User.where((@age - "9.5").eq(50.5)).count
|
|
916
535
|
end
|
|
917
536
|
|
|
918
537
|
def test_wday
|
|
919
|
-
#
|
|
538
|
+
#d = Date.new(2016, 6, 26)
|
|
920
539
|
assert_equal(@env_db == 'oracle' || @env_db == 'mssql' ? 2 : 1, t(@myung, @created_at.wday).to_i) # monday
|
|
921
540
|
end
|
|
922
541
|
|
|
@@ -935,8 +554,8 @@ module ArelExtensions
|
|
|
935
554
|
assert_equal 3, User.select('*').from((@ut.project(@age).where(@age.eq(20)) + @ut.project(@age).where(@age.eq(23)) + @ut.project(@age).where(@age.eq(21))).as('my_union')).length
|
|
936
555
|
assert_equal 2, User.select('*').from((@ut.project(@age).where(@age.eq(20)) + @ut.project(@age).where(@age.eq(20)) + @ut.project(@age).where(@age.eq(21))).as('my_union')).length
|
|
937
556
|
|
|
938
|
-
assert_equal 3, User.find_by_sql(@ut.project(@age).where(@age.gt(22)).union_all(@ut.project(@age).where(@age.lt(0))).to_sql).length
|
|
939
|
-
assert_equal 3, User.find_by_sql(@ut.project(@age).where(@age.eq(20)).union_all(@ut.project(@age).where(@age.eq(20))).union_all(@ut.project(@age).where(@age.eq(21))).to_sql).length
|
|
557
|
+
assert_equal 3, User.find_by_sql((@ut.project(@age).where(@age.gt(22)).union_all(@ut.project(@age).where(@age.lt(0)))).to_sql).length
|
|
558
|
+
assert_equal 3, User.find_by_sql((@ut.project(@age).where(@age.eq(20)).union_all(@ut.project(@age).where(@age.eq(20))).union_all(@ut.project(@age).where(@age.eq(21)))).to_sql).length
|
|
940
559
|
assert_equal 3, User.select('*').from((@ut.project(@age).where(@age.gt(22)).union_all(@ut.project(@age).where(@age.lt(0)))).as('my_union')).length
|
|
941
560
|
assert_equal 3, User.select('*').from((@ut.project(@age).where(@age.eq(20)).union_all(@ut.project(@age).where(@age.eq(23))).union_all(@ut.project(@age).where(@age.eq(21)))).as('my_union')).length
|
|
942
561
|
assert_equal 3, User.select('*').from((@ut.project(@age).where(@age.eq(20)).union_all(@ut.project(@age).where(@age.eq(20))).union_all(@ut.project(@age).where(@age.eq(21)))).as('my_union')).length
|
|
@@ -947,123 +566,116 @@ module ArelExtensions
|
|
|
947
566
|
# Case clause
|
|
948
567
|
def test_case
|
|
949
568
|
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)
|
|
950
|
-
assert_equal
|
|
951
|
-
assert_equal
|
|
952
|
-
assert_equal
|
|
953
|
-
assert_equal
|
|
954
|
-
assert_equal
|
|
955
|
-
assert_equal '65.621', t(@arthur, @score.when(65.62).then(@score.cast(:string)).else(@score.cast(:string)) + 1).tr('0', '') # tr is here because of precision on cast for some DBMS
|
|
569
|
+
assert_equal 2, t(@arthur, @score.when(65.62,1).else(0)+1)
|
|
570
|
+
assert_equal 0, t(@arthur, @score.when(65.62,1).else(0)-1)
|
|
571
|
+
assert_equal "11", t(@arthur, @score.when(65.62).then("1").else("0")+"1")
|
|
572
|
+
assert_equal 66.62, t(@arthur, @score.when(65.62).then(@score).else(@score)+1)
|
|
573
|
+
assert_equal "65.621", t(@arthur, @score.when(65.62).then(@score.cast(:string)).else(@score.cast(:string))+1).tr('0','') #tr is here because of precision on cast for some DBMS
|
|
956
574
|
end
|
|
957
575
|
|
|
958
576
|
def test_format_numbers
|
|
959
|
-
#
|
|
960
|
-
skip
|
|
961
|
-
|
|
962
|
-
assert_equal
|
|
963
|
-
assert_equal
|
|
964
|
-
assert_equal
|
|
965
|
-
assert_equal
|
|
966
|
-
assert_equal
|
|
967
|
-
assert_equal
|
|
968
|
-
assert_equal
|
|
969
|
-
assert_equal
|
|
970
|
-
assert_equal
|
|
971
|
-
assert_equal
|
|
972
|
-
assert_equal
|
|
973
|
-
assert_equal
|
|
974
|
-
assert_includes [
|
|
975
|
-
assert_includes [
|
|
976
|
-
assert_includes [
|
|
977
|
-
assert_equal
|
|
978
|
-
assert_equal
|
|
979
|
-
assert_equal
|
|
980
|
-
assert_equal
|
|
981
|
-
assert_equal
|
|
982
|
-
assert_equal
|
|
577
|
+
#score of Arthur = 65.62
|
|
578
|
+
skip " Works with SQLite if the version used knows printf" if $sqlite
|
|
579
|
+
|
|
580
|
+
assert_equal "Wrong Format" , t(@arthur, @score.format_number("$ %...234.6F €","fr_FR"))
|
|
581
|
+
assert_equal "AZERTY65,62" , t(@arthur, @score.format_number("AZERTY%.2f","fr_FR"))
|
|
582
|
+
assert_equal "65,62AZERTY" , t(@arthur, @score.format_number("%.2fAZERTY","fr_FR"))
|
|
583
|
+
assert_equal "$ 65.62 €" , t(@arthur, @score.format_number("$ %.2f €","en_US"))
|
|
584
|
+
assert_equal "$ 66 €" , t(@arthur, @score.format_number("$ %.0f €","en_US"))
|
|
585
|
+
assert_equal "$ 0065,62 €" , t(@arthur, @score.format_number("$ %07.2f €","fr_FR"))
|
|
586
|
+
assert_equal "$ 65,62 €" , t(@arthur, @score.format_number("$ %-07.2f €","fr_FR"))
|
|
587
|
+
assert_equal "$ 65,62 €" , t(@arthur, @score.format_number("$ %-7.2f €","fr_FR"))
|
|
588
|
+
assert_equal "$ 65,62 €" , t(@arthur, @score.format_number("$ % 7.2f €","fr_FR"))
|
|
589
|
+
assert_equal "$ 65,6 €" , t(@arthur, @score.format_number("$ % 7.1f €","fr_FR"))
|
|
590
|
+
assert_equal "$ +65,62 €" , t(@arthur, @score.format_number("$ % +7.2f €","fr_FR"))
|
|
591
|
+
assert_equal "$ +065,62 €" , t(@arthur, @score.format_number("$ %0+7.2f €","fr_FR"))
|
|
592
|
+
assert_includes ["$ 6,56e1 €","$ 6,56e+01 €"], t(@arthur, @score.format_number("$ %.2e €","fr_FR"))
|
|
593
|
+
assert_includes ["$ 6,56E1 €","$ 6,56E+01 €"], t(@arthur, @score.format_number("$ %.2E €","fr_FR"))
|
|
594
|
+
assert_includes ["$ 6,562E1 €","$ 6,562E+01 €"], t(@arthur, @score.format_number("$ %.3E €","fr_FR"))
|
|
595
|
+
assert_equal "123 456 765,6" , t(@arthur, (@score+123456700).format_number("%.1f","sv_SE")).gsub("\u00A0"," ") #some DBMS put no-break space here (it makes sense thus)
|
|
596
|
+
assert_equal "123456765,6" , t(@arthur, (@score+123456700).format_number("%.1f","fr_FR")).gsub("\u00A0","") #because SqlServer does it like no one else
|
|
597
|
+
assert_equal "123,456,765.6" , t(@arthur, (@score+123456700).format_number("%.1f","en_US"))
|
|
598
|
+
assert_equal " 123,456,765.6" , t(@arthur, (@score+123456700).format_number("%16.1f","en_US"))
|
|
599
|
+
assert_equal "$ 0,00 €" , t(@arthur, @score.when(65.62).then(Arel.sql("null")).else(1).format_number("$ %.2f €","fr_FR"))
|
|
600
|
+
assert_equal "$ 0,00 €" , t(@arthur, (@score-65.62).format_number("$ %.2f €","fr_FR"))
|
|
983
601
|
end
|
|
984
602
|
|
|
985
603
|
def test_accent_insensitive
|
|
986
|
-
skip
|
|
987
|
-
skip
|
|
604
|
+
skip "SQLite is natively Case Insensitive and Accent Sensitive" if $sqlite
|
|
605
|
+
skip "Not finished" if @env_db == 'mysql'
|
|
988
606
|
# actual comments value: "arrêté"
|
|
989
|
-
#
|
|
607
|
+
#AI & CI
|
|
990
608
|
if !['postgresql'].include?(@env_db) # Extension unaccent required on PG
|
|
991
|
-
assert_equal
|
|
992
|
-
assert_equal
|
|
993
|
-
assert_equal
|
|
994
|
-
assert_equal
|
|
995
|
-
assert_equal
|
|
996
|
-
assert_equal
|
|
997
|
-
#
|
|
998
|
-
assert_equal
|
|
999
|
-
assert_equal
|
|
1000
|
-
assert_equal
|
|
1001
|
-
assert_equal
|
|
1002
|
-
if
|
|
1003
|
-
assert_equal
|
|
1004
|
-
assert_equal
|
|
609
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("arrêté")).then("1").else("0"))
|
|
610
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("arrete")).then("1").else("0"))
|
|
611
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("àrrétè")).then("1").else("0"))
|
|
612
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("arretez")).then("1").else("0"))
|
|
613
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("Arrete")).then("1").else("0"))
|
|
614
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("Arrêté")).then("1").else("0"))
|
|
615
|
+
#AI & CS
|
|
616
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("arrêté")).then("1").else("0"))
|
|
617
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("arrete")).then("1").else("0"))
|
|
618
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("àrrétè")).then("1").else("0"))
|
|
619
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("arretez")).then("1").else("0"))
|
|
620
|
+
if !['oracle','postgresql','mysql'].include?(@env_db) # AI => CI
|
|
621
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("Arrete")).then("1").else("0"))
|
|
622
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("Arrêté")).then("1").else("0"))
|
|
1005
623
|
end
|
|
1006
624
|
end
|
|
1007
|
-
#
|
|
1008
|
-
assert_equal
|
|
625
|
+
#AS & CI
|
|
626
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("arrêté")).then("1").else("0"))
|
|
1009
627
|
if !['mysql'].include?(@env_db) # CI => AI in utf8 (AI not possible in latin1)
|
|
1010
|
-
assert_equal
|
|
1011
|
-
assert_equal
|
|
628
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("arrete")).then("1").else("0"))
|
|
629
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("àrrétè")).then("1").else("0"))
|
|
1012
630
|
end
|
|
1013
|
-
assert_equal
|
|
631
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("arretez")).then("1").else("0"))
|
|
1014
632
|
if !['mysql'].include?(@env_db) # CI => AI in utf8 (AI not possible in latin1)
|
|
1015
|
-
assert_equal
|
|
633
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("Arrete")).then("1").else("0"))
|
|
1016
634
|
end
|
|
1017
|
-
assert_equal
|
|
1018
|
-
#
|
|
1019
|
-
assert_equal
|
|
1020
|
-
assert_equal
|
|
1021
|
-
assert_equal
|
|
1022
|
-
assert_equal
|
|
1023
|
-
assert_equal
|
|
1024
|
-
assert_equal
|
|
635
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("Arrêté")).then("1").else("0"))
|
|
636
|
+
#AS & CS
|
|
637
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("arrêté")).then("1").else("0"))
|
|
638
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("arrete")).then("1").else("0"))
|
|
639
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("àrrétè")).then("1").else("0"))
|
|
640
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("arretez")).then("1").else("0"))
|
|
641
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("Arrete")).then("1").else("0"))
|
|
642
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("Arrêté")).then("1").else("0"))
|
|
1025
643
|
end
|
|
1026
644
|
|
|
1027
645
|
def test_subquery_with_order
|
|
1028
|
-
|
|
1029
|
-
assert_equal
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
# Sqlite and mssql are sensistive to the nil value in name, defined by @all_nil
|
|
1034
|
-
assert_equal 1, User.where(name: User.select(:name).order(:name).limit(2)).count
|
|
1035
|
-
elsif @env_db != 'mysql'
|
|
1036
|
-
# MySql can't have limit in IN subquery
|
|
1037
|
-
assert_equal 2, User.where(name: User.select(:name).order(:name).limit(2)).count
|
|
1038
|
-
# assert_equal 6, User.where(name: User.select(:name).order(:name).offset(2)).count
|
|
646
|
+
assert_equal 8, User.where(:name => User.select(:name).order(:name)).count
|
|
647
|
+
assert_equal 8, User.where(@ut[:name].in(@ut.project(@ut[:name]).order(@ut[:name]))).count
|
|
648
|
+
if !['mysql'].include?(@env_db) # MySql can't have limit in IN subquery
|
|
649
|
+
assert_equal 2, User.where(:name => User.select(:name).order(:name).limit(2)).count
|
|
650
|
+
#assert_equal 6, User.where(:name => User.select(:name).order(:name).offset(2)).count
|
|
1039
651
|
end
|
|
1040
652
|
end
|
|
1041
653
|
|
|
1042
654
|
def test_in_with_nil
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
655
|
+
assert_equal true , @myung.where(@age.in(1)).blank?
|
|
656
|
+
assert_equal false , @myung.where(@age.in(23)).blank?
|
|
657
|
+
assert_equal true , @myung.where(@age.in([1])).blank?
|
|
658
|
+
assert_equal true , @myung.where(@age.in([1,2])).blank?
|
|
659
|
+
assert_equal false , @myung.where(@age.in([1,23])).blank?
|
|
660
|
+
assert_equal true , @myung.where(@age.in(nil)).blank?
|
|
661
|
+
assert_equal true , @myung.where(@age.in([nil])).blank?
|
|
662
|
+
assert_equal true , @myung.where(@age.in([nil,1])).blank?
|
|
663
|
+
assert_equal false , @myung.where(@age.in([nil,23])).blank?
|
|
664
|
+
assert_equal true , @myung.where(@age.in([nil,1,2])).blank?
|
|
665
|
+
assert_equal false , @myung.where(@age.in([nil,1,23])).blank?
|
|
666
|
+
assert_equal true , @test.where(@age.in(1)).blank?
|
|
667
|
+
assert_equal true , @test.where(@age.in([1])).blank?
|
|
668
|
+
assert_equal true , @test.where(@age.in([1,2])).blank?
|
|
669
|
+
assert_equal false , @test.where(@age.in(nil)).blank?
|
|
670
|
+
assert_equal false , @test.where(@age.in([nil])).blank?
|
|
671
|
+
assert_equal false , @test.where(@age.in([nil,1])).blank?
|
|
672
|
+
assert_equal false , @test.where(@age.in([nil,1,2])).blank?
|
|
1061
673
|
end
|
|
1062
674
|
|
|
1063
675
|
def test_scope_with_in_plus_new
|
|
1064
676
|
begin
|
|
1065
|
-
@test.where(@age.in([1,
|
|
1066
|
-
@test.where(@age.not_in([1,
|
|
677
|
+
@test.where(@age.in([1,2])).new
|
|
678
|
+
@test.where(@age.not_in([1,2])).new
|
|
1067
679
|
assert true
|
|
1068
680
|
rescue
|
|
1069
681
|
assert false
|
|
@@ -1071,129 +683,114 @@ module ArelExtensions
|
|
|
1071
683
|
end
|
|
1072
684
|
|
|
1073
685
|
def test_is_not_null
|
|
1074
|
-
|
|
1075
|
-
|
|
686
|
+
assert_equal false , @myung.where(@age.is_not_null).blank?
|
|
687
|
+
assert_equal true , @test.where(@age.is_not_null).blank?
|
|
1076
688
|
end
|
|
1077
689
|
|
|
1078
690
|
def test_not_in_with_nil
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
#
|
|
1094
|
-
#
|
|
1095
|
-
#
|
|
1096
|
-
#
|
|
1097
|
-
#
|
|
1098
|
-
#
|
|
1099
|
-
#
|
|
1100
|
-
#
|
|
1101
|
-
end
|
|
1102
|
-
|
|
1103
|
-
def test_in_on_grouping
|
|
1104
|
-
skip 'We should modify the visitor of IN to make it work' if $sqlite || @env_db == 'mssql'
|
|
1105
|
-
assert_equal 2, User.where(Arel.tuple(@name, @age).in(Arel.tuple('Myung', 23), Arel.tuple('Arthur', 21))).count
|
|
1106
|
-
assert_equal 1, User.where(Arel.tuple(@name, @age).in(Arel.tuple('Myung', 23))).count
|
|
1107
|
-
assert_equal 0, User.where(Arel.tuple(@name, @age).in([])).count
|
|
691
|
+
assert_equal false , @myung.where(@age.not_in(1)).blank?
|
|
692
|
+
assert_equal true , @myung.where(@age.not_in(23)).blank?
|
|
693
|
+
assert_equal false , @myung.where(@age.not_in([1])).blank?
|
|
694
|
+
assert_equal false , @myung.where(@age.not_in([1,2])).blank?
|
|
695
|
+
assert_equal true , @myung.where(@age.not_in([1,23])).blank?
|
|
696
|
+
assert_equal false , @myung.where(@age.not_in(nil)).blank?
|
|
697
|
+
assert_equal false , @myung.where(@age.not_in([nil])).blank?
|
|
698
|
+
assert_equal false , @myung.where(@age.not_in([nil,1])).blank?
|
|
699
|
+
assert_equal true , @myung.where(@age.not_in([nil,23])).blank?
|
|
700
|
+
assert_equal false , @myung.where(@age.not_in([nil,1,2])).blank?
|
|
701
|
+
assert_equal true , @myung.where(@age.not_in([nil,1,23])).blank?
|
|
702
|
+
|
|
703
|
+
assert_equal false , @myung.where(@age.not_in(1..2)).blank?
|
|
704
|
+
|
|
705
|
+
#if the column is null, the entry will never be selected with not in (like every DBMS does)
|
|
706
|
+
#assert_equal false , @test.where(@age.not_in(1)).blank?
|
|
707
|
+
#assert_equal false , @test.where(@age.not_in([1])).blank?
|
|
708
|
+
#assert_equal false , @test.where(@age.not_in([1,2])).blank?
|
|
709
|
+
#assert_equal true , @test.where(@age.not_in(nil)).blank?
|
|
710
|
+
#assert_equal true , @test.where(@age.not_in([nil])).blank?
|
|
711
|
+
#assert_equal true , @test.where(@age.not_in([nil,1])).blank?
|
|
712
|
+
#assert_equal true , @test.where(@age.not_in([nil,1,2])).blank?
|
|
1108
713
|
end
|
|
1109
714
|
|
|
1110
715
|
def test_alias_shortened
|
|
1111
|
-
if
|
|
716
|
+
if ['postgresql','oracle'].include?(@env_db)
|
|
1112
717
|
new_alias = Arel.shorten('azerty' * 15)
|
|
1113
718
|
at = User.arel_table.alias('azerty' * 15)
|
|
1114
719
|
assert_equal "\"user_tests\" \"#{new_alias}\"".downcase, User.arel_table.alias('azerty' * 15).to_sql.downcase
|
|
1115
720
|
assert_equal '"user_tests" "u"'.downcase, User.arel_table.alias('u').to_sql.downcase
|
|
1116
|
-
assert_equal
|
|
1117
|
-
|
|
721
|
+
assert_equal %Q[SELECT "#{new_alias}"."id" FROM "user_tests" "#{new_alias}"].downcase,
|
|
722
|
+
User.select(at[:id]).from(at).to_sql.downcase
|
|
1118
723
|
end
|
|
1119
724
|
end
|
|
1120
725
|
|
|
1121
726
|
def test_stat_functions
|
|
1122
727
|
skip "SQLite doesn't work for most on this functions" if $sqlite
|
|
1123
|
-
#
|
|
1124
|
-
#
|
|
1125
|
-
#
|
|
1126
|
-
#
|
|
1127
|
-
#
|
|
1128
|
-
|
|
1129
|
-
assert ( 15.
|
|
1130
|
-
assert (
|
|
1131
|
-
assert (
|
|
1132
|
-
assert (
|
|
1133
|
-
assert (
|
|
1134
|
-
skip 'Not Yet Implemented' # if !['postgresql'].include?(@env_db)
|
|
1135
|
-
assert_equal 2, User.select(@score.std(group: Arel.when(@name > 'M').then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
|
|
1136
|
-
assert_equal 2, User.select(@score.variance(group: Arel.when(@name > 'M').then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
|
|
1137
|
-
assert_equal 2, User.select(@score.sum(group: Arel.when(@name > 'M').then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
|
|
1138
|
-
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
|
|
728
|
+
#puts t(User.where(nil), @score.average)
|
|
729
|
+
#puts t(User.where(nil), @score.variance(true))
|
|
730
|
+
#puts t(User.where(nil), @score.variance(false))
|
|
731
|
+
#puts t(User.where(nil), @score.std(true))
|
|
732
|
+
#puts t(User.where(nil), @score.std(false))
|
|
733
|
+
|
|
734
|
+
assert ( 15.98625 - t(User.where(nil), @score.average)).abs < 0.01
|
|
735
|
+
assert (613.75488 - t(User.where(nil), @score.variance)).abs < 0.01
|
|
736
|
+
assert ( 537.0355 - t(User.where(nil), @score.variance(false))).abs < 0.01
|
|
737
|
+
assert ( 24.77408 - t(User.where(nil), @score.std)).abs < 0.01
|
|
738
|
+
assert ( 23.17403 - t(User.where(nil), @score.std(false))).abs < 0.01
|
|
1139
739
|
end
|
|
1140
740
|
|
|
1141
741
|
def test_levenshtein_distance
|
|
1142
|
-
skip
|
|
1143
|
-
assert_equal 0, t(@arthur
|
|
1144
|
-
assert_equal 2, t(@arthur
|
|
1145
|
-
assert_equal 1, t(@arthur
|
|
742
|
+
skip "Not Yet Implemented" if $sqlite
|
|
743
|
+
assert_equal 0, t(@arthur,@name.levenshtein_distance("Arthur"))
|
|
744
|
+
assert_equal 2, t(@arthur,@name.levenshtein_distance("Artoor"))
|
|
745
|
+
assert_equal 1, t(@arthur,@name.levenshtein_distance("Artehur"))
|
|
1146
746
|
end
|
|
1147
747
|
|
|
1148
748
|
def test_json
|
|
1149
749
|
skip "Can't be tested on travis"
|
|
1150
|
-
#
|
|
1151
|
-
assert_equal 'Arthur', t(@arthur,
|
|
1152
|
-
assert_equal
|
|
1153
|
-
assert_equal ({
|
|
1154
|
-
assert_equal ({
|
|
1155
|
-
assert_equal [{
|
|
750
|
+
#creation
|
|
751
|
+
assert_equal 'Arthur', t(@arthur,Arel.json(@name))
|
|
752
|
+
assert_equal ["Arthur","Arthur"], parse_json(t(@arthur,Arel.json(@name,@name)))
|
|
753
|
+
assert_equal ({"Arthur" => "Arthur", "Arthur2" => "ArthurArthur"}), parse_json(t(@arthur,Arel.json({@name => @name,@name+"2" => @name+@name})))
|
|
754
|
+
assert_equal ({"Arthur" => "Arthur","Arthur2" => 1}), parse_json(t(@arthur,Arel.json({@name => @name,@name+"2" => 1})))
|
|
755
|
+
assert_equal ([{"age" => 21},{"name" => "Arthur","score" => 65.62}]), parse_json(t(@arthur,Arel.json([{age: @age},{name: @name,score: @score}])))
|
|
1156
756
|
|
|
1157
757
|
# aggregate
|
|
1158
|
-
assert_equal ({
|
|
1159
|
-
|
|
1160
|
-
assert_equal ({
|
|
1161
|
-
|
|
1162
|
-
assert_equal [{
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
#
|
|
1166
|
-
#
|
|
1167
|
-
|
|
1168
|
-
skip
|
|
1169
|
-
#
|
|
1170
|
-
h1 = Arel.json({@name => @name
|
|
1171
|
-
assert_equal
|
|
1172
|
-
h2 = Arel.json([{age: @age},
|
|
1173
|
-
assert_equal ({
|
|
1174
|
-
assert_equal 21, parse_json(t(@arthur,
|
|
1175
|
-
assert_nil t(@arthur,
|
|
1176
|
-
#
|
|
1177
|
-
assert_equal ({
|
|
1178
|
-
assert_equal ({
|
|
1179
|
-
assert_equal ({
|
|
1180
|
-
assert_equal ({
|
|
1181
|
-
#
|
|
1182
|
-
assert_equal ({
|
|
1183
|
-
assert_equal ({
|
|
1184
|
-
assert_equal ({
|
|
758
|
+
assert_equal ({"5" => "Lucas", "15" => "Sophie", "23" => "Myung", "25" => "Laure"}),
|
|
759
|
+
parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16),Arel.json({@age => @name}).group(false)))
|
|
760
|
+
assert_equal ({"5" => "Lucas", "15" => "Sophie", "23" => "Myung", "25" => "Laure", "Laure"=>25, "Lucas"=>5, "Myung"=>23, "Sophie"=>15}),
|
|
761
|
+
parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16),Arel.json({@age => @name,@name => @age}).group(false)))
|
|
762
|
+
assert_equal ([{"5" => "Lucas"},{ "15" => "Sophie"},{ "23" => "Myung"},{ "25" => "Laure"}]),
|
|
763
|
+
parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score),Arel.json({@age => @name}).group(true,[@age])))
|
|
764
|
+
|
|
765
|
+
#puts User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score,Arel.json({@age => @name}).group(true,[@age])).to_sql
|
|
766
|
+
#puts User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score,Arel.json({@age => @name}).group(true,[@age])).to_a
|
|
767
|
+
|
|
768
|
+
skip "Not Yet Implemented" if $sqlite || ['oracle','mssql'].include?(@env_db)
|
|
769
|
+
#get
|
|
770
|
+
h1 = Arel.json({@name => @name+@name,@name+"2" => 1})
|
|
771
|
+
assert_equal "ArthurArthur", parse_json(t(@arthur,h1.get(@name)))
|
|
772
|
+
h2 = Arel.json([{age: @age},{name: @name,score: @score}])
|
|
773
|
+
assert_equal ({"age" => 21}), parse_json(t(@arthur,h2.get(0)))
|
|
774
|
+
assert_equal 21, parse_json(t(@arthur,h2.get(0).get('age')))
|
|
775
|
+
assert_nil t(@arthur,h2.get('age'))
|
|
776
|
+
#set
|
|
777
|
+
assert_equal ({"Arthur" => ["toto", "tata"], "Arthur2" => 1}), parse_json(t(@arthur,h1.set(@name, ['toto','tata'])))
|
|
778
|
+
assert_equal ({"Arthur" => "ArthurArthur", "Arthur2" => 1, "Arthur3" => 2}), parse_json(t(@arthur,h1.set(@name+"3",2)))
|
|
779
|
+
assert_equal ({"Arthur" => "ArthurArthur", "Arthur2" => 1, "Arthur3" => nil}), parse_json(t(@arthur,h1.set(@name+"3",nil)))
|
|
780
|
+
assert_equal ({"Arthur" => "ArthurArthur", "Arthur2" => 1, "Arthur3" => {"a" => 2}}), parse_json(t(@arthur,h1.set(@name+"3",{a: 2})))
|
|
781
|
+
#merge
|
|
782
|
+
assert_equal ({"Arthur" => ["toto", "tata"], "Arthur2" => 1, "Arthur3" => 2}), parse_json(t(@arthur,h1.merge({@name => ['toto','tata']},{@name+"3" => 2})))
|
|
783
|
+
assert_equal ({"Arthur" => ["toto", "tata"], "Arthur2" => 1, "Arthur3" => 2}), parse_json(t(@arthur,h1.merge({@name => ['toto','tata'], @name+"3" => 2})))
|
|
784
|
+
assert_equal ({"Arthur" => "ArthurArthur","Arthur2" => 1}), parse_json(t(@arthur,h1.merge({})))
|
|
1185
785
|
end
|
|
1186
786
|
|
|
1187
787
|
def test_as_on_everything
|
|
1188
788
|
name = @arthur.select(@name.as('NaMe')).first.attributes
|
|
1189
|
-
assert_equal 'Arthur', name[
|
|
1190
|
-
assert_equal 'Arthur', @arthur.select(@name.as('Na Me')).first.attributes[
|
|
1191
|
-
assert_equal 'ArthurArthur', @arthur.select((@name
|
|
789
|
+
assert_equal 'Arthur', name["NaMe"] || name["name"] #because of Oracle
|
|
790
|
+
assert_equal 'Arthur', @arthur.select(@name.as('Na Me')).first.attributes["Na Me"]
|
|
791
|
+
assert_equal 'ArthurArthur', @arthur.select((@name+@name).as('Na-Me')).first.attributes["Na-Me"]
|
|
1192
792
|
end
|
|
1193
793
|
|
|
1194
|
-
def test_exists_in_subquery
|
|
1195
|
-
assert User.where(User.where(nil).arel.exists).first
|
|
1196
|
-
end
|
|
1197
794
|
end
|
|
1198
795
|
end
|
|
1199
796
|
end
|