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