arel_extensions 2.4.0 → 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.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/.rubocop.yml +131 -5
  4. data/Makefile +31 -1
  5. data/NEWS.md +15 -0
  6. data/README.md +11 -2
  7. data/Rakefile +5 -3
  8. data/arel_extensions.gemspec +3 -5
  9. data/gemfiles/rails5.gemfile +15 -8
  10. data/gemfiles/rails5_1_4.gemfile +11 -9
  11. data/gemfiles/rails5_2.gemfile +16 -9
  12. data/gemfiles/rails6.gemfile +13 -7
  13. data/gemfiles/rails6_1.gemfile +13 -7
  14. data/gemfiles/rails7.gemfile +15 -9
  15. data/gemfiles/rails7_1.gemfile +15 -8
  16. data/gemfiles/rails7_2.gemfile +12 -6
  17. data/gemfiles/rails8.gemfile +7 -7
  18. data/gemfiles/rails8_1.gemfile +4 -4
  19. data/gemspecs/arel_extensions-v1.gemspec +3 -5
  20. data/gemspecs/arel_extensions-v2.gemspec +3 -5
  21. data/lib/arel_extensions/aliases.rb +3 -3
  22. data/lib/arel_extensions/attributes.rb +2 -0
  23. data/lib/arel_extensions/boolean_functions.rb +9 -7
  24. data/lib/arel_extensions/common_sql_functions.rb +5 -3
  25. data/lib/arel_extensions/comparators.rb +6 -4
  26. data/lib/arel_extensions/date_duration.rb +2 -0
  27. data/lib/arel_extensions/helpers.rb +17 -17
  28. data/lib/arel_extensions/insert_manager.rb +5 -1
  29. data/lib/arel_extensions/math.rb +40 -44
  30. data/lib/arel_extensions/math_functions.rb +28 -30
  31. data/lib/arel_extensions/nodes/aggregate_function.rb +4 -4
  32. data/lib/arel_extensions/nodes/blank.rb +6 -4
  33. data/lib/arel_extensions/nodes/case.rb +15 -12
  34. data/lib/arel_extensions/nodes/cast.rb +3 -5
  35. data/lib/arel_extensions/nodes/coalesce.rb +1 -1
  36. data/lib/arel_extensions/nodes/collate.rb +1 -1
  37. data/lib/arel_extensions/nodes/concat.rb +6 -6
  38. data/lib/arel_extensions/nodes/date_diff.rb +40 -49
  39. data/lib/arel_extensions/nodes/duration.rb +2 -2
  40. data/lib/arel_extensions/nodes/format.rb +2 -2
  41. data/lib/arel_extensions/nodes/formatted_date.rb +2 -2
  42. data/lib/arel_extensions/nodes/formatted_number.rb +2 -2
  43. data/lib/arel_extensions/nodes/function.rb +6 -4
  44. data/lib/arel_extensions/nodes/is_null.rb +2 -0
  45. data/lib/arel_extensions/nodes/json.rb +27 -15
  46. data/lib/arel_extensions/nodes/levenshtein_distance.rb +2 -2
  47. data/lib/arel_extensions/nodes/locate.rb +1 -1
  48. data/lib/arel_extensions/nodes/power.rb +2 -2
  49. data/lib/arel_extensions/nodes/rand.rb +2 -2
  50. data/lib/arel_extensions/nodes/repeat.rb +2 -2
  51. data/lib/arel_extensions/nodes/replace.rb +3 -3
  52. data/lib/arel_extensions/nodes/rollup.rb +4 -4
  53. data/lib/arel_extensions/nodes/round.rb +3 -3
  54. data/lib/arel_extensions/nodes/select.rb +1 -1
  55. data/lib/arel_extensions/nodes/std.rb +4 -4
  56. data/lib/arel_extensions/nodes/substring.rb +52 -2
  57. data/lib/arel_extensions/nodes/then.rb +1 -1
  58. data/lib/arel_extensions/nodes/trim.rb +2 -2
  59. data/lib/arel_extensions/nodes/union.rb +3 -3
  60. data/lib/arel_extensions/nodes/union_all.rb +3 -3
  61. data/lib/arel_extensions/nodes/wday.rb +2 -2
  62. data/lib/arel_extensions/null_functions.rb +5 -7
  63. data/lib/arel_extensions/predications.rb +22 -18
  64. data/lib/arel_extensions/string_functions.rb +26 -27
  65. data/lib/arel_extensions/version.rb +3 -1
  66. data/lib/arel_extensions/visitors/convert_format.rb +2 -2
  67. data/lib/arel_extensions/visitors/ibm_db.rb +5 -5
  68. data/lib/arel_extensions/visitors/mssql.rb +91 -92
  69. data/lib/arel_extensions/visitors/mysql.rb +89 -69
  70. data/lib/arel_extensions/visitors/oracle.rb +100 -104
  71. data/lib/arel_extensions/visitors/oracle12.rb +5 -6
  72. data/lib/arel_extensions/visitors/postgresql.rb +107 -94
  73. data/lib/arel_extensions/visitors/sqlite.rb +57 -65
  74. data/lib/arel_extensions/visitors/to_sql.rb +84 -74
  75. data/lib/arel_extensions/visitors.rb +6 -6
  76. data/lib/arel_extensions/warning.rb +5 -5
  77. data/lib/arel_extensions.rb +34 -27
  78. data/test/real_db_test.rb +31 -31
  79. data/test/visitors/test_to_sql.rb +2 -2
  80. data/test/with_ar/all_agnostic_test.rb +149 -15
  81. data/version_v1.rb +3 -1
  82. data/version_v2.rb +3 -1
  83. metadata +2 -30
@@ -1,13 +1,12 @@
1
1
  module ArelExtensions
2
2
  module Visitors
3
3
  module MSSQL
4
-
5
4
  MSSQL_CLASS_NAMES = %i[MSSQL SQLServer].freeze
6
5
 
7
6
  mssql_class =
8
7
  Arel::Visitors
9
8
  .constants
10
- .select { |c| Arel::Visitors.const_get(c).is_a?(Class) }
9
+ .select { |c| Arel::Visitors.const_get(c).is_a?(Class) }
11
10
  .find { |c| MSSQL_CLASS_NAMES.include?(c) }
12
11
 
13
12
  # This guard is necessary because:
@@ -47,7 +46,7 @@ module ArelExtensions
47
46
  Regexp.new(
48
47
  LOADED_VISITOR::DATE_FORMAT_DIRECTIVES
49
48
  .keys
50
- .map{|k| Regexp.escape(k)}
49
+ .map { |k| Regexp.escape(k) }
51
50
  .join('|')
52
51
  ).freeze
53
52
 
@@ -59,7 +58,7 @@ module ArelExtensions
59
58
  'MM-DD-YYYY' => 110,
60
59
  'YYYY/MM/DD' => 111,
61
60
  'DD-MM-YYYY' => 105,
62
- 'DD-MM-YY' => 5,
61
+ 'DD-MM-YY' => 5,
63
62
  'DD.MM.YYYY' => 104,
64
63
  'YYYY-MM-DDTHH:MM:SS:MMM' => 126
65
64
  }.freeze
@@ -89,15 +88,15 @@ module ArelExtensions
89
88
  if value.acts_like?(:time)
90
89
  if (ActiveRecord.respond_to?(:default_timezone) && ActiveRecord.default_timezone == :utc) || ActiveRecord::Base.default_timezone == :utc
91
90
  value = value.getutc if value.respond_to?(:getutc) && !value.utc?
92
- else
93
- value = value.getlocal if value.respond_to?(:getlocal)
91
+ elsif value.respond_to?(:getlocal)
92
+ value = value.getlocal
94
93
  end
95
94
  end
96
95
  # new versions of AR use `to_fs`, but we want max compatibility, and we're
97
96
  # not going to write it over and over, so it's fine like that.
98
97
  result = value.to_formatted_s(:db)
99
98
  if value.respond_to?(:usec) && value.usec > 0
100
- result << '.' << sprintf('%06d', value.usec)
99
+ result << '.' << format('%06d', value.usec)
101
100
  else
102
101
  result
103
102
  end
@@ -113,10 +112,10 @@ module ArelExtensions
113
112
 
114
113
  def quoted_time(value) # :nodoc:
115
114
  value = value.change(year: 2000, month: 1, day: 1)
116
- quoted_date(value).sub(/\A\d{4}-\d{2}-\d{2} /, "")
115
+ quoted_date(value).sub(/\A\d{4}-\d{2}-\d{2} /, '')
117
116
  end
118
117
 
119
- def quote value, column = nil
118
+ def quote(value, _column = nil)
120
119
  case value
121
120
  when Arel::Nodes::SqlLiteral
122
121
  value
@@ -145,8 +144,8 @@ module ArelExtensions
145
144
  end
146
145
  end
147
146
 
148
- alias_method(:old_primary_Key_From_Table, :primary_Key_From_Table) rescue nil
149
- def primary_Key_From_Table t
147
+ alias old_primary_Key_From_Table primary_Key_From_Table rescue nil
148
+ def primary_Key_From_Table(t)
150
149
  return unless t
151
150
 
152
151
  column_name = @connection.schema_cache.primary_keys(t.name) ||
@@ -155,48 +154,48 @@ module ArelExtensions
155
154
  end
156
155
 
157
156
  # Math Functions
158
- def visit_ArelExtensions_Nodes_Ceil o, collector
157
+ def visit_ArelExtensions_Nodes_Ceil(o, collector)
159
158
  collector << 'CEILING('
160
159
  collector = visit o.expr, collector
161
160
  collector << ')'
162
161
  collector
163
162
  end
164
163
 
165
- def visit_ArelExtensions_Nodes_Log10 o, collector
164
+ def visit_ArelExtensions_Nodes_Log10(o, collector)
166
165
  collector << 'LOG10('
167
- o.expressions.each_with_index { |arg, i|
168
- collector << Arel::Visitors::ToSql::COMMA if i != 0
169
- collector = visit arg, collector
170
- }
171
- collector << ')'
172
- collector
166
+ o.expressions.each_with_index { |arg, i|
167
+ collector << LOADED_VISITOR::COMMA if i != 0
168
+ collector = visit arg, collector
169
+ }
170
+ collector << ')'
171
+ collector
173
172
  end
174
173
 
175
- def visit_ArelExtensions_Nodes_Power o, collector
174
+ def visit_ArelExtensions_Nodes_Power(o, collector)
176
175
  collector << 'POWER('
177
176
  o.expressions.each_with_index { |arg, i|
178
- collector << Arel::Visitors::ToSql::COMMA if i != 0
177
+ collector << LOADED_VISITOR::COMMA if i != 0
179
178
  collector = visit arg, collector
180
179
  }
181
180
  collector << ')'
182
181
  collector
183
182
  end
184
183
 
185
- def visit_ArelExtensions_Nodes_IsNull o, collector
184
+ def visit_ArelExtensions_Nodes_IsNull(o, collector)
186
185
  collector << '('
187
186
  collector = visit o.expr, collector
188
187
  collector << ' IS NULL)'
189
188
  collector
190
189
  end
191
190
 
192
- def visit_ArelExtensions_Nodes_IsNotNull o, collector
191
+ def visit_ArelExtensions_Nodes_IsNotNull(o, collector)
193
192
  collector << '('
194
- collector = visit o.expr, collector
195
- collector << ' IS NOT NULL)'
196
- collector
193
+ collector = visit o.expr, collector
194
+ collector << ' IS NOT NULL)'
195
+ collector
197
196
  end
198
197
 
199
- def visit_ArelExtensions_Nodes_Concat o, collector
198
+ def visit_ArelExtensions_Nodes_Concat(o, collector)
200
199
  collector << 'CONCAT('
201
200
  o.expressions.each_with_index { |arg, i|
202
201
  collector << LOADED_VISITOR::COMMA if i != 0
@@ -206,23 +205,23 @@ module ArelExtensions
206
205
  collector
207
206
  end
208
207
 
209
- def visit_ArelExtensions_Nodes_Repeat o, collector
208
+ def visit_ArelExtensions_Nodes_Repeat(o, collector)
210
209
  collector << 'REPLICATE('
211
210
  o.expressions.each_with_index { |arg, i|
212
- collector << Arel::Visitors::ToSql::COMMA if i != 0
211
+ collector << LOADED_VISITOR::COMMA if i != 0
213
212
  collector = visit arg, collector
214
213
  }
215
214
  collector << ')'
216
215
  collector
217
216
  end
218
217
 
219
- def visit_ArelExtensions_Nodes_DateDiff o, collector
218
+ def visit_ArelExtensions_Nodes_DateDiff(o, collector)
220
219
  case o.right_node_type
221
220
  when :ruby_date, :ruby_time, :date, :datetime, :time
222
221
  collector << case o.left_node_type
223
- when :ruby_time, :datetime, :time then 'DATEDIFF(second'
224
- else 'DATEDIFF(day'
225
- end
222
+ when :ruby_time, :datetime, :time then 'DATEDIFF(second'
223
+ else 'DATEDIFF(day'
224
+ end
226
225
  collector << LOADED_VISITOR::COMMA
227
226
  collector = visit o.right, collector
228
227
  collector << LOADED_VISITOR::COMMA
@@ -244,7 +243,7 @@ module ArelExtensions
244
243
  collector
245
244
  end
246
245
 
247
- def visit_ArelExtensions_Nodes_DateAdd o, collector
246
+ def visit_ArelExtensions_Nodes_DateAdd(o, collector)
248
247
  collector << 'DATEADD('
249
248
  collector = visit o.mssql_datepart(o.right), collector
250
249
  collector << LOADED_VISITOR::COMMA
@@ -255,7 +254,7 @@ module ArelExtensions
255
254
  collector
256
255
  end
257
256
 
258
- def visit_ArelExtensions_Nodes_Duration o, collector
257
+ def visit_ArelExtensions_Nodes_Duration(o, collector)
259
258
  if o.with_interval && o.left.end_with?('i')
260
259
  collector = visit o.right, collector
261
260
  else
@@ -272,14 +271,14 @@ module ArelExtensions
272
271
  collector
273
272
  end
274
273
 
275
- def visit_ArelExtensions_Nodes_ByteSize o, collector
274
+ def visit_ArelExtensions_Nodes_ByteSize(o, collector)
276
275
  collector << 'DATALENGTH(CAST('
277
276
  collector = visit o.expr.coalesce(''), collector
278
277
  collector << ' AS VARCHAR(MAX)))'
279
278
  collector
280
279
  end
281
280
 
282
- def visit_ArelExtensions_Nodes_CharLength o, collector
281
+ def visit_ArelExtensions_Nodes_CharLength(o, collector)
283
282
  # According to the docs https://learn.microsoft.com/en-us/sql/t-sql/functions/len-transact-sql?view=sql-server-ver17
284
283
  # LEN doesn't take into account the trailing white space, and that's why
285
284
  # we need to do acrobatics.
@@ -289,7 +288,7 @@ module ArelExtensions
289
288
  collector
290
289
  end
291
290
 
292
- def visit_ArelExtensions_Nodes_Length o, collector
291
+ def visit_ArelExtensions_Nodes_Length(o, collector)
293
292
  if o.bytewise
294
293
  collector << '(DATALENGTH('
295
294
  collector = visit o.expr, collector
@@ -305,7 +304,7 @@ module ArelExtensions
305
304
  end
306
305
  end
307
306
 
308
- def visit_ArelExtensions_Nodes_Round o, collector
307
+ def visit_ArelExtensions_Nodes_Round(o, collector)
309
308
  collector << 'ROUND('
310
309
  o.expressions.each_with_index { |arg, i|
311
310
  collector << LOADED_VISITOR::COMMA if i != 0
@@ -319,7 +318,7 @@ module ArelExtensions
319
318
  collector
320
319
  end
321
320
 
322
- def visit_ArelExtensions_Nodes_Locate o, collector
321
+ def visit_ArelExtensions_Nodes_Locate(o, collector)
323
322
  collector << 'CHARINDEX('
324
323
  collector = visit o.right, collector
325
324
  collector << LOADED_VISITOR::COMMA
@@ -328,7 +327,9 @@ module ArelExtensions
328
327
  collector
329
328
  end
330
329
 
331
- def visit_ArelExtensions_Nodes_Substring o, collector
330
+ def visit_ArelExtensions_Nodes_Substring(o, collector)
331
+ return visit(o.range_substring_node, collector) if o.range?
332
+
332
333
  collector << 'SUBSTRING('
333
334
  collector = visit o.expressions[0], collector
334
335
  collector << LOADED_VISITOR::COMMA
@@ -339,24 +340,24 @@ module ArelExtensions
339
340
  collector
340
341
  end
341
342
 
342
- def visit_ArelExtensions_Nodes_Trim o, collector
343
+ def visit_ArelExtensions_Nodes_Trim(o, collector)
343
344
  # NOTE: in MSSQL's `blank`, o.right is the space char so we need to
344
345
  # account for it.
345
346
  if o.right && !/\A\s\Z/.match(o.right.expr)
346
347
  collector << 'dbo.TrimChar('
347
348
  collector = visit o.left, collector
348
- collector << Arel::Visitors::MSSQL::COMMA
349
+ collector << LOADED_VISITOR::COMMA
349
350
  collector = visit o.right, collector
350
351
  collector << ')'
351
352
  else
352
- collector << "LTRIM(RTRIM("
353
+ collector << 'LTRIM(RTRIM('
353
354
  collector = visit o.left, collector
354
- collector << "))"
355
+ collector << '))'
355
356
  end
356
357
  collector
357
358
  end
358
359
 
359
- def visit_ArelExtensions_Nodes_Ltrim o, collector
360
+ def visit_ArelExtensions_Nodes_Ltrim(o, collector)
360
361
  if o.right
361
362
  collector << 'REPLACE(REPLACE(LTRIM(REPLACE(REPLACE('
362
363
  collector = visit o.left, collector
@@ -373,7 +374,7 @@ module ArelExtensions
373
374
  collector
374
375
  end
375
376
 
376
- def visit_ArelExtensions_Nodes_Rtrim o, collector
377
+ def visit_ArelExtensions_Nodes_Rtrim(o, collector)
377
378
  if o.right
378
379
  collector << 'REPLACE(REPLACE(RTRIM(REPLACE(REPLACE('
379
380
  collector = visit o.left, collector
@@ -390,20 +391,20 @@ module ArelExtensions
390
391
  collector
391
392
  end
392
393
 
393
- def visit_ArelExtensions_Nodes_Blank o, collector
394
+ def visit_ArelExtensions_Nodes_Blank(o, collector)
394
395
  visit o.expr.coalesce('').trim.length.eq(0), collector
395
396
  end
396
397
 
397
- def visit_ArelExtensions_Nodes_NotBlank o, collector
398
+ def visit_ArelExtensions_Nodes_NotBlank(o, collector)
398
399
  visit o.expr.coalesce('').trim.length.gt(0), collector
399
400
  end
400
401
 
401
- def visit_ArelExtensions_Nodes_Format o, collector
402
+ def visit_ArelExtensions_Nodes_Format(o, collector)
402
403
  visit_ArelExtensions_Nodes_FormattedDate o, collector
403
404
  end
404
405
 
405
- def visit_ArelExtensions_Nodes_FormattedDate o, collector
406
- f = ArelExtensions::Visitors::strftime_to_format(o.iso_format, LOADED_VISITOR::DATE_FORMAT_DIRECTIVES)
406
+ def visit_ArelExtensions_Nodes_FormattedDate(o, collector)
407
+ f = ArelExtensions::Visitors.strftime_to_format(o.iso_format, LOADED_VISITOR::DATE_FORMAT_DIRECTIVES)
407
408
  if fmt = LOADED_VISITOR::DATE_CONVERT_FORMATS[f]
408
409
  collector << "CONVERT(VARCHAR(#{f.length})"
409
410
  collector << LOADED_VISITOR::COMMA
@@ -435,8 +436,7 @@ module ArelExtensions
435
436
  while !s.eos?
436
437
  collector << sep
437
438
  sep = ' + '
438
- case
439
- when s.scan(LOADED_VISITOR::DATE_FORMAT_REGEX)
439
+ if s.scan(LOADED_VISITOR::DATE_FORMAT_REGEX)
440
440
  dir = LOADED_VISITOR::DATE_FORMAT_DIRECTIVES[s.matched]
441
441
  fmt = LOADED_VISITOR::DATE_FORMAT_FORMAT[dir]
442
442
  date_name = LOADED_VISITOR::DATE_NAME.include?(s.matched)
@@ -454,7 +454,8 @@ module ArelExtensions
454
454
  collector = visit o.left, collector
455
455
  case o.time_zone
456
456
  when Hash
457
- src_tz, dst_tz = o.time_zone.first.first, o.time_zone.first.second
457
+ src_tz = o.time_zone.first.first
458
+ dst_tz = o.time_zone.first.second
458
459
  collector << ') AT TIME ZONE '
459
460
  collector = visit Arel.quoted(src_tz), collector
460
461
  collector << ' AT TIME ZONE '
@@ -467,9 +468,9 @@ module ArelExtensions
467
468
  collector << ')' if !fmt && !date_name
468
469
  collector << LOADED_VISITOR::COMMA << "'#{fmt}')" if fmt
469
470
  collector << '))'
470
- when s.scan(/^%%/)
471
+ elsif s.scan(/^%%/)
471
472
  collector = visit Arel.quoted('%'), collector
472
- when s.scan(/[^%]+|./)
473
+ elsif s.scan(/[^%]+|./)
473
474
  collector = visit Arel.quoted(s.matched), collector
474
475
  end
475
476
  end
@@ -478,7 +479,7 @@ module ArelExtensions
478
479
  end
479
480
  end
480
481
 
481
- def visit_ArelExtensions_Nodes_Replace o, collector
482
+ def visit_ArelExtensions_Nodes_Replace(o, collector)
482
483
  collector << 'REPLACE('
483
484
  o.expressions.each_with_index { |arg, i|
484
485
  collector << LOADED_VISITOR::COMMA if i != 0
@@ -488,7 +489,7 @@ module ArelExtensions
488
489
  collector
489
490
  end
490
491
 
491
- def visit_ArelExtensions_Nodes_FindInSet o, collector
492
+ def visit_ArelExtensions_Nodes_FindInSet(o, collector)
492
493
  collector << 'dbo.FIND_IN_SET('
493
494
  o.expressions.each_with_index { |arg, i|
494
495
  collector << LOADED_VISITOR::COMMA if i != 0
@@ -499,7 +500,7 @@ module ArelExtensions
499
500
  end
500
501
 
501
502
  # TODO; manage case insensitivity
502
- def visit_ArelExtensions_Nodes_IMatches o, collector
503
+ def visit_ArelExtensions_Nodes_IMatches(o, collector)
503
504
  collector = visit o.left.ci_collate, collector
504
505
  collector << ' LIKE '
505
506
  collector = visit o.right.ci_collate, collector
@@ -512,7 +513,7 @@ module ArelExtensions
512
513
  end
513
514
 
514
515
  # TODO; manage case insensitivity
515
- def visit_ArelExtensions_Nodes_IDoesNotMatch o, collector
516
+ def visit_ArelExtensions_Nodes_IDoesNotMatch(o, collector)
516
517
  collector = visit o.left.ci_collate, collector
517
518
  collector << ' NOT LIKE '
518
519
  collector = visit o.right.ci_collate, collector
@@ -524,7 +525,7 @@ module ArelExtensions
524
525
  end
525
526
  end
526
527
 
527
- def visit_ArelExtensions_Nodes_AiMatches o, collector
528
+ def visit_ArelExtensions_Nodes_AiMatches(o, collector)
528
529
  collector = visit o.left.ai_collate, collector
529
530
  collector << ' LIKE '
530
531
  collector = visit o.right.ai_collate, collector
@@ -536,7 +537,7 @@ module ArelExtensions
536
537
  end
537
538
  end
538
539
 
539
- def visit_ArelExtensions_Nodes_AiIMatches o, collector
540
+ def visit_ArelExtensions_Nodes_AiIMatches(o, collector)
540
541
  collector = visit o.left.collate(true, true), collector
541
542
  collector << ' LIKE '
542
543
  collector = visit o.right.collate(true, true), collector
@@ -548,7 +549,7 @@ module ArelExtensions
548
549
  end
549
550
  end
550
551
 
551
- def visit_ArelExtensions_Nodes_SMatches o, collector
552
+ def visit_ArelExtensions_Nodes_SMatches(o, collector)
552
553
  collector = visit o.left.collate, collector
553
554
  collector << ' LIKE '
554
555
  collector = visit o.right.collate, collector
@@ -560,7 +561,7 @@ module ArelExtensions
560
561
  end
561
562
  end
562
563
 
563
- def visit_ArelExtensions_Nodes_Collate o, collector
564
+ def visit_ArelExtensions_Nodes_Collate(o, collector)
564
565
  if o.ai && o.ci
565
566
  collector = visit o.expressions.first, collector
566
567
  collector << ' COLLATE Latin1_General_CI_AI'
@@ -577,8 +578,8 @@ module ArelExtensions
577
578
  collector
578
579
  end
579
580
 
580
- alias_method(:old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As) rescue nil
581
- def visit_Arel_Nodes_As o, collector
581
+ alias old_visit_Arel_Nodes_As visit_Arel_Nodes_As rescue nil
582
+ def visit_Arel_Nodes_As(o, collector)
582
583
  if o.left.is_a?(Arel::Nodes::Binary)
583
584
  collector << '('
584
585
  collector = visit o.left, collector
@@ -594,7 +595,7 @@ module ArelExtensions
594
595
  # This is a lie, it's not about arel version, but SQL Server's (>= 2000).
595
596
  %w([ ])
596
597
  elsif ACTIVE_RECORD_VERSION < V8_1 && o.right[0] != '"' && o.right[-1] != '"'
597
- %w(" ")
598
+ %w[" "]
598
599
  else
599
600
  []
600
601
  end
@@ -606,38 +607,38 @@ module ArelExtensions
606
607
  end
607
608
 
608
609
  # SQL Server does not know about REGEXP
609
- def visit_Arel_Nodes_Regexp o, collector
610
+ def visit_Arel_Nodes_Regexp(o, collector)
610
611
  collector = visit o.left, collector
611
612
  collector << "LIKE '%#{o.right}%'"
612
613
  collector
613
614
  end
614
615
 
615
- def visit_Arel_Nodes_NotRegexp o, collector
616
+ def visit_Arel_Nodes_NotRegexp(o, collector)
616
617
  collector = visit o.left, collector
617
618
  collector << "NOT LIKE '%#{o.right}%'"
618
619
  collector
619
620
  end
620
621
 
621
622
  def visit_Arel_Nodes_RollUp(o, collector)
622
- collector << "ROLLUP"
623
+ collector << 'ROLLUP'
623
624
  grouping_array_or_grouping_element o, collector
624
625
  end
625
626
 
626
- def visit_ArelExtensions_Nodes_GroupConcat o, collector
627
+ def visit_ArelExtensions_Nodes_GroupConcat(o, collector)
627
628
  collector << '(STRING_AGG('
628
629
  collector = visit o.left, collector
629
- collector << Arel::Visitors::Oracle::COMMA
630
+ collector << LOADED_VISITOR::COMMA
630
631
  sep = o.separator.is_a?(Arel::Nodes::Quoted) ? o.separator.expr : o.separator
631
632
  collector =
632
- if 'NULL' != sep
633
- visit o.separator, collector
634
- else
633
+ if 'NULL' == sep
635
634
  visit Arel.quoted(','), collector
635
+ else
636
+ visit o.separator, collector
636
637
  end
637
638
  collector << ') WITHIN GROUP (ORDER BY '
638
639
  if o.order.present?
639
640
  o.order.each_with_index do |order, i|
640
- collector << Arel::Visitors::Oracle::COMMA if i != 0
641
+ collector << LOADED_VISITOR::COMMA if i != 0
641
642
  collector = visit order, collector
642
643
  end
643
644
  else
@@ -647,18 +648,18 @@ module ArelExtensions
647
648
  collector
648
649
  end
649
650
 
650
- def visit_ArelExtensions_Nodes_MD5 o, collector
651
- collector << "LOWER(CONVERT(NVARCHAR(32),HashBytes('MD5',CONVERT(VARCHAR,"
651
+ def visit_ArelExtensions_Nodes_MD5(o, collector)
652
+ collector << "LOWER(CONVERT(NVARCHAR(32),HashBytes('MD5',CONVERT(VARCHAR(MAX),"
652
653
  collector = visit o.left, collector
653
654
  collector << ')),2))'
654
655
  collector
655
656
  end
656
657
 
657
- def visit_ArelExtensions_Nodes_Cast o, collector
658
+ def visit_ArelExtensions_Nodes_Cast(o, collector)
658
659
  as_attr =
659
660
  case o.as_attr
660
661
  when :string
661
- 'varchar'
662
+ 'varchar(MAX)'
662
663
  when :time
663
664
  'time'
664
665
  when :date
@@ -685,7 +686,7 @@ module ArelExtensions
685
686
  collector
686
687
  end
687
688
 
688
- def visit_ArelExtensions_Nodes_FormattedNumber o, collector
689
+ def visit_ArelExtensions_Nodes_FormattedNumber(o, collector)
689
690
  col = o.left.coalesce(0)
690
691
  locale = Arel.quoted(o.locale.tr('_', '-'))
691
692
  param = Arel.quoted("N#{o.precision}")
@@ -746,35 +747,33 @@ module ArelExtensions
746
747
  collector
747
748
  end
748
749
 
749
- def visit_ArelExtensions_Nodes_Std o, collector
750
+ def visit_ArelExtensions_Nodes_Std(o, collector)
750
751
  collector << (o.unbiased_estimator ? 'STDEV(' : 'STDEVP(')
751
752
  visit o.left, collector
752
753
  collector << ')'
753
754
  collector
754
755
  end
755
756
 
756
- def visit_ArelExtensions_Nodes_Variance o, collector
757
+ def visit_ArelExtensions_Nodes_Variance(o, collector)
757
758
  collector << (o.unbiased_estimator ? 'VAR(' : 'VARP(')
758
759
  visit o.left, collector
759
760
  collector << ')'
760
761
  collector
761
762
  end
762
763
 
763
-
764
- def visit_ArelExtensions_Nodes_LevenshteinDistance o, collector
764
+ def visit_ArelExtensions_Nodes_LevenshteinDistance(o, collector)
765
765
  collector << 'dbo.LEVENSHTEIN_DISTANCE('
766
766
  collector = visit o.left, collector
767
- collector << Arel::Visitors::ToSql::COMMA
767
+ collector << LOADED_VISITOR::COMMA
768
768
  collector = visit o.right, collector
769
769
  collector << ')'
770
770
  collector
771
771
  end
772
772
 
773
-
774
- def visit_ArelExtensions_Nodes_JsonGet o, collector
773
+ def visit_ArelExtensions_Nodes_JsonGet(o, collector)
775
774
  collector << 'JSON_VALUE('
776
775
  collector = visit o.dict, collector
777
- collector << Arel::Visitors::MySQL::COMMA
776
+ collector << LOADED_VISITOR::COMMA
778
777
  if o.key.is_a?(Integer)
779
778
  collector << "\"$[#{o.key}]\""
780
779
  else
@@ -788,9 +787,9 @@ module ArelExtensions
788
787
  # handle grouping aggregation semantics
789
788
  def grouping_array_or_grouping_element(o, collector)
790
789
  if o.expr.is_a? Array
791
- collector << "( "
790
+ collector << '( '
792
791
  visit o.expr, collector
793
- collector << " )"
792
+ collector << ' )'
794
793
  else
795
794
  visit o.expr, collector
796
795
  end