arel_extensions 2.1.3 → 2.1.4

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 (117) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +1 -2
  3. data/.github/workflows/ruby.yml +4 -4
  4. data/.rubocop.yml +25 -1
  5. data/Gemfile +10 -10
  6. data/README.md +1 -2
  7. data/Rakefile +4 -4
  8. data/TODO +0 -1
  9. data/arel_extensions.gemspec +11 -11
  10. data/gemfiles/rails3.gemfile +10 -10
  11. data/gemfiles/rails4.gemfile +13 -13
  12. data/gemfiles/rails5_0.gemfile +12 -12
  13. data/gemfiles/rails5_1_4.gemfile +12 -12
  14. data/gemfiles/rails5_2.gemfile +13 -13
  15. data/gemfiles/rails6.gemfile +11 -11
  16. data/gemfiles/rails6_1.gemfile +11 -11
  17. data/gemfiles/rails7.gemfile +7 -7
  18. data/gemspecs/arel_extensions-v1.gemspec +12 -12
  19. data/gemspecs/arel_extensions-v2.gemspec +11 -11
  20. data/init/mssql.sql +0 -0
  21. data/init/mysql.sql +0 -0
  22. data/init/oracle.sql +0 -0
  23. data/init/postgresql.sql +0 -0
  24. data/init/sqlite.sql +0 -0
  25. data/lib/arel_extensions/attributes.rb +2 -2
  26. data/lib/arel_extensions/boolean_functions.rb +2 -4
  27. data/lib/arel_extensions/common_sql_functions.rb +10 -10
  28. data/lib/arel_extensions/comparators.rb +14 -14
  29. data/lib/arel_extensions/date_duration.rb +7 -7
  30. data/lib/arel_extensions/helpers.rb +16 -13
  31. data/lib/arel_extensions/insert_manager.rb +1 -1
  32. data/lib/arel_extensions/math.rb +16 -18
  33. data/lib/arel_extensions/math_functions.rb +18 -18
  34. data/lib/arel_extensions/nodes/abs.rb +0 -0
  35. data/lib/arel_extensions/nodes/aggregate_function.rb +0 -0
  36. data/lib/arel_extensions/nodes/blank.rb +1 -1
  37. data/lib/arel_extensions/nodes/case.rb +4 -6
  38. data/lib/arel_extensions/nodes/cast.rb +3 -3
  39. data/lib/arel_extensions/nodes/ceil.rb +0 -0
  40. data/lib/arel_extensions/nodes/change_case.rb +0 -0
  41. data/lib/arel_extensions/nodes/coalesce.rb +0 -0
  42. data/lib/arel_extensions/nodes/collate.rb +9 -9
  43. data/lib/arel_extensions/nodes/concat.rb +2 -2
  44. data/lib/arel_extensions/nodes/date_diff.rb +6 -6
  45. data/lib/arel_extensions/nodes/duration.rb +0 -0
  46. data/lib/arel_extensions/nodes/find_in_set.rb +0 -0
  47. data/lib/arel_extensions/nodes/floor.rb +0 -0
  48. data/lib/arel_extensions/nodes/format.rb +0 -0
  49. data/lib/arel_extensions/nodes/formatted_number.rb +2 -2
  50. data/lib/arel_extensions/nodes/function.rb +21 -21
  51. data/lib/arel_extensions/nodes/is_null.rb +0 -0
  52. data/lib/arel_extensions/nodes/json.rb +7 -7
  53. data/lib/arel_extensions/nodes/length.rb +0 -0
  54. data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
  55. data/lib/arel_extensions/nodes/locate.rb +0 -0
  56. data/lib/arel_extensions/nodes/log10.rb +0 -0
  57. data/lib/arel_extensions/nodes/matches.rb +1 -1
  58. data/lib/arel_extensions/nodes/md5.rb +0 -0
  59. data/lib/arel_extensions/nodes/power.rb +0 -0
  60. data/lib/arel_extensions/nodes/rand.rb +0 -0
  61. data/lib/arel_extensions/nodes/repeat.rb +0 -0
  62. data/lib/arel_extensions/nodes/replace.rb +2 -2
  63. data/lib/arel_extensions/nodes/round.rb +0 -0
  64. data/lib/arel_extensions/nodes/soundex.rb +2 -2
  65. data/lib/arel_extensions/nodes/std.rb +0 -0
  66. data/lib/arel_extensions/nodes/substring.rb +0 -0
  67. data/lib/arel_extensions/nodes/sum.rb +0 -0
  68. data/lib/arel_extensions/nodes/then.rb +0 -0
  69. data/lib/arel_extensions/nodes/trim.rb +0 -0
  70. data/lib/arel_extensions/nodes/union.rb +4 -4
  71. data/lib/arel_extensions/nodes/union_all.rb +3 -3
  72. data/lib/arel_extensions/nodes/wday.rb +0 -0
  73. data/lib/arel_extensions/nodes.rb +0 -0
  74. data/lib/arel_extensions/null_functions.rb +0 -0
  75. data/lib/arel_extensions/predications.rb +10 -10
  76. data/lib/arel_extensions/railtie.rb +1 -1
  77. data/lib/arel_extensions/set_functions.rb +3 -3
  78. data/lib/arel_extensions/string_functions.rb +8 -8
  79. data/lib/arel_extensions/tasks.rb +2 -2
  80. data/lib/arel_extensions/version.rb +1 -1
  81. data/lib/arel_extensions/visitors/convert_format.rb +0 -0
  82. data/lib/arel_extensions/visitors/ibm_db.rb +19 -19
  83. data/lib/arel_extensions/visitors/mssql.rb +127 -121
  84. data/lib/arel_extensions/visitors/mysql.rb +137 -145
  85. data/lib/arel_extensions/visitors/oracle.rb +128 -128
  86. data/lib/arel_extensions/visitors/oracle12.rb +16 -16
  87. data/lib/arel_extensions/visitors/postgresql.rb +139 -137
  88. data/lib/arel_extensions/visitors/sqlite.rb +83 -85
  89. data/lib/arel_extensions/visitors/to_sql.rb +143 -148
  90. data/lib/arel_extensions/visitors.rb +7 -7
  91. data/lib/arel_extensions.rb +46 -32
  92. data/test/arelx_test_helper.rb +14 -13
  93. data/test/database.yml +5 -5
  94. data/test/real_db_test.rb +78 -78
  95. data/test/support/fake_record.rb +1 -1
  96. data/test/test_comparators.rb +5 -5
  97. data/test/visitors/test_bulk_insert_oracle.rb +4 -4
  98. data/test/visitors/test_bulk_insert_sqlite.rb +4 -4
  99. data/test/visitors/test_bulk_insert_to_sql.rb +4 -4
  100. data/test/visitors/test_oracle.rb +14 -14
  101. data/test/visitors/test_to_sql.rb +82 -82
  102. data/test/with_ar/all_agnostic_test.rb +364 -299
  103. data/test/with_ar/insert_agnostic_test.rb +17 -14
  104. data/test/with_ar/test_bulk_sqlite.rb +4 -4
  105. data/test/with_ar/test_math_sqlite.rb +12 -12
  106. data/test/with_ar/test_string_mysql.rb +20 -20
  107. data/test/with_ar/test_string_sqlite.rb +20 -20
  108. data/version_v1.rb +1 -1
  109. data/version_v2.rb +1 -1
  110. metadata +2 -9
  111. data/.travis/oracle/download.js +0 -152
  112. data/.travis/oracle/download.sh +0 -30
  113. data/.travis/oracle/download_ojdbc.js +0 -116
  114. data/.travis/oracle/install.sh +0 -34
  115. data/.travis/setup_accounts.sh +0 -9
  116. data/.travis/sqlite3/extension-functions.sh +0 -6
  117. data/.travis.yml +0 -193
@@ -8,11 +8,11 @@ module ArelExtensions
8
8
 
9
9
  DATE_FORMAT_DIRECTIVES = {
10
10
  '%Y' => 'YYYY', '%C' => 'CC', '%y' => 'YY',
11
- '%m' => 'MM', '%B' => 'Month', '%^B' => 'MONTH', '%b' => 'Mon', '%^b' => 'MON',
12
- '%V' => 'IW', '%G' => 'IYYY', # ISO week number and year of week
13
- '%d' => 'DD', '%e' => 'FMDD', '%j' => 'DDD', '%w' => '', '%A' => 'Day', # day, weekday
14
- '%H' => 'HH24', '%k' => '', '%I' => 'HH', '%l' => '', '%P' => 'am', '%p' => 'AM', # hours
15
- '%M' => 'MI', '%S' => 'SS', '%L' => 'MS', '%N' => 'US', '%z' => 'tz', # seconds, subseconds
11
+ '%m' => 'MM', '%B' => 'TMMonth', '%^B' => 'TMMONTH', '%b' => 'TMMon', '%^b' => 'TMMON',
12
+ '%V' => 'IW', '%G' => 'IYYY', # ISO week number and year of week
13
+ '%d' => 'DD', '%e' => 'FMDD', '%j' => 'DDD', '%w' => '', '%a' => 'TMDy', '%A' => 'TMDay', # day, weekday
14
+ '%H' => 'HH24', '%k' => '', '%I' => 'HH', '%l' => '', '%P' => 'am', '%p' => 'AM', # hours
15
+ '%M' => 'MI', '%S' => 'SS', '%L' => 'MS', '%N' => 'US', '%z' => 'tz', # seconds, subseconds
16
16
  '%%' => '%',
17
17
  }.freeze
18
18
 
@@ -21,33 +21,33 @@ module ArelExtensions
21
21
  }.freeze
22
22
 
23
23
  def visit_ArelExtensions_Nodes_Rand o, collector
24
- collector << "RANDOM("
24
+ collector << 'RANDOM('
25
25
  if (o.left != nil && o.right != nil)
26
26
  collector = visit o.left, collector
27
27
  collector << COMMA
28
28
  collector = isit o.right, collector
29
29
  end
30
- collector << ")"
30
+ collector << ')'
31
31
  collector
32
32
  end
33
33
 
34
34
  def visit_ArelExtensions_Nodes_Power o, collector
35
- collector << "POWER("
35
+ collector << 'POWER('
36
36
  o.expressions.each_with_index { |arg, i|
37
37
  collector << Arel::Visitors::ToSql::COMMA if i != 0
38
38
  collector = visit arg, collector
39
39
  }
40
- collector << ")"
40
+ collector << ')'
41
41
  collector
42
42
  end
43
43
 
44
44
  def visit_ArelExtensions_Nodes_Log10 o, collector
45
- collector << "LOG("
45
+ collector << 'LOG('
46
46
  o.expressions.each_with_index { |arg, i|
47
47
  collector << Arel::Visitors::ToSql::COMMA if i != 0
48
48
  collector = visit arg, collector
49
49
  }
50
- collector << ")"
50
+ collector << ')'
51
51
  collector
52
52
  end
53
53
 
@@ -55,7 +55,7 @@ module ArelExtensions
55
55
  remove_method(:visit_Arel_Nodes_Regexp) rescue nil
56
56
  def visit_Arel_Nodes_Regexp o, collector
57
57
  collector = visit o.left, collector
58
- collector << " ~ "
58
+ collector << ' ~ '
59
59
  collector = visit o.right, collector
60
60
  collector
61
61
  end
@@ -63,7 +63,7 @@ module ArelExtensions
63
63
  remove_method(:visit_Arel_Nodes_NotRegexp) rescue nil
64
64
  def visit_Arel_Nodes_NotRegexp o, collector
65
65
  collector = visit o.left, collector
66
- collector << " !~ "
66
+ collector << ' !~ '
67
67
  collector = visit o.right, collector
68
68
  collector
69
69
  end
@@ -74,7 +74,7 @@ module ArelExtensions
74
74
  collector = visit arg, collector
75
75
  collector << ' || ' unless i == o.expressions.length - 1
76
76
  }
77
- collector << ")"
77
+ collector << ')'
78
78
  collector
79
79
  end
80
80
 
@@ -87,7 +87,7 @@ module ArelExtensions
87
87
  else
88
88
  collector = visit o.left, collector
89
89
  end
90
- collector << " AS "
90
+ collector << ' AS '
91
91
 
92
92
  # sometimes these values are already quoted, if they are, don't double quote it
93
93
  quote = o.right.is_a?(Arel::Nodes::SqlLiteral) && o.right[0] != '"' && o.right[-1] != '"'
@@ -101,38 +101,38 @@ module ArelExtensions
101
101
 
102
102
  def visit_Aggregate_For_AggregateFunction o, collector
103
103
  if !o.order.blank? || !o.group.blank?
104
- collector << " OVER ("
104
+ collector << ' OVER ('
105
105
  if !o.group.blank?
106
- collector << " PARTITION BY "
106
+ collector << ' PARTITION BY '
107
107
  o.group.each_with_index do |group, i|
108
108
  collector << COMMA if i != 0
109
109
  visit group, collector
110
110
  end
111
111
  end
112
112
  if !o.order.blank?
113
- collector << " ORDER BY "
113
+ collector << ' ORDER BY '
114
114
  o.order.each_with_index do |order, i|
115
115
  collector << COMMA if i != 0
116
116
  visit order, collector
117
117
  end
118
118
  end
119
- collector << ")"
119
+ collector << ')'
120
120
  end
121
121
  collector
122
122
  end
123
123
 
124
124
  def visit_ArelExtensions_Nodes_GroupConcat o, collector
125
- collector << "array_to_string(array_agg("
125
+ collector << 'array_to_string(array_agg('
126
126
  collector = visit o.left, collector
127
127
  if o.order && !o.order.blank?
128
- collector << " ORDER BY"
128
+ collector << ' ORDER BY'
129
129
  o.order.each_with_index do |order, i|
130
130
  collector << COMMA if i != 0
131
- collector << " "
131
+ collector << ' '
132
132
  visit order, collector
133
133
  end
134
134
  end
135
- collector << ")"
135
+ collector << ')'
136
136
  o.order = nil
137
137
  visit_Aggregate_For_AggregateFunction o, collector
138
138
  collector << COMMA
@@ -140,68 +140,68 @@ module ArelExtensions
140
140
  if o.separator && o.separator != 'NULL'
141
141
  visit o.separator, collector
142
142
  else
143
- visit Arel::Nodes.build_quoted(','), collector
143
+ visit Arel.quoted(','), collector
144
144
  end
145
- collector << ")"
145
+ collector << ')'
146
146
  collector
147
147
  end
148
148
 
149
149
  def visit_ArelExtensions_Nodes_Trim o, collector
150
- collector << 'TRIM(BOTH '
151
- collector = visit o.right, collector
152
- collector << " FROM "
153
- collector = visit o.left, collector
154
- collector << ")"
155
- collector
150
+ collector << 'TRIM(BOTH '
151
+ collector = visit o.right, collector
152
+ collector << ' FROM '
153
+ collector = visit o.left, collector
154
+ collector << ')'
155
+ collector
156
156
  end
157
157
 
158
158
  def visit_ArelExtensions_Nodes_Ltrim o, collector
159
- collector << 'TRIM(LEADING '
160
- collector = visit o.right, collector
161
- collector << " FROM "
162
- collector = visit o.left, collector
163
- collector << ")"
164
- collector
159
+ collector << 'TRIM(LEADING '
160
+ collector = visit o.right, collector
161
+ collector << ' FROM '
162
+ collector = visit o.left, collector
163
+ collector << ')'
164
+ collector
165
165
  end
166
166
 
167
167
  def visit_ArelExtensions_Nodes_Rtrim o, collector
168
168
  collector << 'TRIM(TRAILING '
169
169
  collector = visit o.right, collector
170
- collector << " FROM "
170
+ collector << ' FROM '
171
171
  collector = visit o.left, collector
172
- collector << ")"
172
+ collector << ')'
173
173
  collector
174
174
  end
175
175
 
176
176
  def visit_ArelExtensions_Nodes_Format o, collector
177
177
  fmt = ArelExtensions::Visitors::strftime_to_format(o.iso_format, DATE_FORMAT_DIRECTIVES)
178
- collector << "TO_CHAR("
178
+ collector << 'TO_CHAR('
179
179
  collector << '(' if o.time_zone
180
180
  collector = visit o.left, collector
181
181
  case o.time_zone
182
182
  when Hash
183
183
  src_tz, dst_tz = o.time_zone.first
184
184
  collector << ') AT TIME ZONE '
185
- collector = visit Arel::Nodes.build_quoted(src_tz), collector
185
+ collector = visit Arel.quoted(src_tz), collector
186
186
  collector << ' AT TIME ZONE '
187
- collector = visit Arel::Nodes.build_quoted(dst_tz), collector
187
+ collector = visit Arel.quoted(dst_tz), collector
188
188
  when String
189
189
  collector << ') AT TIME ZONE '
190
- collector = visit Arel::Nodes.build_quoted(o.time_zone), collector
190
+ collector = visit Arel.quoted(o.time_zone), collector
191
191
  end
192
192
  collector << COMMA
193
- collector = visit Arel::Nodes.build_quoted(fmt), collector
194
- collector << ")"
193
+ collector = visit Arel.quoted(fmt), collector
194
+ collector << ')'
195
195
  collector
196
196
  end
197
197
 
198
198
  def visit_ArelExtensions_Nodes_Repeat o, collector
199
- collector << "REPEAT("
199
+ collector << 'REPEAT('
200
200
  o.expressions.each_with_index { |arg, i|
201
201
  collector << Arel::Visitors::ToSql::COMMA if i != 0
202
202
  collector = visit arg, collector
203
203
  }
204
- collector << ")"
204
+ collector << ')'
205
205
  collector
206
206
  end
207
207
 
@@ -243,9 +243,9 @@ module ArelExtensions
243
243
 
244
244
  def visit_ArelExtensions_Nodes_Collate o, collector
245
245
  if o.ai
246
- collector << "unaccent("
246
+ collector << 'unaccent('
247
247
  collector = visit o.expressions.first, collector
248
- collector << ")"
248
+ collector << ')'
249
249
  elsif o.ci
250
250
  collector = visit o.expressions.first, collector
251
251
  else
@@ -264,16 +264,16 @@ module ArelExtensions
264
264
  def visit_ArelExtensions_Nodes_DateDiff o, collector
265
265
  if o.right_node_type == :ruby_date || o.right_node_type == :ruby_time || o.right_node_type == :date || o.right_node_type == :datetime || o.right_node_type == :time
266
266
  collector << if o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time
267
- "DATEDIFF('second', "
267
+ "DATEDIFF('second', "
268
268
  else
269
- "DATEDIFF('day', "
269
+ "DATEDIFF('day', "
270
270
  end
271
271
  collector = visit o.right, collector
272
272
  collector << (o.right_node_type == :date ? '::date' : '::timestamp')
273
273
  collector << COMMA
274
274
  collector = visit o.left, collector
275
275
  collector << (o.left_node_type == :date ? '::date' : '::timestamp')
276
- collector << ")"
276
+ collector << ')'
277
277
  else
278
278
  collector << '('
279
279
  collector = visit o.left, collector
@@ -290,57 +290,57 @@ module ArelExtensions
290
290
  def visit_ArelExtensions_Nodes_Duration o, collector
291
291
  if o.with_interval
292
292
  interval = case o.left
293
- when 'd','m','y'
293
+ when 'd', 'm', 'y'
294
294
  'DAY'
295
- when 'h','mn','s'
295
+ when 'h', 'mn', 's'
296
296
  'SECOND'
297
297
  when /i\z/
298
- collector << "("
298
+ collector << '('
299
299
  collector = visit o.right, collector
300
- collector << ")"
300
+ collector << ')'
301
301
  collector << " * (INTERVAL '1' #{DATE_MAPPING[o.left[0..-2]]})"
302
302
  return collector
303
303
  end
304
304
  end
305
305
  collector << "EXTRACT(#{DATE_MAPPING[o.left]} FROM CAST("
306
306
  collector = visit o.right, collector
307
- collector << " AS TIMESTAMP WITH TIME ZONE))"
307
+ collector << ' AS TIMESTAMP WITH TIME ZONE))'
308
308
  collector << " * (INTERVAL '1' #{interval})" if interval && o.with_interval
309
309
  collector
310
310
  end
311
311
 
312
312
  def visit_ArelExtensions_Nodes_Locate o, collector
313
- collector << "POSITION("
313
+ collector << 'POSITION('
314
314
  collector = visit o.right, collector
315
- collector << " IN "
315
+ collector << ' IN '
316
316
  collector = visit o.left, collector
317
- collector << ")"
317
+ collector << ')'
318
318
  collector
319
319
  end
320
320
 
321
321
  def visit_ArelExtensions_Nodes_Substring o, collector
322
- collector << "SUBSTR("
322
+ collector << 'SUBSTR('
323
323
  o.expressions.each_with_index { |arg, i|
324
324
  collector << COMMA if i != 0
325
325
  collector = visit arg, collector
326
326
  }
327
- collector << ")"
327
+ collector << ')'
328
328
  collector
329
329
  end
330
330
 
331
331
  def visit_ArelExtensions_Nodes_RegexpReplace o, collector
332
- collector << "REGEXP_REPLACE("
332
+ collector << 'REGEXP_REPLACE('
333
333
  visit o.left, collector
334
334
  collector << Arel::Visitors::ToSql::COMMA
335
- tab = o.pattern.inspect+ 'g' # Make it always global
335
+ tab = o.pattern.inspect + 'g' # Make it always global
336
336
  pattern = tab.split('/')[1..-2].join('/')
337
337
  flags = tab.split('/')[-1]
338
- visit Arel::Nodes.build_quoted(pattern), collector
338
+ visit Arel.quoted(pattern), collector
339
339
  collector << Arel::Visitors::ToSql::COMMA
340
340
  visit o.substitute, collector
341
341
  collector << Arel::Visitors::ToSql::COMMA
342
- visit Arel::Nodes.build_quoted(flags+"g"), collector
343
- collector << ")"
342
+ visit Arel.quoted(flags + 'g'), collector
343
+ collector << ')'
344
344
  collector
345
345
  end
346
346
 
@@ -351,57 +351,59 @@ module ArelExtensions
351
351
  end
352
352
 
353
353
  def visit_ArelExtensions_Nodes_IsNotNull o, collector
354
- collector = visit o.expr, collector
354
+ collector = visit o.expr, collector
355
355
  collector << ' IS NOT NULL'
356
356
  collector
357
357
  end
358
358
 
359
359
  def visit_ArelExtensions_Nodes_Sum o, collector
360
- collector << "sum("
360
+ collector << 'sum('
361
361
  collector = visit o.expr, collector
362
- collector << ")"
362
+ collector << ')'
363
363
  visit_Aggregate_For_AggregateFunction o, collector
364
364
  collector
365
365
  end
366
366
 
367
367
  def visit_ArelExtensions_Nodes_Wday o, collector
368
- collector << "EXRTACT(DOW, "
368
+ collector << 'EXRTACT(DOW, '
369
369
  collector = visit o.date, collector
370
370
  collector << ')'
371
371
  collector
372
372
  end
373
373
 
374
374
  def visit_ArelExtensions_Nodes_Cast o, collector
375
- as_attr = case o.as_attr
376
- when :string
377
- Arel::Nodes::SqlLiteral.new('varchar')
378
- when :text, :ntext
379
- Arel::Nodes::SqlLiteral.new('text')
380
- when :time
381
- Arel::Nodes::SqlLiteral.new('time')
382
- when :int
383
- collector << "CAST(CAST("
384
- collector = visit o.left, collector
385
- collector << " AS numeric) AS int)"
386
- return collector
387
- when :number, :decimal, :float
388
- Arel::Nodes::SqlLiteral.new('numeric')
389
- when :datetime
390
- Arel::Nodes::SqlLiteral.new('timestamp with time zone')
391
- when :date
392
- Arel::Nodes::SqlLiteral.new('date')
393
- when :binary
394
- Arel::Nodes::SqlLiteral.new('binary')
395
- when :jsonb
396
- Arel::Nodes::SqlLiteral.new('jsonb')
397
- else
398
- Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
399
- end
400
- collector << "CAST("
375
+ as_attr =
376
+ case o.as_attr
377
+ when :string
378
+ 'varchar'
379
+ when :text, :ntext
380
+ 'text'
381
+ when :time
382
+ 'time'
383
+ when :int
384
+ collector << 'CAST(CAST('
385
+ collector = visit o.left, collector
386
+ collector << ' AS numeric) AS int)'
387
+ return collector
388
+ when :number, :decimal, :float
389
+ 'numeric'
390
+ when :datetime
391
+ 'timestamp with time zone'
392
+ when :date
393
+ 'date'
394
+ when :binary
395
+ 'binary'
396
+ when :jsonb
397
+ 'jsonb'
398
+ else
399
+ o.as_attr.to_s
400
+ end
401
+
402
+ collector << 'CAST('
401
403
  collector = visit o.left, collector
402
- collector << " AS "
403
- collector = visit as_attr, collector
404
- collector << ")"
404
+ collector << ' AS '
405
+ collector = visit Arel::Nodes::SqlLiteral.new(as_attr), collector
406
+ collector << ')'
405
407
  collector
406
408
  end
407
409
 
@@ -410,9 +412,9 @@ module ArelExtensions
410
412
  comma = o.precision == 0 ? '' : (NUMBER_COMMA_MAPPING[o.locale][0] || '.')
411
413
  thousand_separator = NUMBER_COMMA_MAPPING[o.locale][1] || (NUMBER_COMMA_MAPPING[o.locale] ? '' : 'G')
412
414
  nines_after = (1..o.precision).map{'9'}.join('')
413
- nines_before = ("999#{thousand_separator}"*4+"990")
415
+ nines_before = ("999#{thousand_separator}" * 4 + '990')
414
416
 
415
- sign = ArelExtensions::Nodes::Case.new.when(col<0).
417
+ sign = Arel.when(col < 0).
416
418
  then('-').
417
419
  else(o.flags.include?('+') ? '+' : (o.flags.include?(' ') ? ' ' : ''))
418
420
  sign_length = ArelExtensions::Nodes::Length.new([sign])
@@ -420,35 +422,35 @@ module ArelExtensions
420
422
  number =
421
423
  if o.scientific_notation
422
424
  ArelExtensions::Nodes::Concat.new([
423
- Arel::Nodes::NamedFunction.new('TRIM',[
424
- Arel::Nodes::NamedFunction.new('TO_CHAR',[
425
- Arel.when(col.not_eq 0).then(col.abs/Arel::Nodes.build_quoted(10).pow(col.abs.log10.floor)).else(1),
426
- Arel::Nodes.build_quoted('FM'+nines_before+'"'+comma+'"V'+nines_after)
425
+ Arel::Nodes::NamedFunction.new('TRIM', [
426
+ Arel::Nodes::NamedFunction.new('TO_CHAR', [
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)
427
429
  ])]),
428
430
  o.type,
429
- Arel::Nodes::NamedFunction.new('TRIM',[
430
- Arel::Nodes::NamedFunction.new('TO_CHAR',[
431
+ Arel::Nodes::NamedFunction.new('TRIM', [
432
+ Arel::Nodes::NamedFunction.new('TO_CHAR', [
431
433
  Arel.when(col.not_eq 0).then(col.abs.log10.floor).else(0),
432
- Arel::Nodes.build_quoted('FM'+nines_before)
434
+ Arel.quoted('FM' + nines_before)
433
435
  ])])
434
436
  ])
435
437
  else
436
- Arel::Nodes::NamedFunction.new('TRIM',[
437
- Arel::Nodes::NamedFunction.new('TO_CHAR',[
438
- Arel::Nodes.build_quoted(col.abs),
439
- Arel::Nodes.build_quoted('FM'+nines_before+'"'+comma+'"V'+nines_after)
438
+ Arel::Nodes::NamedFunction.new('TRIM', [
439
+ Arel::Nodes::NamedFunction.new('TO_CHAR', [
440
+ Arel.quoted(col.abs),
441
+ Arel.quoted('FM' + nines_before + '"' + comma + '"V' + nines_after)
440
442
  ])])
441
443
  end
442
444
 
443
- repeated_char = (o.width == 0) ? Arel::Nodes.build_quoted('') : ArelExtensions::Nodes::Case.new().
444
- when(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length)>0).
445
- then(Arel::Nodes.build_quoted(
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(
446
448
  o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
447
- ).repeat(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length))
449
+ ).repeat(Arel.quoted(o.width).abs - (number.length + sign_length))
448
450
  ).
449
451
  else('')
450
- before = (!o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
451
- middle = (o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
452
+ before = (!o.flags.include?('0')) && (!o.flags.include?('-')) ? repeated_char : ''
453
+ middle = (o.flags.include?('0')) && (!o.flags.include?('-')) ? repeated_char : ''
452
454
  after = o.flags.include?('-') ? repeated_char : ''
453
455
  full_number = ArelExtensions::Nodes::Concat.new([
454
456
  before,
@@ -457,7 +459,7 @@ module ArelExtensions
457
459
  number,
458
460
  after
459
461
  ])
460
- collector = visit ArelExtensions::Nodes::Concat.new([Arel::Nodes.build_quoted(o.prefix),full_number,Arel::Nodes.build_quoted(o.suffix)]), collector
462
+ collector = visit ArelExtensions::Nodes::Concat.new([Arel.quoted(o.prefix), full_number, Arel.quoted(o.suffix)]), collector
461
463
  collector
462
464
  end
463
465
 
@@ -469,7 +471,7 @@ module ArelExtensions
469
471
  o = o.dup
470
472
  o.orders = []
471
473
  end
472
- old_visit_Arel_Nodes_SelectStatement(o,collector)
474
+ old_visit_Arel_Nodes_SelectStatement(o, collector)
473
475
  end
474
476
 
475
477
  alias_method(:old_visit_Arel_Nodes_TableAlias, :visit_Arel_Nodes_TableAlias) rescue nil
@@ -477,7 +479,7 @@ module ArelExtensions
477
479
  if o.name.length > 63
478
480
  o = Arel::Table.new(o.table_name).alias(Arel.shorten(o.name))
479
481
  end
480
- old_visit_Arel_Nodes_TableAlias(o,collector)
482
+ old_visit_Arel_Nodes_TableAlias(o, collector)
481
483
  end
482
484
 
483
485
  alias_method(:old_visit_Arel_Attributes_Attribute, :visit_Arel_Attributes_Attribute) rescue nil
@@ -490,26 +492,26 @@ module ArelExtensions
490
492
  end
491
493
 
492
494
  def visit_ArelExtensions_Nodes_Std o, collector
493
- collector << (o.unbiased_estimator ? "STDDEV_SAMP(" : "STDDEV_POP(")
495
+ collector << (o.unbiased_estimator ? 'STDDEV_SAMP(' : 'STDDEV_POP(')
494
496
  visit o.left, collector
495
- collector << ")"
497
+ collector << ')'
496
498
  visit_Aggregate_For_AggregateFunction o, collector
497
499
  collector
498
500
  end
499
501
 
500
502
  def visit_ArelExtensions_Nodes_Variance o, collector
501
- collector << (o.unbiased_estimator ? "VAR_SAMP(" : "VAR_POP(")
503
+ collector << (o.unbiased_estimator ? 'VAR_SAMP(' : 'VAR_POP(')
502
504
  visit o.left, collector
503
- collector << ")"
505
+ collector << ')'
504
506
  visit_Aggregate_For_AggregateFunction o, collector
505
507
  collector
506
508
  end
507
509
 
508
- def visit_ArelExtensions_Nodes_Json o,collector
510
+ def visit_ArelExtensions_Nodes_Json o, collector
509
511
  case o.dict
510
512
  when Array
511
513
  collector << 'to_jsonb(array['
512
- o.dict.each.with_index do |v,i|
514
+ o.dict.each.with_index do |v, i|
513
515
  if i != 0
514
516
  collector << Arel::Visitors::MySQL::COMMA
515
517
  end
@@ -518,7 +520,7 @@ module ArelExtensions
518
520
  collector << '])'
519
521
  when Hash
520
522
  collector << 'jsonb_build_object('
521
- o.dict.each.with_index do |(k,v),i|
523
+ o.dict.each.with_index do |(k, v), i|
522
524
  if i != 0
523
525
  collector << Arel::Visitors::MySQL::COMMA
524
526
  end
@@ -527,11 +529,11 @@ module ArelExtensions
527
529
  collector = visit v, collector
528
530
  end
529
531
  collector << ')'
530
- when String,Numeric,TrueClass,FalseClass
531
- collector = visit Arel::Nodes.build_quoted("#{o.dict}"), collector
532
+ when String, Numeric, TrueClass, FalseClass
533
+ collector = visit Arel.quoted("#{o.dict}"), collector
532
534
  collector << '::jsonb'
533
535
  when NilClass
534
- collector << %Q['null'::jsonb]
536
+ collector << %Q['null'::jsonb]
535
537
  else
536
538
  collector = visit o.dict, collector
537
539
  collector << '::jsonb'
@@ -539,8 +541,8 @@ module ArelExtensions
539
541
  collector
540
542
  end
541
543
 
542
- def visit_ArelExtensions_Nodes_JsonMerge o,collector
543
- o.expressions.each.with_index do |v,i|
544
+ def visit_ArelExtensions_Nodes_JsonMerge o, collector
545
+ o.expressions.each.with_index do |v, i|
544
546
  if i != 0
545
547
  collector << ' || '
546
548
  end
@@ -549,14 +551,14 @@ module ArelExtensions
549
551
  collector
550
552
  end
551
553
 
552
- def visit_ArelExtensions_Nodes_JsonGet o,collector
554
+ def visit_ArelExtensions_Nodes_JsonGet o, collector
553
555
  collector = visit o.dict, collector
554
556
  collector << ' ->> '
555
557
  collector = visit o.key, collector
556
558
  collector
557
559
  end
558
560
 
559
- def visit_ArelExtensions_Nodes_JsonSet o,collector
561
+ def visit_ArelExtensions_Nodes_JsonSet o, collector
560
562
  collector << 'jsonb_set('
561
563
  collector = visit o.dict, collector
562
564
  collector << Arel::Visitors::MySQL::COMMA
@@ -578,7 +580,7 @@ module ArelExtensions
578
580
  else
579
581
  case o.dict
580
582
  when Hash
581
- o.dict.each.with_index do |(k,v),i|
583
+ o.dict.each.with_index do |(k, v), i|
582
584
  if i != 0
583
585
  collector << ' || '
584
586
  end