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
@@ -1,6 +1,6 @@
|
|
1
1
|
module ArelExtensions
|
2
2
|
module Visitors
|
3
|
-
|
3
|
+
Arel::Visitors::ToSql.class_eval do
|
4
4
|
|
5
5
|
# Math Functions
|
6
6
|
def visit_ArelExtensions_Nodes_Abs o, collector
|
@@ -52,14 +52,14 @@ module ArelExtensions
|
|
52
52
|
collector << ")"
|
53
53
|
collector
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
def visit_ArelExtensions_Nodes_Log10 o, collector
|
57
57
|
collector << "LOG10("
|
58
58
|
collector = visit o.left, collector
|
59
59
|
collector << ")"
|
60
60
|
collector
|
61
61
|
end
|
62
|
-
|
62
|
+
|
63
63
|
def visit_ArelExtensions_Nodes_Power o, collector
|
64
64
|
collector << "POW("
|
65
65
|
o.expressions.each_with_index { |arg, i|
|
@@ -73,7 +73,7 @@ module ArelExtensions
|
|
73
73
|
# String functions
|
74
74
|
def visit_ArelExtensions_Nodes_Concat o, collector
|
75
75
|
collector << "CONCAT("
|
76
|
-
|
76
|
+
o.expressions.each_with_index { |arg, i|
|
77
77
|
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
78
78
|
collector = visit arg, collector
|
79
79
|
}
|
@@ -134,7 +134,7 @@ module ArelExtensions
|
|
134
134
|
collector << ")"
|
135
135
|
collector
|
136
136
|
end
|
137
|
-
|
137
|
+
|
138
138
|
def visit_ArelExtensions_Nodes_Repeat o, collector
|
139
139
|
collector << "REPEAT("
|
140
140
|
o.expressions.each_with_index { |arg, i|
|
@@ -205,7 +205,6 @@ module ArelExtensions
|
|
205
205
|
collector
|
206
206
|
end
|
207
207
|
|
208
|
-
|
209
208
|
def visit_ArelExtensions_Nodes_Rtrim o, collector
|
210
209
|
collector << "RTRIM("
|
211
210
|
o.expressions.each_with_index { |arg, i|
|
@@ -217,7 +216,7 @@ module ArelExtensions
|
|
217
216
|
end
|
218
217
|
|
219
218
|
def visit_ArelExtensions_Nodes_Blank o, collector
|
220
|
-
|
219
|
+
#visit o.left.coalesce('').trim.length.eq(0), collector
|
221
220
|
collector << 'LENGTH(TRIM(COALESCE('
|
222
221
|
collector = visit o.left, collector
|
223
222
|
collector << Arel::Visitors::ToSql::COMMA
|
@@ -228,7 +227,7 @@ module ArelExtensions
|
|
228
227
|
|
229
228
|
|
230
229
|
def visit_ArelExtensions_Nodes_NotBlank o, collector
|
231
|
-
|
230
|
+
#visit o.left.coalesce('').trim.length.gt(0), collector
|
232
231
|
collector << 'LENGTH(TRIM(COALESCE('
|
233
232
|
collector = visit o.left, collector
|
234
233
|
collector << Arel::Visitors::ToSql::COMMA
|
@@ -257,33 +256,33 @@ module ArelExtensions
|
|
257
256
|
collector
|
258
257
|
end
|
259
258
|
|
260
|
-
|
259
|
+
#comparators
|
261
260
|
|
262
|
-
|
261
|
+
def visit_ArelExtensions_Nodes_Cast o, collector
|
263
262
|
collector << "CAST("
|
264
263
|
collector = visit o.left, collector
|
265
264
|
collector << " AS "
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
265
|
+
case o.as_attr
|
266
|
+
when :string
|
267
|
+
as_attr = Arel::Nodes::SqlLiteral.new('char')
|
268
|
+
when :number
|
269
|
+
as_attr = Arel::Nodes::SqlLiteral.new('int')
|
270
|
+
when :decimal, :float
|
271
|
+
as_attr = Arel::Nodes::SqlLiteral.new('float')
|
272
|
+
when :datetime
|
273
|
+
as_attr = Arel::Nodes::SqlLiteral.new('datetime')
|
274
|
+
when :time
|
275
|
+
as_attr = Arel::Nodes::SqlLiteral.new('time')
|
276
|
+
when :binary
|
277
|
+
as_attr = Arel::Nodes::SqlLiteral.new('binary')
|
278
|
+
else
|
279
|
+
as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
|
280
|
+
end
|
282
281
|
collector = visit as_attr, collector
|
283
282
|
collector << ")"
|
284
283
|
collector
|
285
|
-
|
286
|
-
|
284
|
+
end
|
285
|
+
|
287
286
|
def visit_ArelExtensions_Nodes_Coalesce o, collector
|
288
287
|
collector << "COALESCE("
|
289
288
|
o.expressions.each_with_index { |arg, i|
|
@@ -294,19 +293,19 @@ module ArelExtensions
|
|
294
293
|
collector
|
295
294
|
end
|
296
295
|
|
297
|
-
|
296
|
+
def visit_ArelExtensions_Nodes_DateDiff o, collector
|
298
297
|
collector << if o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time
|
299
298
|
'TIMEDIFF('
|
300
299
|
else
|
301
300
|
'DATEDIFF('
|
302
301
|
end
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
302
|
+
collector = visit o.left, collector
|
303
|
+
collector << Arel::Visitors::ToSql::COMMA
|
304
|
+
collector = visit o.right, collector
|
305
|
+
collector << ")"
|
306
|
+
collector
|
307
|
+
end
|
308
|
+
|
310
309
|
def visit_ArelExtensions_Nodes_DateSub o, collector
|
311
310
|
collector << "DATE_SUB("
|
312
311
|
collector = visit o.left, collector
|
@@ -372,20 +371,20 @@ module ArelExtensions
|
|
372
371
|
collector << ")"
|
373
372
|
collector
|
374
373
|
end
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
374
|
+
|
375
|
+
def visit_ArelExtensions_Nodes_IsNotNull o, collector
|
376
|
+
collector << "NOT ISNULL("
|
377
|
+
collector = visit o.left, collector
|
378
|
+
collector << ")"
|
379
|
+
collector
|
380
|
+
end
|
382
381
|
|
383
382
|
def visit_ArelExtensions_Nodes_Then o, collector
|
384
383
|
collector << "CASE WHEN ("
|
385
384
|
collector = visit o.left, collector
|
386
385
|
collector << ") THEN "
|
387
386
|
collector = visit o.right, collector
|
388
|
-
if o.expressions[2]
|
387
|
+
if o.expressions[2]
|
389
388
|
collector << " ELSE "
|
390
389
|
collector = visit o.expressions[2], collector
|
391
390
|
end
|
@@ -403,140 +402,209 @@ module ArelExtensions
|
|
403
402
|
collector
|
404
403
|
end
|
405
404
|
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
405
|
+
if Arel::VERSION.to_i < 7
|
406
|
+
def visit_ArelExtensions_InsertManager_BulkValues o, collector
|
407
|
+
collector << 'VALUES '
|
408
|
+
row_nb = o.left.length
|
409
|
+
o.left.each_with_index do |row, idx|
|
410
|
+
collector << '('
|
411
|
+
v = Arel::Nodes::Values.new(row, o.cols)
|
412
|
+
len = v.expressions.length - 1
|
413
|
+
v.expressions.zip(v.columns).each_with_index { |(value, attr), i|
|
414
|
+
case value
|
415
|
+
when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
|
416
|
+
collector = visit value, collector
|
417
|
+
else
|
418
|
+
collector << quote(value, attr && column_for(attr)).to_s
|
419
|
+
end
|
420
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == len
|
421
|
+
}
|
422
|
+
collector << (idx == row_nb-1 ? ')' : '), ')
|
423
|
+
end
|
424
|
+
collector
|
425
|
+
end
|
426
|
+
else
|
427
|
+
def visit_ArelExtensions_InsertManager_BulkValues o, collector
|
428
|
+
collector << 'VALUES '
|
429
|
+
row_nb = o.left.length
|
430
|
+
o.left.each_with_index do |row, idx|
|
431
|
+
collector << '('
|
432
|
+
v = Arel::Nodes::Values.new(row, o.cols)
|
433
|
+
len = v.expressions.length - 1
|
434
|
+
v.expressions.zip(v.columns).each_with_index { |(value, attr), i|
|
435
|
+
case value
|
436
|
+
when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
|
437
|
+
collector = visit value, collector
|
438
|
+
else
|
439
|
+
collector << (attr && attr.able_to_type_cast? ? quote(attr.type_cast_for_database(value)) : quote(value).to_s)
|
440
|
+
end
|
441
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == len
|
442
|
+
}
|
443
|
+
collector << (idx == row_nb-1 ? ')' : '), ')
|
444
|
+
end
|
445
|
+
collector
|
424
446
|
end
|
447
|
+
end
|
448
|
+
|
449
|
+
def visit_ArelExtensions_Nodes_Union o, collector
|
450
|
+
collector = visit o.left, collector
|
451
|
+
collector << " UNION "
|
452
|
+
collector = visit o.right, collector
|
425
453
|
collector
|
426
454
|
end
|
427
|
-
|
428
|
-
def
|
429
|
-
collector
|
430
|
-
|
431
|
-
o.
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
455
|
+
|
456
|
+
def visit_ArelExtensions_Nodes_UnionAll o, collector
|
457
|
+
collector = visit o.left, collector
|
458
|
+
collector << " UNION ALL "
|
459
|
+
collector = visit o.right, collector
|
460
|
+
collector
|
461
|
+
end
|
462
|
+
|
463
|
+
def visit_ArelExtensions_Nodes_As o, collector
|
464
|
+
if o.left.is_a?(ArelExtensions::Nodes::Union) || o.left.is_a?(ArelExtensions::Nodes::UnionAll)
|
465
|
+
collector << "("
|
466
|
+
collector = visit o.left, collector
|
467
|
+
collector << ") "
|
468
|
+
visit o.right, collector
|
469
|
+
else
|
470
|
+
collector = visit o.left, collector
|
471
|
+
collector << " AS "
|
472
|
+
visit o.right, collector
|
473
|
+
end
|
474
|
+
end
|
475
|
+
|
476
|
+
def visit_ArelExtensions_Nodes_Case o, collector
|
477
|
+
collector << "CASE "
|
478
|
+
if o.case
|
479
|
+
visit o.case, collector
|
480
|
+
collector << " "
|
481
|
+
end
|
482
|
+
o.conditions.each do |condition|
|
483
|
+
visit condition, collector
|
484
|
+
collector << " "
|
485
|
+
end
|
486
|
+
if o.default
|
487
|
+
visit o.default, collector
|
488
|
+
collector << " "
|
489
|
+
end
|
490
|
+
collector << "END"
|
491
|
+
end
|
492
|
+
|
493
|
+
def visit_ArelExtensions_Nodes_Case_When o, collector
|
494
|
+
collector << "WHEN "
|
495
|
+
visit Arel::Nodes.build_quoted(o.left), collector
|
496
|
+
collector << " THEN "
|
497
|
+
visit Arel::Nodes.build_quoted(o.right), collector
|
498
|
+
end
|
499
|
+
|
500
|
+
def visit_ArelExtensions_Nodes_Case_Else o, collector
|
501
|
+
collector << "ELSE "
|
502
|
+
visit Arel::Nodes.build_quoted(o.expr), collector
|
503
|
+
end
|
504
|
+
|
505
|
+
def visit_ArelExtensions_Nodes_FormattedNumber o, collector
|
506
|
+
visit o.left, collector
|
507
|
+
end
|
508
|
+
|
509
|
+
remove_method(:visit_Arel_Nodes_LessThan) rescue nil
|
510
|
+
def visit_Arel_Nodes_LessThan o, collector
|
511
|
+
collector = visit o.left, collector
|
512
|
+
collector << " < "
|
513
|
+
visit o.right, collector
|
514
|
+
end
|
515
|
+
|
516
|
+
def visit_ArelExtensions_Nodes_Std o, collector
|
517
|
+
collector << "STD("
|
518
|
+
visit o.left, collector
|
519
|
+
collector << ")"
|
520
|
+
collector
|
521
|
+
end
|
522
|
+
|
523
|
+
def visit_ArelExtensions_Nodes_Variance o, collector
|
524
|
+
collector << "VARIANCE("
|
525
|
+
visit o.left, collector
|
526
|
+
collector << ")"
|
527
|
+
collector
|
528
|
+
end
|
529
|
+
|
530
|
+
def visit_ArelExtensions_Nodes_LevenshteinDistance o, collector
|
531
|
+
collector << "LEVENSHTEIN_DISTANCE("
|
532
|
+
collector = visit o.left, collector
|
533
|
+
collector << Arel::Visitors::ToSql::COMMA
|
534
|
+
collector = visit o.right, collector
|
535
|
+
collector << ')'
|
536
|
+
collector
|
537
|
+
end
|
538
|
+
|
539
|
+
alias_method :old_visit_Arel_Nodes_And, :visit_Arel_Nodes_And
|
540
|
+
def visit_Arel_Nodes_And o, collector
|
541
|
+
if o.children.length == 2
|
542
|
+
old_visit_Arel_Nodes_And o, collector
|
543
|
+
else
|
544
|
+
o.children.each_with_index { |arg, i|
|
545
|
+
if i == 0
|
546
|
+
collector << '('
|
547
|
+
else
|
548
|
+
collector << ') AND ('
|
549
|
+
end
|
550
|
+
collector = visit arg, collector
|
443
551
|
}
|
444
|
-
collector <<
|
552
|
+
collector << ')'
|
553
|
+
collector
|
554
|
+
end
|
555
|
+
end
|
556
|
+
|
557
|
+
def visit_ArelExtensions_Nodes_Or o, collector
|
558
|
+
collector << '('
|
559
|
+
o.children.each_with_index { |arg, i|
|
560
|
+
if i == 0
|
561
|
+
collector << '('
|
562
|
+
else
|
563
|
+
collector << ') OR ('
|
564
|
+
end
|
565
|
+
collector = visit arg, collector
|
566
|
+
}
|
567
|
+
collector << '))'
|
568
|
+
collector
|
569
|
+
end
|
570
|
+
|
571
|
+
def visit_ArelExtensions_Nodes_Json o,collector
|
572
|
+
case o.hash
|
573
|
+
when Array
|
574
|
+
res = Arel::Nodes.build_quoted('[')
|
575
|
+
o.hash.each.with_index do |v,i|
|
576
|
+
if i != 0
|
577
|
+
res += ', '
|
578
|
+
end
|
579
|
+
if (v.is_a?(Arel::Attributes::Attribute) && o.type_of_attribute(v) == :string) || (v.return_type == :string)
|
580
|
+
res = res + '"' + v + '"'
|
581
|
+
else
|
582
|
+
res += v
|
583
|
+
end
|
584
|
+
end
|
585
|
+
res += ']'
|
586
|
+
collector = visit res, collector
|
587
|
+
when Hash
|
588
|
+
res = Arel::Nodes.build_quoted('{')
|
589
|
+
o.hash.each.with_index do |(k,v),i|
|
590
|
+
if i != 0
|
591
|
+
res += ', '
|
592
|
+
end
|
593
|
+
res += Arel::Nodes.build_quoted('"')+k + '": '
|
594
|
+
if (v.is_a?(Arel::Attributes::Attribute) && o.type_of_attribute(v) == :string) || (v.try(:return_type) == :string) # TODO : remove the try
|
595
|
+
res = res + '"' + v + '"'
|
596
|
+
else
|
597
|
+
res += v
|
598
|
+
end
|
599
|
+
end
|
600
|
+
res += '}'
|
601
|
+
collector = visit res, collector
|
602
|
+
else
|
603
|
+
collector = visit o.hash, collector
|
445
604
|
end
|
446
605
|
collector
|
447
606
|
end
|
448
|
-
end
|
449
607
|
|
450
|
-
|
451
|
-
collector = visit o.left, collector
|
452
|
-
collector << " UNION "
|
453
|
-
collector = visit o.right, collector
|
454
|
-
collector
|
455
|
-
end
|
456
|
-
|
457
|
-
def visit_ArelExtensions_Nodes_UnionAll o, collector
|
458
|
-
collector = visit o.left, collector
|
459
|
-
collector << " UNION ALL "
|
460
|
-
collector = visit o.right, collector
|
461
|
-
collector
|
462
|
-
end
|
463
|
-
|
464
|
-
def visit_ArelExtensions_Nodes_As o, collector
|
465
|
-
if o.left.is_a?(ArelExtensions::Nodes::Union) || o.left.is_a?(ArelExtensions::Nodes::UnionAll)
|
466
|
-
collector << "("
|
467
|
-
collector = visit o.left, collector
|
468
|
-
collector << ") "
|
469
|
-
visit o.right, collector
|
470
|
-
else
|
471
|
-
collector = visit o.left, collector
|
472
|
-
collector << " AS "
|
473
|
-
visit o.right, collector
|
474
|
-
end
|
475
|
-
end
|
476
|
-
|
477
|
-
def visit_ArelExtensions_Nodes_Case o, collector
|
478
|
-
collector << "CASE "
|
479
|
-
if o.case
|
480
|
-
visit o.case, collector
|
481
|
-
collector << " "
|
482
|
-
end
|
483
|
-
o.conditions.each do |condition|
|
484
|
-
visit condition, collector
|
485
|
-
collector << " "
|
486
|
-
end
|
487
|
-
if o.default
|
488
|
-
visit o.default, collector
|
489
|
-
collector << " "
|
490
|
-
end
|
491
|
-
collector << "END"
|
492
|
-
end
|
493
|
-
|
494
|
-
def visit_ArelExtensions_Nodes_Case_When o, collector
|
495
|
-
collector << "WHEN "
|
496
|
-
visit Arel::Nodes.build_quoted(o.left), collector
|
497
|
-
collector << " THEN "
|
498
|
-
visit Arel::Nodes.build_quoted(o.right), collector
|
499
|
-
end
|
500
|
-
|
501
|
-
def visit_ArelExtensions_Nodes_Case_Else o, collector
|
502
|
-
collector << "ELSE "
|
503
|
-
visit Arel::Nodes.build_quoted(o.expr), collector
|
504
|
-
end
|
505
|
-
|
506
|
-
def visit_ArelExtensions_Nodes_FormattedNumber o, collector
|
507
|
-
visit o.left, collector
|
508
|
-
end
|
509
|
-
|
510
|
-
remove_method(:visit_Arel_Nodes_LessThan) rescue nil
|
511
|
-
def visit_Arel_Nodes_LessThan o, collector
|
512
|
-
collector = visit o.left, collector
|
513
|
-
collector << " < "
|
514
|
-
visit o.right, collector
|
515
|
-
end
|
516
|
-
|
517
|
-
def visit_ArelExtensions_Nodes_Std o, collector
|
518
|
-
collector << "STD("
|
519
|
-
visit o.left, collector
|
520
|
-
collector << ")"
|
521
|
-
collector
|
522
|
-
end
|
523
|
-
|
524
|
-
def visit_ArelExtensions_Nodes_Variance o, collector
|
525
|
-
collector << "VARIANCE("
|
526
|
-
visit o.left, collector
|
527
|
-
collector << ")"
|
528
|
-
collector
|
529
|
-
end
|
530
|
-
|
531
|
-
def visit_ArelExtensions_Nodes_LevenshteinDistance o, collector
|
532
|
-
collector << "LEVENSHTEIN_DISTANCE("
|
533
|
-
collector = visit o.left, collector
|
534
|
-
collector << Arel::Visitors::ToSql::COMMA
|
535
|
-
collector = visit o.right, collector
|
536
|
-
collector << ')'
|
537
|
-
collector
|
538
|
-
end
|
539
|
-
|
540
|
-
end
|
608
|
+
end
|
541
609
|
end
|
542
610
|
end
|
@@ -7,45 +7,75 @@ require 'arel_extensions/visitors/sqlite'
|
|
7
7
|
require 'arel_extensions/visitors/mssql'
|
8
8
|
|
9
9
|
Arel::Visitors::MSSQL.class_eval do
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
10
|
+
include ArelExtensions::Visitors::MSSQL
|
11
|
+
|
12
|
+
alias_method :old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As
|
13
|
+
def visit_Arel_Nodes_As o, collector
|
14
|
+
if o.left.is_a?(Arel::Nodes::Binary)
|
15
|
+
collector << '('
|
16
|
+
collector = visit o.left, collector
|
17
|
+
collector << ')'
|
18
|
+
else
|
19
|
+
collector = visit o.left, collector
|
20
|
+
end
|
21
|
+
collector << " AS ["
|
22
|
+
collector = visit o.right, collector
|
23
|
+
collector << "]"
|
24
|
+
collector
|
25
|
+
end
|
26
|
+
|
27
|
+
alias_method :old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement
|
28
|
+
def visit_Arel_Nodes_SelectStatement o, collector
|
29
|
+
if !collector.value.blank? && o.limit.blank? && o.offset.blank?
|
30
|
+
o = o.dup
|
31
|
+
o.orders = []
|
32
|
+
end
|
33
|
+
old_visit_Arel_Nodes_SelectStatement(o,collector)
|
34
|
+
end
|
20
35
|
end
|
21
36
|
|
22
|
-
begin
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
37
|
+
begin
|
38
|
+
require 'arel_sqlserver'
|
39
|
+
if Arel::VERSION.to_i == 6
|
40
|
+
if Arel::Visitors::VISITORS['sqlserver'] && Arel::Visitors::VISITORS['sqlserver'] != Arel::Visitors::MSSQL
|
41
|
+
Arel::Visitors::VISITORS['sqlserver'].class_eval do
|
27
42
|
include ArelExtensions::Visitors::MSSQL
|
28
43
|
|
29
44
|
alias_method :old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
45
|
+
def visit_Arel_Nodes_SelectStatement o, collector
|
46
|
+
if !collector.value.blank? && o.limit.blank? && o.offset.blank?
|
47
|
+
o = o.dup
|
48
|
+
o.orders = []
|
49
|
+
end
|
50
|
+
old_visit_Arel_Nodes_SelectStatement(o,collector)
|
51
|
+
end
|
52
|
+
|
53
|
+
alias_method :old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As
|
54
|
+
def visit_Arel_Nodes_As o, collector
|
55
|
+
if o.left.is_a?(Arel::Nodes::Binary)
|
56
|
+
collector << '('
|
57
|
+
collector = visit o.left, collector
|
58
|
+
collector << ')'
|
59
|
+
else
|
60
|
+
collector = visit o.left, collector
|
61
|
+
end
|
62
|
+
collector << " AS ["
|
63
|
+
collector = visit o.right, collector
|
64
|
+
collector << "]"
|
65
|
+
collector
|
66
|
+
end
|
37
67
|
|
38
68
|
alias_method :old_primary_Key_From_Table, :primary_Key_From_Table
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
rescue LoadError
|
69
|
+
def primary_Key_From_Table t
|
70
|
+
return unless t
|
71
|
+
column_name = @connection.schema_cache.primary_keys(t.name) ||
|
72
|
+
@connection.schema_cache.columns_hash(t.name).first.try(:second).try(:name)
|
73
|
+
column_name ? t[column_name] : nil
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
rescue LoadError
|
49
79
|
rescue => e
|
50
|
-
|
80
|
+
e
|
51
81
|
end
|
data/lib/arel_extensions.rb
CHANGED