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.
@@ -1,7 +1,7 @@
1
1
  #require 'oracle_visitor'
2
2
  module ArelExtensions
3
3
  module Visitors
4
- Arel::Visitors::Oracle.class_eval do
4
+ Arel::Visitors::Oracle.class_eval do
5
5
 
6
6
  SPECIAL_CHARS = {"\t" => 'CHR(9)', "\n" => 'CHR(10)', "\r" => 'CHR(13)'}
7
7
  Arel::Visitors::Oracle::DATE_MAPPING = {'d' => 'DAY', 'm' => 'MONTH', 'w' => 'IW', 'y' => 'YEAR', 'wd' => 'D', 'h' => 'HOUR', 'mn' => 'MINUTE', 's' => 'SECOND'}
@@ -13,25 +13,25 @@ module ArelExtensions
13
13
  }
14
14
  Arel::Visitors::Oracle::NUMBER_COMMA_MAPPING = { 'en_US' => '.,', 'fr_FR' => ',', 'sv_SE' => ', ' }
15
15
 
16
- def visit_ArelExtensions_Nodes_Log10 o, collector
17
- collector << "LOG("
18
- o.expressions.each_with_index { |arg, i|
19
- collector << Arel::Visitors::ToSql::COMMA unless i == 0
20
- collector = visit arg, collector
21
- }
22
- collector << ",10)"
23
- collector
24
- end
16
+ def visit_ArelExtensions_Nodes_Log10 o, collector
17
+ collector << "LOG("
18
+ o.expressions.each_with_index { |arg, i|
19
+ collector << Arel::Visitors::ToSql::COMMA unless i == 0
20
+ collector = visit arg, collector
21
+ }
22
+ collector << ",10)"
23
+ collector
24
+ end
25
25
 
26
- def visit_ArelExtensions_Nodes_Power o, collector
27
- collector << "POWER("
28
- o.expressions.each_with_index { |arg, i|
29
- collector << Arel::Visitors::ToSql::COMMA unless i == 0
30
- collector = visit arg, collector
31
- }
32
- collector << ")"
33
- collector
34
- end
26
+ def visit_ArelExtensions_Nodes_Power o, collector
27
+ collector << "POWER("
28
+ o.expressions.each_with_index { |arg, i|
29
+ collector << Arel::Visitors::ToSql::COMMA unless i == 0
30
+ collector = visit arg, collector
31
+ }
32
+ collector << ")"
33
+ collector
34
+ end
35
35
 
36
36
  def visit_ArelExtensions_Nodes_Concat o, collector
37
37
  collector << '('
@@ -56,7 +56,7 @@ module ArelExtensions
56
56
  collector
57
57
  end
58
58
  end
59
-
59
+
60
60
  def visit_ArelExtensions_Nodes_AiMatches o, collector
61
61
  collector = visit o.left.ai_collate, collector
62
62
  collector << ' LIKE '
@@ -68,7 +68,7 @@ module ArelExtensions
68
68
  collector
69
69
  end
70
70
  end
71
-
71
+
72
72
  def visit_ArelExtensions_Nodes_AiIMatches o, collector
73
73
  collector = visit o.left.ai_collate, collector
74
74
  collector << ' LIKE '
@@ -80,7 +80,7 @@ module ArelExtensions
80
80
  collector
81
81
  end
82
82
  end
83
-
83
+
84
84
  def visit_ArelExtensions_Nodes_SMatches o, collector
85
85
  collector = visit o.left, collector
86
86
  collector << ' LIKE '
@@ -91,8 +91,8 @@ module ArelExtensions
91
91
  else
92
92
  collector
93
93
  end
94
- end
95
-
94
+ end
95
+
96
96
 
97
97
  def visit_ArelExtensions_Nodes_IDoesNotMatch o, collector
98
98
  collector << 'LOWER('
@@ -112,13 +112,13 @@ module ArelExtensions
112
112
  if o.ai
113
113
  collector << "NLSSORT("
114
114
  collector = visit o.expressions.first, collector
115
- collector << Arel::Visitors::Oracle::COMMA
115
+ collector << Arel::Visitors::Oracle::COMMA
116
116
  collector << "'NLS_SORT = BINARY_AI NLS_COMP = LINGUISTIC'"
117
117
  collector << ")"
118
118
  elsif o.ci
119
119
  collector << "NLSSORT("
120
120
  collector = visit o.expressions.first, collector
121
- collector << Arel::Visitors::Oracle::COMMA
121
+ collector << Arel::Visitors::Oracle::COMMA
122
122
  collector << "'NLS_SORT = BINARY_CI NLS_COMP = LINGUISTIC'"
123
123
  collector << ")"
124
124
  else
@@ -126,7 +126,6 @@ module ArelExtensions
126
126
  end
127
127
  collector
128
128
  end
129
-
130
129
 
131
130
  def visit_ArelExtensions_Nodes_GroupConcat o, collector
132
131
  collector << "(LISTAGG("
@@ -134,7 +133,7 @@ module ArelExtensions
134
133
  collector << Arel::Visitors::Oracle::COMMA
135
134
  if o.right && o.right != 'NULL'
136
135
  collector = visit o.right, collector
137
- else
136
+ else
138
137
  collector = visit Arel::Nodes.build_quoted(','), collector
139
138
  end
140
139
  collector << ") WITHIN GROUP (ORDER BY "
@@ -220,20 +219,20 @@ module ArelExtensions
220
219
  collector
221
220
  end
222
221
 
223
- def visit_ArelExtensions_Nodes_Cast o, collector
222
+ def visit_ArelExtensions_Nodes_Cast o, collector
224
223
  case o.as_attr
225
224
  when :string
226
225
  as_attr = Arel::Nodes::SqlLiteral.new('varchar(255)')
227
226
  when :time
228
- left = Arel::Nodes::NamedFunction.new('TO_CHAR',[o.left,Arel::Nodes.build_quoted('HH24:MI:SS')])
227
+ left = Arel::Nodes::NamedFunction.new('TO_CHAR',[o.left,Arel::Nodes.build_quoted('HH24:MI:SS')])
229
228
  collector = visit left, collector
230
229
  return collector
231
- when :number
230
+ when :number
232
231
  as_attr = Arel::Nodes::SqlLiteral.new('int')
233
- when :datetime
232
+ when :datetime
234
233
  as_attr = Arel::Nodes::SqlLiteral.new('timestamp')
235
- when :binary
236
- as_attr = Arel::Nodes::SqlLiteral.new('binary')
234
+ when :binary
235
+ as_attr = Arel::Nodes::SqlLiteral.new('binary')
237
236
  else
238
237
  as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
239
238
  end
@@ -245,8 +244,6 @@ module ArelExtensions
245
244
  collector
246
245
  end
247
246
 
248
-
249
-
250
247
  def visit_ArelExtensions_Nodes_Length o, collector
251
248
  collector << "LENGTH("
252
249
  collector = visit o.expr, collector
@@ -254,13 +251,12 @@ module ArelExtensions
254
251
  collector
255
252
  end
256
253
 
257
-
258
254
  def visit_ArelExtensions_Nodes_IsNull o, collector
259
255
  collector = visit o.left, collector
260
256
  collector << ' IS NULL'
261
257
  collector
262
258
  end
263
-
259
+
264
260
  def visit_ArelExtensions_Nodes_IsNotNull o, collector
265
261
  collector = visit o.left, collector
266
262
  collector << ' IS NOT NULL'
@@ -397,7 +393,7 @@ module ArelExtensions
397
393
  collector << ")"
398
394
  collector
399
395
  end
400
-
396
+
401
397
  def visit_ArelExtensions_Nodes_Repeat o, collector
402
398
  collector << "LPAD("
403
399
  collector = visit o.expressions[0], collector #can't put empty string, otherwise it wouldn't work
@@ -407,214 +403,228 @@ module ArelExtensions
407
403
  collector = visit o.expressions[0], collector
408
404
  collector << ")"
409
405
  collector
410
- end
411
-
412
- # add primary_key if not present, avoid zip
413
- if Arel::VERSION.to_i < 7
414
- def visit_ArelExtensions_InsertManager_BulkValues o, collector
415
- collector << "("
416
- o.left.each_with_index do |row, idx| # values
417
- collector << " UNION ALL " if idx != 0
418
- collector << "(SELECT "
419
- v = Arel::Nodes::Values.new(row, o.cols)
420
- len = v.expressions.length - 1
421
- v.expressions.each_with_index { |value, i|
406
+ end
407
+
408
+ # add primary_key if not present, avoid zip
409
+ if Arel::VERSION.to_i < 7
410
+ def visit_ArelExtensions_InsertManager_BulkValues o, collector
411
+ collector << "("
412
+ o.left.each_with_index do |row, idx| # values
413
+ collector << " UNION ALL " if idx != 0
414
+ collector << "(SELECT "
415
+ v = Arel::Nodes::Values.new(row, o.cols)
416
+ len = v.expressions.length - 1
417
+ v.expressions.each_with_index { |value, i|
418
+ case value
419
+ when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
420
+ collector = visit value, collector
421
+ else
422
+ attr = v.columns[i]
423
+ collector << quote(value, attr && column_for(attr)).to_s
424
+ end
425
+ collector << Arel::Visitors::Oracle::COMMA unless i == len
426
+ }
427
+ collector << ' FROM DUAL)'
428
+ end
429
+ collector << ")"
430
+ collector
431
+ end
432
+ else
433
+ def visit_ArelExtensions_InsertManager_BulkValues o, collector
434
+ collector << "("
435
+ o.left.each_with_index do |row, idx|
436
+ collector << " UNION ALL " if idx != 0
437
+ collector << "(SELECT "
438
+ v = Arel::Nodes::Values.new(row, o.cols)
439
+ len = v.expressions.length - 1
440
+ v.expressions.zip(v.columns).each_with_index { |(value, attr), i|
422
441
  case value
423
442
  when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
424
443
  collector = visit value, collector
425
444
  else
426
- attr = v.columns[i]
427
- collector << quote(value, attr && column_for(attr)).to_s
445
+ collector << (attr && attr.able_to_type_cast? ? quote(attr.type_cast_for_database(value)) : quote(value).to_s)
428
446
  end
429
447
  collector << Arel::Visitors::Oracle::COMMA unless i == len
430
- }
431
- collector << ' FROM DUAL)'
448
+ }
449
+ collector << ' FROM DUAL)'
450
+ end
451
+ collector << ")"
452
+ collector
432
453
  end
433
- collector << ")"
454
+ end
455
+
456
+
457
+ def get_time_converted element
458
+ if element.is_a?(Time)
459
+ ArelExtensions::Nodes::Format.new [element, '%H:%M:%S']
460
+ elsif element.is_a?(Arel::Attributes::Attribute)
461
+ col = Arel::Table.engine.connection.schema_cache.columns_hash(element.relation.table_name)[element.name.to_s]
462
+ if col && (col.type == :time)
463
+ ArelExtensions::Nodes::Format.new [element, '%H:%M:%S']
464
+ else
465
+ element
466
+ end
467
+ else
468
+ element
469
+ end
470
+ end
471
+
472
+
473
+ remove_method(:visit_Arel_Nodes_GreaterThanOrEqual) rescue nil
474
+ def visit_Arel_Nodes_GreaterThanOrEqual o, collector
475
+ collector = visit get_time_converted(o.left), collector
476
+ collector << " >= "
477
+ collector = visit get_time_converted(o.right), collector
434
478
  collector
435
479
  end
436
- else
437
- def visit_ArelExtensions_InsertManager_BulkValues o, collector
438
- collector << "("
439
- o.left.each_with_index do |row, idx|
440
- collector << " UNION ALL " if idx != 0
441
- collector << "(SELECT "
442
- v = Arel::Nodes::Values.new(row, o.cols)
443
- len = v.expressions.length - 1
444
- v.expressions.zip(v.columns).each_with_index { |(value, attr), i|
445
- case value
446
- when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
447
- collector = visit value, collector
448
- else
449
- collector << (attr && attr.able_to_type_cast? ? quote(attr.type_cast_for_database(value)) : quote(value).to_s)
450
- end
451
- collector << Arel::Visitors::Oracle::COMMA unless i == len
452
- }
453
- collector << ' FROM DUAL)'
480
+
481
+ remove_method(:visit_Arel_Nodes_GreaterThan) rescue nil
482
+ def visit_Arel_Nodes_GreaterThan o, collector
483
+ collector = visit get_time_converted(o.left), collector
484
+ collector << " > "
485
+ collector = visit get_time_converted(o.right), collector
486
+ collector
487
+ end
488
+
489
+ remove_method(:visit_Arel_Nodes_LessThanOrEqual) rescue nil
490
+ def visit_Arel_Nodes_LessThanOrEqual o, collector
491
+ collector = visit get_time_converted(o.left), collector
492
+ collector << " <= "
493
+ collector = visit get_time_converted(o.right), collector
494
+ collector
495
+ end
496
+
497
+ remove_method(:visit_Arel_Nodes_LessThan) rescue nil
498
+ def visit_Arel_Nodes_LessThan o, collector
499
+ collector = visit get_time_converted(o.left), collector
500
+ collector << " < "
501
+ collector = visit get_time_converted(o.right), collector
502
+ collector
503
+ end
504
+
505
+
506
+ alias_method :old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement
507
+ def visit_Arel_Nodes_SelectStatement o, collector
508
+ if !(collector.value.blank? || (collector.value.is_a?(Array) && collector.value[0].blank?)) && o.limit.blank? && o.offset.blank?
509
+ o = o.dup
510
+ o.orders = []
454
511
  end
455
- collector << ")"
512
+ old_visit_Arel_Nodes_SelectStatement(o,collector)
513
+ end
514
+
515
+ alias_method :old_visit_Arel_Nodes_TableAlias, :visit_Arel_Nodes_TableAlias
516
+ def visit_Arel_Nodes_TableAlias o, collector
517
+ if o.name.length > 30
518
+ o = Arel::Table.new(o.table_name).alias(Base64.urlsafe_encode64(Digest::MD5.new.digest(o.name)).tr('=', '').tr('-', '_'))
519
+ end
520
+ old_visit_Arel_Nodes_TableAlias(o,collector)
521
+ end
522
+
523
+ alias_method :old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As
524
+ def visit_Arel_Nodes_As o, collector
525
+ if o.left.is_a?(Arel::Nodes::Binary)
526
+ collector << '('
527
+ collector = visit o.left, collector
528
+ collector << ')'
529
+ else
530
+ collector = visit o.left, collector
531
+ end
532
+ quote = o.right.to_s =~ /[^a-zA-Z_]/ ? '"' : ''
533
+ collector << " AS #{quote}"
534
+ collector = visit o.right, collector
535
+ collector << "#{quote}"
456
536
  collector
457
537
  end
458
- end
459
538
 
539
+ alias_method :old_visit_Arel_Attributes_Attribute, :visit_Arel_Attributes_Attribute
540
+ def visit_Arel_Attributes_Attribute o, collector
541
+ join_name = o.relation.table_alias || o.relation.name
542
+ if join_name.length > 30
543
+ join_name = Arel.shorten(join_name)
544
+ end
545
+ collector << "#{quote_table_name join_name}.#{quote_column_name o.name}"
546
+ end
460
547
 
461
- def get_time_converted element
462
- if element.is_a?(Time)
463
- ArelExtensions::Nodes::Format.new [element, '%H:%M:%S']
464
- elsif element.is_a?(Arel::Attributes::Attribute)
465
- col = Arel::Table.engine.connection.schema_cache.columns_hash(element.relation.table_name)[element.name.to_s]
466
- if col && (col.type == :time)
467
- ArelExtensions::Nodes::Format.new [element, '%H:%M:%S']
468
- else
469
- element
470
- end
471
- else
472
- element
473
- end
474
- end
475
-
476
-
477
- remove_method(:visit_Arel_Nodes_GreaterThanOrEqual) rescue nil
478
- def visit_Arel_Nodes_GreaterThanOrEqual o, collector
479
- collector = visit get_time_converted(o.left), collector
480
- collector << " >= "
481
- collector = visit get_time_converted(o.right), collector
482
- collector
483
- end
484
-
485
- remove_method(:visit_Arel_Nodes_GreaterThan) rescue nil
486
- def visit_Arel_Nodes_GreaterThan o, collector
487
- collector = visit get_time_converted(o.left), collector
488
- collector << " > "
489
- collector = visit get_time_converted(o.right), collector
490
- collector
491
- end
492
-
493
- remove_method(:visit_Arel_Nodes_LessThanOrEqual) rescue nil
494
- def visit_Arel_Nodes_LessThanOrEqual o, collector
495
- collector = visit get_time_converted(o.left), collector
496
- collector << " <= "
497
- collector = visit get_time_converted(o.right), collector
498
- collector
499
- end
500
-
501
- remove_method(:visit_Arel_Nodes_LessThan) rescue nil
502
- def visit_Arel_Nodes_LessThan o, collector
503
- collector = visit get_time_converted(o.left), collector
504
- collector << " < "
505
- collector = visit get_time_converted(o.right), collector
506
- collector
507
- end
508
-
509
-
510
- alias_method :old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement
511
- def visit_Arel_Nodes_SelectStatement o, collector
512
- if !(collector.value.blank? || (collector.value.is_a?(Array) && collector.value[0].blank?)) && o.limit.blank? && o.offset.blank?
513
- o = o.dup
514
- o.orders = []
515
- end
516
- old_visit_Arel_Nodes_SelectStatement(o,collector)
517
- end
518
-
519
- alias_method :old_visit_Arel_Nodes_TableAlias, :visit_Arel_Nodes_TableAlias
520
- def visit_Arel_Nodes_TableAlias o, collector
521
- if o.name.length > 30
522
- o = Arel::Table.new(o.table_name).alias(Base64.urlsafe_encode64(Digest::MD5.new.digest(o.name)).tr('=', '').tr('-', '_'))
523
- end
524
- old_visit_Arel_Nodes_TableAlias(o,collector)
525
- end
526
-
527
-
528
- alias_method :old_visit_Arel_Attributes_Attribute, :visit_Arel_Attributes_Attribute
529
- def visit_Arel_Attributes_Attribute o, collector
530
- join_name = o.relation.table_alias || o.relation.name
531
- if join_name.length > 30
532
- join_name = Arel.shorten(join_name)
533
- end
534
- collector << "#{quote_table_name join_name}.#{quote_column_name o.name}"
535
- end
536
-
537
-
538
- def visit_ArelExtensions_Nodes_FormattedNumber o, collector
539
- col = o.left.coalesce(0)
540
- comma = Arel::Visitors::Oracle::NUMBER_COMMA_MAPPING[o.locale] || '.,'
541
- comma_in_format = o.precision == 0 ? '' : 'D'
542
- nines_after = (1..o.precision-1).map{'9'}.join('')+'0'
543
- if comma.length == 1
544
- options = Arel::Nodes.build_quoted("NLS_NUMERIC_CHARACTERS = '"+comma+" '")
545
- nines_before = ("999"*4+"990")
546
- else
547
- options = Arel::Nodes.build_quoted("NLS_NUMERIC_CHARACTERS = '"+comma+"'")
548
- nines_before = ("999G"*4+"990")
549
- end
550
- sign = ArelExtensions::Nodes::Case.new.when(col<0).
551
- then('-').
552
- else(o.flags.include?('+') ? '+' : (o.flags.include?(' ') ? ' ' : ''))
553
- sign_length = o.flags.include?('+') || o.flags.include?(' ') ?
554
- Arel::Nodes.build_quoted(1) :
555
- ArelExtensions::Nodes::Case.new.when(col<0).then(1).else(0)
556
-
557
- if o.scientific_notation
558
- number = Arel::Nodes::NamedFunction.new('TO_CHAR',[
559
- Arel::Nodes.build_quoted(col.abs),
560
- Arel::Nodes.build_quoted('FM'+nines_before+comma_in_format+nines_after+'EEEE'),
561
- options
562
- ])
563
- if o.type == 'e'
564
- number = number.replace('E','e')
565
- end
566
- else
567
- number = Arel::Nodes::NamedFunction.new('TO_CHAR',[
568
- Arel::Nodes.build_quoted(col.abs),
569
- Arel::Nodes.build_quoted('FM'+nines_before+comma_in_format+nines_after),
570
- options
571
- ])
572
- end
573
-
574
- repeated_char = (o.width == 0) ? Arel::Nodes.build_quoted('') : ArelExtensions::Nodes::Case.new().
575
- when(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length)>0).
576
- then(Arel::Nodes.build_quoted(
577
- o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
578
- ).repeat(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length))
579
- ).
580
- else('')
581
- before = (!o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
582
- middle = (o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
583
- after = o.flags.include?('-') ? repeated_char : ''
584
- full_number = ArelExtensions::Nodes::Concat.new([
585
- before,
586
- sign,
587
- middle,
588
- number,
589
- after
590
- ])
591
- collector = visit ArelExtensions::Nodes::Concat.new([Arel::Nodes.build_quoted(o.prefix),full_number,Arel::Nodes.build_quoted(o.suffix)]), collector
592
- collector
593
- end
594
-
595
- def visit_ArelExtensions_Nodes_Std o, collector
596
- collector << (o.unbiased_estimator ? "STDDEV_SAMP(" : "STDDEV_POP(")
597
- visit o.left, collector
598
- collector << ")"
599
- collector
600
- end
601
-
602
- def visit_ArelExtensions_Nodes_Variance o, collector
603
- collector << (o.unbiased_estimator ? "VAR_SAMP(" : "VAR_POP(")
604
- visit o.left, collector
605
- collector << ")"
606
- collector
607
- end
608
-
609
- def visit_ArelExtensions_Nodes_LevenshteinDistance o, collector
610
- collector << "UTL_MATCH.edit_distance("
611
- collector = visit o.left, collector
612
- collector << Arel::Visitors::ToSql::COMMA
613
- collector = visit o.right, collector
614
- collector << ')'
615
- collector
616
- end
617
548
 
549
+ def visit_ArelExtensions_Nodes_FormattedNumber o, collector
550
+ col = o.left.coalesce(0)
551
+ comma = Arel::Visitors::Oracle::NUMBER_COMMA_MAPPING[o.locale] || '.,'
552
+ comma_in_format = o.precision == 0 ? '' : 'D'
553
+ nines_after = (1..o.precision-1).map{'9'}.join('')+'0'
554
+ if comma.length == 1
555
+ options = Arel::Nodes.build_quoted("NLS_NUMERIC_CHARACTERS = '"+comma+" '")
556
+ nines_before = ("999"*4+"990")
557
+ else
558
+ options = Arel::Nodes.build_quoted("NLS_NUMERIC_CHARACTERS = '"+comma+"'")
559
+ nines_before = ("999G"*4+"990")
560
+ end
561
+ sign = ArelExtensions::Nodes::Case.new.when(col<0).
562
+ then('-').
563
+ else(o.flags.include?('+') ? '+' : (o.flags.include?(' ') ? ' ' : ''))
564
+ sign_length = o.flags.include?('+') || o.flags.include?(' ') ?
565
+ Arel::Nodes.build_quoted(1) :
566
+ ArelExtensions::Nodes::Case.new.when(col<0).then(1).else(0)
567
+
568
+ if o.scientific_notation
569
+ number = Arel::Nodes::NamedFunction.new('TO_CHAR',[
570
+ Arel::Nodes.build_quoted(col.abs),
571
+ Arel::Nodes.build_quoted('FM'+nines_before+comma_in_format+nines_after+'EEEE'),
572
+ options
573
+ ])
574
+ if o.type == 'e'
575
+ number = number.replace('E','e')
576
+ end
577
+ else
578
+ number = Arel::Nodes::NamedFunction.new('TO_CHAR',[
579
+ Arel::Nodes.build_quoted(col.abs),
580
+ Arel::Nodes.build_quoted('FM'+nines_before+comma_in_format+nines_after),
581
+ options
582
+ ])
583
+ end
584
+
585
+ repeated_char = (o.width == 0) ? Arel::Nodes.build_quoted('') : ArelExtensions::Nodes::Case.new().
586
+ when(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length)>0).
587
+ then(Arel::Nodes.build_quoted(
588
+ o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
589
+ ).repeat(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length))
590
+ ).
591
+ else('')
592
+ before = (!o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
593
+ middle = (o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
594
+ after = o.flags.include?('-') ? repeated_char : ''
595
+ full_number = ArelExtensions::Nodes::Concat.new([
596
+ before,
597
+ sign,
598
+ middle,
599
+ number,
600
+ after
601
+ ])
602
+ collector = visit ArelExtensions::Nodes::Concat.new([Arel::Nodes.build_quoted(o.prefix),full_number,Arel::Nodes.build_quoted(o.suffix)]), collector
603
+ collector
604
+ end
605
+
606
+ def visit_ArelExtensions_Nodes_Std o, collector
607
+ collector << (o.unbiased_estimator ? "STDDEV_SAMP(" : "STDDEV_POP(")
608
+ visit o.left, collector
609
+ collector << ")"
610
+ collector
611
+ end
612
+
613
+ def visit_ArelExtensions_Nodes_Variance o, collector
614
+ collector << (o.unbiased_estimator ? "VAR_SAMP(" : "VAR_POP(")
615
+ visit o.left, collector
616
+ collector << ")"
617
+ collector
618
+ end
619
+
620
+ def visit_ArelExtensions_Nodes_LevenshteinDistance o, collector
621
+ collector << "UTL_MATCH.edit_distance("
622
+ collector = visit o.left, collector
623
+ collector << Arel::Visitors::ToSql::COMMA
624
+ collector = visit o.right, collector
625
+ collector << ')'
626
+ collector
627
+ end
618
628
 
619
629
  end
620
630
  end
@@ -59,7 +59,45 @@ module ArelExtensions
59
59
  collector << "DECODE("
60
60
  collector = visit [o.left, o.right, 0, 1], collector
61
61
  collector << ")"
62
- end
62
+ end
63
+ def visit_ArelExtensions_Nodes_Json o,collector
64
+ case o.hash
65
+ when Array
66
+ collector << 'json_array('
67
+ o.hash.each.with_index do |v,i|
68
+ if i != 0
69
+ collector << Arel::Visitors::MySQL::COMMA
70
+ end
71
+ collector = visit v, collector
72
+ end
73
+ collector << ')'
74
+ when Hash
75
+ collector << 'json__object('
76
+ o.hash.each.with_index do |(k,v),i|
77
+ if i != 0
78
+ collector << Arel::Visitors::MySQL::COMMA
79
+ end
80
+ collector << 'KEY '
81
+ collector = visit k, collector
82
+ collector << ' IS '
83
+ collector = visit v, collector
84
+ collector << 'FORMAT JSON'
85
+ end
86
+ collector << ')'
87
+ when String,Numeric,TrueClass,FalseClass
88
+ collector = visit Arel::Nodes.build_quoted("#{o.hash}"), collector
89
+ collector << ' FORMAT JSON'
90
+ when NilClass
91
+ collector << %Q['null' FORMAT JSON]
92
+ when Arel::Attributes::Attribute
93
+ collector = visit o.hash.cast('JSON'), collector
94
+ else
95
+ collector = visit o.hash, collector
96
+ collector << ' FORMAT JSON'
97
+ end
98
+ collector
99
+ end
100
+
63
101
  end
64
102
  end
65
103
  end