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.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +92 -43
  3. data/.gitignore +2 -1
  4. data/.rubocop.yml +131 -5
  5. data/Makefile +48 -0
  6. data/NEWS.md +22 -0
  7. data/README.md +32 -5
  8. data/Rakefile +5 -3
  9. data/arel_extensions.gemspec +3 -5
  10. data/dev/arelx.dockerfile +13 -16
  11. data/dev/compose.yaml +26 -28
  12. data/gemfiles/rails5.gemfile +15 -8
  13. data/gemfiles/rails5_1_4.gemfile +11 -9
  14. data/gemfiles/rails5_2.gemfile +16 -9
  15. data/gemfiles/rails6.gemfile +13 -7
  16. data/gemfiles/rails6_1.gemfile +13 -7
  17. data/gemfiles/rails7.gemfile +15 -9
  18. data/gemfiles/rails7_1.gemfile +15 -8
  19. data/gemfiles/rails7_2.gemfile +12 -6
  20. data/gemfiles/rails8.gemfile +40 -0
  21. data/gemfiles/rails8_1.gemfile +41 -0
  22. data/gemspecs/arel_extensions-v1.gemspec +3 -5
  23. data/gemspecs/arel_extensions-v2.gemspec +3 -5
  24. data/lib/arel_extensions/aliases.rb +3 -3
  25. data/lib/arel_extensions/attributes.rb +2 -0
  26. data/lib/arel_extensions/boolean_functions.rb +9 -7
  27. data/lib/arel_extensions/common_sql_functions.rb +5 -3
  28. data/lib/arel_extensions/comparators.rb +6 -4
  29. data/lib/arel_extensions/constants.rb +13 -0
  30. data/lib/arel_extensions/date_duration.rb +2 -0
  31. data/lib/arel_extensions/helpers.rb +18 -19
  32. data/lib/arel_extensions/insert_manager.rb +5 -1
  33. data/lib/arel_extensions/math.rb +40 -44
  34. data/lib/arel_extensions/math_functions.rb +29 -31
  35. data/lib/arel_extensions/nodes/aggregate_function.rb +4 -4
  36. data/lib/arel_extensions/nodes/blank.rb +6 -4
  37. data/lib/arel_extensions/nodes/byte_size.rb +11 -0
  38. data/lib/arel_extensions/nodes/case.rb +16 -13
  39. data/lib/arel_extensions/nodes/cast.rb +3 -5
  40. data/lib/arel_extensions/nodes/char_length.rb +11 -0
  41. data/lib/arel_extensions/nodes/coalesce.rb +1 -1
  42. data/lib/arel_extensions/nodes/collate.rb +1 -1
  43. data/lib/arel_extensions/nodes/concat.rb +6 -6
  44. data/lib/arel_extensions/nodes/date_diff.rb +40 -49
  45. data/lib/arel_extensions/nodes/duration.rb +2 -2
  46. data/lib/arel_extensions/nodes/format.rb +2 -2
  47. data/lib/arel_extensions/nodes/formatted_date.rb +2 -2
  48. data/lib/arel_extensions/nodes/formatted_number.rb +2 -2
  49. data/lib/arel_extensions/nodes/function.rb +7 -7
  50. data/lib/arel_extensions/nodes/is_null.rb +2 -0
  51. data/lib/arel_extensions/nodes/json.rb +27 -15
  52. data/lib/arel_extensions/nodes/levenshtein_distance.rb +2 -2
  53. data/lib/arel_extensions/nodes/locate.rb +1 -1
  54. data/lib/arel_extensions/nodes/matches.rb +2 -2
  55. data/lib/arel_extensions/nodes/power.rb +2 -2
  56. data/lib/arel_extensions/nodes/rand.rb +2 -2
  57. data/lib/arel_extensions/nodes/repeat.rb +2 -2
  58. data/lib/arel_extensions/nodes/replace.rb +3 -3
  59. data/lib/arel_extensions/nodes/rollup.rb +4 -4
  60. data/lib/arel_extensions/nodes/round.rb +3 -3
  61. data/lib/arel_extensions/nodes/select.rb +1 -1
  62. data/lib/arel_extensions/nodes/std.rb +4 -4
  63. data/lib/arel_extensions/nodes/substring.rb +52 -2
  64. data/lib/arel_extensions/nodes/then.rb +1 -1
  65. data/lib/arel_extensions/nodes/trim.rb +2 -2
  66. data/lib/arel_extensions/nodes/union.rb +3 -3
  67. data/lib/arel_extensions/nodes/union_all.rb +3 -3
  68. data/lib/arel_extensions/nodes/wday.rb +2 -2
  69. data/lib/arel_extensions/null_functions.rb +5 -7
  70. data/lib/arel_extensions/predications.rb +23 -19
  71. data/lib/arel_extensions/string_functions.rb +37 -28
  72. data/lib/arel_extensions/version.rb +3 -1
  73. data/lib/arel_extensions/visitors/convert_format.rb +2 -2
  74. data/lib/arel_extensions/visitors/ibm_db.rb +5 -5
  75. data/lib/arel_extensions/visitors/mssql.rb +111 -97
  76. data/lib/arel_extensions/visitors/mysql.rb +101 -67
  77. data/lib/arel_extensions/visitors/oracle.rb +113 -103
  78. data/lib/arel_extensions/visitors/oracle12.rb +5 -6
  79. data/lib/arel_extensions/visitors/postgresql.rb +119 -92
  80. data/lib/arel_extensions/visitors/sqlite.rb +72 -64
  81. data/lib/arel_extensions/visitors/to_sql.rb +85 -75
  82. data/lib/arel_extensions/visitors.rb +7 -7
  83. data/lib/arel_extensions/warning.rb +5 -5
  84. data/lib/arel_extensions.rb +47 -31
  85. data/test/arelx_test_helper.rb +8 -6
  86. data/test/config_loader.rb +9 -0
  87. data/test/database.yml +8 -6
  88. data/test/real_db_test.rb +33 -33
  89. data/test/support/fake_record.rb +3 -1
  90. data/test/visitors/test_bulk_insert_oracle.rb +2 -2
  91. data/test/visitors/test_bulk_insert_sqlite.rb +2 -2
  92. data/test/visitors/test_to_sql.rb +2 -2
  93. data/test/with_ar/all_agnostic_test.rb +214 -32
  94. data/test/with_ar/insert_agnostic_test.rb +2 -2
  95. data/test/with_ar/test_bulk_sqlite.rb +2 -2
  96. data/test/with_ar/test_math_sqlite.rb +2 -2
  97. data/test/with_ar/test_string_mysql.rb +2 -2
  98. data/test/with_ar/test_string_sqlite.rb +2 -2
  99. data/version_v1.rb +3 -1
  100. data/version_v2.rb +3 -1
  101. metadata +9 -33
  102. data/bin/compose +0 -6
  103. data/gemfiles/rails3.gemfile +0 -20
  104. data/gemfiles/rails4_2.gemfile +0 -38
@@ -13,27 +13,41 @@ module ArelExtensions
13
13
  }
14
14
  NUMBER_COMMA_MAPPING = {'en_US' => '.,', 'fr_FR' => ',', 'sv_SE' => ', '}
15
15
 
16
- def visit_ArelExtensions_Nodes_Log10 o, collector
16
+ def visit_ArelExtensions_Nodes_ByteSize(o, collector)
17
+ collector << 'LENGTHB('
18
+ collector = visit o.expr.coalesce(''), collector
19
+ collector << ')'
20
+ collector
21
+ end
22
+
23
+ def visit_ArelExtensions_Nodes_CharLength(o, collector)
24
+ collector << 'LENGTH('
25
+ collector = visit o.expr.coalesce(''), collector
26
+ collector << ')'
27
+ collector
28
+ end
29
+
30
+ def visit_ArelExtensions_Nodes_Log10(o, collector)
17
31
  collector << 'LOG('
18
32
  o.expressions.each_with_index { |arg, i|
19
- collector << Arel::Visitors::ToSql::COMMA if i != 0
33
+ collector << COMMA if i != 0
20
34
  collector = visit arg, collector
21
35
  }
22
36
  collector << ',10)'
23
37
  collector
24
38
  end
25
39
 
26
- def visit_ArelExtensions_Nodes_Power o, collector
40
+ def visit_ArelExtensions_Nodes_Power(o, collector)
27
41
  collector << 'POWER('
28
42
  o.expressions.each_with_index { |arg, i|
29
- collector << Arel::Visitors::ToSql::COMMA if i != 0
43
+ collector << COMMA if i != 0
30
44
  collector = visit arg, collector
31
45
  }
32
46
  collector << ')'
33
47
  collector
34
48
  end
35
49
 
36
- def visit_ArelExtensions_Nodes_Concat o, collector
50
+ def visit_ArelExtensions_Nodes_Concat(o, collector)
37
51
  collector << '('
38
52
  o.expressions.each_with_index { |arg, i|
39
53
  collector = visit o.convert_to_string_node(arg), collector
@@ -43,7 +57,7 @@ module ArelExtensions
43
57
  collector
44
58
  end
45
59
 
46
- def visit_ArelExtensions_Nodes_IMatches o, collector
60
+ def visit_ArelExtensions_Nodes_IMatches(o, collector)
47
61
  collector << 'LOWER('
48
62
  collector = visit o.left, collector
49
63
  collector << ') LIKE LOWER('
@@ -57,7 +71,7 @@ module ArelExtensions
57
71
  end
58
72
  end
59
73
 
60
- def visit_ArelExtensions_Nodes_AiMatches o, collector
74
+ def visit_ArelExtensions_Nodes_AiMatches(o, collector)
61
75
  collector = visit o.left.ai_collate, collector
62
76
  collector << ' LIKE '
63
77
  collector = visit o.right.ai_collate, collector
@@ -69,7 +83,7 @@ module ArelExtensions
69
83
  end
70
84
  end
71
85
 
72
- def visit_ArelExtensions_Nodes_AiIMatches o, collector
86
+ def visit_ArelExtensions_Nodes_AiIMatches(o, collector)
73
87
  collector = visit o.left.ai_collate, collector
74
88
  collector << ' LIKE '
75
89
  collector = visit o.right.ai_collate, collector
@@ -81,7 +95,7 @@ module ArelExtensions
81
95
  end
82
96
  end
83
97
 
84
- def visit_ArelExtensions_Nodes_SMatches o, collector
98
+ def visit_ArelExtensions_Nodes_SMatches(o, collector)
85
99
  collector = visit o.left, collector
86
100
  collector << ' LIKE '
87
101
  collector = visit o.right, collector
@@ -93,7 +107,7 @@ module ArelExtensions
93
107
  end
94
108
  end
95
109
 
96
- def visit_ArelExtensions_Nodes_IDoesNotMatch o, collector
110
+ def visit_ArelExtensions_Nodes_IDoesNotMatch(o, collector)
97
111
  collector << 'LOWER('
98
112
  collector = visit o.left, collector
99
113
  collector << ') NOT LIKE LOWER('
@@ -107,7 +121,7 @@ module ArelExtensions
107
121
  end
108
122
  end
109
123
 
110
- def visit_ArelExtensions_Nodes_Collate o, collector
124
+ def visit_ArelExtensions_Nodes_Collate(o, collector)
111
125
  if o.ai
112
126
  collector << 'NLSSORT('
113
127
  collector = visit o.expressions.first, collector
@@ -123,39 +137,39 @@ module ArelExtensions
123
137
  else
124
138
  collector = visit o.expressions.first, collector
125
139
  end
126
- collector
140
+ collector
127
141
  end
128
142
 
129
143
  def visit_Arel_Nodes_RollUp(o, collector)
130
- collector << "ROLLUP"
144
+ collector << 'ROLLUP'
131
145
  grouping_array_or_grouping_element o, collector
132
146
  end
133
147
 
134
- def visit_ArelExtensions_Nodes_GroupConcat o, collector
148
+ def visit_ArelExtensions_Nodes_GroupConcat(o, collector)
135
149
  collector << '(LISTAGG('
136
150
  collector = visit o.left, collector
137
151
  collector << COMMA
138
152
  sep = o.separator.is_a?(Arel::Nodes::Quoted) ? o.separator.expr : o.separator
139
153
  collector =
140
- if 'NULL' != sep
141
- visit o.separator, collector
142
- else
154
+ if 'NULL' == sep
143
155
  visit Arel.quoted(','), collector
156
+ else
157
+ visit o.separator, collector
144
158
  end
145
159
  collector << ') WITHIN GROUP (ORDER BY '
146
- if !o.order.blank?
160
+ if o.order.blank?
161
+ collector = visit o.left, collector
162
+ else
147
163
  o.order.each_with_index do |order, i|
148
164
  collector << COMMA if i != 0
149
165
  collector = visit order, collector
150
166
  end
151
- else
152
- collector = visit o.left, collector
153
167
  end
154
168
  collector << '))'
155
169
  collector
156
170
  end
157
171
 
158
- def visit_ArelExtensions_Nodes_Coalesce o, collector
172
+ def visit_ArelExtensions_Nodes_Coalesce(o, collector)
159
173
  collector << 'COALESCE('
160
174
  o.expressions.each_with_index { |arg, i|
161
175
  collector << COMMA if i != 0
@@ -175,7 +189,7 @@ module ArelExtensions
175
189
  collector
176
190
  end
177
191
 
178
- def visit_ArelExtensions_Nodes_MD5 o, collector
192
+ def visit_ArelExtensions_Nodes_MD5(o, collector)
179
193
  collector << 'LOWER (RAWTOHEX (DBMS_OBFUSCATION_TOOLKIT.md5(input => UTL_I18N.STRING_TO_RAW('
180
194
  collector = visit o.left, collector
181
195
  collector << ", 'AL32UTF8'))))"
@@ -183,9 +197,9 @@ module ArelExtensions
183
197
  end
184
198
 
185
199
  # :date is not possible in Oracle since this type does not really exist
186
- def visit_ArelExtensions_Nodes_DateDiff o, collector
187
- lc = o.left_node_type == :ruby_date || o.left_node_type == :ruby_time
188
- rc = o.right_node_type == :ruby_date || o.right_node_type == :ruby_time
200
+ def visit_ArelExtensions_Nodes_DateDiff(o, collector)
201
+ lc = %i[ruby_date ruby_time].include?(o.left_node_type)
202
+ rc = %i[ruby_date ruby_time].include?(o.right_node_type)
189
203
  if rc || o.right_node_type == :date || o.right_node_type == :datetime || o.right_node_type == :time
190
204
  collector << '('
191
205
  collector << 'TO_DATE(' if lc
@@ -196,7 +210,7 @@ module ArelExtensions
196
210
  collector = visit o.right, collector
197
211
  collector << ')' if rc
198
212
  collector << ')'
199
- if (o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time)
213
+ if %i[ruby_time datetime time].include?(o.left_node_type)
200
214
  collector << ' * (CASE WHEN (TRUNC('
201
215
  collector << 'TO_DATE(' if lc
202
216
  collector = visit o.left, collector
@@ -222,7 +236,7 @@ module ArelExtensions
222
236
  collector
223
237
  end
224
238
 
225
- def visit_ArelExtensions_Nodes_Duration o, collector
239
+ def visit_ArelExtensions_Nodes_Duration(o, collector)
226
240
  case o.left
227
241
  when 'wd', 'w'
228
242
  collector << 'TO_CHAR('
@@ -230,23 +244,24 @@ module ArelExtensions
230
244
  collector << COMMA
231
245
  collector = visit Arel.quoted(DATE_MAPPING[o.left]), collector
232
246
  else
233
- right = case o.left
234
- when 'd', 'm', 'y'
235
- interval = 'DAY'
236
- o.right.cast(:date)
237
- when 'h', 'mn', 's'
238
- interval = 'SECOND'
239
- o.right.cast(:datetime)
240
- when /i\z/
241
- interval = DATE_MAPPING[o.left[0..-2]]
242
- collector << '('
243
- collector = visit o.right, collector
244
- collector << ") * (INTERVAL '1' #{interval})"
245
- return collector
246
- else
247
- interval = nil
248
- o.right
249
- end
247
+ right =
248
+ case o.left
249
+ when 'd', 'm', 'y'
250
+ interval = 'DAY'
251
+ o.right.cast(:date)
252
+ when 'h', 'mn', 's'
253
+ interval = 'SECOND'
254
+ o.right.cast(:datetime)
255
+ when /i\z/
256
+ interval = DATE_MAPPING[o.left[0..-2]]
257
+ collector << '('
258
+ collector = visit o.right, collector
259
+ collector << ") * (INTERVAL '1' #{interval})"
260
+ return collector
261
+ else
262
+ interval = nil
263
+ o.right
264
+ end
250
265
  collector << "EXTRACT(#{DATE_MAPPING[o.left]} FROM "
251
266
  collector = visit right, collector
252
267
  end
@@ -255,7 +270,7 @@ module ArelExtensions
255
270
  collector
256
271
  end
257
272
 
258
- def visit_ArelExtensions_Nodes_Cast o, collector
273
+ def visit_ArelExtensions_Nodes_Cast(o, collector)
259
274
  case o.as_attr
260
275
  when :string
261
276
  collector << 'TO_CHAR('
@@ -314,26 +329,26 @@ module ArelExtensions
314
329
  collector
315
330
  end
316
331
 
317
- def visit_ArelExtensions_Nodes_Length o, collector
318
- collector << "LENGTH#{o.bytewise ? 'B' : ''}("
332
+ def visit_ArelExtensions_Nodes_Length(o, collector)
333
+ collector << "LENGTH#{'B' if o.bytewise}("
319
334
  collector = visit o.expr, collector
320
335
  collector << ')'
321
336
  collector
322
337
  end
323
338
 
324
- def visit_ArelExtensions_Nodes_IsNull o, collector
339
+ def visit_ArelExtensions_Nodes_IsNull(o, collector)
325
340
  collector = visit o.expr, collector
326
341
  collector << ' IS NULL'
327
342
  collector
328
343
  end
329
344
 
330
- def visit_ArelExtensions_Nodes_IsNotNull o, collector
345
+ def visit_ArelExtensions_Nodes_IsNotNull(o, collector)
331
346
  collector = visit o.expr, collector
332
347
  collector << ' IS NOT NULL'
333
348
  collector
334
349
  end
335
350
 
336
- def visit_ArelExtensions_Nodes_Rand o, collector
351
+ def visit_ArelExtensions_Nodes_Rand(o, collector)
337
352
  collector << 'DBMS_RANDOM.VALUE('
338
353
  if o.left && o.right
339
354
  collector = visit o.left, collector
@@ -344,7 +359,7 @@ module ArelExtensions
344
359
  collector
345
360
  end
346
361
 
347
- def visit_Arel_Nodes_Regexp o, collector
362
+ def visit_Arel_Nodes_Regexp(o, collector)
348
363
  collector << ' REGEXP_LIKE('
349
364
  collector = visit o.left, collector
350
365
  collector << COMMA
@@ -353,7 +368,7 @@ module ArelExtensions
353
368
  collector
354
369
  end
355
370
 
356
- def visit_Arel_Nodes_NotRegexp o, collector
371
+ def visit_Arel_Nodes_NotRegexp(o, collector)
357
372
  collector << ' NOT REGEXP_LIKE('
358
373
  collector = visit o.left, collector
359
374
  collector << COMMA
@@ -362,7 +377,7 @@ module ArelExtensions
362
377
  collector
363
378
  end
364
379
 
365
- def visit_ArelExtensions_Nodes_Locate o, collector
380
+ def visit_ArelExtensions_Nodes_Locate(o, collector)
366
381
  collector << 'INSTR('
367
382
  o.expressions.each_with_index { |arg, i|
368
383
  collector << COMMA if i != 0
@@ -372,7 +387,9 @@ module ArelExtensions
372
387
  collector
373
388
  end
374
389
 
375
- def visit_ArelExtensions_Nodes_Substring o, collector
390
+ def visit_ArelExtensions_Nodes_Substring(o, collector)
391
+ return visit(o.range_substring_node, collector) if o.range?
392
+
376
393
  collector << 'SUBSTR('
377
394
  o.expressions.each_with_index { |arg, i|
378
395
  collector << COMMA if i != 0
@@ -382,7 +399,7 @@ module ArelExtensions
382
399
  collector
383
400
  end
384
401
 
385
- def visit_ArelExtensions_Nodes_Trim o, collector
402
+ def visit_ArelExtensions_Nodes_Trim(o, collector)
386
403
  collector << 'TRIM(' # BOTH
387
404
  if o.right.expr && SPECIAL_CHARS[o.right.expr]
388
405
  collector << SPECIAL_CHARS[o.right.expr]
@@ -408,7 +425,7 @@ module ArelExtensions
408
425
  collector
409
426
  end
410
427
 
411
- def visit_ArelExtensions_Nodes_Ltrim o, collector
428
+ def visit_ArelExtensions_Nodes_Ltrim(o, collector)
412
429
  collector << 'TRIM(LEADING '
413
430
  if o.right.expr && SPECIAL_CHARS[o.right.expr]
414
431
  collector << SPECIAL_CHARS[o.right.expr]
@@ -421,7 +438,7 @@ module ArelExtensions
421
438
  collector
422
439
  end
423
440
 
424
- def visit_ArelExtensions_Nodes_Rtrim o, collector
441
+ def visit_ArelExtensions_Nodes_Rtrim(o, collector)
425
442
  collector << 'TRIM(TRAILING '
426
443
  if o.right.expr && SPECIAL_CHARS[o.right.expr]
427
444
  collector << SPECIAL_CHARS[o.right.expr]
@@ -434,15 +451,15 @@ module ArelExtensions
434
451
  collector
435
452
  end
436
453
 
437
- def visit_ArelExtensions_Nodes_Blank o, collector
454
+ def visit_ArelExtensions_Nodes_Blank(o, collector)
438
455
  visit o.expr.trim.length.coalesce(0).eq(0), collector
439
456
  end
440
457
 
441
- def visit_ArelExtensions_Nodes_NotBlank o, collector
458
+ def visit_ArelExtensions_Nodes_NotBlank(o, collector)
442
459
  visit o.expr.trim.length.coalesce(0).gt(0), collector
443
460
  end
444
461
 
445
- def visit_ArelExtensions_Nodes_DateAdd o, collector
462
+ def visit_ArelExtensions_Nodes_DateAdd(o, collector)
446
463
  collector << '('
447
464
  collector = visit o.left, collector
448
465
  collector << ' + ' # (o.right.value >= 0 ? ' + ' : ' - ')
@@ -451,12 +468,12 @@ module ArelExtensions
451
468
  collector
452
469
  end
453
470
 
454
- def visit_ArelExtensions_Nodes_Format o, collector
471
+ def visit_ArelExtensions_Nodes_Format(o, collector)
455
472
  visit_ArelExtensions_Nodes_FormattedDate o, collector
456
473
  end
457
474
 
458
- def visit_ArelExtensions_Nodes_FormattedDate o, collector
459
- fmt = ArelExtensions::Visitors::strftime_to_format(o.iso_format, DATE_FORMAT_DIRECTIVES)
475
+ def visit_ArelExtensions_Nodes_FormattedDate(o, collector)
476
+ fmt = ArelExtensions::Visitors.strftime_to_format(o.iso_format, DATE_FORMAT_DIRECTIVES)
460
477
  collector << 'TO_CHAR('
461
478
  collector << 'CAST(' if o.time_zone
462
479
  collector = visit o.left, collector
@@ -465,7 +482,7 @@ module ArelExtensions
465
482
  src_tz, dst_tz = o.time_zone.first
466
483
  collector << ' as timestamp) at time zone '
467
484
  collector = visit Arel.quoted(src_tz), collector
468
- collector < ' at time zone '
485
+ collector << ' at time zone '
469
486
  collector = visit Arel.quoted(dst_tz), collector
470
487
  when String
471
488
  collector << ' as timestamp) at time zone '
@@ -477,20 +494,20 @@ module ArelExtensions
477
494
  collector
478
495
  end
479
496
 
480
- def visit_ArelExtensions_Nodes_Repeat o, collector
497
+ def visit_ArelExtensions_Nodes_Repeat(o, collector)
481
498
  collector << 'LPAD('
482
499
  collector = visit o.expressions[0], collector # can't put empty string, otherwise it wouldn't work
483
- collector << Arel::Visitors::ToSql::COMMA
500
+ collector << COMMA
484
501
  collector = visit o.expressions[1], collector
485
- collector << Arel::Visitors::ToSql::COMMA
502
+ collector << COMMA
486
503
  collector = visit o.expressions[0], collector
487
504
  collector << ')'
488
505
  collector
489
506
  end
490
507
 
491
508
  # add primary_key if not present, avoid zip
492
- if Arel::VERSION.to_i < 7
493
- def visit_ArelExtensions_InsertManager_BulkValues o, collector
509
+ if AREL_VERSION < V7
510
+ def visit_ArelExtensions_InsertManager_BulkValues(o, collector)
494
511
  collector << '('
495
512
  o.left.each_with_index do |row, idx| # values
496
513
  collector << ' UNION ALL ' if idx != 0
@@ -511,7 +528,7 @@ module ArelExtensions
511
528
  collector
512
529
  end
513
530
  else
514
- def visit_ArelExtensions_InsertManager_BulkValues o, collector
531
+ def visit_ArelExtensions_InsertManager_BulkValues(o, collector)
515
532
  collector << '('
516
533
  o.left.each_with_index do |row, idx|
517
534
  collector << ' UNION ALL ' if idx != 0
@@ -535,8 +552,7 @@ module ArelExtensions
535
552
  end
536
553
  end
537
554
 
538
-
539
- def get_time_converted element
555
+ def get_time_converted(element)
540
556
  if element.is_a?(Time)
541
557
  ArelExtensions::Nodes::Format.new [element, '%H:%M:%S']
542
558
  elsif element.is_a?(Arel::Attributes::Attribute)
@@ -551,42 +567,36 @@ module ArelExtensions
551
567
  end
552
568
  end
553
569
 
554
-
555
570
  remove_method(:visit_Arel_Nodes_GreaterThanOrEqual) rescue nil
556
- def visit_Arel_Nodes_GreaterThanOrEqual o, collector
571
+ def visit_Arel_Nodes_GreaterThanOrEqual(o, collector)
557
572
  collector = visit get_time_converted(o.left), collector
558
573
  collector << ' >= '
559
- collector = visit get_time_converted(o.right), collector
560
- collector
574
+ visit get_time_converted(o.right), collector
561
575
  end
562
576
 
563
577
  remove_method(:visit_Arel_Nodes_GreaterThan) rescue nil
564
- def visit_Arel_Nodes_GreaterThan o, collector
578
+ def visit_Arel_Nodes_GreaterThan(o, collector)
565
579
  collector = visit get_time_converted(o.left), collector
566
580
  collector << ' > '
567
- collector = visit get_time_converted(o.right), collector
568
- collector
581
+ visit get_time_converted(o.right), collector
569
582
  end
570
583
 
571
584
  remove_method(:visit_Arel_Nodes_LessThanOrEqual) rescue nil
572
- def visit_Arel_Nodes_LessThanOrEqual o, collector
585
+ def visit_Arel_Nodes_LessThanOrEqual(o, collector)
573
586
  collector = visit get_time_converted(o.left), collector
574
587
  collector << ' <= '
575
- collector = visit get_time_converted(o.right), collector
576
- collector
588
+ visit get_time_converted(o.right), collector
577
589
  end
578
590
 
579
591
  remove_method(:visit_Arel_Nodes_LessThan) rescue nil
580
- def visit_Arel_Nodes_LessThan o, collector
592
+ def visit_Arel_Nodes_LessThan(o, collector)
581
593
  collector = visit get_time_converted(o.left), collector
582
594
  collector << ' < '
583
- collector = visit get_time_converted(o.right), collector
584
- collector
595
+ visit get_time_converted(o.right), collector
585
596
  end
586
597
 
587
-
588
- alias_method(:old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement) rescue nil
589
- def visit_Arel_Nodes_SelectStatement o, collector
598
+ alias old_visit_Arel_Nodes_SelectStatement visit_Arel_Nodes_SelectStatement rescue nil
599
+ def visit_Arel_Nodes_SelectStatement(o, collector)
590
600
  if !(collector.value.blank? || (collector.value.is_a?(Array) && collector.value[0].blank?)) && o.limit.blank? && o.offset.blank?
591
601
  o = o.dup
592
602
  o.orders = []
@@ -594,16 +604,16 @@ module ArelExtensions
594
604
  old_visit_Arel_Nodes_SelectStatement(o, collector)
595
605
  end
596
606
 
597
- alias_method(:old_visit_Arel_Nodes_TableAlias, :visit_Arel_Nodes_TableAlias) rescue nil
598
- def visit_Arel_Nodes_TableAlias o, collector
607
+ alias old_visit_Arel_Nodes_TableAlias visit_Arel_Nodes_TableAlias rescue nil
608
+ def visit_Arel_Nodes_TableAlias(o, collector)
599
609
  if o.name.length > 30
600
610
  o = Arel::Table.new(o.table_name).alias(Arel.shorten(o.name))
601
611
  end
602
612
  old_visit_Arel_Nodes_TableAlias(o, collector)
603
613
  end
604
614
 
605
- alias_method(:old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As) rescue nil
606
- def visit_Arel_Nodes_As o, collector
615
+ alias old_visit_Arel_Nodes_As visit_Arel_Nodes_As rescue nil
616
+ def visit_Arel_Nodes_As(o, collector)
607
617
  if o.left.is_a?(Arel::Nodes::Binary)
608
618
  collector << '('
609
619
  collector = visit o.left, collector
@@ -618,12 +628,12 @@ module ArelExtensions
618
628
  collector
619
629
  end
620
630
 
621
- def visit_ArelExtensions_Nodes_As o, collector
631
+ def visit_ArelExtensions_Nodes_As(o, collector)
622
632
  visit_Arel_Nodes_As o, collector
623
633
  end
624
634
 
625
- alias_method(:old_visit_Arel_Attributes_Attribute, :visit_Arel_Attributes_Attribute) rescue nil
626
- def visit_Arel_Attributes_Attribute o, collector
635
+ alias old_visit_Arel_Attributes_Attribute visit_Arel_Attributes_Attribute rescue nil
636
+ def visit_Arel_Attributes_Attribute(o, collector)
627
637
  join_name = o.relation.table_alias || o.relation.name
628
638
  if join_name.length > 30
629
639
  join_name = Arel.shorten(join_name)
@@ -631,11 +641,11 @@ module ArelExtensions
631
641
  collector << "#{quote_table_name join_name}.#{quote_column_name o.name}"
632
642
  end
633
643
 
634
- def visit_ArelExtensions_Nodes_FormattedNumber o, collector
644
+ def visit_ArelExtensions_Nodes_FormattedNumber(o, collector)
635
645
  col = o.left.coalesce(0)
636
646
  comma = NUMBER_COMMA_MAPPING[o.locale] || '.,'
637
647
  comma_in_format = o.precision == 0 ? '' : 'D'
638
- nines_after = (1..o.precision - 1).map{'9'}.join('') + '0'
648
+ nines_after = (1..o.precision - 1).map { '9' }.join('') + '0'
639
649
  if comma.length == 1
640
650
  options = Arel.quoted("NLS_NUMERIC_CHARACTERS = '#{comma} '")
641
651
  nines_before = ('999' * 4 + '990')
@@ -693,24 +703,24 @@ module ArelExtensions
693
703
  collector
694
704
  end
695
705
 
696
- def visit_ArelExtensions_Nodes_Std o, collector
706
+ def visit_ArelExtensions_Nodes_Std(o, collector)
697
707
  collector << (o.unbiased_estimator ? 'STDDEV_SAMP(' : 'STDDEV_POP(')
698
708
  visit o.left, collector
699
709
  collector << ')'
700
710
  collector
701
711
  end
702
712
 
703
- def visit_ArelExtensions_Nodes_Variance o, collector
713
+ def visit_ArelExtensions_Nodes_Variance(o, collector)
704
714
  collector << (o.unbiased_estimator ? 'VAR_SAMP(' : 'VAR_POP(')
705
715
  visit o.left, collector
706
716
  collector << ')'
707
717
  collector
708
718
  end
709
719
 
710
- def visit_ArelExtensions_Nodes_LevenshteinDistance o, collector
720
+ def visit_ArelExtensions_Nodes_LevenshteinDistance(o, collector)
711
721
  collector << 'UTL_MATCH.edit_distance('
712
722
  collector = visit o.left, collector
713
- collector << Arel::Visitors::ToSql::COMMA
723
+ collector << COMMA
714
724
  collector = visit o.right, collector
715
725
  collector << ')'
716
726
  collector
@@ -720,9 +730,9 @@ module ArelExtensions
720
730
  # handle grouping aggregation semantics
721
731
  def grouping_array_or_grouping_element(o, collector)
722
732
  if o.expr.is_a? Array
723
- collector << "( "
733
+ collector << '( '
724
734
  visit o.expr, collector
725
- collector << " )"
735
+ collector << ' )'
726
736
  else
727
737
  visit o.expr, collector
728
738
  end
@@ -1,8 +1,7 @@
1
1
  module ArelExtensions
2
2
  module Visitors
3
3
  Arel::Visitors.send(:remove_const, 'Oracle12') if Arel::Visitors.const_defined?('Oracle12')
4
- Arel::Visitors.const_set('Oracle12', Class.new(Arel::Visitors::Oracle)).class_eval do
5
-
4
+ Arel::Visitors.const_set(:Oracle12, Class.new(Arel::Visitors::Oracle)).class_eval do
6
5
  def visit_Arel_Nodes_SelectOptions(o, collector)
7
6
  collector = maybe_visit o.offset, collector
8
7
  collector = maybe_visit o.limit, collector
@@ -48,13 +47,13 @@ module ArelExtensions
48
47
  collector << ')'
49
48
  end
50
49
 
51
- def visit_ArelExtensions_Nodes_Json o, collector
50
+ def visit_ArelExtensions_Nodes_Json(o, collector)
52
51
  case o.dict
53
52
  when Array
54
53
  collector << 'json_array('
55
54
  o.dict.each.with_index do |v, i|
56
55
  if i != 0
57
- collector << Arel::Visitors::MySQL::COMMA
56
+ collector << COMMA
58
57
  end
59
58
  collector = visit v, collector
60
59
  end
@@ -63,7 +62,7 @@ module ArelExtensions
63
62
  collector << 'json__object('
64
63
  o.dict.each.with_index do |(k, v), i|
65
64
  if i != 0
66
- collector << Arel::Visitors::MySQL::COMMA
65
+ collector << COMMA
67
66
  end
68
67
  collector << 'KEY '
69
68
  collector = visit k, collector
@@ -76,7 +75,7 @@ module ArelExtensions
76
75
  collector = visit Arel.quoted("#{o.dict}"), collector
77
76
  collector << ' FORMAT JSON'
78
77
  when NilClass
79
- collector << %Q['null' FORMAT JSON]
78
+ collector << %('null' FORMAT JSON)
80
79
  when Arel::Attributes::Attribute
81
80
  collector = visit o.dict.cast('JSON'), collector
82
81
  else