arel_extensions 1.2.8 → 1.2.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +54 -86
  3. data/README.md +1 -1
  4. data/Rakefile +13 -2
  5. data/gemfiles/rails4.gemfile +1 -1
  6. data/gemfiles/rails6.gemfile +1 -1
  7. data/generate_gems.sh +4 -3
  8. data/lib/arel_extensions.rb +45 -20
  9. data/lib/arel_extensions/attributes.rb +0 -1
  10. data/lib/arel_extensions/boolean_functions.rb +39 -12
  11. data/lib/arel_extensions/insert_manager.rb +7 -5
  12. data/lib/arel_extensions/nodes/abs.rb +0 -0
  13. data/lib/arel_extensions/nodes/case.rb +8 -2
  14. data/lib/arel_extensions/nodes/ceil.rb +0 -0
  15. data/lib/arel_extensions/nodes/coalesce.rb +0 -0
  16. data/lib/arel_extensions/nodes/concat.rb +0 -0
  17. data/lib/arel_extensions/nodes/duration.rb +0 -0
  18. data/lib/arel_extensions/nodes/find_in_set.rb +0 -0
  19. data/lib/arel_extensions/nodes/floor.rb +0 -0
  20. data/lib/arel_extensions/nodes/function.rb +0 -0
  21. data/lib/arel_extensions/nodes/is_null.rb +0 -0
  22. data/lib/arel_extensions/nodes/json.rb +40 -25
  23. data/lib/arel_extensions/nodes/length.rb +0 -0
  24. data/lib/arel_extensions/nodes/locate.rb +0 -0
  25. data/lib/arel_extensions/nodes/rand.rb +0 -0
  26. data/lib/arel_extensions/nodes/replace.rb +0 -0
  27. data/lib/arel_extensions/nodes/round.rb +0 -0
  28. data/lib/arel_extensions/nodes/soundex.rb +0 -0
  29. data/lib/arel_extensions/nodes/substring.rb +0 -0
  30. data/lib/arel_extensions/nodes/trim.rb +0 -0
  31. data/lib/arel_extensions/nodes/union.rb +0 -0
  32. data/lib/arel_extensions/nodes/wday.rb +0 -0
  33. data/lib/arel_extensions/predications.rb +22 -19
  34. data/lib/arel_extensions/set_functions.rb +2 -2
  35. data/lib/arel_extensions/string_functions.rb +13 -0
  36. data/lib/arel_extensions/version.rb +1 -1
  37. data/lib/arel_extensions/visitors.rb +1 -1
  38. data/lib/arel_extensions/visitors/ibm_db.rb +1 -1
  39. data/lib/arel_extensions/visitors/mysql.rb +24 -9
  40. data/lib/arel_extensions/visitors/oracle.rb +7 -8
  41. data/lib/arel_extensions/visitors/postgresql.rb +1 -1
  42. data/lib/arel_extensions/visitors/sqlite.rb +11 -17
  43. data/lib/arel_extensions/visitors/to_sql.rb +56 -55
  44. data/test/arelx_test_helper.rb +28 -0
  45. data/test/support/fake_record.rb +4 -0
  46. data/test/test_comparators.rb +8 -7
  47. data/test/visitors/test_bulk_insert_oracle.rb +4 -3
  48. data/test/visitors/test_bulk_insert_sqlite.rb +4 -3
  49. data/test/visitors/test_bulk_insert_to_sql.rb +3 -3
  50. data/test/visitors/test_oracle.rb +41 -41
  51. data/test/visitors/test_to_sql.rb +366 -206
  52. data/test/with_ar/all_agnostic_test.rb +19 -8
  53. data/test/with_ar/insert_agnostic_test.rb +1 -1
  54. data/test/with_ar/test_bulk_sqlite.rb +4 -3
  55. data/test/with_ar/test_math_sqlite.rb +1 -1
  56. data/test/with_ar/test_string_mysql.rb +1 -1
  57. data/test/with_ar/test_string_sqlite.rb +1 -1
  58. data/version_v1.rb +1 -1
  59. data/version_v2.rb +1 -1
  60. metadata +3 -3
  61. data/test/helper.rb +0 -18
@@ -1,7 +1,7 @@
1
1
  #require 'oracle_visitor'
2
2
  module ArelExtensions
3
3
  module Visitors
4
- Arel::Visitors::Oracle.class_eval do
4
+ class Arel::Visitors::Oracle
5
5
 
6
6
  SPECIAL_CHARS = {"\t" => 'CHR(9)', "\n" => 'CHR(10)', "\r" => 'CHR(13)'}
7
7
  Arel::Visitors::Oracle::DATE_MAPPING = {'d' => 'DAY', 'm' => 'MONTH', 'w' => 'IW', 'y' => 'YEAR', 'wd' => 'D', 'h' => 'HOUR', 'mn' => 'MINUTE', 's' => 'SECOND'}
@@ -467,14 +467,12 @@ module ArelExtensions
467
467
  o.left.each_with_index do |row, idx| # values
468
468
  collector << " UNION ALL " if idx != 0
469
469
  collector << "(SELECT "
470
- v = Arel::Nodes::Values.new(row, o.cols)
471
- len = v.expressions.length - 1
472
- v.expressions.each_with_index { |value, i|
470
+ len = row.length - 1
471
+ row.zip(o.cols).each_with_index { |(value, attr), i|
473
472
  case value
474
473
  when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
475
474
  collector = visit value, collector
476
475
  else
477
- attr = v.columns[i]
478
476
  collector << quote(value, attr && column_for(attr)).to_s
479
477
  end
480
478
  collector << Arel::Visitors::Oracle::COMMA unless i == len
@@ -490,12 +488,13 @@ module ArelExtensions
490
488
  o.left.each_with_index do |row, idx|
491
489
  collector << " UNION ALL " if idx != 0
492
490
  collector << "(SELECT "
493
- v = Arel::Nodes::Values.new(row, o.cols)
494
- len = v.expressions.length - 1
495
- v.expressions.zip(v.columns).each_with_index { |(value, attr), i|
491
+ len = row.length - 1
492
+ row.zip(o.cols).each_with_index { |(value, attr), i|
496
493
  case value
497
494
  when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
498
495
  collector = visit value, collector
496
+ when Integer
497
+ collector << value.to_s
499
498
  else
500
499
  collector << (attr && attr.able_to_type_cast? ? quote(attr.type_cast_for_database(value)) : quote(value).to_s)
501
500
  end
@@ -1,6 +1,6 @@
1
1
  module ArelExtensions
2
2
  module Visitors
3
- Arel::Visitors::PostgreSQL.class_eval do
3
+ class Arel::Visitors::PostgreSQL
4
4
  Arel::Visitors::PostgreSQL::DATE_MAPPING = {'d' => 'DAY', 'm' => 'MONTH', 'w' => 'WEEK', 'y' => 'YEAR', 'wd' => 'DOW', 'h' => 'HOUR', 'mn' => 'MINUTE', 's' => 'SECOND'}
5
5
  Arel::Visitors::PostgreSQL::DATE_FORMAT_DIRECTIVES = {
6
6
  '%Y' => 'IYYY', '%C' => 'CC', '%y' => 'YY', '%m' => 'MM', '%B' => 'Month', '%^B' => 'MONTH', '%b' => 'Mon', '%^b' => 'MON',
@@ -1,6 +1,6 @@
1
1
  module ArelExtensions
2
2
  module Visitors
3
- Arel::Visitors::SQLite.class_eval do
3
+ class Arel::Visitors::SQLite
4
4
  Arel::Visitors::SQLite::DATE_MAPPING = {'d' => '%d', 'm' => '%m', 'w' => '%W', 'y' => '%Y', 'wd' => '%w', 'M' => '%M', 'h' => '%H', 'mn' => '%M', 's' => '%S'}
5
5
  Arel::Visitors::SQLite::DATE_FORMAT_DIRECTIVES = { # ISO C / POSIX
6
6
  '%Y' => '%Y', '%C' => '', '%y' => '%y', '%m' => '%m', '%B' => '%M', '%b' => '%b', '%^b' => '%b', # year, month
@@ -235,9 +235,8 @@ module ArelExtensions
235
235
  def visit_ArelExtensions_InsertManager_BulkValues o, collector
236
236
  o.left.each_with_index do |row, idx|
237
237
  collector << 'SELECT '
238
- v = Arel::Nodes::Values.new(row, o.cols)
239
- len = v.expressions.length - 1
240
- v.expressions.zip(v.columns).each_with_index { |(value, attr), i|
238
+ len = row.length - 1
239
+ row.zip(o.cols).each_with_index { |(value, attr), i|
241
240
  case value
242
241
  when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
243
242
  collector = visit value.as(attr.name), collector
@@ -258,12 +257,17 @@ module ArelExtensions
258
257
  def visit_ArelExtensions_InsertManager_BulkValues o, collector
259
258
  o.left.each_with_index do |row, idx|
260
259
  collector << 'SELECT '
261
- v = Arel::Nodes::Values.new(row, o.cols)
262
- len = v.expressions.length - 1
263
- v.expressions.zip(v.columns).each_with_index { |(value, attr), i|
260
+ len = row.length - 1
261
+ row.zip(o.cols).each_with_index { |(value, attr), i|
264
262
  case value
265
263
  when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
266
264
  collector = visit value.as(attr.name), collector
265
+ when Integer
266
+ collector << value.to_s
267
+ if idx == 0
268
+ collector << " AS "
269
+ collector << quote(attr.name)
270
+ end
267
271
  else
268
272
  collector << (attr && attr.able_to_type_cast? ? quote(attr.type_cast_for_database(value)) : quote(value).to_s)
269
273
  if idx == 0
@@ -360,16 +364,6 @@ module ArelExtensions
360
364
  collector
361
365
  end
362
366
 
363
-
364
- alias_method :old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement
365
- def visit_Arel_Nodes_SelectStatement o, collector
366
- if !collector.value.blank? && o.limit.blank?
367
- o = o.dup
368
- o.orders = []
369
- end
370
- old_visit_Arel_Nodes_SelectStatement(o,collector)
371
- end
372
-
373
367
  alias_method :old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As
374
368
  def visit_Arel_Nodes_As o, collector
375
369
  if o.left.is_a?(Arel::Nodes::Binary)
@@ -1,6 +1,6 @@
1
1
  module ArelExtensions
2
2
  module Visitors
3
- Arel::Visitors::ToSql.class_eval do
3
+ class Arel::Visitors::ToSql
4
4
  Arel::Visitors::ToSql::COMMA = ', ' unless defined?(Arel::Visitors::ToSql::COMMA)
5
5
 
6
6
  # Math Functions
@@ -428,16 +428,15 @@ module ArelExtensions
428
428
  row_nb = o.left.length
429
429
  o.left.each_with_index do |row, idx|
430
430
  collector << '('
431
- v = Arel::Nodes::Values.new(row, o.cols)
432
- len = v.expressions.length - 1
433
- v.expressions.zip(v.columns).each_with_index { |(value, attr), i|
434
- case value
435
- when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
436
- collector = visit value, collector
437
- else
438
- collector << quote(value, attr && column_for(attr)).to_s
439
- end
440
- collector << Arel::Visitors::ToSql::COMMA unless i == len
431
+ len = row.length - 1
432
+ row.zip(o.cols).each_with_index { |(value, attr), i|
433
+ case value
434
+ when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
435
+ collector = visit value, collector
436
+ else
437
+ collector << quote(value, attr && column_for(attr)).to_s
438
+ end
439
+ collector << Arel::Visitors::ToSql::COMMA unless i == len
441
440
  }
442
441
  collector << (idx == row_nb-1 ? ')' : '), ')
443
442
  end
@@ -449,16 +448,17 @@ module ArelExtensions
449
448
  row_nb = o.left.length
450
449
  o.left.each_with_index do |row, idx|
451
450
  collector << '('
452
- v = Arel::Nodes::Values.new(row, o.cols)
453
- len = v.expressions.length - 1
454
- v.expressions.zip(v.columns).each_with_index { |(value, attr), i|
455
- case value
456
- when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
457
- collector = visit value, collector
458
- else
459
- collector << (attr && attr.able_to_type_cast? ? quote(attr.type_cast_for_database(value)) : quote(value).to_s)
460
- end
461
- collector << Arel::Visitors::ToSql::COMMA unless i == len
451
+ len = row.length - 1
452
+ row.zip(o.cols).each_with_index { |(value, attr), i|
453
+ case value
454
+ when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
455
+ collector = visit value, collector
456
+ when Integer
457
+ collector << value.to_s
458
+ else
459
+ collector << (attr && attr.able_to_type_cast? ? quote(attr.type_cast_for_database(value)) : quote(value).to_s)
460
+ end
461
+ collector << Arel::Visitors::ToSql::COMMA unless i == len
462
462
  }
463
463
  collector << (idx == row_nb-1 ? ')' : '), ')
464
464
  end
@@ -543,53 +543,66 @@ module ArelExtensions
543
543
  collector
544
544
  end
545
545
 
546
+ # Boolean logic.
547
+
546
548
  alias_method :old_visit_Arel_Nodes_And, :visit_Arel_Nodes_And
547
549
  def visit_Arel_Nodes_And o, collector
548
- collector << '('
549
550
  case o.children.length
550
551
  when 0
551
- collector << '1=1' # but this should not happen
552
+ collector << '1 = 1' # but this should not happen
552
553
  when 1
553
554
  collector = visit o.children[0], collector
554
555
  else
556
+ collector << '('
555
557
  o.children.each_with_index { |arg, i|
556
558
  if i != 0
557
559
  collector << ') AND ('
558
560
  end
559
561
  collector = visit arg, collector
560
562
  }
563
+ collector << ')'
561
564
  end
562
- collector << ')'
563
565
  collector
564
566
  end
565
567
 
566
- def visit_ArelExtensions_Nodes_Or o, collector
567
- collector << '('
568
+ alias_method :old_visit_Arel_Nodes_Or, :visit_Arel_Nodes_Or
569
+ def visit_Arel_Nodes_Or o, collector
568
570
  case o.children.length
569
571
  when 0
570
- collector << '0=1' # but this should not happen
572
+ collector << '1 = 0' # but this should not happen
571
573
  when 1
572
574
  collector = visit o.children[0], collector
573
575
  else
576
+ collector << '('
574
577
  o.children.each_with_index { |arg, i|
575
578
  if i != 0
576
579
  collector << ') OR ('
577
580
  end
578
581
  collector = visit arg, collector
579
582
  }
583
+ collector << ')'
580
584
  end
581
- collector << ')'
582
585
  collector
583
586
  end
584
587
 
585
- alias_method :old_visit_Arel_Nodes_Or, :visit_Arel_Nodes_Or
586
- def visit_Arel_Nodes_Or o, collector
587
- collector << '('
588
- collector = visit o.left, collector
589
- collector << ') OR ('
590
- collector = visit o.right, collector
591
- collector << ')'
592
- collector
588
+ def json_value(o,v)
589
+ case o.type_of_node(v)
590
+ when :string
591
+ Arel.when(v.is_null).then(Arel::Nodes.build_quoted("null")).else(Arel::Nodes.build_quoted('"') + v.replace('\\','\\\\').replace('"','\"') + '"')
592
+ when :date
593
+ s = v.format('%Y-%m-%d')
594
+ Arel.when(s.is_null).then(Arel::Nodes.build_quoted("null")).else(Arel::Nodes.build_quoted('"') + s + '"')
595
+ when :datetime
596
+ s = v.format('%Y-%m-%dT%H:%M:%S')
597
+ Arel.when(s.is_null).then(Arel::Nodes.build_quoted("null")).else(Arel::Nodes.build_quoted('"') + s + '"')
598
+ when :time
599
+ s = v.format('%H:%M:%S')
600
+ Arel.when(s.is_null).then(Arel::Nodes.build_quoted("null")).else(Arel::Nodes.build_quoted('"') + s + '"')
601
+ when :nil
602
+ Arel::Nodes.build_quoted("null")
603
+ else
604
+ ArelExtensions::Nodes::Cast.new([v, :string]).coalesce("null")
605
+ end
593
606
  end
594
607
 
595
608
  def visit_ArelExtensions_Nodes_Json o,collector
@@ -600,11 +613,7 @@ module ArelExtensions
600
613
  if i != 0
601
614
  res += ', '
602
615
  end
603
- if (v.is_a?(Arel::Attributes::Attribute) && o.type_of_attribute(v) == :string) || (v.return_type == :string)
604
- res = res + '"' + v + '"'
605
- else
606
- res += v
607
- end
616
+ res += json_value(o,v)
608
617
  end
609
618
  res += ']'
610
619
  collector = visit res, collector
@@ -614,12 +623,8 @@ module ArelExtensions
614
623
  if i != 0
615
624
  res += ', '
616
625
  end
617
- res += Arel::Nodes.build_quoted('"')+k + '": '
618
- if (v.is_a?(Arel::Attributes::Attribute) && o.type_of_attribute(v) == :string) || (v.respond_to?(:return_type) && v.return_type == :string)
619
- res = res + '"' + v + '"'
620
- else
621
- res += v
622
- end
626
+ res += Arel::Nodes.build_quoted('"') + ArelExtensions::Nodes::Cast.new([k, :string]).coalesce("").replace('\\','\\\\').replace('"','\"') + '": '
627
+ res += json_value(o,v)
623
628
  end
624
629
  res += '}'
625
630
  collector = visit res, collector
@@ -631,7 +636,7 @@ module ArelExtensions
631
636
 
632
637
  def visit_ArelExtensions_Nodes_JsonGroup o, collector
633
638
  if o.as_array
634
- res = Arel::Nodes.build_quoted('[') + (o.orders ? o.dict.group_concat(', ',o.orders) : o.dict.group_concat(', ')) + ']'
639
+ res = Arel::Nodes.build_quoted('[') + (o.orders ? o.dict.group_concat(', ', order: Array(o.orders)) : o.dict.group_concat(', ')).coalesce('') + ']'
635
640
  collector = visit res, collector
636
641
  else
637
642
  res = Arel::Nodes.build_quoted('{')
@@ -640,13 +645,9 @@ module ArelExtensions
640
645
  if i != 0
641
646
  res = res + ', '
642
647
  end
643
- kv = Arel::Nodes.build_quoted('"')+k + '": '
644
- if (v.is_a?(Arel::Attributes::Attribute) && o.type_of_attribute(v) == :string) || (v.respond_to?(:return_type) && v.return_type == :string)
645
- kv = kv + '"' + v + '"'
646
- else
647
- kv += v
648
- end
649
- res = res + kv.group_concat(', ',orders)
648
+ kv = Arel::Nodes.build_quoted('"') + ArelExtensions::Nodes::Cast.new([k, :string]).coalesce("").replace('\\','\\\\').replace('"','\"') + '": '
649
+ kv += json_value(o,v)
650
+ res = res + kv.group_concat(', ', order: Array(orders)).coalesce('')
650
651
  end
651
652
  res = res + '}'
652
653
  collector = visit res, collector
@@ -0,0 +1,28 @@
1
+ require 'rubygems'
2
+ require 'minitest/autorun'
3
+ require 'fileutils'
4
+ require 'arel'
5
+ require 'active_record'
6
+
7
+ require 'support/fake_record'
8
+
9
+ require 'arel_extensions'
10
+ Arel::Table.engine = FakeRecord::Base.new
11
+
12
+ $arel_silence_type_casting_deprecation = true
13
+
14
+ module Minitest::Assertions
15
+ #
16
+ # Fails unless +expected and +actual are the same string, modulo extraneous spaces.
17
+ #
18
+ def assert_like(expected, actual, msg = nil)
19
+ msg ||= "Expected #{expected.inspect} and #{actual.inspect} to be alike"
20
+ assert_equal expected.gsub(/\s+/, ' ').strip, actual.gsub(/\s+/, ' ').strip
21
+ end
22
+ end
23
+
24
+ module Minitest::Expectations
25
+
26
+ infect_an_assertion :assert_like, :must_be_like
27
+
28
+ end
@@ -65,6 +65,10 @@ module FakeRecord
65
65
  self
66
66
  end
67
67
 
68
+ def in_clause_length
69
+ 10000
70
+ end
71
+
68
72
  def quote thing, column = nil
69
73
  if column && !thing.nil?
70
74
  case column.type
@@ -1,4 +1,4 @@
1
- require 'helper'
1
+ require 'arelx_test_helper'
2
2
 
3
3
  module ArelExtensions
4
4
  module Nodes
@@ -20,26 +20,27 @@ module ArelExtensions
20
20
  end
21
21
 
22
22
  it "< is equal lt" do
23
- compile(@table[:id] < 10).must_be_like('"users"."id" < 10')
23
+ _(compile(@table[:id] < 10)).must_be_like('"users"."id" < 10')
24
24
  end
25
25
 
26
26
  it "<= is equal lteq" do
27
- compile(@table[:id] <= 10).must_be_like('"users"."id" <= 10')
27
+ _(compile(@table[:id] <= 10)).must_be_like('"users"."id" <= 10')
28
28
  end
29
29
 
30
30
  it "> is equal gt" do
31
- compile(@table[:id] > 10).must_be_like('"users"."id" > 10')
31
+ _(compile(@table[:id] > 10)).must_be_like('"users"."id" > 10')
32
32
  end
33
33
 
34
34
  it "< is equal gteq" do
35
- compile(@table[:id] >= 10).must_be_like('"users"."id" >= 10')
35
+ _(compile(@table[:id] >= 10)).must_be_like('"users"."id" >= 10')
36
36
  end
37
37
 
38
38
  it "should compare with dates" do
39
- compile(@table[:created_at] >= Date.new(2016, 3, 31)).must_be_like %{"users"."created_at" >= '2016-03-31'}
39
+ _(compile(@table[:created_at] >= Date.new(2016, 3, 31)))
40
+ .must_be_like %{"users"."created_at" >= '2016-03-31'}
40
41
  end
41
42
 
42
43
  end
43
44
 
44
45
  end
45
- end
46
+ end
@@ -1,4 +1,4 @@
1
- require 'helper'
1
+ require 'arelx_test_helper'
2
2
 
3
3
  module ArelExtensions
4
4
  module BulkInsertOracle
@@ -25,8 +25,9 @@ module ArelExtensions
25
25
  it "should import large set of data in Oracle" do
26
26
  insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new().into(@table) : Arel::InsertManager.new(@conn).into(@table)
27
27
  insert_manager.bulk_insert(@cols, @data)
28
- sql = compile(insert_manager.ast)
29
- sql.must_be_like %Q[INSERT INTO "users" ("name", "comments", "created_at") ((SELECT 'nom1', 'sdfdsfdsfsdf', '2016-01-01' FROM DUAL) UNION ALL (SELECT 'nom2', 'sdfdsfdsfsdf', '2016-01-01' FROM DUAL))]
28
+ _(compile(insert_manager.ast))
29
+ .must_be_like %Q[INSERT INTO "users" ("name", "comments", "created_at")
30
+ ((SELECT 'nom1', 'sdfdsfdsfsdf', '2016-01-01' FROM DUAL) UNION ALL (SELECT 'nom2', 'sdfdsfdsfsdf', '2016-01-01' FROM DUAL))]
30
31
  end
31
32
 
32
33
  end
@@ -1,4 +1,4 @@
1
- require 'helper'
1
+ require 'arelx_test_helper'
2
2
 
3
3
  module ArelExtensions
4
4
  module BulkInsertSQLlite
@@ -27,8 +27,9 @@ module ArelExtensions
27
27
  it "should import large set of data" do
28
28
  insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new().into(@table) : Arel::InsertManager.new(@conn).into(@table)
29
29
  insert_manager.bulk_insert(@cols, @data)
30
- sql = compile(insert_manager.ast)
31
- sql.must_be_like %Q[INSERT INTO "users" ("id", "name", "comments", "created_at") SELECT 23 AS 'id', 'nom1' AS 'name', 'sdfdsfdsfsdf' AS 'comments', '2016-01-01' AS 'created_at' UNION ALL SELECT 25, 'nom2', 'sdfdsfdsfsdf', '2016-01-01']
30
+ _(compile(insert_manager.ast))
31
+ .must_be_like %Q[INSERT INTO "users" ("id", "name", "comments", "created_at")
32
+ SELECT 23 AS 'id', 'nom1' AS 'name', 'sdfdsfdsfsdf' AS 'comments', '2016-01-01' AS 'created_at' UNION ALL SELECT 25, 'nom2', 'sdfdsfdsfsdf', '2016-01-01']
32
33
  end
33
34
 
34
35
  end
@@ -1,4 +1,4 @@
1
- require 'helper'
1
+ require 'arelx_test_helper'
2
2
 
3
3
  module ArelExtensions
4
4
  module BulkInsertToSql
@@ -27,8 +27,8 @@ module ArelExtensions
27
27
  it "should import large set of data using ToSql" do
28
28
  insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new().into(@table) : Arel::InsertManager.new(@conn).into(@table)
29
29
  insert_manager.bulk_insert(@cols, @data)
30
- sql = compile(insert_manager.ast)
31
- sql.must_be_like %Q[INSERT INTO "users" ("id", "name", "comments", "created_at") VALUES (23, 'nom1', 'sdfdsfdsfsdf', '2016-01-01'), (25, 'nom2', 'sdfdsfdsfsdf', '2016-01-01')]
30
+ _(compile(insert_manager.ast))
31
+ .must_be_like %Q[INSERT INTO "users" ("id", "name", "comments", "created_at") VALUES (23, 'nom1', 'sdfdsfdsfsdf', '2016-01-01'), (25, 'nom2', 'sdfdsfdsfsdf', '2016-01-01')]
32
32
  end
33
33
  end
34
34
  end
@@ -1,4 +1,4 @@
1
- require 'helper'
1
+ require 'arelx_test_helper'
2
2
 
3
3
  module ArelExtensions
4
4
  module VisitorOracle
@@ -23,86 +23,86 @@ module ArelExtensions
23
23
  # Comparators
24
24
 
25
25
  it "should accept comparators on integers" do
26
- compile(@table[:id] == 42).must_match %{"users"."id" = 42}
27
- compile(@table[:id] == @table[:id]).must_be_like %{"users"."id" = "users"."id"}
28
- compile(@table[:id] != 42).must_match %{"users"."id" != 42}
29
- compile(@table[:id] > 42).must_match %{"users"."id" > 42}
30
- compile(@table[:id] >= 42).must_match %{"users"."id" >= 42}
31
- compile(@table[:id] >= @table[:id]).must_be_like %{"users"."id" >= "users"."id"}
32
- compile(@table[:id] < 42).must_match %{"users"."id" < 42}
33
- compile(@table[:id] <= 42).must_match %{"users"."id" <= 42}
34
- compile((@table[:id] <= 42).as('new_name')).must_match %{("users"."id" <= 42) AS new_name}
26
+ _(compile(@table[:id] == 42)).must_match %{"users"."id" = 42}
27
+ _(compile(@table[:id] == @table[:id])).must_be_like %{"users"."id" = "users"."id"}
28
+ _(compile(@table[:id] != 42)).must_match %{"users"."id" != 42}
29
+ _(compile(@table[:id] > 42)).must_match %{"users"."id" > 42}
30
+ _(compile(@table[:id] >= 42)).must_match %{"users"."id" >= 42}
31
+ _(compile(@table[:id] >= @table[:id])).must_be_like %{"users"."id" >= "users"."id"}
32
+ _(compile(@table[:id] < 42)).must_match %{"users"."id" < 42}
33
+ _(compile(@table[:id] <= 42)).must_match %{"users"."id" <= 42}
34
+ _(compile((@table[:id] <= 42).as('new_name'))).must_match %{("users"."id" <= 42) AS new_name}
35
35
  end
36
36
 
37
37
  it "should accept comparators on dates" do
38
38
  c = @table[:created_at]
39
39
  u = @table[:updated_at]
40
- compile(c > @date).must_be_like %{"users"."created_at" > '2016-03-31'}
41
- compile(u >= @date).must_be_like %{"users"."updated_at" >= '2016-03-31'}
42
- compile(c < u).must_be_like %{"users"."created_at" < "users"."updated_at"}
40
+ _(compile(c > @date)).must_be_like %{"users"."created_at" > '2016-03-31'}
41
+ _(compile(u >= @date)).must_be_like %{"users"."updated_at" >= '2016-03-31'}
42
+ _(compile(c < u)).must_be_like %{"users"."created_at" < "users"."updated_at"}
43
43
  end
44
44
 
45
45
  it "should accept comparators on strings" do
46
46
  c = @table[:name]
47
- compile(c == 'test').must_be_like %{"users"."name" = 'test'}
48
- compile(c != 'test').must_be_like %{"users"."name" != 'test'}
49
- compile(c > 'test').must_be_like %{"users"."name" > 'test'}
50
- compile((c >= 'test').as('new_name')).must_be_like %{("users"."name" >= 'test') AS new_name}
51
- compile(c <= @table[:comments]).must_be_like %{"users"."name" <= "users"."comments"}
52
- compile(c =~ /\Atest\Z/).must_be_like %{REGEXP_LIKE("users"."name", '^test$')}
53
- compile(c =~ /\Atest\z/).must_be_like %{REGEXP_LIKE("users"."name", '^test$')}
54
- compile(c =~ '^test$').must_be_like %{REGEXP_LIKE("users"."name", '^test$')}
55
- compile(c !~ /\Ate\Dst\Z/).must_be_like %{NOT REGEXP_LIKE("users"."name", '^te[^0-9]st$')}
56
- compile(c.imatches('%test%')).must_be_like %{LOWER("users"."name") LIKE LOWER('%test%')}
57
- compile(c.imatches_any(['%test%', 't2'])).must_be_like %{((LOWER("users"."name") LIKE LOWER('%test%')) OR (LOWER("users"."name") LIKE LOWER('t2')))}
58
- compile(c.idoes_not_match('%test%')).must_be_like %{LOWER("users"."name") NOT LIKE LOWER('%test%')}
47
+ _(compile(c == 'test')).must_be_like %{"users"."name" = 'test'}
48
+ _(compile(c != 'test')).must_be_like %{"users"."name" != 'test'}
49
+ _(compile(c > 'test')).must_be_like %{"users"."name" > 'test'}
50
+ _(compile((c >= 'test').as('new_name'))).must_be_like %{("users"."name" >= 'test') AS new_name}
51
+ _(compile(c <= @table[:comments])).must_be_like %{"users"."name" <= "users"."comments"}
52
+ _(compile(c =~ /\Atest\Z/)).must_be_like %{REGEXP_LIKE("users"."name", '^test$')}
53
+ _(compile(c =~ /\Atest\z/)).must_be_like %{REGEXP_LIKE("users"."name", '^test$')}
54
+ _(compile(c =~ '^test$')).must_be_like %{REGEXP_LIKE("users"."name", '^test$')}
55
+ _(compile(c !~ /\Ate\Dst\Z/)).must_be_like %{NOT REGEXP_LIKE("users"."name", '^te[^0-9]st$')}
56
+ _(compile(c.imatches('%test%'))).must_be_like %{LOWER("users"."name") LIKE LOWER('%test%')}
57
+ _(compile(c.imatches_any(['%test%', 't2']))).must_be_like %{((LOWER("users"."name") LIKE LOWER('%test%')) OR (LOWER("users"."name") LIKE LOWER('t2')))}
58
+ _(compile(c.idoes_not_match('%test%'))).must_be_like %{LOWER("users"."name") NOT LIKE LOWER('%test%')}
59
59
  end
60
60
 
61
61
  # Maths
62
62
  # DateDiff
63
63
  it "should diff date col and date" do
64
- compile(@table[:created_at] - Date.new(2016, 3, 31)).must_match %{"users"."created_at" - TO_DATE('2016-03-31')}
64
+ _(compile(@table[:created_at] - Date.new(2016, 3, 31))).must_match %{"users"."created_at" - TO_DATE('2016-03-31')}
65
65
  end
66
66
 
67
67
  it "should diff date col and datetime col" do
68
- compile(@table[:created_at] - @table[:updated_at]).must_match %{"users"."created_at" - "users"."updated_at"}
68
+ _(compile(@table[:created_at] - @table[:updated_at])).must_match %{"users"."created_at" - "users"."updated_at"}
69
69
  end
70
70
 
71
71
  it "should diff date col and datetime col with AS" do
72
72
  sql = compile((@table[:updated_at] - @table[:created_at]).as('new_name'))
73
73
  # sql.must_be_like %{(TO_DATE("users"."updated_at") - "users"."created_at") * 86400 AS new_name}
74
- sql.must_be_like %{("users"."updated_at" - "users"."created_at") * (CASE WHEN (TRUNC("users"."updated_at", 'DDD') = "users"."updated_at") THEN 1 ELSE 86400 END) AS new_name}
74
+ _(sql).must_be_like %{("users"."updated_at" - "users"."created_at") * (CASE WHEN (TRUNC("users"."updated_at", 'DDD') = "users"."updated_at") THEN 1 ELSE 86400 END) AS new_name}
75
75
  end
76
76
 
77
77
  it "should diff between time values" do
78
78
  d2 = Time.new(2015,6,1)
79
79
  d1 = DateTime.new(2015,6,2)
80
- sql = compile(ArelExtensions::Nodes::DateDiff.new([d1,d2]))
81
- sql.must_match("TO_DATE('2015-06-02') - TO_DATE('2015-06-01')")
80
+ _(compile(ArelExtensions::Nodes::DateDiff.new([d1,d2])))
81
+ .must_match("TO_DATE('2015-06-02') - TO_DATE('2015-06-01')")
82
82
  end
83
83
 
84
84
  it "should diff between time values and time col" do
85
85
  d1 = DateTime.new(2015,6,2)
86
- sql = compile(ArelExtensions::Nodes::DateDiff.new([d1, @table[:updated_at]]))
87
- sql.must_match %{TO_DATE('2015-06-02') - "users"."updated_at"}
86
+ _(compile(ArelExtensions::Nodes::DateDiff.new([d1, @table[:updated_at]])))
87
+ .must_match %{TO_DATE('2015-06-02') - "users"."updated_at"}
88
88
  end
89
89
 
90
90
  it "should accept operators on dates with numbers" do
91
91
  c = @table[:created_at]
92
- compile(c - 42).must_be_like %{DATE_SUB("users"."created_at", 42)}
93
- compile(c - @table[:id]).must_be_like %{DATE_SUB("users"."created_at", "users"."id")}
92
+ _(compile(c - 42)).must_be_like %{DATE_SUB("users"."created_at", 42)}
93
+ _(compile(c - @table[:id])).must_be_like %{DATE_SUB("users"."created_at", "users"."id")}
94
94
  end
95
95
 
96
96
  # Maths on sums
97
97
  it "should accept math operators on anything" do
98
98
  c = @table[:name]
99
- (c == 'test').to_sql.must_be_like %{"users"."name" = 'test'}
100
- (c != 'test').to_sql.must_be_like %{"users"."name" != 'test'}
101
- (c > 'test').to_sql.must_be_like %{"users"."name" > 'test'}
102
- compile((c >= 'test').as('new_name')).must_be_like %{("users"."name" >= 'test') AS new_name}
103
- compile(c <= @table[:comments]).must_be_like %{"users"."name" <= "users"."comments"}
104
- compile(c =~ /\Atest\Z/).must_be_like %{REGEXP_LIKE("users"."name", '^test$')}
105
- compile(c !~ /\Ate\Dst\Z/).must_be_like %{NOT REGEXP_LIKE("users"."name", '^te[^0-9]st$')}
99
+ _((c == 'test').to_sql).must_be_like %{"users"."name" = 'test'}
100
+ _((c != 'test').to_sql).must_be_like %{"users"."name" != 'test'}
101
+ _((c > 'test').to_sql).must_be_like %{"users"."name" > 'test'}
102
+ _(compile((c >= 'test').as('new_name'))).must_be_like %{("users"."name" >= 'test') AS new_name}
103
+ _(compile(c <= @table[:comments])).must_be_like %{"users"."name" <= "users"."comments"}
104
+ _(compile(c =~ /\Atest\Z/)).must_be_like %{REGEXP_LIKE("users"."name", '^test$')}
105
+ _(compile(c !~ /\Ate\Dst\Z/)).must_be_like %{NOT REGEXP_LIKE("users"."name", '^te[^0-9]st$')}
106
106
  end
107
107
 
108
108
  end