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.
- checksums.yaml +4 -4
- data/.travis.yml +2 -0
- data/Gemfile +1 -1
- data/gemfiles/rails3.gemfile +12 -12
- data/gemfiles/rails4.gemfile +17 -17
- data/gemfiles/rails5_0.gemfile +17 -17
- data/gemfiles/rails5_1_4.gemfile +17 -17
- data/gemfiles/rails5_2.gemfile +17 -17
- data/lib/arel_extensions/boolean_functions.rb +30 -11
- data/lib/arel_extensions/math.rb +111 -112
- data/lib/arel_extensions/math_functions.rb +50 -31
- data/lib/arel_extensions/nodes/function.rb +25 -26
- data/lib/arel_extensions/nodes/json.rb +81 -0
- data/lib/arel_extensions/predications.rb +95 -97
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/mssql.rb +121 -108
- data/lib/arel_extensions/visitors/mysql.rb +230 -148
- data/lib/arel_extensions/visitors/oracle.rb +242 -232
- data/lib/arel_extensions/visitors/oracle12.rb +39 -1
- data/lib/arel_extensions/visitors/postgresql.rb +216 -134
- data/lib/arel_extensions/visitors/sqlite.rb +200 -189
- data/lib/arel_extensions/visitors/to_sql.rb +239 -171
- data/lib/arel_extensions/visitors.rb +63 -33
- data/lib/arel_extensions.rb +1 -0
- data/test/visitors/test_oracle.rb +1 -1
- data/test/visitors/test_to_sql.rb +206 -195
- data/test/with_ar/all_agnostic_test.rb +278 -235
- metadata +3 -2
@@ -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
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
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
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
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
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
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
|
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
|
-
|
448
|
+
}
|
449
|
+
collector << ' FROM DUAL)'
|
450
|
+
end
|
451
|
+
collector << ")"
|
452
|
+
collector
|
432
453
|
end
|
433
|
-
|
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
|
-
|
437
|
-
|
438
|
-
|
439
|
-
o.left
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
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
|