arel_extensions 2.1.4 → 2.1.5

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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +41 -89
  3. data/.gitignore +7 -6
  4. data/.rubocop.yml +37 -0
  5. data/Gemfile +3 -3
  6. data/README.md +1 -0
  7. data/appveyor.yml +73 -0
  8. data/gemfiles/rails3.gemfile +5 -5
  9. data/gemfiles/rails4.gemfile +7 -7
  10. data/gemfiles/rails5_0.gemfile +6 -6
  11. data/gemfiles/rails5_1_4.gemfile +6 -6
  12. data/gemfiles/rails5_2.gemfile +6 -5
  13. data/gemfiles/rails6.gemfile +5 -4
  14. data/gemfiles/rails6_1.gemfile +5 -4
  15. data/gemfiles/rails7.gemfile +5 -4
  16. data/lib/arel_extensions/common_sql_functions.rb +2 -2
  17. data/lib/arel_extensions/helpers.rb +12 -12
  18. data/lib/arel_extensions/math.rb +32 -17
  19. data/lib/arel_extensions/nodes/cast.rb +2 -2
  20. data/lib/arel_extensions/nodes/coalesce.rb +1 -1
  21. data/lib/arel_extensions/nodes/collate.rb +1 -1
  22. data/lib/arel_extensions/nodes/date_diff.rb +6 -6
  23. data/lib/arel_extensions/nodes/locate.rb +1 -1
  24. data/lib/arel_extensions/nodes/repeat.rb +2 -2
  25. data/lib/arel_extensions/nodes/substring.rb +1 -1
  26. data/lib/arel_extensions/nodes/then.rb +1 -1
  27. data/lib/arel_extensions/nodes/trim.rb +2 -2
  28. data/lib/arel_extensions/nodes/union.rb +3 -3
  29. data/lib/arel_extensions/nodes/union_all.rb +2 -2
  30. data/lib/arel_extensions/version.rb +1 -1
  31. data/lib/arel_extensions/visitors/ibm_db.rb +1 -1
  32. data/lib/arel_extensions/visitors/mssql.rb +30 -17
  33. data/lib/arel_extensions/visitors/mysql.rb +15 -10
  34. data/lib/arel_extensions/visitors/oracle.rb +22 -17
  35. data/lib/arel_extensions/visitors/postgresql.rb +17 -12
  36. data/lib/arel_extensions/visitors/sqlite.rb +4 -4
  37. data/lib/arel_extensions/visitors/to_sql.rb +4 -1
  38. data/lib/arel_extensions.rb +10 -0
  39. data/test/arelx_test_helper.rb +1 -1
  40. data/test/real_db_test.rb +5 -5
  41. data/test/support/fake_record.rb +1 -1
  42. data/test/visitors/test_bulk_insert_oracle.rb +3 -3
  43. data/test/visitors/test_bulk_insert_sqlite.rb +1 -1
  44. data/test/visitors/test_bulk_insert_to_sql.rb +1 -1
  45. data/test/visitors/test_to_sql.rb +6 -6
  46. data/test/with_ar/all_agnostic_test.rb +67 -60
  47. data/test/with_ar/insert_agnostic_test.rb +3 -3
  48. data/test/with_ar/test_bulk_sqlite.rb +1 -1
  49. data/version_v1.rb +1 -1
  50. data/version_v2.rb +1 -1
  51. metadata +3 -2
@@ -16,16 +16,16 @@ module ArelExtensions
16
16
  # Date and integer adds or subtracts a specified time interval from a date.
17
17
  def +(other)
18
18
  case self
19
- when Arel::Nodes::Quoted
20
- return self.concat(other)
21
- when Arel::Nodes::Grouping
22
- if self.expr.left.is_a?(String) || self.expr.right.is_a?(String)
23
- return self.concat(other)
24
- else
25
- return Arel.grouping(Arel::Nodes::Addition.new self, other)
26
- end
27
- when ArelExtensions::Nodes::Function, ArelExtensions::Nodes::Case
28
- return case self.return_type
19
+ when Arel::Nodes::Quoted
20
+ self.concat(other)
21
+ when Arel::Nodes::Grouping
22
+ if self.expr.left.is_a?(String) || self.expr.right.is_a?(String)
23
+ self.concat(other)
24
+ else
25
+ Arel.grouping(Arel::Nodes::Addition.new self, other)
26
+ end
27
+ when ArelExtensions::Nodes::Function, ArelExtensions::Nodes::Case
28
+ case self.return_type
29
29
  when :string, :text
30
30
  self.concat(other)
31
31
  when :integer, :decimal, :float, :number, :int
@@ -38,12 +38,17 @@ module ArelExtensions
38
38
  when Arel::Nodes::Function
39
39
  Arel.grouping(Arel::Nodes::Addition.new self, other)
40
40
  else
41
- col = Arel.column_of(self.relation.table_name, self.name.to_s) if self.respond_to?(:relation)
42
- if (!col) # if the column doesn't exist in the database
41
+ col =
42
+ if self.is_a?(Arel::Attribute) && self.respond_to?(:type_caster) && self.able_to_type_cast?
43
+ self.type_caster
44
+ else
45
+ Arel.column_of(self.relation.table_name, self.name.to_s) if self.respond_to?(:relation)
46
+ end
47
+ if !col # if the column doesn't exist in the database
43
48
  Arel.grouping(Arel::Nodes::Addition.new(self, Arel.quoted(other)))
44
49
  else
45
50
  arg = col.type
46
- if arg == :integer || (!arg)
51
+ if arg == :integer || !arg
47
52
  other = other.to_i if other.is_a?(String)
48
53
  Arel.grouping(Arel::Nodes::Addition.new self, Arel.quoted(other))
49
54
  elsif arg == :decimal || arg == :float
@@ -82,16 +87,26 @@ module ArelExtensions
82
87
  when Arel::Nodes::Function
83
88
  Arel.grouping(Arel::Nodes::Subtraction.new(self, Arel.quoted(other)))
84
89
  else
85
- col = Arel.column_of(self.relation.table_name, self.name.to_s)
86
- if (!col) # if the column doesn't exist in the database
90
+ col =
91
+ if self.is_a?(Arel::Attribute) && self.respond_to?(:type_caster) && self.able_to_type_cast?
92
+ self.type_caster
93
+ else
94
+ Arel.column_of(self.relation.table_name, self.name.to_s) if self.respond_to?(:relation)
95
+ end
96
+ if !col # if the column doesn't exist in the database
87
97
  Arel.grouping(Arel::Nodes::Subtraction.new(self, Arel.quoted(other)))
88
98
  else
89
99
  arg = col.type
90
100
  if (arg == :date || arg == :datetime)
91
101
  case other
92
102
  when Arel::Attributes::Attribute
93
- col2 = Arel.column_of(other.relation.table_name, other.name.to_s)
94
- if (!col2) # if the column doesn't exist in the database
103
+ col2 =
104
+ if other.is_a?(Arel::Attribute) && other.respond_to?(:type_caster) && other.able_to_type_cast?
105
+ other.type_caster
106
+ else
107
+ Arel.column_of(other.relation.table_name, other.name.to_s) if other.respond_to?(:relation)
108
+ end
109
+ if !col2 # if the column doesn't exist in the database
95
110
  ArelExtensions::Nodes::DateSub.new [self, other]
96
111
  else
97
112
  arg2 = col2.type
@@ -32,13 +32,13 @@ module ArelExtensions
32
32
  @as_attr = :string
33
33
  end
34
34
  tab = [convert_to_node(expr.first)]
35
- return super(tab)
35
+ super(tab)
36
36
  end
37
37
 
38
38
  def +(other)
39
39
  case @return_type
40
40
  when :string
41
- return ArelExtensions::Nodes::Concat.new [self, other]
41
+ ArelExtensions::Nodes::Concat.new [self, other]
42
42
  when :ruby_time
43
43
  ArelExtensions::Nodes::DateAdd.new [self, other]
44
44
  else
@@ -27,7 +27,7 @@ module ArelExtensions
27
27
  when DateTime, Time
28
28
  @left_node_type = :ruby_time
29
29
  end
30
- return super(tab)
30
+ super(tab)
31
31
  end
32
32
  end
33
33
  end
@@ -10,7 +10,7 @@ module ArelExtensions
10
10
  @ci = ci
11
11
  @option = option
12
12
  tab = [convert_to_node(left)]
13
- return super(tab)
13
+ super(tab)
14
14
  end
15
15
  end
16
16
  end
@@ -19,7 +19,7 @@ module ArelExtensions
19
19
  when DateTime, Time
20
20
  @left_node_type = :ruby_time
21
21
  end
22
- res << ([:date, :ruby_date].include?(@left_node_type) ? convert_to_date_node(col) : convert_to_datetime_node(col))
22
+ res << (%i[date ruby_date].include?(@left_node_type) ? convert_to_date_node(col) : convert_to_datetime_node(col))
23
23
  case expr[1]
24
24
  when Arel::Nodes::Node, Arel::Attributes::Attribute
25
25
  @right_node_type = type_of_attribute(expr[1])
@@ -28,7 +28,7 @@ module ArelExtensions
28
28
  when DateTime, Time
29
29
  @right_node_type = :ruby_time
30
30
  end
31
- res << ([:date, :ruby_date].include?(@left_node_type) ? convert_to_date_node(expr[1]) : convert_to_datetime_node(expr[1]))
31
+ res << (%i[date ruby_date].include?(@left_node_type) ? convert_to_date_node(expr[1]) : convert_to_datetime_node(expr[1]))
32
32
  super res
33
33
  end
34
34
  end
@@ -43,19 +43,19 @@ module ArelExtensions
43
43
  tab = expr.map do |arg|
44
44
  convert(arg)
45
45
  end
46
- return super(tab)
46
+ super(tab)
47
47
  end
48
48
 
49
49
  def sqlite_value
50
50
  v = self.expressions.last
51
51
  if defined?(ActiveSupport::Duration) && ActiveSupport::Duration === v
52
52
  if @date_type == :date
53
- return Arel.quoted((v.value >= 0 ? '+' : '-') + v.inspect)
53
+ Arel.quoted((v.value >= 0 ? '+' : '-') + v.inspect)
54
54
  elsif @date_type == :datetime
55
- return Arel.quoted((v.value >= 0 ? '+' : '-') + v.inspect)
55
+ Arel.quoted((v.value >= 0 ? '+' : '-') + v.inspect)
56
56
  end
57
57
  else
58
- return v
58
+ v
59
59
  end
60
60
  end
61
61
 
@@ -7,7 +7,7 @@ module ArelExtensions
7
7
  tab = expr.map do |arg|
8
8
  convert_to_node(arg)
9
9
  end
10
- return super(tab)
10
+ super(tab)
11
11
  end
12
12
  end
13
13
  end
@@ -7,11 +7,11 @@ module ArelExtensions
7
7
  tab = expr.map { |arg|
8
8
  convert_to_node(arg)
9
9
  }
10
- return super(tab)
10
+ super(tab)
11
11
  end
12
12
 
13
13
  def +(other)
14
- return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
14
+ ArelExtensions::Nodes::Concat.new(self.expressions + [other])
15
15
  end
16
16
  end
17
17
  end
@@ -8,7 +8,7 @@ module ArelExtensions
8
8
  if expr[2]
9
9
  tab << convert_to_node(expr[2])
10
10
  end
11
- return super(tab)
11
+ super(tab)
12
12
  end
13
13
  end
14
14
  end
@@ -5,7 +5,7 @@ module ArelExtensions
5
5
  tab = expr.map { |arg|
6
6
  convert_to_node(arg)
7
7
  }
8
- return super(tab)
8
+ super(tab)
9
9
  end
10
10
  end
11
11
  end
@@ -7,11 +7,11 @@ module ArelExtensions
7
7
  tab = expr.map { |arg|
8
8
  convert_to_node(arg)
9
9
  }
10
- return super(tab)
10
+ super(tab)
11
11
  end
12
12
 
13
13
  def +(other)
14
- return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
14
+ ArelExtensions::Nodes::Concat.new(self.expressions + [other])
15
15
  end
16
16
  end
17
17
 
@@ -2,15 +2,15 @@ module ArelExtensions
2
2
  module Nodes
3
3
  class Union < Arel::Nodes::Union
4
4
  def initialize left, right
5
- return super(left, right)
5
+ super(left, right)
6
6
  end
7
7
 
8
8
  def +(other)
9
- return ArelExtensions::Nodes::Union.new(self, other)
9
+ ArelExtensions::Nodes::Union.new(self, other)
10
10
  end
11
11
 
12
12
  def union(other)
13
- return ArelExtensions::Nodes::UnionAll.new(self, other)
13
+ ArelExtensions::Nodes::UnionAll.new(self, other)
14
14
  end
15
15
 
16
16
  def as other
@@ -2,11 +2,11 @@ module ArelExtensions
2
2
  module Nodes
3
3
  class UnionAll < Arel::Nodes::UnionAll
4
4
  def initialize left, right
5
- return super(left, right)
5
+ super(left, right)
6
6
  end
7
7
 
8
8
  def union_all(other)
9
- return ArelExtensions::Nodes::UnionAll.new(self, other)
9
+ ArelExtensions::Nodes::UnionAll.new(self, other)
10
10
  end
11
11
 
12
12
  def as other
@@ -1,3 +1,3 @@
1
1
  module ArelExtensions
2
- VERSION = '2.1.4'.freeze
2
+ VERSION = '2.1.5'.freeze
3
3
  end
@@ -56,7 +56,7 @@ module ArelExtensions
56
56
  collector << 'COALESCE('
57
57
  collector = visit o.left, collector
58
58
  collector << ','
59
- if (o.right.is_a?(Arel::Attributes::Attribute))
59
+ if o.right.is_a?(Arel::Attributes::Attribute)
60
60
  collector = visit o.right, collector
61
61
  else
62
62
  collector << "'#{o.right}'"
@@ -157,7 +157,7 @@ module ArelExtensions
157
157
  collector = visit o.right, collector
158
158
  else
159
159
  left = o.left.end_with?('i') ? o.left[0..-2] : o.left
160
- conv = ['h', 'mn', 's'].include?(o.left)
160
+ conv = %w[h mn s].include?(o.left)
161
161
  collector << 'DATEPART('
162
162
  collector << LOADED_VISITOR::DATE_MAPPING[left]
163
163
  collector << LOADED_VISITOR::COMMA
@@ -220,11 +220,19 @@ module ArelExtensions
220
220
  end
221
221
 
222
222
  def visit_ArelExtensions_Nodes_Trim o, collector
223
- collector << 'TRIM( '
224
- collector = visit o.right, collector
225
- collector << ' FROM '
226
- collector = visit o.left, collector
227
- collector << ')'
223
+ # NOTE: in MSSQL's `blank`, o.right is the space char so we need to
224
+ # account for it.
225
+ if o.right && !/\A\s\Z/.match(o.right.expr)
226
+ collector << 'dbo.TrimChar('
227
+ collector = visit o.left, collector
228
+ collector << Arel::Visitors::MSSQL::COMMA
229
+ collector = visit o.right, collector
230
+ collector << ')'
231
+ else
232
+ collector << "LTRIM(RTRIM("
233
+ collector = visit o.left, collector
234
+ collector << "))"
235
+ end
228
236
  collector
229
237
  end
230
238
 
@@ -308,7 +316,7 @@ module ArelExtensions
308
316
  dir = LOADED_VISITOR::DATE_FORMAT_DIRECTIVES[s.matched]
309
317
  fmt = LOADED_VISITOR::DATE_FORMAT_FORMAT[dir]
310
318
  date_name = LOADED_VISITOR::DATE_NAME.include?(s.matched)
311
- collector << 'TRIM('
319
+ collector << 'LTRIM(RTRIM('
312
320
  collector << 'FORMAT(' if fmt
313
321
  collector << 'STR(' if !fmt && !date_name
314
322
  collector << (date_name ? 'DATENAME(' : 'DATEPART(')
@@ -334,7 +342,7 @@ module ArelExtensions
334
342
  collector << ')'
335
343
  collector << ')' if !fmt && !date_name
336
344
  collector << LOADED_VISITOR::COMMA << "'#{fmt}')" if fmt
337
- collector << ')'
345
+ collector << '))'
338
346
  when s.scan(/^%%/)
339
347
  collector = visit Arel.quoted('%'), collector
340
348
  when s.scan(/[^%]+|./)
@@ -575,15 +583,20 @@ module ArelExtensions
575
583
  ])
576
584
  end
577
585
 
578
- repeated_char = (o.width == 0) ? Arel.quoted('') : ArelExtensions::Nodes::Case.new.
579
- when(Arel.quoted(o.width).abs - (number.length + sign_length) > 0).
580
- then(Arel.quoted(
581
- o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
582
- ).repeat(Arel.quoted(o.width).abs - (number.length + sign_length))
583
- ).
584
- else('')
585
- before = (!o.flags.include?('0')) && (!o.flags.include?('-')) ? repeated_char : ''
586
- middle = (o.flags.include?('0')) && (!o.flags.include?('-')) ? repeated_char : ''
586
+ repeated_char =
587
+ if o.width == 0
588
+ Arel.quoted('')
589
+ else
590
+ Arel
591
+ .when(Arel.quoted(o.width).abs - (number.length + sign_length) > 0)
592
+ .then(Arel.quoted(
593
+ o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
594
+ ).repeat(Arel.quoted(o.width).abs - (number.length + sign_length))
595
+ )
596
+ .else('')
597
+ end
598
+ before = !o.flags.include?('0') && !o.flags.include?('-') ? repeated_char : ''
599
+ middle = o.flags.include?('0') && !o.flags.include?('-') ? repeated_char : ''
587
600
  after = o.flags.include?('-') ? repeated_char : ''
588
601
  full_number =
589
602
  ArelExtensions::Nodes::Concat.new([
@@ -126,7 +126,7 @@ module ArelExtensions
126
126
  collector << 'CONCAT('
127
127
  o.expressions.each_with_index { |arg, i|
128
128
  collector << COMMA if i != 0
129
- if (arg.is_a?(Numeric)) || (arg.is_a?(Arel::Attributes::Attribute))
129
+ if arg.is_a?(Numeric) || arg.is_a?(Arel::Attributes::Attribute)
130
130
  collector << 'CAST('
131
131
  collector = visit arg, collector
132
132
  collector << ' AS char)'
@@ -398,15 +398,20 @@ module ArelExtensions
398
398
  Arel::Nodes::NamedFunction.new('FORMAT', [col.abs] + params)
399
399
  end
400
400
 
401
- repeated_char = (o.width == 0) ? Arel.quoted('') : ArelExtensions::Nodes::Case.new.
402
- when(Arel.quoted(o.width).abs - (number.length + sign_length) > 0).
403
- then(Arel.quoted(
404
- o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
405
- ).repeat(Arel.quoted(o.width).abs - (number.length + sign_length))
406
- ).
407
- else('')
408
- before = (!o.flags.include?('0')) && (!o.flags.include?('-')) ? repeated_char : ''
409
- middle = (o.flags.include?('0')) && (!o.flags.include?('-')) ? repeated_char : ''
401
+ repeated_char =
402
+ if o.width == 0
403
+ Arel.quoted('')
404
+ else
405
+ Arel
406
+ .when(Arel.quoted(o.width).abs - (number.length + sign_length) > 0)
407
+ .then(Arel.quoted(
408
+ o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
409
+ ).repeat(Arel.quoted(o.width).abs - (number.length + sign_length))
410
+ )
411
+ .else('')
412
+ end
413
+ before = !o.flags.include?('0') && !o.flags.include?('-') ? repeated_char : ''
414
+ middle = o.flags.include?('0') && !o.flags.include?('-') ? repeated_char : ''
410
415
  after = o.flags.include?('-') ? repeated_char : ''
411
416
  full_number = ArelExtensions::Nodes::Concat.new([
412
417
  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 = { 'en_US' => '.,', 'fr_FR' => ',', 'sv_SE' => ', ' }
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('
@@ -455,7 +455,7 @@ module ArelExtensions
455
455
  src_tz, dst_tz = o.time_zone.first
456
456
  collector << ' as timestamp) at time zone '
457
457
  collector = visit Arel.quoted(src_tz), collector
458
- collecto < ' at time zone '
458
+ collector < ' at time zone '
459
459
  collector = visit Arel.quoted(dst_tz), collector
460
460
  when String
461
461
  collector << ' as timestamp) at time zone '
@@ -587,7 +587,7 @@ module ArelExtensions
587
587
  alias_method(:old_visit_Arel_Nodes_TableAlias, :visit_Arel_Nodes_TableAlias) rescue nil
588
588
  def visit_Arel_Nodes_TableAlias o, collector
589
589
  if o.name.length > 30
590
- o = Arel::Table.new(o.table_name).alias(Base64.urlsafe_encode64(Digest::MD5.new.digest(o.name)).tr('=', '').tr('-', '_'))
590
+ o = Arel::Table.new(o.table_name).alias(Arel.shorten(o.name))
591
591
  end
592
592
  old_visit_Arel_Nodes_TableAlias(o, collector)
593
593
  end
@@ -601,7 +601,7 @@ module ArelExtensions
601
601
  else
602
602
  collector = visit o.left, collector
603
603
  end
604
- quote = o.right.to_s =~ /(\A["].*["]\z)|\A[a-zA-Z_]*\z/ ? '' : '"'
604
+ quote = /(\A".*"\z)|\A[a-zA-Z_]*\z/.match?(o.right.to_s) ? '' : '"'
605
605
  collector << " AS #{quote}"
606
606
  collector = visit o.right, collector
607
607
  collector << "#{quote}"
@@ -627,10 +627,10 @@ module ArelExtensions
627
627
  comma_in_format = o.precision == 0 ? '' : 'D'
628
628
  nines_after = (1..o.precision - 1).map{'9'}.join('') + '0'
629
629
  if comma.length == 1
630
- options = Arel.quoted("NLS_NUMERIC_CHARACTERS = '" + comma + " '")
630
+ options = Arel.quoted("NLS_NUMERIC_CHARACTERS = '#{comma} '")
631
631
  nines_before = ('999' * 4 + '990')
632
632
  else
633
- options = Arel.quoted("NLS_NUMERIC_CHARACTERS = '" + comma + "'")
633
+ options = Arel.quoted("NLS_NUMERIC_CHARACTERS = '#{comma}'")
634
634
  nines_before = ('999G' * 4 + '990')
635
635
  end
636
636
  sign = Arel.when(col < 0).
@@ -643,7 +643,7 @@ module ArelExtensions
643
643
  if o.scientific_notation
644
644
  number = Arel::Nodes::NamedFunction.new('TO_CHAR', [
645
645
  Arel.quoted(col.abs),
646
- Arel.quoted('FM' + nines_before + comma_in_format + nines_after + 'EEEE'),
646
+ Arel.quoted("FM#{nines_before}#{comma_in_format}#{nines_after}EEEE"),
647
647
  options
648
648
  ])
649
649
  if o.type == 'e'
@@ -652,20 +652,25 @@ module ArelExtensions
652
652
  else
653
653
  number = Arel::Nodes::NamedFunction.new('TO_CHAR', [
654
654
  Arel.quoted(col.abs),
655
- Arel.quoted('FM' + nines_before + comma_in_format + nines_after),
655
+ Arel.quoted("FM#{nines_before}#{comma_in_format}#{nines_after}"),
656
656
  options
657
657
  ])
658
658
  end
659
659
 
660
- repeated_char = (o.width == 0) ? Arel.quoted('') : ArelExtensions::Nodes::Case.new.
661
- when(Arel.quoted(o.width).abs - (number.length + sign_length) > 0).
662
- then(Arel.quoted(
663
- o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
664
- ).repeat(Arel.quoted(o.width).abs - (number.length + sign_length))
665
- ).
666
- else('')
667
- before = (!o.flags.include?('0')) && (!o.flags.include?('-')) ? repeated_char : ''
668
- middle = (o.flags.include?('0')) && (!o.flags.include?('-')) ? repeated_char : ''
660
+ repeated_char =
661
+ if o.width == 0
662
+ Arel.quoted('')
663
+ else
664
+ Arel
665
+ .when(Arel.quoted(o.width).abs - (number.length + sign_length) > 0)
666
+ .then(Arel.quoted(
667
+ o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
668
+ ).repeat(Arel.quoted(o.width).abs - (number.length + sign_length))
669
+ )
670
+ .else('')
671
+ end
672
+ before = !o.flags.include?('0') && !o.flags.include?('-') ? repeated_char : ''
673
+ middle = o.flags.include?('0') && !o.flags.include?('-') ? repeated_char : ''
669
674
  after = o.flags.include?('-') ? repeated_char : ''
670
675
  full_number = ArelExtensions::Nodes::Concat.new([
671
676
  before,
@@ -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('FM' + nines_before + '"' + comma + '"V' + nines_after)
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('FM' + nines_before)
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('FM' + nines_before + '"' + comma + '"V' + nines_after)
441
+ Arel.quoted("FM#{nines_before}\"#{comma}\"V#{nines_after}")
442
442
  ])])
443
443
  end
444
444
 
445
- repeated_char = (o.width == 0) ? Arel.quoted('') : ArelExtensions::Nodes::Case.new.
446
- when(Arel.quoted(o.width).abs - (number.length + sign_length) > 0).
447
- then(Arel.quoted(
448
- o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
449
- ).repeat(Arel.quoted(o.width).abs - (number.length + sign_length))
450
- ).
451
- else('')
452
- before = (!o.flags.include?('0')) && (!o.flags.include?('-')) ? repeated_char : ''
453
- middle = (o.flags.include?('0')) && (!o.flags.include?('-')) ? repeated_char : ''
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
- return Arel::Nodes::NamedFunction.new('STRFTIME', [element, '%H:%M:%S'])
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
- return Arel::Nodes::NamedFunction.new('STRFTIME', [element, '%H:%M:%S'])
332
+ Arel::Nodes::NamedFunction.new('STRFTIME', [element, '%H:%M:%S'])
333
333
  else
334
- return element
334
+ element
335
335
  end
336
336
  else
337
- return element
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 = Arel.quoted('[') + (o.orders ? o.dict.group_concat(', ', order: Array(o.orders)) : o.dict.group_concat(', ')).coalesce('') + ']'
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('{')
@@ -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
 
@@ -268,3 +269,12 @@ class Arel::Nodes::TableAlias
268
269
  end
269
270
  end
270
271
  end
272
+
273
+
274
+ class Arel::Attributes::Attribute
275
+ def to_sql(engine = Arel::Table.engine)
276
+ collector = Arel::Collectors::SQLString.new
277
+ collector = engine.connection.visitor.accept self, collector
278
+ collector.value
279
+ end
280
+ end
@@ -7,7 +7,7 @@ require 'active_record'
7
7
  require 'support/fake_record'
8
8
 
9
9
  def colored(color, msg)
10
- ENV['TERM'] =~ /^xterm|-256color$/ ? "\x1b[#{color}m#{msg}\x1b[89m\x1b[0m" : "#{msg}"
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 =~ /sqlite/i
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 =~ /pgsql/i
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 =~ /pgsql/i
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(((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
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