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
@@ -28,17 +28,17 @@ module ArelExtensions
|
|
28
28
|
collector << ")"
|
29
29
|
collector
|
30
30
|
end
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
31
|
+
|
32
|
+
def visit_ArelExtensions_Nodes_Log10 o, collector
|
33
|
+
collector << "LOG10("
|
34
|
+
o.expressions.each_with_index { |arg, i|
|
35
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
36
|
+
collector = visit arg, collector
|
37
|
+
}
|
38
|
+
collector << ")"
|
39
|
+
collector
|
40
|
+
end
|
41
|
+
|
42
42
|
def visit_ArelExtensions_Nodes_Power o, collector
|
43
43
|
collector << "POWER("
|
44
44
|
o.expressions.each_with_index { |arg, i|
|
@@ -52,18 +52,16 @@ module ArelExtensions
|
|
52
52
|
def visit_ArelExtensions_Nodes_IsNull o, collector
|
53
53
|
collector << "("
|
54
54
|
collector = visit o.left, collector
|
55
|
-
# collector << Arel::Visitors::MSSQL::COMMA
|
56
55
|
collector << " IS NULL)"
|
57
56
|
collector
|
58
57
|
end
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
end
|
58
|
+
|
59
|
+
def visit_ArelExtensions_Nodes_IsNotNull o, collector
|
60
|
+
collector << "("
|
61
|
+
collector = visit o.left, collector
|
62
|
+
collector << " IS NOT NULL)"
|
63
|
+
collector
|
64
|
+
end
|
67
65
|
|
68
66
|
def visit_ArelExtensions_Nodes_Concat o, collector
|
69
67
|
collector << "CONCAT("
|
@@ -74,7 +72,7 @@ module ArelExtensions
|
|
74
72
|
collector << ")"
|
75
73
|
collector
|
76
74
|
end
|
77
|
-
|
75
|
+
|
78
76
|
def visit_ArelExtensions_Nodes_Repeat o, collector
|
79
77
|
collector << "REPLICATE("
|
80
78
|
o.expressions.each_with_index { |arg, i|
|
@@ -310,8 +308,8 @@ module ArelExtensions
|
|
310
308
|
collector
|
311
309
|
end
|
312
310
|
end
|
313
|
-
|
314
|
-
def visit_ArelExtensions_Nodes_AiMatches o, collector
|
311
|
+
|
312
|
+
def visit_ArelExtensions_Nodes_AiMatches o, collector
|
315
313
|
collector = visit o.left.ai_collate, collector
|
316
314
|
collector << ' LIKE '
|
317
315
|
collector = visit o.right.ai_collate, collector
|
@@ -322,8 +320,8 @@ module ArelExtensions
|
|
322
320
|
collector
|
323
321
|
end
|
324
322
|
end
|
325
|
-
|
326
|
-
def visit_ArelExtensions_Nodes_AiIMatches o, collector
|
323
|
+
|
324
|
+
def visit_ArelExtensions_Nodes_AiIMatches o, collector
|
327
325
|
collector = visit o.left.collate(true,true), collector
|
328
326
|
collector << ' LIKE '
|
329
327
|
collector = visit o.right.collate(true,true), collector
|
@@ -335,7 +333,7 @@ module ArelExtensions
|
|
335
333
|
end
|
336
334
|
end
|
337
335
|
|
338
|
-
def visit_ArelExtensions_Nodes_SMatches o, collector
|
336
|
+
def visit_ArelExtensions_Nodes_SMatches o, collector
|
339
337
|
collector = visit o.left.collate, collector
|
340
338
|
collector << ' LIKE '
|
341
339
|
collector = visit o.right.collate, collector
|
@@ -346,8 +344,8 @@ module ArelExtensions
|
|
346
344
|
collector
|
347
345
|
end
|
348
346
|
end
|
349
|
-
|
350
|
-
def visit_ArelExtensions_Nodes_Collate o, collector
|
347
|
+
|
348
|
+
def visit_ArelExtensions_Nodes_Collate o, collector
|
351
349
|
if o.ai && o.ci
|
352
350
|
collector = visit o.expressions.first, collector
|
353
351
|
collector << ' COLLATE Latin1_General_CI_AI'
|
@@ -377,14 +375,14 @@ module ArelExtensions
|
|
377
375
|
collector
|
378
376
|
end
|
379
377
|
|
380
|
-
# TODO;
|
378
|
+
# TODO;
|
381
379
|
def visit_ArelExtensions_Nodes_GroupConcat o, collector
|
382
380
|
collector << "(STRING_AGG("
|
383
381
|
collector = visit o.left, collector
|
384
382
|
collector << Arel::Visitors::Oracle::COMMA
|
385
383
|
if o.right && o.right != 'NULL'
|
386
384
|
collector = visit o.right, collector
|
387
|
-
else
|
385
|
+
else
|
388
386
|
collector = visit Arel::Nodes.build_quoted(','), collector
|
389
387
|
end
|
390
388
|
collector << ") WITHIN GROUP (ORDER BY "
|
@@ -430,84 +428,99 @@ module ArelExtensions
|
|
430
428
|
collector
|
431
429
|
end
|
432
430
|
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
431
|
+
def visit_ArelExtensions_Nodes_FormattedNumber o, collector
|
432
|
+
col = o.left.coalesce(0)
|
433
|
+
locale = Arel::Nodes.build_quoted(o.locale.tr('_','-'))
|
434
|
+
param = Arel::Nodes.build_quoted("N#{o.precision}")
|
435
|
+
sign = ArelExtensions::Nodes::Case.new.when(col<0).
|
436
|
+
then('-').
|
437
|
+
else(o.flags.include?('+') ? '+' : (o.flags.include?(' ') ? ' ' : ''))
|
438
|
+
sign_length = o.flags.include?('+') || o.flags.include?(' ') ?
|
439
|
+
Arel::Nodes.build_quoted(1) :
|
440
|
+
ArelExtensions::Nodes::Case.new.when(col<0).then(1).else(0)
|
441
|
+
|
442
|
+
if o.scientific_notation
|
443
|
+
number = ArelExtensions::Nodes::Concat.new([
|
444
|
+
Arel::Nodes::NamedFunction.new('FORMAT',[
|
445
|
+
col.abs/Arel::Nodes.build_quoted(10).pow(col.abs.log10.floor),
|
446
|
+
param,
|
447
|
+
locale
|
448
|
+
]),
|
449
|
+
o.type,
|
450
|
+
Arel::Nodes::NamedFunction.new('FORMAT',[
|
451
|
+
col.abs.log10.floor,
|
452
|
+
Arel::Nodes.build_quoted('N0'),
|
453
|
+
locale
|
454
|
+
])
|
455
|
+
])
|
456
|
+
else
|
457
|
+
number = Arel::Nodes::NamedFunction.new('FORMAT',[
|
458
|
+
Arel::Nodes.build_quoted(col.abs),
|
459
|
+
param,
|
460
|
+
locale
|
461
|
+
])
|
462
|
+
end
|
463
|
+
|
464
|
+
repeated_char = (o.width == 0) ? Arel::Nodes.build_quoted('') : ArelExtensions::Nodes::Case.new().
|
465
|
+
when(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length)>0).
|
466
|
+
then(Arel::Nodes.build_quoted(
|
467
|
+
o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
|
468
|
+
).repeat(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length))
|
469
|
+
).
|
470
|
+
else('')
|
471
|
+
before = (!o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
|
472
|
+
middle = (o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
|
473
|
+
after = o.flags.include?('-') ? repeated_char : ''
|
474
|
+
full_number =
|
475
|
+
ArelExtensions::Nodes::Concat.new([
|
476
|
+
before,
|
477
|
+
sign,
|
478
|
+
middle,
|
479
|
+
number,
|
480
|
+
after
|
481
|
+
])
|
482
|
+
collector = visit ArelExtensions::Nodes::Concat.new([Arel::Nodes.build_quoted(o.prefix),full_number,Arel::Nodes.build_quoted(o.suffix)]), collector
|
483
|
+
collector
|
484
|
+
end
|
485
|
+
|
486
|
+
def visit_ArelExtensions_Nodes_Std o, collector
|
487
|
+
collector << (o.unbiased_estimator ? "STDEV(" : "STDEVP(")
|
488
|
+
visit o.left, collector
|
489
|
+
collector << ")"
|
490
|
+
collector
|
491
|
+
end
|
492
|
+
|
493
|
+
def visit_ArelExtensions_Nodes_Variance o, collector
|
494
|
+
collector << (o.unbiased_estimator ? "VAR(" : "VARP(")
|
495
|
+
visit o.left, collector
|
496
|
+
collector << ")"
|
497
|
+
collector
|
498
|
+
end
|
499
|
+
|
500
|
+
|
501
|
+
def visit_ArelExtensions_Nodes_LevenshteinDistance o, collector
|
502
|
+
collector << "dbo.LEVENSHTEIN_DISTANCE("
|
503
|
+
collector = visit o.left, collector
|
504
|
+
collector << Arel::Visitors::ToSql::COMMA
|
505
|
+
collector = visit o.right, collector
|
506
|
+
collector << ')'
|
507
|
+
collector
|
508
|
+
end
|
509
|
+
|
510
|
+
|
511
|
+
def visit_ArelExtensions_Nodes_JsonGet o,collector
|
512
|
+
collector << 'JSON_VALUE('
|
513
|
+
collector = visit o.hash, collector
|
514
|
+
collector << Arel::Visitors::MySQL::COMMA
|
515
|
+
if o.key.is_a?(Integer)
|
516
|
+
collector << "\"$[#{o.key}]\""
|
517
|
+
else
|
518
|
+
collector = visit Arel::Nodes.build_quoted('$.')+o.key, collector
|
519
|
+
end
|
520
|
+
collector << ')'
|
521
|
+
collector
|
522
|
+
end
|
523
|
+
|
511
524
|
|
512
525
|
end
|
513
526
|
end
|