arel_extensions 1.3.4 → 1.3.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +162 -222
- data/.gitignore +7 -6
- data/.rubocop.yml +37 -0
- data/Gemfile +3 -3
- data/NEWS.md +15 -0
- data/README.md +119 -75
- data/appveyor.yml +82 -0
- data/arel_extensions.gemspec +0 -1
- data/gemfiles/rails3.gemfile +5 -5
- data/gemfiles/rails4_2.gemfile +38 -0
- data/gemfiles/{rails5_0.gemfile → rails5.gemfile} +6 -6
- data/gemfiles/rails5_1_4.gemfile +6 -6
- data/gemfiles/rails5_2.gemfile +6 -5
- data/gemfiles/rails6.gemfile +5 -4
- data/gemfiles/rails6_1.gemfile +5 -4
- data/gemfiles/rails7.gemfile +5 -4
- data/gemspecs/arel_extensions-v1.gemspec +0 -1
- data/gemspecs/arel_extensions-v2.gemspec +0 -1
- data/lib/arel_extensions/common_sql_functions.rb +2 -2
- data/lib/arel_extensions/helpers.rb +12 -12
- data/lib/arel_extensions/math.rb +32 -17
- data/lib/arel_extensions/nodes/case.rb +4 -3
- data/lib/arel_extensions/nodes/cast.rb +2 -2
- data/lib/arel_extensions/nodes/coalesce.rb +1 -1
- data/lib/arel_extensions/nodes/collate.rb +1 -1
- data/lib/arel_extensions/nodes/date_diff.rb +6 -6
- data/lib/arel_extensions/nodes/locate.rb +1 -1
- data/lib/arel_extensions/nodes/repeat.rb +2 -2
- data/lib/arel_extensions/nodes/rollup.rb +36 -0
- data/lib/arel_extensions/nodes/select.rb +10 -0
- data/lib/arel_extensions/nodes/substring.rb +1 -1
- 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 +2 -2
- data/lib/arel_extensions/null_functions.rb +16 -0
- data/lib/arel_extensions/string_functions.rb +1 -0
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/ibm_db.rb +1 -1
- data/lib/arel_extensions/visitors/mssql.rb +123 -17
- data/lib/arel_extensions/visitors/mysql.rb +78 -11
- data/lib/arel_extensions/visitors/oracle.rb +39 -17
- data/lib/arel_extensions/visitors/postgresql.rb +17 -12
- data/lib/arel_extensions/visitors/sqlite.rb +4 -4
- data/lib/arel_extensions/visitors/to_sql.rb +4 -1
- data/lib/arel_extensions/visitors.rb +8 -0
- data/lib/arel_extensions.rb +26 -0
- data/test/arelx_test_helper.rb +1 -1
- data/test/real_db_test.rb +5 -5
- data/test/support/fake_record.rb +1 -1
- data/test/visitors/test_bulk_insert_oracle.rb +3 -3
- data/test/visitors/test_bulk_insert_sqlite.rb +1 -1
- data/test/visitors/test_bulk_insert_to_sql.rb +1 -1
- data/test/visitors/test_to_sql.rb +6 -6
- data/test/with_ar/all_agnostic_test.rb +177 -70
- data/test/with_ar/insert_agnostic_test.rb +3 -3
- data/test/with_ar/test_bulk_sqlite.rb +1 -1
- data/version_v1.rb +1 -1
- data/version_v2.rb +1 -1
- metadata +8 -18
- data/gemfiles/rails4.gemfile +0 -29
@@ -14,6 +14,52 @@ module ArelExtensions
|
|
14
14
|
'%M' => '%i', '%S' => '%S', '%L' => '', '%N' => '%f', '%z' => ''
|
15
15
|
}.freeze
|
16
16
|
|
17
|
+
# This helper method did not exist in rails < 5.2
|
18
|
+
if !Arel::Visitors::MySQL.method_defined?(:collect_nodes_for)
|
19
|
+
def collect_nodes_for(nodes, collector, spacer, connector = ", ")
|
20
|
+
if nodes&.any?
|
21
|
+
collector << spacer
|
22
|
+
inject_join nodes, collector, connector
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# The whole purpose of this override is to fix the behavior of RollUp.
|
28
|
+
# All other databases treat RollUp sanely, execpt MySQL which requires
|
29
|
+
# that it figures as the last element of a GROUP BY.
|
30
|
+
def visit_Arel_Nodes_SelectCore(o, collector)
|
31
|
+
collector << "SELECT"
|
32
|
+
|
33
|
+
collector = collect_optimizer_hints(o, collector) if self.respond_to?(:collect_optimizer_hinsts)
|
34
|
+
collector = maybe_visit o.set_quantifier, collector
|
35
|
+
|
36
|
+
collect_nodes_for o.projections, collector, " "
|
37
|
+
|
38
|
+
if o.source && !o.source.empty?
|
39
|
+
collector << " FROM "
|
40
|
+
collector = visit o.source, collector
|
41
|
+
end
|
42
|
+
|
43
|
+
# The actual work
|
44
|
+
groups = o.groups
|
45
|
+
rollup = groups.select { |g| g.expr.class == Arel::Nodes::RollUp }.map { |r| r.expr.value }
|
46
|
+
if rollup && !rollup.empty?
|
47
|
+
groups = o.groups.reject { |g| g.expr.class == Arel::Nodes::RollUp }
|
48
|
+
groups << Arel::Nodes::RollUp.new(rollup)
|
49
|
+
end
|
50
|
+
# FIN
|
51
|
+
|
52
|
+
collect_nodes_for o.wheres, collector, " WHERE ", " AND "
|
53
|
+
collect_nodes_for groups, collector, " GROUP BY " # Look ma, I'm viring a group
|
54
|
+
collect_nodes_for o.havings, collector, " HAVING ", " AND "
|
55
|
+
collect_nodes_for o.windows, collector, " WINDOW "
|
56
|
+
|
57
|
+
if o.respond_to?(:comment)
|
58
|
+
maybe_visit o.comment, collector
|
59
|
+
else
|
60
|
+
collector
|
61
|
+
end
|
62
|
+
end
|
17
63
|
|
18
64
|
# Math functions
|
19
65
|
def visit_ArelExtensions_Nodes_Log10 o, collector
|
@@ -126,7 +172,7 @@ module ArelExtensions
|
|
126
172
|
collector << 'CONCAT('
|
127
173
|
o.expressions.each_with_index { |arg, i|
|
128
174
|
collector << COMMA if i != 0
|
129
|
-
if
|
175
|
+
if arg.is_a?(Numeric) || arg.is_a?(Arel::Attributes::Attribute)
|
130
176
|
collector << 'CAST('
|
131
177
|
collector = visit arg, collector
|
132
178
|
collector << ' AS char)'
|
@@ -138,6 +184,11 @@ module ArelExtensions
|
|
138
184
|
collector
|
139
185
|
end
|
140
186
|
|
187
|
+
def visit_Arel_Nodes_RollUp(o, collector)
|
188
|
+
visit o.expr, collector
|
189
|
+
collector << " WITH ROLLUP"
|
190
|
+
end
|
191
|
+
|
141
192
|
def visit_ArelExtensions_Nodes_GroupConcat o, collector
|
142
193
|
collector << 'GROUP_CONCAT('
|
143
194
|
collector = visit o.left, collector
|
@@ -201,7 +252,18 @@ module ArelExtensions
|
|
201
252
|
end
|
202
253
|
|
203
254
|
def visit_ArelExtensions_Nodes_Format o, collector
|
204
|
-
case
|
255
|
+
# One use case we met is
|
256
|
+
# `case…when…then(valid_date).else(Arel.null).format(…)`.
|
257
|
+
#
|
258
|
+
# In this case, `o.col_type` is `nil` but we have a legitimate type in
|
259
|
+
# the expression to be formatted. The following is a best effort to
|
260
|
+
# infer the proper type.
|
261
|
+
type =
|
262
|
+
o.col_type.nil? && !o.expressions[0].return_type.nil? \
|
263
|
+
? o.expressions[0].return_type \
|
264
|
+
: o.col_type
|
265
|
+
|
266
|
+
case type
|
205
267
|
when :date, :datetime, :time
|
206
268
|
fmt = ArelExtensions::Visitors::strftime_to_format(o.iso_format, DATE_FORMAT_DIRECTIVES)
|
207
269
|
collector << 'DATE_FORMAT('
|
@@ -398,15 +460,20 @@ module ArelExtensions
|
|
398
460
|
Arel::Nodes::NamedFunction.new('FORMAT', [col.abs] + params)
|
399
461
|
end
|
400
462
|
|
401
|
-
repeated_char =
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
463
|
+
repeated_char =
|
464
|
+
if o.width == 0
|
465
|
+
Arel.quoted('')
|
466
|
+
else
|
467
|
+
Arel
|
468
|
+
.when(Arel.quoted(o.width).abs - (number.length + sign_length) > 0)
|
469
|
+
.then(Arel.quoted(
|
470
|
+
o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
|
471
|
+
).repeat(Arel.quoted(o.width).abs - (number.length + sign_length))
|
472
|
+
)
|
473
|
+
.else('')
|
474
|
+
end
|
475
|
+
before = !o.flags.include?('0') && !o.flags.include?('-') ? repeated_char : ''
|
476
|
+
middle = o.flags.include?('0') && !o.flags.include?('-') ? repeated_char : ''
|
410
477
|
after = o.flags.include?('-') ? repeated_char : ''
|
411
478
|
full_number = ArelExtensions::Nodes::Concat.new([
|
412
479
|
before,
|
@@ -11,7 +11,7 @@ module ArelExtensions
|
|
11
11
|
'%H' => 'HH24', '%k' => '', '%I' => 'HH', '%l' => '', '%P' => 'am', '%p' => 'AM', # hours
|
12
12
|
'%M' => 'MI', '%S' => 'SS', '%L' => 'MS', '%N' => 'US', '%z' => 'tz' # seconds, subseconds
|
13
13
|
}
|
14
|
-
NUMBER_COMMA_MAPPING = {
|
14
|
+
NUMBER_COMMA_MAPPING = {'en_US' => '.,', 'fr_FR' => ',', 'sv_SE' => ', '}
|
15
15
|
|
16
16
|
def visit_ArelExtensions_Nodes_Log10 o, collector
|
17
17
|
collector << 'LOG('
|
@@ -126,6 +126,11 @@ module ArelExtensions
|
|
126
126
|
collector
|
127
127
|
end
|
128
128
|
|
129
|
+
def visit_Arel_Nodes_RollUp(o, collector)
|
130
|
+
collector << "ROLLUP"
|
131
|
+
grouping_array_or_grouping_element o, collector
|
132
|
+
end
|
133
|
+
|
129
134
|
def visit_ArelExtensions_Nodes_GroupConcat o, collector
|
130
135
|
collector << '(LISTAGG('
|
131
136
|
collector = visit o.left, collector
|
@@ -455,7 +460,7 @@ module ArelExtensions
|
|
455
460
|
src_tz, dst_tz = o.time_zone.first
|
456
461
|
collector << ' as timestamp) at time zone '
|
457
462
|
collector = visit Arel.quoted(src_tz), collector
|
458
|
-
|
463
|
+
collector < ' at time zone '
|
459
464
|
collector = visit Arel.quoted(dst_tz), collector
|
460
465
|
when String
|
461
466
|
collector << ' as timestamp) at time zone '
|
@@ -587,7 +592,7 @@ module ArelExtensions
|
|
587
592
|
alias_method(:old_visit_Arel_Nodes_TableAlias, :visit_Arel_Nodes_TableAlias) rescue nil
|
588
593
|
def visit_Arel_Nodes_TableAlias o, collector
|
589
594
|
if o.name.length > 30
|
590
|
-
o = Arel::Table.new(o.table_name).alias(
|
595
|
+
o = Arel::Table.new(o.table_name).alias(Arel.shorten(o.name))
|
591
596
|
end
|
592
597
|
old_visit_Arel_Nodes_TableAlias(o, collector)
|
593
598
|
end
|
@@ -601,7 +606,7 @@ module ArelExtensions
|
|
601
606
|
else
|
602
607
|
collector = visit o.left, collector
|
603
608
|
end
|
604
|
-
quote =
|
609
|
+
quote = /(\A".*"\z)|\A[a-zA-Z_]*\z/.match?(o.right.to_s) ? '' : '"'
|
605
610
|
collector << " AS #{quote}"
|
606
611
|
collector = visit o.right, collector
|
607
612
|
collector << "#{quote}"
|
@@ -627,10 +632,10 @@ module ArelExtensions
|
|
627
632
|
comma_in_format = o.precision == 0 ? '' : 'D'
|
628
633
|
nines_after = (1..o.precision - 1).map{'9'}.join('') + '0'
|
629
634
|
if comma.length == 1
|
630
|
-
options = Arel.quoted("NLS_NUMERIC_CHARACTERS = '
|
635
|
+
options = Arel.quoted("NLS_NUMERIC_CHARACTERS = '#{comma} '")
|
631
636
|
nines_before = ('999' * 4 + '990')
|
632
637
|
else
|
633
|
-
options = Arel.quoted("NLS_NUMERIC_CHARACTERS = '
|
638
|
+
options = Arel.quoted("NLS_NUMERIC_CHARACTERS = '#{comma}'")
|
634
639
|
nines_before = ('999G' * 4 + '990')
|
635
640
|
end
|
636
641
|
sign = Arel.when(col < 0).
|
@@ -643,7 +648,7 @@ module ArelExtensions
|
|
643
648
|
if o.scientific_notation
|
644
649
|
number = Arel::Nodes::NamedFunction.new('TO_CHAR', [
|
645
650
|
Arel.quoted(col.abs),
|
646
|
-
Arel.quoted(
|
651
|
+
Arel.quoted("FM#{nines_before}#{comma_in_format}#{nines_after}EEEE"),
|
647
652
|
options
|
648
653
|
])
|
649
654
|
if o.type == 'e'
|
@@ -652,20 +657,25 @@ module ArelExtensions
|
|
652
657
|
else
|
653
658
|
number = Arel::Nodes::NamedFunction.new('TO_CHAR', [
|
654
659
|
Arel.quoted(col.abs),
|
655
|
-
Arel.quoted(
|
660
|
+
Arel.quoted("FM#{nines_before}#{comma_in_format}#{nines_after}"),
|
656
661
|
options
|
657
662
|
])
|
658
663
|
end
|
659
664
|
|
660
|
-
repeated_char =
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
665
|
+
repeated_char =
|
666
|
+
if o.width == 0
|
667
|
+
Arel.quoted('')
|
668
|
+
else
|
669
|
+
Arel
|
670
|
+
.when(Arel.quoted(o.width).abs - (number.length + sign_length) > 0)
|
671
|
+
.then(Arel.quoted(
|
672
|
+
o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
|
673
|
+
).repeat(Arel.quoted(o.width).abs - (number.length + sign_length))
|
674
|
+
)
|
675
|
+
.else('')
|
676
|
+
end
|
677
|
+
before = !o.flags.include?('0') && !o.flags.include?('-') ? repeated_char : ''
|
678
|
+
middle = o.flags.include?('0') && !o.flags.include?('-') ? repeated_char : ''
|
669
679
|
after = o.flags.include?('-') ? repeated_char : ''
|
670
680
|
full_number = ArelExtensions::Nodes::Concat.new([
|
671
681
|
before,
|
@@ -700,6 +710,18 @@ module ArelExtensions
|
|
700
710
|
collector << ')'
|
701
711
|
collector
|
702
712
|
end
|
713
|
+
|
714
|
+
# Utilized by GroupingSet, Cube & RollUp visitors to
|
715
|
+
# handle grouping aggregation semantics
|
716
|
+
def grouping_array_or_grouping_element(o, collector)
|
717
|
+
if o.expr.is_a? Array
|
718
|
+
collector << "( "
|
719
|
+
visit o.expr, collector
|
720
|
+
collector << " )"
|
721
|
+
else
|
722
|
+
visit o.expr, collector
|
723
|
+
end
|
724
|
+
end
|
703
725
|
end
|
704
726
|
end
|
705
727
|
end
|
@@ -425,32 +425,37 @@ module ArelExtensions
|
|
425
425
|
Arel::Nodes::NamedFunction.new('TRIM', [
|
426
426
|
Arel::Nodes::NamedFunction.new('TO_CHAR', [
|
427
427
|
Arel.when(col.not_eq 0).then(col.abs / Arel.quoted(10).pow(col.abs.log10.floor)).else(1),
|
428
|
-
Arel.quoted(
|
428
|
+
Arel.quoted("FM#{nines_before}\"#{comma}\"V#{nines_after}")
|
429
429
|
])]),
|
430
430
|
o.type,
|
431
431
|
Arel::Nodes::NamedFunction.new('TRIM', [
|
432
432
|
Arel::Nodes::NamedFunction.new('TO_CHAR', [
|
433
433
|
Arel.when(col.not_eq 0).then(col.abs.log10.floor).else(0),
|
434
|
-
Arel.quoted(
|
434
|
+
Arel.quoted("FM#{nines_before}")
|
435
435
|
])])
|
436
436
|
])
|
437
437
|
else
|
438
438
|
Arel::Nodes::NamedFunction.new('TRIM', [
|
439
439
|
Arel::Nodes::NamedFunction.new('TO_CHAR', [
|
440
440
|
Arel.quoted(col.abs),
|
441
|
-
Arel.quoted(
|
441
|
+
Arel.quoted("FM#{nines_before}\"#{comma}\"V#{nines_after}")
|
442
442
|
])])
|
443
443
|
end
|
444
444
|
|
445
|
-
repeated_char =
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
445
|
+
repeated_char =
|
446
|
+
if o.width == 0
|
447
|
+
Arel.quoted('')
|
448
|
+
else
|
449
|
+
Arel
|
450
|
+
.when(Arel.quoted(o.width).abs - (number.length + sign_length) > 0)
|
451
|
+
.then(Arel.quoted(
|
452
|
+
o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
|
453
|
+
).repeat(Arel.quoted(o.width).abs - (number.length + sign_length))
|
454
|
+
)
|
455
|
+
.else('')
|
456
|
+
end
|
457
|
+
before = !o.flags.include?('0') && !o.flags.include?('-') ? repeated_char : ''
|
458
|
+
middle = o.flags.include?('0') && !o.flags.include?('-') ? repeated_char : ''
|
454
459
|
after = o.flags.include?('-') ? repeated_char : ''
|
455
460
|
full_number = ArelExtensions::Nodes::Concat.new([
|
456
461
|
before,
|
@@ -325,16 +325,16 @@ module ArelExtensions
|
|
325
325
|
|
326
326
|
def get_time_converted element
|
327
327
|
if element.is_a?(Time)
|
328
|
-
|
328
|
+
Arel::Nodes::NamedFunction.new('STRFTIME', [element, '%H:%M:%S'])
|
329
329
|
elsif element.is_a?(Arel::Attributes::Attribute)
|
330
330
|
col = Arel.column_of(element.relation.table_name, element.name.to_s)
|
331
331
|
if col && (col.type == :time)
|
332
|
-
|
332
|
+
Arel::Nodes::NamedFunction.new('STRFTIME', [element, '%H:%M:%S'])
|
333
333
|
else
|
334
|
-
|
334
|
+
element
|
335
335
|
end
|
336
336
|
else
|
337
|
-
|
337
|
+
element
|
338
338
|
end
|
339
339
|
end
|
340
340
|
|
@@ -649,7 +649,10 @@ module ArelExtensions
|
|
649
649
|
|
650
650
|
def visit_ArelExtensions_Nodes_JsonGroup o, collector
|
651
651
|
if o.as_array
|
652
|
-
res =
|
652
|
+
res =
|
653
|
+
Arel.quoted('[') \
|
654
|
+
+ (o.orders ? o.dict.group_concat(', ', order: Array(o.orders)) : o.dict.group_concat(', ')).coalesce('') \
|
655
|
+
+ ']'
|
653
656
|
collector = visit res, collector
|
654
657
|
else
|
655
658
|
res = Arel.quoted('{')
|
@@ -19,6 +19,14 @@ if defined?(Arel::Visitors::SQLServer)
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
+
if defined?(Arel::Visitors::DepthFirst)
|
23
|
+
class Arel::Visitors::DepthFirst
|
24
|
+
def visit_Arel_SelectManager o
|
25
|
+
visit o.ast
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
22
30
|
if defined?(Arel::Visitors::MSSQL)
|
23
31
|
class Arel::Visitors::MSSQL
|
24
32
|
include ArelExtensions::Visitors::MSSQL
|
data/lib/arel_extensions.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'arel'
|
2
|
+
require 'base64'
|
2
3
|
|
3
4
|
require 'arel_extensions/railtie' if defined?(Rails::Railtie)
|
4
5
|
|
@@ -77,6 +78,8 @@ require 'arel_extensions/nodes/case'
|
|
77
78
|
require 'arel_extensions/nodes/soundex'
|
78
79
|
require 'arel_extensions/nodes/cast'
|
79
80
|
require 'arel_extensions/nodes/json'
|
81
|
+
require 'arel_extensions/nodes/rollup'
|
82
|
+
require 'arel_extensions/nodes/select'
|
80
83
|
|
81
84
|
# It seems like the code in lib/arel_extensions/visitors.rb that is supposed
|
82
85
|
# to inject ArelExtension is not enough. Different versions of the sqlserver
|
@@ -131,6 +134,10 @@ module Arel
|
|
131
134
|
ArelExtensions::Nodes::Rand.new
|
132
135
|
end
|
133
136
|
|
137
|
+
def self.rollup(*args)
|
138
|
+
Arel::Nodes::RollUp.new(args)
|
139
|
+
end
|
140
|
+
|
134
141
|
def self.shorten s
|
135
142
|
Base64.urlsafe_encode64(Digest::MD5.new.digest(s)).tr('=', '').tr('-', '_')
|
136
143
|
end
|
@@ -268,3 +275,22 @@ class Arel::Nodes::TableAlias
|
|
268
275
|
end
|
269
276
|
end
|
270
277
|
end
|
278
|
+
|
279
|
+
|
280
|
+
class Arel::Attributes::Attribute
|
281
|
+
def to_sql(engine = Arel::Table.engine)
|
282
|
+
collector = Arel::Collectors::SQLString.new
|
283
|
+
collector = engine.connection.visitor.accept self, collector
|
284
|
+
collector.value
|
285
|
+
end
|
286
|
+
|
287
|
+
def rollup
|
288
|
+
Arel::Nodes::RollUp.new([self])
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
class Arel::Nodes::Node
|
293
|
+
def rollup
|
294
|
+
Arel::Nodes::RollUp.new([self])
|
295
|
+
end
|
296
|
+
end
|
data/test/arelx_test_helper.rb
CHANGED
@@ -7,7 +7,7 @@ require 'active_record'
|
|
7
7
|
require 'support/fake_record'
|
8
8
|
|
9
9
|
def colored(color, msg)
|
10
|
-
ENV['TERM']
|
10
|
+
/^xterm|-256color$/.match?(ENV['TERM']) ? "\x1b[#{color}m#{msg}\x1b[89m\x1b[0m" : "#{msg}"
|
11
11
|
end
|
12
12
|
|
13
13
|
YELLOW = '33'
|
data/test/real_db_test.rb
CHANGED
@@ -14,7 +14,7 @@ def setup_db
|
|
14
14
|
ActiveRecord::Base.default_timezone = :utc
|
15
15
|
end
|
16
16
|
@cnx = ActiveRecord::Base.connection
|
17
|
-
if ActiveRecord::Base.connection.adapter_name
|
17
|
+
if /sqlite/i.match?(ActiveRecord::Base.connection.adapter_name)
|
18
18
|
$sqlite = true
|
19
19
|
db = @cnx.raw_connection
|
20
20
|
if !$load_extension_disabled
|
@@ -82,7 +82,7 @@ class ListTest < Minitest::Test
|
|
82
82
|
end
|
83
83
|
|
84
84
|
def test_coalesce
|
85
|
-
if @cnx.adapter_name
|
85
|
+
if /pgsql/i.match?(@cnx.adapter_name)
|
86
86
|
assert_equal 100, User.where(User.arel_table[:name].eq('Test')).select((User.arel_table[:age].coalesce(100)).as('res')).first.res
|
87
87
|
assert_equal 'Camille', User.where(User.arel_table[:name].eq('Camille')).select((User.arel_table[:name].coalesce('Null', 'default')).as('res')).first.res
|
88
88
|
else
|
@@ -128,7 +128,7 @@ class ListTest < Minitest::Test
|
|
128
128
|
end
|
129
129
|
|
130
130
|
def test_isnull
|
131
|
-
if ActiveRecord::Base.connection.adapter_name
|
131
|
+
if /pgsql/i.match?(ActiveRecord::Base.connection.adapter_name)
|
132
132
|
assert_equal 100, User.where(User.arel_table[:name].eq('Test')).select((User.arel_table[:age].isnull(100)).as('res')).first.res
|
133
133
|
else
|
134
134
|
assert_equal 'default', User.where(User.arel_table[:name].eq('Test')).select((User.arel_table[:age].isnull('default')).as('res')).first.res
|
@@ -196,8 +196,8 @@ class ListTest < Minitest::Test
|
|
196
196
|
end
|
197
197
|
|
198
198
|
def test_replace
|
199
|
-
assert_equal 'LucaX', User.where(User.arel_table[:name].eq('Lucas')).select((
|
200
|
-
assert_equal 'replace', User.where(User.arel_table[:name].eq('Lucas')).select((
|
199
|
+
assert_equal 'LucaX', User.where(User.arel_table[:name].eq('Lucas')).select((User.arel_table[:name].replace('s', 'X')).as('res')).first.res
|
200
|
+
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
|
201
201
|
end
|
202
202
|
|
203
203
|
def test_round
|
data/test/support/fake_record.rb
CHANGED
@@ -7,10 +7,10 @@ module ArelExtensions
|
|
7
7
|
@conn = FakeRecord::Base.new
|
8
8
|
@visitor = Arel::Visitors::Oracle.new @conn.connection
|
9
9
|
@table = Arel::Table.new(:users)
|
10
|
-
@cols = [
|
10
|
+
@cols = %w[name comments created_at]
|
11
11
|
@data = [
|
12
|
-
[
|
13
|
-
[
|
12
|
+
%w[nom1 sdfdsfdsfsdf 2016-01-01],
|
13
|
+
%w[nom2 sdfdsfdsfsdf 2016-01-01]
|
14
14
|
]
|
15
15
|
end
|
16
16
|
|
@@ -8,7 +8,7 @@ module ArelExtensions
|
|
8
8
|
@visitor = Arel::Visitors::SQLite.new @conn.connection
|
9
9
|
@table = Arel::Table.new(:users)
|
10
10
|
Arel::Table.engine = @conn
|
11
|
-
@cols = [
|
11
|
+
@cols = %w[id name comments created_at]
|
12
12
|
@data = [
|
13
13
|
[23, 'nom1', 'sdfdsfdsfsdf', '2016-01-01'],
|
14
14
|
[25, 'nom2', 'sdfdsfdsfsdf', '2016-01-01']
|
@@ -8,7 +8,7 @@ module ArelExtensions
|
|
8
8
|
Arel::Table.engine = @conn
|
9
9
|
@visitor = Arel::Visitors::ToSql.new @conn.connection
|
10
10
|
@table = Arel::Table.new(:users)
|
11
|
-
@cols = [
|
11
|
+
@cols = %w[id name comments created_at]
|
12
12
|
@data = [
|
13
13
|
[23, 'nom1', 'sdfdsfdsfsdf', '2016-01-01'],
|
14
14
|
[25, 'nom2', 'sdfdsfdsfsdf', '2016-01-01']
|
@@ -11,7 +11,7 @@ module ArelExtensions
|
|
11
11
|
# test become flaky.
|
12
12
|
#
|
13
13
|
# The first time `Arel::Table.engine` is called
|
14
|
-
# from `
|
14
|
+
# from `ArelExtensions.column_of_via_arel_table(table_name, column_name)`
|
15
15
|
# in `lib/arel_extensions/helpers.rb`
|
16
16
|
# will almost always fail. It's important to note that when the test
|
17
17
|
# fails, it's always on 1 test case, and every subsequent test that
|
@@ -273,13 +273,13 @@ module ArelExtensions
|
|
273
273
|
c = @table.project(@table[:name])
|
274
274
|
_(compile(c.union_all(c)))
|
275
275
|
.must_be_like %{(SELECT "users"."name" FROM "users") UNION ALL (SELECT "users"."name" FROM "users")}
|
276
|
-
_(
|
276
|
+
_(c.union_all(c).to_sql)
|
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}
|
@@ -576,7 +576,7 @@ module ArelExtensions
|
|
576
576
|
end
|
577
577
|
end
|
578
578
|
|
579
|
-
puts
|
579
|
+
puts "AREL VERSION: #{Arel::VERSION}"
|
580
580
|
end
|
581
581
|
end
|
582
582
|
end
|