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.
@@ -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