arel_extensions 2.3.3 → 2.5.0
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/.github/workflows/ruby.yml +92 -43
- data/.gitignore +2 -1
- data/.rubocop.yml +131 -5
- data/Makefile +48 -0
- data/NEWS.md +22 -0
- data/README.md +32 -5
- data/Rakefile +5 -3
- data/arel_extensions.gemspec +3 -5
- data/dev/arelx.dockerfile +13 -16
- data/dev/compose.yaml +26 -28
- data/gemfiles/rails5.gemfile +15 -8
- data/gemfiles/rails5_1_4.gemfile +11 -9
- data/gemfiles/rails5_2.gemfile +16 -9
- data/gemfiles/rails6.gemfile +13 -7
- data/gemfiles/rails6_1.gemfile +13 -7
- data/gemfiles/rails7.gemfile +15 -9
- data/gemfiles/rails7_1.gemfile +15 -8
- data/gemfiles/rails7_2.gemfile +12 -6
- data/gemfiles/rails8.gemfile +40 -0
- data/gemfiles/rails8_1.gemfile +41 -0
- data/gemspecs/arel_extensions-v1.gemspec +3 -5
- data/gemspecs/arel_extensions-v2.gemspec +3 -5
- data/lib/arel_extensions/aliases.rb +3 -3
- data/lib/arel_extensions/attributes.rb +2 -0
- data/lib/arel_extensions/boolean_functions.rb +9 -7
- data/lib/arel_extensions/common_sql_functions.rb +5 -3
- data/lib/arel_extensions/comparators.rb +6 -4
- data/lib/arel_extensions/constants.rb +13 -0
- data/lib/arel_extensions/date_duration.rb +2 -0
- data/lib/arel_extensions/helpers.rb +18 -19
- data/lib/arel_extensions/insert_manager.rb +5 -1
- data/lib/arel_extensions/math.rb +40 -44
- data/lib/arel_extensions/math_functions.rb +29 -31
- data/lib/arel_extensions/nodes/aggregate_function.rb +4 -4
- data/lib/arel_extensions/nodes/blank.rb +6 -4
- data/lib/arel_extensions/nodes/byte_size.rb +11 -0
- data/lib/arel_extensions/nodes/case.rb +16 -13
- data/lib/arel_extensions/nodes/cast.rb +3 -5
- data/lib/arel_extensions/nodes/char_length.rb +11 -0
- data/lib/arel_extensions/nodes/coalesce.rb +1 -1
- data/lib/arel_extensions/nodes/collate.rb +1 -1
- data/lib/arel_extensions/nodes/concat.rb +6 -6
- data/lib/arel_extensions/nodes/date_diff.rb +40 -49
- data/lib/arel_extensions/nodes/duration.rb +2 -2
- data/lib/arel_extensions/nodes/format.rb +2 -2
- data/lib/arel_extensions/nodes/formatted_date.rb +2 -2
- data/lib/arel_extensions/nodes/formatted_number.rb +2 -2
- data/lib/arel_extensions/nodes/function.rb +7 -7
- data/lib/arel_extensions/nodes/is_null.rb +2 -0
- data/lib/arel_extensions/nodes/json.rb +27 -15
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +2 -2
- data/lib/arel_extensions/nodes/locate.rb +1 -1
- data/lib/arel_extensions/nodes/matches.rb +2 -2
- data/lib/arel_extensions/nodes/power.rb +2 -2
- data/lib/arel_extensions/nodes/rand.rb +2 -2
- data/lib/arel_extensions/nodes/repeat.rb +2 -2
- data/lib/arel_extensions/nodes/replace.rb +3 -3
- data/lib/arel_extensions/nodes/rollup.rb +4 -4
- data/lib/arel_extensions/nodes/round.rb +3 -3
- data/lib/arel_extensions/nodes/select.rb +1 -1
- data/lib/arel_extensions/nodes/std.rb +4 -4
- data/lib/arel_extensions/nodes/substring.rb +52 -2
- 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 +3 -3
- data/lib/arel_extensions/nodes/union_all.rb +3 -3
- data/lib/arel_extensions/nodes/wday.rb +2 -2
- data/lib/arel_extensions/null_functions.rb +5 -7
- data/lib/arel_extensions/predications.rb +23 -19
- data/lib/arel_extensions/string_functions.rb +37 -28
- data/lib/arel_extensions/version.rb +3 -1
- data/lib/arel_extensions/visitors/convert_format.rb +2 -2
- data/lib/arel_extensions/visitors/ibm_db.rb +5 -5
- data/lib/arel_extensions/visitors/mssql.rb +111 -97
- data/lib/arel_extensions/visitors/mysql.rb +101 -67
- data/lib/arel_extensions/visitors/oracle.rb +113 -103
- data/lib/arel_extensions/visitors/oracle12.rb +5 -6
- data/lib/arel_extensions/visitors/postgresql.rb +119 -92
- data/lib/arel_extensions/visitors/sqlite.rb +72 -64
- data/lib/arel_extensions/visitors/to_sql.rb +85 -75
- data/lib/arel_extensions/visitors.rb +7 -7
- data/lib/arel_extensions/warning.rb +5 -5
- data/lib/arel_extensions.rb +47 -31
- data/test/arelx_test_helper.rb +8 -6
- data/test/config_loader.rb +9 -0
- data/test/database.yml +8 -6
- data/test/real_db_test.rb +33 -33
- data/test/support/fake_record.rb +3 -1
- data/test/visitors/test_bulk_insert_oracle.rb +2 -2
- data/test/visitors/test_bulk_insert_sqlite.rb +2 -2
- data/test/visitors/test_to_sql.rb +2 -2
- data/test/with_ar/all_agnostic_test.rb +214 -32
- data/test/with_ar/insert_agnostic_test.rb +2 -2
- data/test/with_ar/test_bulk_sqlite.rb +2 -2
- data/test/with_ar/test_math_sqlite.rb +2 -2
- data/test/with_ar/test_string_mysql.rb +2 -2
- data/test/with_ar/test_string_sqlite.rb +2 -2
- data/version_v1.rb +3 -1
- data/version_v2.rb +3 -1
- metadata +9 -33
- data/bin/compose +0 -6
- data/gemfiles/rails3.gemfile +0 -20
- data/gemfiles/rails4_2.gemfile +0 -38
data/lib/arel_extensions.rb
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'arel'
|
|
4
|
+
require 'arel_extensions/constants'
|
|
2
5
|
require 'base64'
|
|
3
6
|
|
|
4
7
|
require 'arel_extensions/railtie' if defined?(Rails::Railtie)
|
|
@@ -17,9 +20,9 @@ class Arel::Nodes::Casted
|
|
|
17
20
|
include Arel::AliasPredication
|
|
18
21
|
|
|
19
22
|
# They forget to define hash.
|
|
20
|
-
if
|
|
23
|
+
if ArelExtensions::AREL_VERSION < ArelExtensions::V10
|
|
21
24
|
def hash
|
|
22
|
-
[self.class,
|
|
25
|
+
[self.class, val, attribute].hash
|
|
23
26
|
end
|
|
24
27
|
end
|
|
25
28
|
end
|
|
@@ -35,8 +38,8 @@ class Arel::Nodes::Grouping
|
|
|
35
38
|
end
|
|
36
39
|
|
|
37
40
|
class Arel::Nodes::Ordering
|
|
38
|
-
def eql?
|
|
39
|
-
|
|
41
|
+
def eql?(other)
|
|
42
|
+
hash.eql? other.hash
|
|
40
43
|
end
|
|
41
44
|
end
|
|
42
45
|
|
|
@@ -45,7 +48,7 @@ class Arel::Nodes::Function
|
|
|
45
48
|
include Arel::Expressions
|
|
46
49
|
end
|
|
47
50
|
|
|
48
|
-
if
|
|
51
|
+
if ArelExtensions::AREL_VERSION >= ArelExtensions::V7_1
|
|
49
52
|
class Arel::Nodes::Case
|
|
50
53
|
include Arel::Math
|
|
51
54
|
include Arel::Expressions
|
|
@@ -87,7 +90,7 @@ require 'arel_extensions/nodes/select'
|
|
|
87
90
|
# adapter behave differently. It doesn't always proc, so we added this for
|
|
88
91
|
# coverage.
|
|
89
92
|
if defined?(Arel::Visitors::SQLServer)
|
|
90
|
-
Arel::Visitors.const_set(
|
|
93
|
+
Arel::Visitors.const_set(:MSSQL, Arel::Visitors::SQLServer)
|
|
91
94
|
require 'arel_extensions/visitors/mssql'
|
|
92
95
|
class Arel::Visitors::SQLServer
|
|
93
96
|
include ArelExtensions::Visitors::MSSQL
|
|
@@ -95,11 +98,11 @@ if defined?(Arel::Visitors::SQLServer)
|
|
|
95
98
|
end
|
|
96
99
|
|
|
97
100
|
module Arel
|
|
98
|
-
def self.column_of
|
|
101
|
+
def self.column_of(table_name, column_name)
|
|
99
102
|
ArelExtensions.column_of(table_name, column_name)
|
|
100
103
|
end
|
|
101
104
|
|
|
102
|
-
def self.duration
|
|
105
|
+
def self.duration(s, expr)
|
|
103
106
|
ArelExtensions::Nodes::Duration.new("#{s}i", expr)
|
|
104
107
|
end
|
|
105
108
|
|
|
@@ -108,11 +111,11 @@ module Arel
|
|
|
108
111
|
Arel::Nodes::Equality.new(1, 0)
|
|
109
112
|
end
|
|
110
113
|
|
|
111
|
-
def self.grouping
|
|
114
|
+
def self.grouping(*v)
|
|
112
115
|
Arel::Nodes::Grouping.new(*v)
|
|
113
116
|
end
|
|
114
117
|
|
|
115
|
-
def self.json
|
|
118
|
+
def self.json(*expr)
|
|
116
119
|
ArelExtensions::Nodes::Json.new(
|
|
117
120
|
if expr.length == 1
|
|
118
121
|
expr.first
|
|
@@ -147,7 +150,7 @@ module Arel
|
|
|
147
150
|
Arel.quoted(nil)
|
|
148
151
|
end
|
|
149
152
|
|
|
150
|
-
def self.quoted
|
|
153
|
+
def self.quoted(*args)
|
|
151
154
|
Arel::Nodes.build_quoted(*args)
|
|
152
155
|
end
|
|
153
156
|
|
|
@@ -159,7 +162,7 @@ module Arel
|
|
|
159
162
|
Arel::Nodes::RollUp.new(args)
|
|
160
163
|
end
|
|
161
164
|
|
|
162
|
-
def self.shorten
|
|
165
|
+
def self.shorten(s)
|
|
163
166
|
Base64.urlsafe_encode64(Digest::MD5.new.digest(s)).tr('=', '').tr('-', '_')
|
|
164
167
|
end
|
|
165
168
|
|
|
@@ -168,9 +171,9 @@ module Arel
|
|
|
168
171
|
Arel::Nodes::Equality.new(1, 1)
|
|
169
172
|
end
|
|
170
173
|
|
|
171
|
-
def self.tuple
|
|
174
|
+
def self.tuple(*v)
|
|
172
175
|
tmp = Arel.grouping(nil)
|
|
173
|
-
Arel.grouping
|
|
176
|
+
Arel.grouping(v.map { |e| tmp.convert_to_node(e) })
|
|
174
177
|
end
|
|
175
178
|
|
|
176
179
|
# For instance
|
|
@@ -178,7 +181,7 @@ module Arel
|
|
|
178
181
|
# ```
|
|
179
182
|
# Arel.when(at[field].is_null).then(0).else(1)
|
|
180
183
|
# ```
|
|
181
|
-
def self.when
|
|
184
|
+
def self.when(condition)
|
|
182
185
|
ArelExtensions::Nodes::Case.new.when(condition)
|
|
183
186
|
end
|
|
184
187
|
end
|
|
@@ -199,12 +202,20 @@ class Arel::Nodes::Function
|
|
|
199
202
|
include ArelExtensions::NullFunctions
|
|
200
203
|
include ArelExtensions::Predications
|
|
201
204
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
205
|
+
if ArelExtensions::ACTIVE_RECORD_VERSION >= ArelExtensions::V8_1
|
|
206
|
+
attr_accessor :alias
|
|
207
|
+
alias old_initialize initialize
|
|
208
|
+
|
|
209
|
+
def initialize(expr, aliaz = nil)
|
|
210
|
+
old_initialize(expr)
|
|
211
|
+
self.alias = aliaz
|
|
207
212
|
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
alias old_as as rescue nil
|
|
216
|
+
def as(other)
|
|
217
|
+
res = Arel::Nodes::As.new(clone, Arel.sql(other))
|
|
218
|
+
self.alias = Arel.sql(other)
|
|
208
219
|
res
|
|
209
220
|
end
|
|
210
221
|
end
|
|
@@ -225,7 +236,8 @@ class Arel::Nodes::Unary
|
|
|
225
236
|
include ArelExtensions::MathFunctions
|
|
226
237
|
include ArelExtensions::Comparators
|
|
227
238
|
include ArelExtensions::Predications
|
|
228
|
-
|
|
239
|
+
|
|
240
|
+
def eql?(other)
|
|
229
241
|
hash == other.hash
|
|
230
242
|
end
|
|
231
243
|
end
|
|
@@ -237,7 +249,8 @@ class Arel::Nodes::Binary
|
|
|
237
249
|
include ArelExtensions::Comparators
|
|
238
250
|
include ArelExtensions::BooleanFunctions
|
|
239
251
|
include ArelExtensions::Predications
|
|
240
|
-
|
|
252
|
+
|
|
253
|
+
def eql?(other)
|
|
241
254
|
hash == other.hash
|
|
242
255
|
end
|
|
243
256
|
end
|
|
@@ -258,12 +271,12 @@ class Arel::SelectManager
|
|
|
258
271
|
include ArelExtensions::Nodes
|
|
259
272
|
|
|
260
273
|
remove_method(:as) if method_defined?(:as)
|
|
261
|
-
def as
|
|
274
|
+
def as(table_name)
|
|
262
275
|
Arel::Nodes::TableAlias.new(self, table_name)
|
|
263
276
|
end
|
|
264
277
|
|
|
265
278
|
# Install an alias, if present.
|
|
266
|
-
def xas
|
|
279
|
+
def xas(table_name)
|
|
267
280
|
if table_name.present?
|
|
268
281
|
as table_name
|
|
269
282
|
else
|
|
@@ -277,12 +290,12 @@ class Arel::Nodes::As
|
|
|
277
290
|
end
|
|
278
291
|
|
|
279
292
|
class Arel::Table
|
|
280
|
-
|
|
293
|
+
alias old_alias alias rescue nil
|
|
281
294
|
|
|
282
295
|
# activerecord 7.1 removed the alias. We might need to remove our dependency
|
|
283
296
|
# on the alias if it proves problematic.
|
|
284
|
-
if !
|
|
285
|
-
alias
|
|
297
|
+
if !respond_to?(:table_name)
|
|
298
|
+
alias table_name name
|
|
286
299
|
end
|
|
287
300
|
|
|
288
301
|
def alias(name = "#{self.name}_2")
|
|
@@ -297,14 +310,17 @@ end
|
|
|
297
310
|
class Arel::Nodes::TableAlias
|
|
298
311
|
def method_missing(*args)
|
|
299
312
|
met = args.shift.to_sym
|
|
300
|
-
if
|
|
301
|
-
|
|
313
|
+
if relation.respond_to?(met)
|
|
314
|
+
relation.send(met, args)
|
|
302
315
|
else
|
|
303
316
|
super(met, *args)
|
|
304
317
|
end
|
|
305
318
|
end
|
|
306
|
-
end
|
|
307
319
|
|
|
320
|
+
def respond_to_missing?(method_name, include_private = false)
|
|
321
|
+
relation.respond_to?(method_name) || super
|
|
322
|
+
end
|
|
323
|
+
end
|
|
308
324
|
|
|
309
325
|
class Arel::Attributes::Attribute
|
|
310
326
|
def to_sql(engine = Arel::Table.engine)
|
|
@@ -325,7 +341,7 @@ class Arel::Nodes::Node
|
|
|
325
341
|
end
|
|
326
342
|
|
|
327
343
|
require 'active_record'
|
|
328
|
-
if
|
|
344
|
+
if ArelExtensions::ACTIVE_RECORD_VERSION >= ArelExtensions::V7_2
|
|
329
345
|
class ActiveRecord::Relation::WhereClause
|
|
330
346
|
def except_predicates(columns)
|
|
331
347
|
attrs = columns.extract! { |node| node.is_a?(Arel::Attribute) }
|
data/test/arelx_test_helper.rb
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
require 'rubygems'
|
|
2
|
-
require 'minitest/autorun'
|
|
3
|
-
require 'fileutils'
|
|
4
|
-
require 'arel'
|
|
5
1
|
require 'active_record'
|
|
6
|
-
|
|
2
|
+
require 'arel'
|
|
3
|
+
require 'arel_extensions/constants'
|
|
4
|
+
require 'fileutils'
|
|
5
|
+
require 'minitest/autorun'
|
|
6
|
+
require 'rubygems'
|
|
7
7
|
require 'support/fake_record'
|
|
8
8
|
|
|
9
|
+
require_relative './config_loader'
|
|
10
|
+
|
|
9
11
|
ENV['AREL_EXTENSIONS_IN_TEST'] = '1' # Useful for deprecation warnings.
|
|
10
12
|
|
|
11
13
|
def colored(color, msg)
|
|
@@ -59,7 +61,7 @@ end
|
|
|
59
61
|
|
|
60
62
|
|
|
61
63
|
def load_lib(gems)
|
|
62
|
-
if gems && (RUBY_PLATFORM == 'java' ||
|
|
64
|
+
if gems && (RUBY_PLATFORM == 'java' || ArelExtensions::AREL_VERSION > ArelExtensions::V9_0)
|
|
63
65
|
gems.each do |gem|
|
|
64
66
|
begin
|
|
65
67
|
require gem
|
data/test/database.yml
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# Updated to use ENV vars mapped in compose.yml
|
|
1
2
|
sqlite:
|
|
2
3
|
adapter: sqlite3
|
|
3
4
|
database: ":memory:"
|
|
@@ -10,27 +11,28 @@ mysql:
|
|
|
10
11
|
adapter: mysql2
|
|
11
12
|
database: arelx_test
|
|
12
13
|
username: root
|
|
13
|
-
host: 127.0.0.1
|
|
14
|
+
host: <%= ENV.fetch('MYSQL_HOST', '127.0.0.1') %>
|
|
14
15
|
port: 3306
|
|
15
|
-
encoding:
|
|
16
|
+
encoding: utf8mb4
|
|
16
17
|
jdbc-mysql:
|
|
17
18
|
adapter: jdbcmysql
|
|
18
19
|
database: arelx_test
|
|
19
20
|
username: root
|
|
20
|
-
encoding:
|
|
21
|
+
encoding: utf8mb4
|
|
22
|
+
host: <%= ENV.fetch('MYSQL_HOST', '127.0.0.1') %>
|
|
21
23
|
postgresql:
|
|
22
24
|
adapter: postgresql
|
|
23
25
|
database: arelx_test
|
|
24
26
|
username: postgres
|
|
25
27
|
password: secret
|
|
26
|
-
host: 127.0.0.1
|
|
28
|
+
host: <%= ENV.fetch('POSTGRES_HOST', '127.0.0.1') %>
|
|
27
29
|
port: 5432
|
|
28
30
|
jdbc-postgresql:
|
|
29
31
|
adapter: jdbcpostgresql
|
|
30
32
|
database: arelx_test
|
|
31
33
|
username: postgres
|
|
32
34
|
password: secret
|
|
33
|
-
host: 127.0.0.1
|
|
35
|
+
host: <%= ENV.fetch('POSTGRES_HOST', '127.0.0.1') %>
|
|
34
36
|
port: 5432
|
|
35
37
|
oracle:
|
|
36
38
|
adapter: oracle_enhanced
|
|
@@ -48,7 +50,7 @@ ibm_db:
|
|
|
48
50
|
database: arelx_test
|
|
49
51
|
mssql:
|
|
50
52
|
adapter: sqlserver
|
|
51
|
-
host: localhost
|
|
53
|
+
host: <%= ENV.fetch('MSSQL_HOST', 'localhost') %>
|
|
52
54
|
database: master
|
|
53
55
|
username: sa
|
|
54
56
|
password: Password12!
|
data/test/real_db_test.rb
CHANGED
|
@@ -6,9 +6,9 @@ $:.unshift "#{File.dirname(__FILE__)}../../lib"
|
|
|
6
6
|
require 'arel_extensions'
|
|
7
7
|
|
|
8
8
|
def setup_db
|
|
9
|
-
ActiveRecord::Base.configurations =
|
|
9
|
+
ActiveRecord::Base.configurations = ConfigLoader.load('test/database.yml')
|
|
10
10
|
ActiveRecord::Base.establish_connection(ENV['DB'].try(:to_sym) || (RUBY_PLATFORM == 'java' ? :"jdbc-sqlite" : :sqlite))
|
|
11
|
-
if
|
|
11
|
+
if ACTIVE_RECORD_VERSION >= V7_0
|
|
12
12
|
ActiveRecord.default_timezone = :utc
|
|
13
13
|
else
|
|
14
14
|
ActiveRecord::Base.default_timezone = :utc
|
|
@@ -72,24 +72,24 @@ class ListTest < Minitest::Test
|
|
|
72
72
|
end
|
|
73
73
|
|
|
74
74
|
def test_abs
|
|
75
|
-
assert_equal 0, User.where(User.arel_table[:name].eq('Negatif')).select(
|
|
76
|
-
assert_equal 14, User.where(User.arel_table[:name].eq('Laure')).select((
|
|
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
|
|
77
77
|
end
|
|
78
78
|
|
|
79
79
|
def test_ceil
|
|
80
80
|
if !$sqlite || !$load_extension_disabled
|
|
81
|
-
assert_equal 1, User.where(User.arel_table[:name].eq('Negatif')).select(
|
|
82
|
-
assert_equal 66, User.where(User.arel_table[:name].eq('Arthur')).select(
|
|
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
|
|
83
83
|
end
|
|
84
84
|
end
|
|
85
85
|
|
|
86
86
|
def test_coalesce
|
|
87
87
|
if /pgsql/i.match?(@cnx.adapter_name)
|
|
88
|
-
assert_equal 100, User.where(User.arel_table[:name].eq('Test')).select(
|
|
89
|
-
assert_equal 'Camille', User.where(User.arel_table[:name].eq('Camille')).select(
|
|
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
|
|
90
90
|
else
|
|
91
|
-
assert_equal 'Camille', User.where(User.arel_table[:name].eq('Camille')).select(
|
|
92
|
-
assert_equal 20, User.where(User.arel_table[:name].eq('Test')).select(
|
|
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
|
|
93
93
|
end
|
|
94
94
|
end
|
|
95
95
|
|
|
@@ -115,45 +115,45 @@ class ListTest < Minitest::Test
|
|
|
115
115
|
|
|
116
116
|
def test_date_duration
|
|
117
117
|
# Year
|
|
118
|
-
assert_equal 2016, User.where(User.arel_table[:name].eq('Lucas')).select(
|
|
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
119
|
assert_equal 0, User.where(User.arel_table[:created_at].year.eq('2012')).count
|
|
120
120
|
# Month
|
|
121
|
-
assert_equal 5, User.where(User.arel_table[:name].eq('Camille')).select(
|
|
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
122
|
assert_equal 8, User.where(User.arel_table[:created_at].month.eq('05')).count
|
|
123
123
|
# Week
|
|
124
|
-
assert_equal 21, User.where(User.arel_table[:name].eq('Arthur')).select(
|
|
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
125
|
assert_equal 8, User.where(User.arel_table[:created_at].month.eq('05')).count
|
|
126
126
|
# Day
|
|
127
|
-
assert_equal 23, User.where(User.arel_table[:name].eq('Laure')).select(
|
|
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
128
|
assert_equal 0, User.where(User.arel_table[:created_at].day.eq('05')).count
|
|
129
129
|
end
|
|
130
130
|
|
|
131
131
|
def test_length
|
|
132
|
-
assert_equal 7, User.where(User.arel_table[:name].eq('Camille')).select(
|
|
133
|
-
assert_equal 5, User.where(User.arel_table[:name].eq('Laure')).select(
|
|
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
|
|
134
134
|
end
|
|
135
135
|
|
|
136
136
|
def test_locate
|
|
137
137
|
if !$sqlite || !$load_extension_disabled
|
|
138
|
-
assert_equal 1, User.where(User.arel_table[:name].eq('Camille')).select(
|
|
139
|
-
assert_equal 0, User.where(User.arel_table[:name].eq('Lucas')).select(
|
|
140
|
-
assert_equal 5, User.where(User.arel_table[:name].eq('Lucas')).select(
|
|
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
|
|
141
141
|
end
|
|
142
142
|
end
|
|
143
143
|
|
|
144
144
|
def test_isnull
|
|
145
145
|
if /pgsql/i.match?(ActiveRecord::Base.connection.adapter_name)
|
|
146
|
-
assert_equal 100, User.where(User.arel_table[:name].eq('Test')).select(
|
|
146
|
+
assert_equal 100, User.where(User.arel_table[:name].eq('Test')).select(User.arel_table[:age].isnull(100).as('res')).first.res
|
|
147
147
|
else
|
|
148
|
-
assert_equal 'default', User.where(User.arel_table[:name].eq('Test')).select(
|
|
149
|
-
assert_equal 'Test', User.where(
|
|
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
|
|
150
150
|
end
|
|
151
151
|
end
|
|
152
152
|
|
|
153
153
|
def test_floor
|
|
154
154
|
if !$sqlite || !$load_extension_disabled
|
|
155
|
-
assert_equal 0, User.where(User.arel_table[:name].eq('Negatif')).select(
|
|
156
|
-
assert_equal 65, User.where(User.arel_table[:name].eq('Arthur')).select(
|
|
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
|
|
157
157
|
end
|
|
158
158
|
end
|
|
159
159
|
|
|
@@ -210,19 +210,19 @@ class ListTest < Minitest::Test
|
|
|
210
210
|
end
|
|
211
211
|
|
|
212
212
|
def test_replace
|
|
213
|
-
assert_equal 'LucaX', User.where(User.arel_table[:name].eq('Lucas')).select(
|
|
214
|
-
assert_equal 'replace', User.where(User.arel_table[:name].eq('Lucas')).select(
|
|
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
|
|
215
215
|
end
|
|
216
216
|
|
|
217
217
|
def test_round
|
|
218
|
-
assert_equal 1, User.where(
|
|
219
|
-
assert_equal 0, User.where(
|
|
218
|
+
assert_equal 1, User.where(User.arel_table[:age].round(0).eq(5.0)).count
|
|
219
|
+
assert_equal 0, User.where(User.arel_table[:age].round(-1).eq(6.0)).count
|
|
220
220
|
end
|
|
221
221
|
|
|
222
222
|
def test_Soundex
|
|
223
223
|
if !$sqlite || !$load_extension_disabled
|
|
224
|
-
assert_equal 'C540', User.where(User.arel_table[:name].eq('Camille')).select(
|
|
225
|
-
assert_equal 8, User.where(
|
|
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
|
|
226
226
|
end
|
|
227
227
|
end
|
|
228
228
|
|
|
@@ -230,8 +230,8 @@ class ListTest < Minitest::Test
|
|
|
230
230
|
# .take(50) because of limit by ORDER BY
|
|
231
231
|
assert_equal 110, User.select((User.arel_table[:age].sum + 1).as('res')).take(50).first.res
|
|
232
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((
|
|
234
|
-
assert_equal 2245, User.select((
|
|
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
|
|
235
235
|
end
|
|
236
236
|
|
|
237
237
|
def test_trim
|
|
@@ -244,7 +244,7 @@ class ListTest < Minitest::Test
|
|
|
244
244
|
|
|
245
245
|
def test_wday
|
|
246
246
|
d = Date.new(2016, 06, 26)
|
|
247
|
-
assert_equal 1, User.where(User.arel_table[:name].eq('Myung')).select(
|
|
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
248
|
assert_equal 0, User.select(d.wday).as('res').first.to_i
|
|
249
249
|
end
|
|
250
250
|
end
|
data/test/support/fake_record.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require 'arel_extensions/constants'
|
|
2
|
+
|
|
1
3
|
module FakeRecord
|
|
2
4
|
class Column < Struct.new(:name, :type)
|
|
3
5
|
end
|
|
@@ -146,7 +148,7 @@ module FakeRecord
|
|
|
146
148
|
connection_pool.connection
|
|
147
149
|
end
|
|
148
150
|
|
|
149
|
-
if
|
|
151
|
+
if ArelExtensions::ACTIVE_RECORD_VERSION >= ArelExtensions::V7_2
|
|
150
152
|
def with_connection(*args, **kwargs, &block)
|
|
151
153
|
connection_pool.with_connection(*args, **kwargs, &block)
|
|
152
154
|
end
|
|
@@ -15,7 +15,7 @@ module ArelExtensions
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def compile node
|
|
18
|
-
if
|
|
18
|
+
if AREL_VERSION > V5
|
|
19
19
|
@visitor.accept(node, Arel::Collectors::SQLString.new).value
|
|
20
20
|
else
|
|
21
21
|
@visitor.accept(node)
|
|
@@ -23,7 +23,7 @@ module ArelExtensions
|
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
it 'should import large set of data in Oracle' do
|
|
26
|
-
insert_manager =
|
|
26
|
+
insert_manager = AREL_VERSION > V6 ? 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")
|
|
@@ -16,7 +16,7 @@ module ArelExtensions
|
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
def compile node
|
|
19
|
-
if
|
|
19
|
+
if AREL_VERSION > V5
|
|
20
20
|
@visitor.accept(node, Arel::Collectors::SQLString.new).value
|
|
21
21
|
else
|
|
22
22
|
@visitor.accept(node)
|
|
@@ -24,7 +24,7 @@ module ArelExtensions
|
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
it 'should import large set of data' do
|
|
27
|
-
insert_manager =
|
|
27
|
+
insert_manager = AREL_VERSION > V6 ? 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")
|
|
@@ -277,11 +277,11 @@ module ArelExtensions
|
|
|
277
277
|
.must_be_like %{(SELECT "users"."name" FROM "users") UNION ALL (SELECT "users"."name" FROM "users")}
|
|
278
278
|
_(c.union_all(c.union_all(c)).to_sql)
|
|
279
279
|
.must_be_like %{(SELECT "users"."name" FROM "users") UNION ALL (SELECT "users"."name" FROM "users") UNION ALL (SELECT "users"."name" FROM "users")}
|
|
280
|
-
_(
|
|
280
|
+
_(c.union_all(c).union_all(c).to_sql)
|
|
281
281
|
.must_be_like %{(SELECT "users"."name" FROM "users") UNION ALL (SELECT "users"."name" FROM "users") UNION ALL (SELECT "users"."name" FROM "users")}
|
|
282
282
|
_(c.union_all(c).union_all(c).to_sql)
|
|
283
283
|
.must_be_like %{(SELECT "users"."name" FROM "users") UNION ALL (SELECT "users"."name" FROM "users") UNION ALL (SELECT "users"."name" FROM "users")}
|
|
284
|
-
_(
|
|
284
|
+
_(c.union_all(c).as('union_table').to_sql)
|
|
285
285
|
.must_be_like %{((SELECT "users"."name" FROM "users") UNION ALL (SELECT "users"."name" FROM "users")) union_table}
|
|
286
286
|
end
|
|
287
287
|
|