arel_extensions 1.1.8 → 1.1.9

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.
@@ -20,7 +20,7 @@ module ArelExtensions
20
20
  collector << ")"
21
21
  collector
22
22
  end
23
-
23
+
24
24
  def visit_ArelExtensions_Nodes_Power o, collector
25
25
  collector << "POWER("
26
26
  o.expressions.each_with_index { |arg, i|
@@ -30,7 +30,7 @@ module ArelExtensions
30
30
  collector << ")"
31
31
  collector
32
32
  end
33
-
33
+
34
34
  def visit_ArelExtensions_Nodes_Log10 o, collector
35
35
  collector << "LOG("
36
36
  o.expressions.each_with_index { |arg, i|
@@ -40,7 +40,7 @@ module ArelExtensions
40
40
  collector << ")"
41
41
  collector
42
42
  end
43
-
43
+
44
44
 
45
45
  remove_method(:visit_Arel_Nodes_Regexp) rescue nil
46
46
  def visit_Arel_Nodes_Regexp o, collector
@@ -57,7 +57,7 @@ module ArelExtensions
57
57
  collector = visit o.right, collector
58
58
  collector
59
59
  end
60
-
60
+
61
61
  def visit_ArelExtensions_Nodes_Concat o, collector
62
62
  collector << '('
63
63
  o.expressions.each_with_index { |arg, i|
@@ -68,6 +68,21 @@ module ArelExtensions
68
68
  collector
69
69
  end
70
70
 
71
+ alias_method :old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As
72
+ def visit_Arel_Nodes_As o, collector
73
+ if o.left.is_a?(Arel::Nodes::Binary)
74
+ collector << '('
75
+ collector = visit o.left, collector
76
+ collector << ')'
77
+ else
78
+ collector = visit o.left, collector
79
+ end
80
+ collector << " AS \""
81
+ collector = visit o.right, collector
82
+ collector << "\""
83
+ collector
84
+ end
85
+
71
86
  def visit_ArelExtensions_Nodes_GroupConcat o, collector
72
87
  collector << "array_to_string(array_agg("
73
88
  collector = visit o.left, collector
@@ -128,7 +143,7 @@ module ArelExtensions
128
143
  collector << ")"
129
144
  collector
130
145
  end
131
-
146
+
132
147
  def visit_ArelExtensions_Nodes_Repeat o, collector
133
148
  collector << "REPEAT("
134
149
  o.expressions.each_with_index { |arg, i|
@@ -137,9 +152,9 @@ module ArelExtensions
137
152
  }
138
153
  collector << ")"
139
154
  collector
140
- end
141
-
142
- def visit_ArelExtensions_Nodes_AiMatches o, collector
155
+ end
156
+
157
+ def visit_ArelExtensions_Nodes_AiMatches o, collector
143
158
  collector = visit o.left.ai_collate, collector
144
159
  collector << ' LIKE '
145
160
  collector = visit o.right.ai_collate, collector
@@ -150,8 +165,8 @@ module ArelExtensions
150
165
  collector
151
166
  end
152
167
  end
153
-
154
- def visit_ArelExtensions_Nodes_AiIMatches o, collector
168
+
169
+ def visit_ArelExtensions_Nodes_AiIMatches o, collector
155
170
  collector = visit o.left.ai_collate, collector
156
171
  collector << ' ILIKE '
157
172
  collector = visit o.right.ai_collate, collector
@@ -162,8 +177,8 @@ module ArelExtensions
162
177
  collector
163
178
  end
164
179
  end
165
-
166
- def visit_ArelExtensions_Nodes_SMatches o, collector
180
+
181
+ def visit_ArelExtensions_Nodes_SMatches o, collector
167
182
  collector = visit o.left, collector
168
183
  collector << ' LIKE '
169
184
  collector = visit o.right, collector
@@ -175,7 +190,7 @@ module ArelExtensions
175
190
  end
176
191
  end
177
192
 
178
- def visit_ArelExtensions_Nodes_Collate o, collector
193
+ def visit_ArelExtensions_Nodes_Collate o, collector
179
194
  if o.ai
180
195
  collector << "unaccent("
181
196
  collector = visit o.expressions.first, collector
@@ -184,7 +199,7 @@ module ArelExtensions
184
199
  collector = visit o.expressions.first, collector
185
200
  else
186
201
  collector = visit o.expressions.first, collector
187
- end
202
+ end
188
203
  collector
189
204
  end
190
205
 
@@ -241,12 +256,12 @@ module ArelExtensions
241
256
  collector << ' IS NULL'
242
257
  collector
243
258
  end
244
-
245
- def visit_ArelExtensions_Nodes_IsNotNull o, collector
246
- collector = visit o.left, collector
247
- collector << ' IS NOT NULL'
248
- collector
249
- end
259
+
260
+ def visit_ArelExtensions_Nodes_IsNotNull o, collector
261
+ collector = visit o.left, collector
262
+ collector << ' IS NOT NULL'
263
+ collector
264
+ end
250
265
 
251
266
  def visit_ArelExtensions_Nodes_Sum o, collector
252
267
  collector << "sum("
@@ -261,126 +276,193 @@ module ArelExtensions
261
276
  collector << ')'
262
277
  collector
263
278
  end
264
-
265
- def visit_ArelExtensions_Nodes_Cast o, collector
279
+
280
+ def visit_ArelExtensions_Nodes_Cast o, collector
266
281
  collector << "CAST("
267
282
  collector = visit o.left, collector
268
283
  collector << " AS "
269
- case o.as_attr
270
- when :string
271
- as_attr = Arel::Nodes::SqlLiteral.new('varchar')
272
- when :time
273
- as_attr = Arel::Nodes::SqlLiteral.new('time')
274
- when :number
275
- as_attr = Arel::Nodes::SqlLiteral.new('int')
276
- when :datetime
277
- as_attr = Arel::Nodes::SqlLiteral.new('datetime')
278
- when :binary
279
- as_attr = Arel::Nodes::SqlLiteral.new('binary')
280
- else
281
- as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
282
- end
284
+ case o.as_attr
285
+ when :string
286
+ as_attr = Arel::Nodes::SqlLiteral.new('varchar')
287
+ when :time
288
+ as_attr = Arel::Nodes::SqlLiteral.new('time')
289
+ when :number
290
+ as_attr = Arel::Nodes::SqlLiteral.new('int')
291
+ when :datetime
292
+ as_attr = Arel::Nodes::SqlLiteral.new('datetime')
293
+ when :binary
294
+ as_attr = Arel::Nodes::SqlLiteral.new('binary')
295
+ else
296
+ as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
297
+ end
283
298
  collector = visit as_attr, collector
284
299
  collector << ")"
285
300
  collector
286
- end
287
-
288
- def visit_ArelExtensions_Nodes_FormattedNumber o, collector
289
- col = o.left.coalesce(0)
290
- comma = o.precision == 0 ? '' : (Arel::Visitors::PostgreSQL::NUMBER_COMMA_MAPPING[o.locale][0] || '.')
291
- thousand_separator = Arel::Visitors::PostgreSQL::NUMBER_COMMA_MAPPING[o.locale][1] || (Arel::Visitors::PostgreSQL::NUMBER_COMMA_MAPPING[o.locale] ? '' : 'G')
292
- nines_after = (1..o.precision).map{'9'}.join('')
293
- nines_before = ("999#{thousand_separator}"*4+"990")
294
-
295
- sign = ArelExtensions::Nodes::Case.new.when(col<0).
296
- then('-').
297
- else(o.flags.include?('+') ? '+' : (o.flags.include?(' ') ? ' ' : ''))
298
- sign_length = ArelExtensions::Nodes::Length.new([sign])
299
-
300
- if o.scientific_notation
301
- number = ArelExtensions::Nodes::Concat.new([
302
- Arel::Nodes::NamedFunction.new('TRIM',[
303
- Arel::Nodes::NamedFunction.new('TO_CHAR',[
304
- col.abs/Arel::Nodes.build_quoted(10).pow(col.abs.log10.floor),
305
- Arel::Nodes.build_quoted('FM'+nines_before+'"'+comma+'"V'+nines_after)
306
- ])]),
307
- o.type,
308
- Arel::Nodes::NamedFunction.new('TRIM',[
309
- Arel::Nodes::NamedFunction.new('TO_CHAR',[
310
- col.abs.log10.floor,
311
- Arel::Nodes.build_quoted('FM'+nines_before)
312
- ])])
313
- ])
314
- else
315
- number = Arel::Nodes::NamedFunction.new('TRIM',[
316
- Arel::Nodes::NamedFunction.new('TO_CHAR',[
317
- Arel::Nodes.build_quoted(col.abs),
318
- Arel::Nodes.build_quoted('FM'+nines_before+'"'+comma+'"V'+nines_after)
319
- ])])
320
- end
321
-
322
- repeated_char = (o.width == 0) ? Arel::Nodes.build_quoted('') : ArelExtensions::Nodes::Case.new().
323
- when(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length)>0).
324
- then(Arel::Nodes.build_quoted(
325
- o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
326
- ).repeat(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length))
327
- ).
328
- else('')
329
- before = (!o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
330
- middle = (o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
331
- after = o.flags.include?('-') ? repeated_char : ''
332
- full_number = ArelExtensions::Nodes::Concat.new([
333
- before,
334
- sign,
335
- middle,
336
- number,
337
- after
338
- ])
339
- collector = visit ArelExtensions::Nodes::Concat.new([Arel::Nodes.build_quoted(o.prefix),full_number,Arel::Nodes.build_quoted(o.suffix)]), collector
340
- collector
341
- end
342
-
343
-
344
- alias_method :old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement
345
- def visit_Arel_Nodes_SelectStatement o, collector
346
-
347
- if !(collector.value.blank? || (collector.value.is_a?(Array) && collector.value[0].blank?)) && o.limit.blank? && o.offset.blank?
348
- o = o.dup
349
- o.orders = []
350
- end
351
- old_visit_Arel_Nodes_SelectStatement(o,collector)
352
- end
353
-
354
- alias_method :old_visit_Arel_Nodes_TableAlias, :visit_Arel_Nodes_TableAlias
355
- def visit_Arel_Nodes_TableAlias o, collector
356
- if o.name.length > 63
357
- o = Arel::Table.new(o.table_name).alias(Arel.shorten(o.name))
358
- end
359
- old_visit_Arel_Nodes_TableAlias(o,collector)
360
- end
361
-
362
- alias_method :old_visit_Arel_Attributes_Attribute, :visit_Arel_Attributes_Attribute
363
- def visit_Arel_Attributes_Attribute o, collector
364
- join_name = o.relation.table_alias || o.relation.name
365
- if join_name.length > 63
366
- join_name = Arel.shorten(join_name)
367
- end
368
- collector << "#{quote_table_name join_name}.#{quote_column_name o.name}"
369
- end
370
-
371
- def visit_ArelExtensions_Nodes_Std o, collector
372
- collector << (o.unbiased_estimator ? "STDDEV_SAMP(" : "STDDEV_POP(")
373
- visit o.left, collector
374
- collector << ")"
375
- collector
376
- end
377
-
378
- def visit_ArelExtensions_Nodes_Variance o, collector
379
- collector << (o.unbiased_estimator ? "VAR_SAMP(" : "VAR_POP(")
380
- visit o.left, collector
381
- collector << ")"
382
- collector
383
- end
301
+ end
302
+
303
+ def visit_ArelExtensions_Nodes_FormattedNumber o, collector
304
+ col = o.left.coalesce(0)
305
+ comma = o.precision == 0 ? '' : (Arel::Visitors::PostgreSQL::NUMBER_COMMA_MAPPING[o.locale][0] || '.')
306
+ thousand_separator = Arel::Visitors::PostgreSQL::NUMBER_COMMA_MAPPING[o.locale][1] || (Arel::Visitors::PostgreSQL::NUMBER_COMMA_MAPPING[o.locale] ? '' : 'G')
307
+ nines_after = (1..o.precision).map{'9'}.join('')
308
+ nines_before = ("999#{thousand_separator}"*4+"990")
309
+
310
+ sign = ArelExtensions::Nodes::Case.new.when(col<0).
311
+ then('-').
312
+ else(o.flags.include?('+') ? '+' : (o.flags.include?(' ') ? ' ' : ''))
313
+ sign_length = ArelExtensions::Nodes::Length.new([sign])
314
+
315
+ if o.scientific_notation
316
+ number = ArelExtensions::Nodes::Concat.new([
317
+ Arel::Nodes::NamedFunction.new('TRIM',[
318
+ Arel::Nodes::NamedFunction.new('TO_CHAR',[
319
+ col.abs/Arel::Nodes.build_quoted(10).pow(col.abs.log10.floor),
320
+ Arel::Nodes.build_quoted('FM'+nines_before+'"'+comma+'"V'+nines_after)
321
+ ])]),
322
+ o.type,
323
+ Arel::Nodes::NamedFunction.new('TRIM',[
324
+ Arel::Nodes::NamedFunction.new('TO_CHAR',[
325
+ col.abs.log10.floor,
326
+ Arel::Nodes.build_quoted('FM'+nines_before)
327
+ ])])
328
+ ])
329
+ else
330
+ number = Arel::Nodes::NamedFunction.new('TRIM',[
331
+ Arel::Nodes::NamedFunction.new('TO_CHAR',[
332
+ Arel::Nodes.build_quoted(col.abs),
333
+ Arel::Nodes.build_quoted('FM'+nines_before+'"'+comma+'"V'+nines_after)
334
+ ])])
335
+ end
336
+
337
+ repeated_char = (o.width == 0) ? Arel::Nodes.build_quoted('') : ArelExtensions::Nodes::Case.new().
338
+ when(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length)>0).
339
+ then(Arel::Nodes.build_quoted(
340
+ o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
341
+ ).repeat(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length))
342
+ ).
343
+ else('')
344
+ before = (!o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
345
+ middle = (o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
346
+ after = o.flags.include?('-') ? repeated_char : ''
347
+ full_number = ArelExtensions::Nodes::Concat.new([
348
+ before,
349
+ sign,
350
+ middle,
351
+ number,
352
+ after
353
+ ])
354
+ collector = visit ArelExtensions::Nodes::Concat.new([Arel::Nodes.build_quoted(o.prefix),full_number,Arel::Nodes.build_quoted(o.suffix)]), collector
355
+ collector
356
+ end
357
+
358
+
359
+ alias_method :old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement
360
+ def visit_Arel_Nodes_SelectStatement o, collector
361
+
362
+ if !(collector.value.blank? || (collector.value.is_a?(Array) && collector.value[0].blank?)) && o.limit.blank? && o.offset.blank?
363
+ o = o.dup
364
+ o.orders = []
365
+ end
366
+ old_visit_Arel_Nodes_SelectStatement(o,collector)
367
+ end
368
+
369
+ alias_method :old_visit_Arel_Nodes_TableAlias, :visit_Arel_Nodes_TableAlias
370
+ def visit_Arel_Nodes_TableAlias o, collector
371
+ if o.name.length > 63
372
+ o = Arel::Table.new(o.table_name).alias(Arel.shorten(o.name))
373
+ end
374
+ old_visit_Arel_Nodes_TableAlias(o,collector)
375
+ end
376
+
377
+ alias_method :old_visit_Arel_Attributes_Attribute, :visit_Arel_Attributes_Attribute
378
+ def visit_Arel_Attributes_Attribute o, collector
379
+ join_name = o.relation.table_alias || o.relation.name
380
+ if join_name.length > 63
381
+ join_name = Arel.shorten(join_name)
382
+ end
383
+ collector << "#{quote_table_name join_name}.#{quote_column_name o.name}"
384
+ end
385
+
386
+ def visit_ArelExtensions_Nodes_Std o, collector
387
+ collector << (o.unbiased_estimator ? "STDDEV_SAMP(" : "STDDEV_POP(")
388
+ visit o.left, collector
389
+ collector << ")"
390
+ collector
391
+ end
392
+
393
+ def visit_ArelExtensions_Nodes_Variance o, collector
394
+ collector << (o.unbiased_estimator ? "VAR_SAMP(" : "VAR_POP(")
395
+ visit o.left, collector
396
+ collector << ")"
397
+ collector
398
+ end
399
+
400
+ def visit_ArelExtensions_Nodes_Json o,collector
401
+ case o.hash
402
+ when Array
403
+ collector << 'to_jsonb(array['
404
+ o.hash.each.with_index do |v,i|
405
+ if i != 0
406
+ collector << Arel::Visitors::MySQL::COMMA
407
+ end
408
+ collector = visit v, collector
409
+ end
410
+ collector << '])'
411
+ when Hash
412
+ collector << 'jsonb_build_object('
413
+ o.hash.each.with_index do |(k,v),i|
414
+ if i != 0
415
+ collector << Arel::Visitors::MySQL::COMMA
416
+ end
417
+ collector = visit k, collector
418
+ collector << Arel::Visitors::MySQL::COMMA
419
+ collector = visit v, collector
420
+ end
421
+ collector << ')'
422
+ when String,Numeric,TrueClass,FalseClass
423
+ collector = visit Arel::Nodes.build_quoted("#{o.hash}"), collector
424
+ collector << '::jsonb'
425
+ when NilClass
426
+ collector << %Q['null'::jsonb]
427
+ when Arel::Attributes::Attribute
428
+ collector = visit o.hash.cast(:jsonb), collector
429
+ else
430
+ collector = visit o.hash, collector
431
+ collector << '::jsonb'
432
+ end
433
+ collector
434
+ end
435
+
436
+ def visit_ArelExtensions_Nodes_JsonMerge o,collector
437
+ o.expressions.each.with_index do |v,i|
438
+ if i != 0
439
+ collector << ' || '
440
+ end
441
+ collector = visit v, collector
442
+ end
443
+ collector
444
+ end
445
+
446
+ def visit_ArelExtensions_Nodes_JsonGet o,collector
447
+ collector = visit o.hash, collector
448
+ collector << ' -> '
449
+ collector = visit o.key, collector
450
+ collector
451
+ end
452
+
453
+ def visit_ArelExtensions_Nodes_JsonSet o,collector
454
+ collector << 'jsonb_set('
455
+ collector = visit o.hash, collector
456
+ collector << Arel::Visitors::MySQL::COMMA
457
+ collector << 'array['
458
+ collector = visit o.key, collector
459
+ collector << ']'
460
+ collector << Arel::Visitors::MySQL::COMMA
461
+ collector = visit o.value, collector
462
+ collector << Arel::Visitors::MySQL::COMMA
463
+ collector << 'true)'
464
+ collector
465
+ end
384
466
 
385
467
  end
386
468
  end