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,6 +1,6 @@
1
1
  module ArelExtensions
2
2
  module Visitors
3
- Arel::Visitors::ToSql.class_eval do
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
- o.expressions.each_with_index { |arg, i|
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
- #visit o.left.coalesce('').trim.length.eq(0), collector
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
- #visit o.left.coalesce('').trim.length.gt(0), collector
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
- #comparators
259
+ #comparators
261
260
 
262
- def visit_ArelExtensions_Nodes_Cast o, collector
261
+ def visit_ArelExtensions_Nodes_Cast o, collector
263
262
  collector << "CAST("
264
263
  collector = visit o.left, collector
265
264
  collector << " AS "
266
- case o.as_attr
267
- when :string
268
- as_attr = Arel::Nodes::SqlLiteral.new('char')
269
- when :number
270
- as_attr = Arel::Nodes::SqlLiteral.new('int')
271
- when :decimal, :float
272
- as_attr = Arel::Nodes::SqlLiteral.new('float')
273
- when :datetime
274
- as_attr = Arel::Nodes::SqlLiteral.new('datetime')
275
- when :time
276
- as_attr = Arel::Nodes::SqlLiteral.new('time')
277
- when :binary
278
- as_attr = Arel::Nodes::SqlLiteral.new('binary')
279
- else
280
- as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
281
- end
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
- end
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
- def visit_ArelExtensions_Nodes_DateDiff o, collector
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
- collector = visit o.left, collector
304
- collector << Arel::Visitors::ToSql::COMMA
305
- collector = visit o.right, collector
306
- collector << ")"
307
- collector
308
- end
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
- def visit_ArelExtensions_Nodes_IsNotNull o, collector
377
- collector << "NOT ISNULL("
378
- collector = visit o.left, collector
379
- collector << ")"
380
- collector
381
- end
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
- if Arel::VERSION.to_i < 7
407
- def visit_ArelExtensions_InsertManager_BulkValues o, collector
408
- collector << 'VALUES '
409
- row_nb = o.left.length
410
- o.left.each_with_index do |row, idx|
411
- collector << '('
412
- v = Arel::Nodes::Values.new(row, o.cols)
413
- len = v.expressions.length - 1
414
- v.expressions.zip(v.columns).each_with_index { |(value, attr), i|
415
- case value
416
- when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
417
- collector = visit value, collector
418
- else
419
- collector << quote(value, attr && column_for(attr)).to_s
420
- end
421
- collector << Arel::Visitors::ToSql::COMMA unless i == len
422
- }
423
- collector << (idx == row_nb-1 ? ')' : '), ')
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
- else
428
- def visit_ArelExtensions_InsertManager_BulkValues o, collector
429
- collector << 'VALUES '
430
- row_nb = o.left.length
431
- o.left.each_with_index do |row, idx|
432
- collector << '('
433
- v = Arel::Nodes::Values.new(row, o.cols)
434
- len = v.expressions.length - 1
435
- v.expressions.zip(v.columns).each_with_index { |(value, attr), i|
436
- case value
437
- when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
438
- collector = visit value, collector
439
- else
440
- collector << (attr && attr.able_to_type_cast? ? quote(attr.type_cast_for_database(value)) : quote(value).to_s)
441
- end
442
- collector << Arel::Visitors::ToSql::COMMA unless i == len
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 << (idx == row_nb-1 ? ')' : '), ')
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
- def visit_ArelExtensions_Nodes_Union o, collector
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
- include ArelExtensions::Visitors::MSSQL
11
-
12
- alias_method :old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement
13
- def visit_Arel_Nodes_SelectStatement o, collector
14
- if !collector.value.blank? && o.limit.blank? && o.offset.blank?
15
- o = o.dup
16
- o.orders = []
17
- end
18
- old_visit_Arel_Nodes_SelectStatement(o,collector)
19
- end
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
- require 'arel_sqlserver'
24
- if Arel::VERSION.to_i == 6
25
- if Arel::Visitors::VISITORS['sqlserver'] && Arel::Visitors::VISITORS['sqlserver'] != Arel::Visitors::MSSQL
26
- Arel::Visitors::VISITORS['sqlserver'].class_eval do
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
- def visit_Arel_Nodes_SelectStatement o, collector
31
- if !collector.value.blank? && o.limit.blank? && o.offset.blank?
32
- o = o.dup
33
- o.orders = []
34
- end
35
- old_visit_Arel_Nodes_SelectStatement(o,collector)
36
- end
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
- def primary_Key_From_Table t
40
- return unless t
41
- column_name = @connection.schema_cache.primary_keys(t.name) ||
42
- @connection.schema_cache.columns_hash(t.name).first.try(:second).try(:name)
43
- column_name ? t[column_name] : nil
44
- end
45
- end
46
- end
47
- end
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
- e
80
+ e
51
81
  end
@@ -65,6 +65,7 @@ require 'arel_extensions/nodes/as'
65
65
  require 'arel_extensions/nodes/case'
66
66
  require 'arel_extensions/nodes/soundex'
67
67
  require 'arel_extensions/nodes/cast'
68
+ require 'arel_extensions/nodes/json'
68
69
 
69
70
 
70
71
 
@@ -106,4 +106,4 @@ module ArelExtensions
106
106
 
107
107
  end
108
108
  end
109
- end
109
+ end