arel 5.0.1.20140414130214 → 6.0.0.beta1
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 +4 -2
- data/History.txt +9 -4
- data/Manifest.txt +9 -7
- data/README.markdown +85 -8
- data/Rakefile +1 -1
- data/arel.gemspec +15 -16
- data/lib/arel.rb +1 -12
- data/lib/arel/collectors/bind.rb +36 -0
- data/lib/arel/collectors/plain_string.rb +18 -0
- data/lib/arel/collectors/sql_string.rb +18 -0
- data/lib/arel/factory_methods.rb +1 -1
- data/lib/arel/insert_manager.rb +5 -1
- data/lib/arel/nodes.rb +41 -0
- data/lib/arel/nodes/and.rb +1 -5
- data/lib/arel/nodes/binary.rb +2 -0
- data/lib/arel/nodes/extract.rb +0 -2
- data/lib/arel/nodes/full_outer_join.rb +6 -0
- data/lib/arel/nodes/function.rb +0 -1
- data/lib/arel/nodes/insert_statement.rb +5 -2
- data/lib/arel/nodes/node.rb +5 -1
- data/lib/arel/nodes/right_outer_join.rb +6 -0
- data/lib/arel/nodes/window.rb +23 -5
- data/lib/arel/predications.rb +41 -33
- data/lib/arel/select_manager.rb +13 -37
- data/lib/arel/table.rb +13 -9
- data/lib/arel/tree_manager.rb +8 -2
- data/lib/arel/update_manager.rb +2 -2
- data/lib/arel/visitors.rb +0 -2
- data/lib/arel/visitors/bind_substitute.rb +9 -0
- data/lib/arel/visitors/bind_visitor.rb +10 -5
- data/lib/arel/visitors/depth_first.rb +60 -57
- data/lib/arel/visitors/dot.rb +84 -80
- data/lib/arel/visitors/ibm_db.rb +4 -2
- data/lib/arel/visitors/informix.rb +39 -21
- data/lib/arel/visitors/mssql.rb +41 -23
- data/lib/arel/visitors/mysql.rb +48 -22
- data/lib/arel/visitors/oracle.rb +33 -24
- data/lib/arel/visitors/postgresql.rb +15 -8
- data/lib/arel/visitors/reduce.rb +25 -0
- data/lib/arel/visitors/sqlite.rb +3 -2
- data/lib/arel/visitors/to_sql.rb +455 -248
- data/lib/arel/visitors/visitor.rb +2 -2
- data/lib/arel/visitors/where_sql.rb +3 -2
- data/test/attributes/test_attribute.rb +12 -3
- data/test/collectors/test_bind_collector.rb +70 -0
- data/test/collectors/test_sql_string.rb +38 -0
- data/test/helper.rb +10 -1
- data/test/nodes/test_bin.rb +2 -2
- data/test/nodes/test_count.rb +0 -6
- data/test/nodes/test_equality.rb +1 -1
- data/test/nodes/test_grouping.rb +1 -1
- data/test/nodes/test_infix_operation.rb +1 -1
- data/test/nodes/test_select_core.rb +7 -7
- data/test/nodes/test_sql_literal.rb +10 -6
- data/test/nodes/test_window.rb +9 -3
- data/test/support/fake_record.rb +16 -4
- data/test/test_factory_methods.rb +1 -1
- data/test/test_insert_manager.rb +33 -4
- data/test/test_select_manager.rb +164 -92
- data/test/test_table.rb +49 -4
- data/test/visitors/test_bind_visitor.rb +18 -10
- data/test/visitors/test_depth_first.rb +12 -0
- data/test/visitors/test_dot.rb +4 -4
- data/test/visitors/test_ibm_db.rb +11 -5
- data/test/visitors/test_informix.rb +14 -8
- data/test/visitors/test_mssql.rb +12 -8
- data/test/visitors/test_mysql.rb +17 -12
- data/test/visitors/test_oracle.rb +25 -21
- data/test/visitors/test_postgres.rb +50 -12
- data/test/visitors/test_sqlite.rb +2 -2
- data/test/visitors/test_to_sql.rb +177 -81
- metadata +24 -19
- data/lib/arel/deprecated.rb +0 -4
- data/lib/arel/expression.rb +0 -5
- data/lib/arel/sql/engine.rb +0 -10
- data/lib/arel/sql_literal.rb +0 -4
- data/lib/arel/visitors/join_sql.rb +0 -19
- data/lib/arel/visitors/order_clauses.rb +0 -11
- data/test/visitors/test_join_sql.rb +0 -42
data/test/test_select_manager.rb
CHANGED
@@ -5,7 +5,7 @@ module Arel
|
|
5
5
|
describe 'select manager' do
|
6
6
|
def test_join_sources
|
7
7
|
manager = Arel::SelectManager.new Table.engine
|
8
|
-
manager.join_sources << Arel::Nodes::StringJoin.new('foo')
|
8
|
+
manager.join_sources << Arel::Nodes::StringJoin.new(Nodes.build_quoted('foo'))
|
9
9
|
assert_equal "SELECT FROM 'foo'", manager.to_sql
|
10
10
|
end
|
11
11
|
|
@@ -33,7 +33,7 @@ module Arel
|
|
33
33
|
it 'accepts symbols' do
|
34
34
|
table = Table.new :users
|
35
35
|
manager = Arel::SelectManager.new Table.engine
|
36
|
-
manager.project SqlLiteral.new '*'
|
36
|
+
manager.project Nodes::SqlLiteral.new '*'
|
37
37
|
manager.from table
|
38
38
|
manager.order :foo
|
39
39
|
manager.to_sql.must_be_like %{ SELECT * FROM "users" ORDER BY foo }
|
@@ -140,7 +140,7 @@ module Arel
|
|
140
140
|
mgr.to_sql.must_be_like %{ SELECT FROM "users" INNER JOIN "users" "users_2" ON omg }
|
141
141
|
end
|
142
142
|
|
143
|
-
it 'converts to sqlliterals' do
|
143
|
+
it 'converts to sqlliterals with multiple items' do
|
144
144
|
table = Table.new :users
|
145
145
|
right = table.alias
|
146
146
|
mgr = table.from table
|
@@ -152,7 +152,7 @@ module Arel
|
|
152
152
|
|
153
153
|
describe 'clone' do
|
154
154
|
it 'creates new cores' do
|
155
|
-
table = Table.new :users, :
|
155
|
+
table = Table.new :users, :as => 'foo'
|
156
156
|
mgr = table.from table
|
157
157
|
m2 = mgr.clone
|
158
158
|
m2.project "foo"
|
@@ -160,7 +160,7 @@ module Arel
|
|
160
160
|
end
|
161
161
|
|
162
162
|
it 'makes updates to the correct copy' do
|
163
|
-
table = Table.new :users, :
|
163
|
+
table = Table.new :users, :as => 'foo'
|
164
164
|
mgr = table.from table
|
165
165
|
m2 = mgr.clone
|
166
166
|
m3 = m2.clone
|
@@ -172,7 +172,7 @@ module Arel
|
|
172
172
|
|
173
173
|
describe 'initialize' do
|
174
174
|
it 'uses alias in sql' do
|
175
|
-
table = Table.new :users, :
|
175
|
+
table = Table.new :users, :as => 'foo'
|
176
176
|
mgr = table.from table
|
177
177
|
mgr.skip 10
|
178
178
|
mgr.to_sql.must_be_like %{ SELECT FROM "users" "foo" OFFSET 10 }
|
@@ -224,7 +224,7 @@ module Arel
|
|
224
224
|
it 'should create an exists clause' do
|
225
225
|
table = Table.new(:users)
|
226
226
|
manager = Arel::SelectManager.new Table.engine, table
|
227
|
-
manager.project SqlLiteral.new '*'
|
227
|
+
manager.project Nodes::SqlLiteral.new '*'
|
228
228
|
m2 = Arel::SelectManager.new(manager.engine)
|
229
229
|
m2.project manager.exists
|
230
230
|
m2.to_sql.must_be_like %{ SELECT EXISTS (#{manager.to_sql}) }
|
@@ -233,7 +233,7 @@ module Arel
|
|
233
233
|
it 'can be aliased' do
|
234
234
|
table = Table.new(:users)
|
235
235
|
manager = Arel::SelectManager.new Table.engine, table
|
236
|
-
manager.project SqlLiteral.new '*'
|
236
|
+
manager.project Nodes::SqlLiteral.new '*'
|
237
237
|
m2 = Arel::SelectManager.new(manager.engine)
|
238
238
|
m2.project manager.exists.as('foo')
|
239
239
|
m2.to_sql.must_be_like %{ SELECT EXISTS (#{manager.to_sql}) AS foo }
|
@@ -330,6 +330,20 @@ module Arel
|
|
330
330
|
end
|
331
331
|
|
332
332
|
describe 'with' do
|
333
|
+
it 'should support basic WITH' do
|
334
|
+
users = Table.new(:users)
|
335
|
+
users_top = Table.new(:users_top)
|
336
|
+
comments = Table.new(:comments)
|
337
|
+
|
338
|
+
top = users.project(users[:id]).where(users[:karma].gt(100))
|
339
|
+
users_as = Arel::Nodes::As.new(users_top, top)
|
340
|
+
select_manager = comments.project(Arel.star).with(users_as)
|
341
|
+
.where(comments[:author_id].in(users_top.project(users_top[:id])))
|
342
|
+
|
343
|
+
select_manager.to_sql.must_be_like %{
|
344
|
+
WITH "users_top" AS (SELECT "users"."id" FROM "users" WHERE "users"."karma" > 100) SELECT * FROM "comments" WHERE "comments"."author_id" IN (SELECT "users_top"."id" FROM "users_top")
|
345
|
+
}
|
346
|
+
end
|
333
347
|
|
334
348
|
it "should support WITH RECURSIVE" do
|
335
349
|
comments = Table.new(:comments)
|
@@ -368,9 +382,9 @@ module Arel
|
|
368
382
|
it 'should return the ast' do
|
369
383
|
table = Table.new :users
|
370
384
|
mgr = table.from table
|
371
|
-
|
372
|
-
mgr.visitor.accept(ast).must_equal mgr.to_sql
|
385
|
+
assert mgr.ast
|
373
386
|
end
|
387
|
+
|
374
388
|
it 'should allow orders to work when the ast is grepped' do
|
375
389
|
table = Table.new :users
|
376
390
|
mgr = table.from table
|
@@ -413,7 +427,7 @@ module Arel
|
|
413
427
|
it 'generates order clauses' do
|
414
428
|
table = Table.new :users
|
415
429
|
manager = Arel::SelectManager.new Table.engine
|
416
|
-
manager.project SqlLiteral.new '*'
|
430
|
+
manager.project Nodes::SqlLiteral.new '*'
|
417
431
|
manager.from table
|
418
432
|
manager.order table[:id]
|
419
433
|
manager.to_sql.must_be_like %{
|
@@ -425,7 +439,7 @@ module Arel
|
|
425
439
|
it 'takes *args' do
|
426
440
|
table = Table.new :users
|
427
441
|
manager = Arel::SelectManager.new Table.engine
|
428
|
-
manager.project SqlLiteral.new '*'
|
442
|
+
manager.project Nodes::SqlLiteral.new '*'
|
429
443
|
manager.from table
|
430
444
|
manager.order table[:id], table[:name]
|
431
445
|
manager.to_sql.must_be_like %{
|
@@ -442,25 +456,13 @@ module Arel
|
|
442
456
|
it 'has order attributes' do
|
443
457
|
table = Table.new :users
|
444
458
|
manager = Arel::SelectManager.new Table.engine
|
445
|
-
manager.project SqlLiteral.new '*'
|
459
|
+
manager.project Nodes::SqlLiteral.new '*'
|
446
460
|
manager.from table
|
447
461
|
manager.order table[:id].desc
|
448
462
|
manager.to_sql.must_be_like %{
|
449
463
|
SELECT * FROM "users" ORDER BY "users"."id" DESC
|
450
464
|
}
|
451
465
|
end
|
452
|
-
|
453
|
-
it 'has order attributes for expressions' do
|
454
|
-
table = Table.new :users
|
455
|
-
manager = Arel::SelectManager.new Table.engine
|
456
|
-
manager.project SqlLiteral.new '*'
|
457
|
-
manager.from table
|
458
|
-
manager.order table[:id].count.desc
|
459
|
-
manager.to_sql.must_be_like %{
|
460
|
-
SELECT * FROM "users" ORDER BY COUNT("users"."id") DESC
|
461
|
-
}
|
462
|
-
end
|
463
|
-
|
464
466
|
end
|
465
467
|
|
466
468
|
describe 'on' do
|
@@ -529,7 +531,15 @@ module Arel
|
|
529
531
|
assert_equal 'bar', join.right
|
530
532
|
end
|
531
533
|
|
532
|
-
it 'should create join nodes with a klass' do
|
534
|
+
it 'should create join nodes with a full outer join klass' do
|
535
|
+
relation = Arel::SelectManager.new Table.engine
|
536
|
+
join = relation.create_join 'foo', 'bar', Arel::Nodes::FullOuterJoin
|
537
|
+
assert_kind_of Arel::Nodes::FullOuterJoin, join
|
538
|
+
assert_equal 'foo', join.left
|
539
|
+
assert_equal 'bar', join.right
|
540
|
+
end
|
541
|
+
|
542
|
+
it 'should create join nodes with a outer join klass' do
|
533
543
|
relation = Arel::SelectManager.new Table.engine
|
534
544
|
join = relation.create_join 'foo', 'bar', Arel::Nodes::OuterJoin
|
535
545
|
assert_kind_of Arel::Nodes::OuterJoin, join
|
@@ -537,6 +547,14 @@ module Arel
|
|
537
547
|
assert_equal 'bar', join.right
|
538
548
|
end
|
539
549
|
|
550
|
+
it 'should create join nodes with a right outer join klass' do
|
551
|
+
relation = Arel::SelectManager.new Table.engine
|
552
|
+
join = relation.create_join 'foo', 'bar', Arel::Nodes::RightOuterJoin
|
553
|
+
assert_kind_of Arel::Nodes::RightOuterJoin, join
|
554
|
+
assert_equal 'foo', join.left
|
555
|
+
assert_equal 'bar', join.right
|
556
|
+
end
|
557
|
+
|
540
558
|
describe 'join' do
|
541
559
|
it 'responds to join' do
|
542
560
|
left = Table.new :users
|
@@ -574,15 +592,37 @@ module Arel
|
|
574
592
|
end
|
575
593
|
end
|
576
594
|
|
595
|
+
describe 'outer join' do
|
596
|
+
it 'responds to join' do
|
597
|
+
left = Table.new :users
|
598
|
+
right = left.alias
|
599
|
+
predicate = left[:id].eq(right[:id])
|
600
|
+
manager = Arel::SelectManager.new Table.engine
|
601
|
+
|
602
|
+
manager.from left
|
603
|
+
manager.outer_join(right).on(predicate)
|
604
|
+
manager.to_sql.must_be_like %{
|
605
|
+
SELECT FROM "users"
|
606
|
+
LEFT OUTER JOIN "users" "users_2"
|
607
|
+
ON "users"."id" = "users_2"."id"
|
608
|
+
}
|
609
|
+
end
|
610
|
+
|
611
|
+
it 'noops on nil' do
|
612
|
+
manager = Arel::SelectManager.new Table.engine
|
613
|
+
manager.outer_join(nil).must_equal manager
|
614
|
+
end
|
615
|
+
end
|
616
|
+
|
577
617
|
describe 'joins' do
|
578
|
-
|
618
|
+
|
619
|
+
it 'returns inner join sql' do
|
579
620
|
table = Table.new :users
|
580
621
|
aliaz = table.alias
|
581
622
|
manager = Arel::SelectManager.new Table.engine
|
582
623
|
manager.from Nodes::InnerJoin.new(aliaz, table[:id].eq(aliaz[:id]))
|
583
|
-
|
584
|
-
|
585
|
-
}
|
624
|
+
assert_match 'INNER JOIN "users" "users_2" "users"."id" = "users_2"."id"',
|
625
|
+
manager.to_sql
|
586
626
|
end
|
587
627
|
|
588
628
|
it 'returns outer join sql' do
|
@@ -590,9 +630,8 @@ module Arel
|
|
590
630
|
aliaz = table.alias
|
591
631
|
manager = Arel::SelectManager.new Table.engine
|
592
632
|
manager.from Nodes::OuterJoin.new(aliaz, table[:id].eq(aliaz[:id]))
|
593
|
-
|
594
|
-
|
595
|
-
}
|
633
|
+
assert_match 'LEFT OUTER JOIN "users" "users_2" "users"."id" = "users_2"."id"',
|
634
|
+
manager.to_sql
|
596
635
|
end
|
597
636
|
|
598
637
|
it 'can have a non-table alias as relation name' do
|
@@ -612,25 +651,26 @@ module Arel
|
|
612
651
|
}
|
613
652
|
end
|
614
653
|
|
615
|
-
it
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
end
|
654
|
+
it "joins itself" do
|
655
|
+
left = Table.new :users
|
656
|
+
right = left.alias
|
657
|
+
predicate = left[:id].eq(right[:id])
|
620
658
|
|
621
|
-
|
622
|
-
|
623
|
-
|
659
|
+
mgr = left.join(right)
|
660
|
+
mgr.project Nodes::SqlLiteral.new('*')
|
661
|
+
mgr.on(predicate).must_equal mgr
|
662
|
+
|
663
|
+
mgr.to_sql.must_be_like %{
|
664
|
+
SELECT * FROM "users"
|
665
|
+
INNER JOIN "users" "users_2"
|
666
|
+
ON "users"."id" = "users_2"."id"
|
667
|
+
}
|
624
668
|
end
|
625
|
-
end
|
626
669
|
|
627
|
-
|
628
|
-
it 'returns order clauses as a list' do
|
629
|
-
table = Table.new :users
|
670
|
+
it 'returns string join sql' do
|
630
671
|
manager = Arel::SelectManager.new Table.engine
|
631
|
-
manager.from
|
632
|
-
manager.
|
633
|
-
manager.order_clauses.first.must_be_like %{ "users"."id" }
|
672
|
+
manager.from Nodes::StringJoin.new(Nodes.build_quoted('hello'))
|
673
|
+
assert_match "'hello'", manager.to_sql
|
634
674
|
end
|
635
675
|
end
|
636
676
|
|
@@ -692,6 +732,47 @@ module Arel
|
|
692
732
|
}
|
693
733
|
end
|
694
734
|
|
735
|
+
it 'takes an order with multiple columns' do
|
736
|
+
table = Table.new :users
|
737
|
+
manager = Arel::SelectManager.new Table.engine
|
738
|
+
manager.from table
|
739
|
+
manager.window('a_window').order(table['foo'].asc, table['bar'].desc)
|
740
|
+
manager.to_sql.must_be_like %{
|
741
|
+
SELECT FROM "users" WINDOW "a_window" AS (ORDER BY "users"."foo" ASC, "users"."bar" DESC)
|
742
|
+
}
|
743
|
+
end
|
744
|
+
|
745
|
+
it 'takes a partition' do
|
746
|
+
table = Table.new :users
|
747
|
+
manager = Arel::SelectManager.new Table.engine
|
748
|
+
manager.from table
|
749
|
+
manager.window('a_window').partition(table['bar'])
|
750
|
+
manager.to_sql.must_be_like %{
|
751
|
+
SELECT FROM "users" WINDOW "a_window" AS (PARTITION BY "users"."bar")
|
752
|
+
}
|
753
|
+
end
|
754
|
+
|
755
|
+
it 'takes a partition and an order' do
|
756
|
+
table = Table.new :users
|
757
|
+
manager = Arel::SelectManager.new Table.engine
|
758
|
+
manager.from table
|
759
|
+
manager.window('a_window').partition(table['foo']).order(table['foo'].asc)
|
760
|
+
manager.to_sql.must_be_like %{
|
761
|
+
SELECT FROM "users" WINDOW "a_window" AS (PARTITION BY "users"."foo"
|
762
|
+
ORDER BY "users"."foo" ASC)
|
763
|
+
}
|
764
|
+
end
|
765
|
+
|
766
|
+
it 'takes a partition with multiple columns' do
|
767
|
+
table = Table.new :users
|
768
|
+
manager = Arel::SelectManager.new Table.engine
|
769
|
+
manager.from table
|
770
|
+
manager.window('a_window').partition(table['bar'], table['baz'])
|
771
|
+
manager.to_sql.must_be_like %{
|
772
|
+
SELECT FROM "users" WINDOW "a_window" AS (PARTITION BY "users"."bar", "users"."baz")
|
773
|
+
}
|
774
|
+
end
|
775
|
+
|
695
776
|
it 'takes a rows frame, unbounded preceding' do
|
696
777
|
table = Table.new :users
|
697
778
|
manager = Arel::SelectManager.new Table.engine
|
@@ -868,12 +949,33 @@ module Arel
|
|
868
949
|
end
|
869
950
|
|
870
951
|
describe 'update' do
|
952
|
+
|
953
|
+
it 'creates an update statement' do
|
954
|
+
table = Table.new :users
|
955
|
+
manager = Arel::SelectManager.new Table.engine
|
956
|
+
manager.from table
|
957
|
+
stmt = manager.compile_update({table[:id] => 1}, Arel::Attributes::Attribute.new(table, 'id'))
|
958
|
+
|
959
|
+
stmt.to_sql.must_be_like %{
|
960
|
+
UPDATE "users" SET "id" = 1
|
961
|
+
}
|
962
|
+
end
|
963
|
+
|
964
|
+
it 'takes a string' do
|
965
|
+
table = Table.new :users
|
966
|
+
manager = Arel::SelectManager.new Table.engine
|
967
|
+
manager.from table
|
968
|
+
stmt = manager.compile_update(Nodes::SqlLiteral.new('foo = bar'), Arel::Attributes::Attribute.new(table, 'id'))
|
969
|
+
|
970
|
+
stmt.to_sql.must_be_like %{ UPDATE "users" SET foo = bar }
|
971
|
+
end
|
972
|
+
|
871
973
|
it 'copies limits' do
|
872
974
|
table = Table.new :users
|
873
975
|
manager = Arel::SelectManager.new Table.engine
|
874
976
|
manager.from table
|
875
977
|
manager.take 1
|
876
|
-
stmt = manager.compile_update(SqlLiteral.new('foo = bar'), Arel::Attributes::Attribute.new(table, 'id'))
|
978
|
+
stmt = manager.compile_update(Nodes::SqlLiteral.new('foo = bar'), Arel::Attributes::Attribute.new(table, 'id'))
|
877
979
|
stmt.key = table['id']
|
878
980
|
|
879
981
|
stmt.to_sql.must_be_like %{
|
@@ -887,7 +989,7 @@ module Arel
|
|
887
989
|
manager = Arel::SelectManager.new Table.engine
|
888
990
|
manager.from table
|
889
991
|
manager.order :foo
|
890
|
-
stmt = manager.compile_update(SqlLiteral.new('foo = bar'), Arel::Attributes::Attribute.new(table, 'id'))
|
992
|
+
stmt = manager.compile_update(Nodes::SqlLiteral.new('foo = bar'), Arel::Attributes::Attribute.new(table, 'id'))
|
891
993
|
stmt.key = table['id']
|
892
994
|
|
893
995
|
stmt.to_sql.must_be_like %{
|
@@ -896,15 +998,6 @@ module Arel
|
|
896
998
|
}
|
897
999
|
end
|
898
1000
|
|
899
|
-
it 'takes a string' do
|
900
|
-
table = Table.new :users
|
901
|
-
manager = Arel::SelectManager.new Table.engine
|
902
|
-
manager.from table
|
903
|
-
stmt = manager.compile_update(SqlLiteral.new('foo = bar'), Arel::Attributes::Attribute.new(table, 'id'))
|
904
|
-
|
905
|
-
stmt.to_sql.must_be_like %{ UPDATE "users" SET foo = bar }
|
906
|
-
end
|
907
|
-
|
908
1001
|
it 'copies where clauses' do
|
909
1002
|
table = Table.new :users
|
910
1003
|
manager = Arel::SelectManager.new Table.engine
|
@@ -930,19 +1023,15 @@ module Arel
|
|
930
1023
|
}
|
931
1024
|
end
|
932
1025
|
|
933
|
-
it 'executes an update statement' do
|
934
|
-
table = Table.new :users
|
935
|
-
manager = Arel::SelectManager.new Table.engine
|
936
|
-
manager.from table
|
937
|
-
stmt = manager.compile_update({table[:id] => 1}, Arel::Attributes::Attribute.new(table, 'id'))
|
938
|
-
|
939
|
-
stmt.to_sql.must_be_like %{
|
940
|
-
UPDATE "users" SET "id" = 1
|
941
|
-
}
|
942
|
-
end
|
943
1026
|
end
|
944
1027
|
|
945
1028
|
describe 'project' do
|
1029
|
+
it "takes sql literals" do
|
1030
|
+
manager = Arel::SelectManager.new Table.engine
|
1031
|
+
manager.project Nodes::SqlLiteral.new '*'
|
1032
|
+
manager.to_sql.must_be_like %{ SELECT * }
|
1033
|
+
end
|
1034
|
+
|
946
1035
|
it 'takes multiple args' do
|
947
1036
|
manager = Arel::SelectManager.new Table.engine
|
948
1037
|
manager.project Nodes::SqlLiteral.new('foo'),
|
@@ -956,11 +1045,6 @@ module Arel
|
|
956
1045
|
manager.to_sql.must_be_like %{ SELECT * }
|
957
1046
|
end
|
958
1047
|
|
959
|
-
it "takes sql literals" do
|
960
|
-
manager = Arel::SelectManager.new Table.engine
|
961
|
-
manager.project Nodes::SqlLiteral.new '*'
|
962
|
-
manager.to_sql.must_be_like %{ SELECT * }
|
963
|
-
end
|
964
1048
|
end
|
965
1049
|
|
966
1050
|
describe 'projections' do
|
@@ -1032,24 +1116,6 @@ module Arel
|
|
1032
1116
|
end
|
1033
1117
|
end
|
1034
1118
|
|
1035
|
-
describe "join" do
|
1036
|
-
it "joins itself" do
|
1037
|
-
left = Table.new :users
|
1038
|
-
right = left.alias
|
1039
|
-
predicate = left[:id].eq(right[:id])
|
1040
|
-
|
1041
|
-
mgr = left.join(right)
|
1042
|
-
mgr.project Nodes::SqlLiteral.new('*')
|
1043
|
-
mgr.on(predicate).must_equal mgr
|
1044
|
-
|
1045
|
-
mgr.to_sql.must_be_like %{
|
1046
|
-
SELECT * FROM "users"
|
1047
|
-
INNER JOIN "users" "users_2"
|
1048
|
-
ON "users"."id" = "users_2"."id"
|
1049
|
-
}
|
1050
|
-
end
|
1051
|
-
end
|
1052
|
-
|
1053
1119
|
describe 'from' do
|
1054
1120
|
it "makes sql" do
|
1055
1121
|
table = Table.new :users
|
@@ -1085,6 +1151,12 @@ module Arel
|
|
1085
1151
|
manager.distinct(false)
|
1086
1152
|
manager.ast.cores.last.set_quantifier.must_equal nil
|
1087
1153
|
end
|
1154
|
+
|
1155
|
+
it "chains" do
|
1156
|
+
manager = Arel::SelectManager.new Table.engine
|
1157
|
+
manager.distinct.must_equal manager
|
1158
|
+
manager.distinct(false).must_equal manager
|
1159
|
+
end
|
1088
1160
|
end
|
1089
1161
|
end
|
1090
1162
|
end
|
data/test/test_table.rb
CHANGED
@@ -19,6 +19,13 @@ module Arel
|
|
19
19
|
assert_equal 'bar', join.right
|
20
20
|
end
|
21
21
|
|
22
|
+
it 'should create join nodes with a klass' do
|
23
|
+
join = @relation.create_join 'foo', 'bar', Arel::Nodes::FullOuterJoin
|
24
|
+
assert_kind_of Arel::Nodes::FullOuterJoin, join
|
25
|
+
assert_equal 'foo', join.left
|
26
|
+
assert_equal 'bar', join.right
|
27
|
+
end
|
28
|
+
|
22
29
|
it 'should create join nodes with a klass' do
|
23
30
|
join = @relation.create_join 'foo', 'bar', Arel::Nodes::OuterJoin
|
24
31
|
assert_kind_of Arel::Nodes::OuterJoin, join
|
@@ -26,10 +33,18 @@ module Arel
|
|
26
33
|
assert_equal 'bar', join.right
|
27
34
|
end
|
28
35
|
|
36
|
+
it 'should create join nodes with a klass' do
|
37
|
+
join = @relation.create_join 'foo', 'bar', Arel::Nodes::RightOuterJoin
|
38
|
+
assert_kind_of Arel::Nodes::RightOuterJoin, join
|
39
|
+
assert_equal 'foo', join.left
|
40
|
+
assert_equal 'bar', join.right
|
41
|
+
end
|
42
|
+
|
29
43
|
it 'should return an insert manager' do
|
30
44
|
im = @relation.compile_insert 'VALUES(NULL)'
|
31
45
|
assert_kind_of Arel::InsertManager, im
|
32
|
-
|
46
|
+
im.into Table.new(:users)
|
47
|
+
assert_equal "INSERT INTO \"users\" VALUES(NULL)", im.to_sql
|
33
48
|
end
|
34
49
|
|
35
50
|
it 'should return IM from insert_manager' do
|
@@ -52,6 +67,22 @@ module Arel
|
|
52
67
|
end
|
53
68
|
end
|
54
69
|
|
70
|
+
describe 'update_manager' do
|
71
|
+
it 'should return an update manager' do
|
72
|
+
um = @relation.update_manager
|
73
|
+
assert_kind_of Arel::UpdateManager, um
|
74
|
+
assert_equal um.engine, @relation.engine
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe 'delete_manager' do
|
79
|
+
it 'should return a delete manager' do
|
80
|
+
dm = @relation.delete_manager
|
81
|
+
assert_kind_of Arel::DeleteManager, dm
|
82
|
+
assert_equal dm.engine, @relation.engine
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
55
86
|
describe 'having' do
|
56
87
|
it 'adds a having clause' do
|
57
88
|
mgr = @relation.having @relation[:id].eq(10)
|
@@ -81,6 +112,20 @@ module Arel
|
|
81
112
|
}
|
82
113
|
end
|
83
114
|
end
|
115
|
+
|
116
|
+
describe 'join' do
|
117
|
+
it 'creates an outer join' do
|
118
|
+
right = @relation.alias
|
119
|
+
predicate = @relation[:id].eq(right[:id])
|
120
|
+
mgr = @relation.outer_join(right).on(predicate)
|
121
|
+
|
122
|
+
mgr.to_sql.must_be_like %{
|
123
|
+
SELECT FROM "users"
|
124
|
+
LEFT OUTER JOIN "users" "users_2"
|
125
|
+
ON "users"."id" = "users_2"."id"
|
126
|
+
}
|
127
|
+
end
|
128
|
+
end
|
84
129
|
end
|
85
130
|
|
86
131
|
describe 'group' do
|
@@ -130,19 +175,19 @@ module Arel
|
|
130
175
|
describe 'take' do
|
131
176
|
it "should add a limit" do
|
132
177
|
manager = @relation.take 1
|
133
|
-
manager.project SqlLiteral.new '*'
|
178
|
+
manager.project Nodes::SqlLiteral.new '*'
|
134
179
|
manager.to_sql.must_be_like %{ SELECT * FROM "users" LIMIT 1 }
|
135
180
|
end
|
136
181
|
end
|
137
182
|
|
138
183
|
describe 'project' do
|
139
184
|
it 'can project' do
|
140
|
-
manager = @relation.project SqlLiteral.new '*'
|
185
|
+
manager = @relation.project Nodes::SqlLiteral.new '*'
|
141
186
|
manager.to_sql.must_be_like %{ SELECT * FROM "users" }
|
142
187
|
end
|
143
188
|
|
144
189
|
it 'takes multiple parameters' do
|
145
|
-
manager = @relation.project SqlLiteral.new('*'), SqlLiteral.new('*')
|
190
|
+
manager = @relation.project Nodes::SqlLiteral.new('*'), Nodes::SqlLiteral.new('*')
|
146
191
|
manager.to_sql.must_be_like %{ SELECT *, * FROM "users" }
|
147
192
|
end
|
148
193
|
end
|