arel_extensions 1.1.8 → 1.1.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -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