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