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.
- checksums.yaml +4 -4
- data/.travis.yml +54 -86
- data/README.md +1 -1
- data/Rakefile +13 -2
- data/gemfiles/rails4.gemfile +1 -1
- data/gemfiles/rails6.gemfile +1 -1
- data/generate_gems.sh +4 -3
- data/lib/arel_extensions.rb +45 -20
- data/lib/arel_extensions/attributes.rb +0 -1
- data/lib/arel_extensions/boolean_functions.rb +39 -12
- data/lib/arel_extensions/insert_manager.rb +7 -5
- data/lib/arel_extensions/nodes/abs.rb +0 -0
- data/lib/arel_extensions/nodes/case.rb +8 -2
- data/lib/arel_extensions/nodes/ceil.rb +0 -0
- data/lib/arel_extensions/nodes/coalesce.rb +0 -0
- data/lib/arel_extensions/nodes/concat.rb +0 -0
- data/lib/arel_extensions/nodes/duration.rb +0 -0
- data/lib/arel_extensions/nodes/find_in_set.rb +0 -0
- data/lib/arel_extensions/nodes/floor.rb +0 -0
- data/lib/arel_extensions/nodes/function.rb +0 -0
- data/lib/arel_extensions/nodes/is_null.rb +0 -0
- data/lib/arel_extensions/nodes/json.rb +40 -25
- data/lib/arel_extensions/nodes/length.rb +0 -0
- data/lib/arel_extensions/nodes/locate.rb +0 -0
- data/lib/arel_extensions/nodes/rand.rb +0 -0
- data/lib/arel_extensions/nodes/replace.rb +0 -0
- data/lib/arel_extensions/nodes/round.rb +0 -0
- data/lib/arel_extensions/nodes/soundex.rb +0 -0
- data/lib/arel_extensions/nodes/substring.rb +0 -0
- data/lib/arel_extensions/nodes/trim.rb +0 -0
- data/lib/arel_extensions/nodes/union.rb +0 -0
- data/lib/arel_extensions/nodes/wday.rb +0 -0
- data/lib/arel_extensions/predications.rb +22 -19
- data/lib/arel_extensions/set_functions.rb +2 -2
- data/lib/arel_extensions/string_functions.rb +13 -0
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors.rb +1 -1
- data/lib/arel_extensions/visitors/ibm_db.rb +1 -1
- data/lib/arel_extensions/visitors/mysql.rb +24 -9
- data/lib/arel_extensions/visitors/oracle.rb +7 -8
- data/lib/arel_extensions/visitors/postgresql.rb +1 -1
- data/lib/arel_extensions/visitors/sqlite.rb +11 -17
- data/lib/arel_extensions/visitors/to_sql.rb +56 -55
- data/test/arelx_test_helper.rb +28 -0
- data/test/support/fake_record.rb +4 -0
- data/test/test_comparators.rb +8 -7
- data/test/visitors/test_bulk_insert_oracle.rb +4 -3
- data/test/visitors/test_bulk_insert_sqlite.rb +4 -3
- data/test/visitors/test_bulk_insert_to_sql.rb +3 -3
- data/test/visitors/test_oracle.rb +41 -41
- data/test/visitors/test_to_sql.rb +366 -206
- data/test/with_ar/all_agnostic_test.rb +19 -8
- data/test/with_ar/insert_agnostic_test.rb +1 -1
- data/test/with_ar/test_bulk_sqlite.rb +4 -3
- data/test/with_ar/test_math_sqlite.rb +1 -1
- data/test/with_ar/test_string_mysql.rb +1 -1
- data/test/with_ar/test_string_sqlite.rb +1 -1
- data/version_v1.rb +1 -1
- data/version_v2.rb +1 -1
- metadata +3 -3
- 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
|
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
|
-
|
471
|
-
|
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
|
-
|
494
|
-
|
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
|
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
|
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
|
-
|
239
|
-
|
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
|
-
|
262
|
-
|
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
|
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
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
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
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
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
|
-
|
567
|
-
|
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
|
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
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
645
|
-
|
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
|
data/test/support/fake_record.rb
CHANGED
data/test/test_comparators.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
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))
|
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 '
|
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
|
-
|
29
|
-
|
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 '
|
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
|
-
|
31
|
-
|
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 '
|
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
|
-
|
31
|
-
|
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 '
|
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
|
-
|
81
|
-
|
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
|
-
|
87
|
-
|
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
|