arel_extensions 1.2.8 → 1.2.16
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.
- 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
|