arel 5.0.1.20140414130214 → 6.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +4 -2
  3. data/History.txt +9 -4
  4. data/Manifest.txt +9 -7
  5. data/README.markdown +85 -8
  6. data/Rakefile +1 -1
  7. data/arel.gemspec +15 -16
  8. data/lib/arel.rb +1 -12
  9. data/lib/arel/collectors/bind.rb +36 -0
  10. data/lib/arel/collectors/plain_string.rb +18 -0
  11. data/lib/arel/collectors/sql_string.rb +18 -0
  12. data/lib/arel/factory_methods.rb +1 -1
  13. data/lib/arel/insert_manager.rb +5 -1
  14. data/lib/arel/nodes.rb +41 -0
  15. data/lib/arel/nodes/and.rb +1 -5
  16. data/lib/arel/nodes/binary.rb +2 -0
  17. data/lib/arel/nodes/extract.rb +0 -2
  18. data/lib/arel/nodes/full_outer_join.rb +6 -0
  19. data/lib/arel/nodes/function.rb +0 -1
  20. data/lib/arel/nodes/insert_statement.rb +5 -2
  21. data/lib/arel/nodes/node.rb +5 -1
  22. data/lib/arel/nodes/right_outer_join.rb +6 -0
  23. data/lib/arel/nodes/window.rb +23 -5
  24. data/lib/arel/predications.rb +41 -33
  25. data/lib/arel/select_manager.rb +13 -37
  26. data/lib/arel/table.rb +13 -9
  27. data/lib/arel/tree_manager.rb +8 -2
  28. data/lib/arel/update_manager.rb +2 -2
  29. data/lib/arel/visitors.rb +0 -2
  30. data/lib/arel/visitors/bind_substitute.rb +9 -0
  31. data/lib/arel/visitors/bind_visitor.rb +10 -5
  32. data/lib/arel/visitors/depth_first.rb +60 -57
  33. data/lib/arel/visitors/dot.rb +84 -80
  34. data/lib/arel/visitors/ibm_db.rb +4 -2
  35. data/lib/arel/visitors/informix.rb +39 -21
  36. data/lib/arel/visitors/mssql.rb +41 -23
  37. data/lib/arel/visitors/mysql.rb +48 -22
  38. data/lib/arel/visitors/oracle.rb +33 -24
  39. data/lib/arel/visitors/postgresql.rb +15 -8
  40. data/lib/arel/visitors/reduce.rb +25 -0
  41. data/lib/arel/visitors/sqlite.rb +3 -2
  42. data/lib/arel/visitors/to_sql.rb +455 -248
  43. data/lib/arel/visitors/visitor.rb +2 -2
  44. data/lib/arel/visitors/where_sql.rb +3 -2
  45. data/test/attributes/test_attribute.rb +12 -3
  46. data/test/collectors/test_bind_collector.rb +70 -0
  47. data/test/collectors/test_sql_string.rb +38 -0
  48. data/test/helper.rb +10 -1
  49. data/test/nodes/test_bin.rb +2 -2
  50. data/test/nodes/test_count.rb +0 -6
  51. data/test/nodes/test_equality.rb +1 -1
  52. data/test/nodes/test_grouping.rb +1 -1
  53. data/test/nodes/test_infix_operation.rb +1 -1
  54. data/test/nodes/test_select_core.rb +7 -7
  55. data/test/nodes/test_sql_literal.rb +10 -6
  56. data/test/nodes/test_window.rb +9 -3
  57. data/test/support/fake_record.rb +16 -4
  58. data/test/test_factory_methods.rb +1 -1
  59. data/test/test_insert_manager.rb +33 -4
  60. data/test/test_select_manager.rb +164 -92
  61. data/test/test_table.rb +49 -4
  62. data/test/visitors/test_bind_visitor.rb +18 -10
  63. data/test/visitors/test_depth_first.rb +12 -0
  64. data/test/visitors/test_dot.rb +4 -4
  65. data/test/visitors/test_ibm_db.rb +11 -5
  66. data/test/visitors/test_informix.rb +14 -8
  67. data/test/visitors/test_mssql.rb +12 -8
  68. data/test/visitors/test_mysql.rb +17 -12
  69. data/test/visitors/test_oracle.rb +25 -21
  70. data/test/visitors/test_postgres.rb +50 -12
  71. data/test/visitors/test_sqlite.rb +2 -2
  72. data/test/visitors/test_to_sql.rb +177 -81
  73. metadata +24 -19
  74. data/lib/arel/deprecated.rb +0 -4
  75. data/lib/arel/expression.rb +0 -5
  76. data/lib/arel/sql/engine.rb +0 -10
  77. data/lib/arel/sql_literal.rb +0 -4
  78. data/lib/arel/visitors/join_sql.rb +0 -19
  79. data/lib/arel/visitors/order_clauses.rb +0 -11
  80. data/test/visitors/test_join_sql.rb +0 -42
@@ -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, :engine => Table.engine, :as => 'foo'
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, :engine => Table.engine, :as => 'foo'
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, :engine => Table.engine, :as => 'foo'
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
- ast = mgr.ast
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
- it 'returns join sql' do
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
- manager.join_sql.must_be_like %{
584
- INNER JOIN "users" "users_2" "users"."id" = "users_2"."id"
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
- manager.join_sql.must_be_like %{
594
- LEFT OUTER JOIN "users" "users_2" "users"."id" = "users_2"."id"
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 'returns string join sql' do
616
- manager = Arel::SelectManager.new Table.engine
617
- manager.from Nodes::StringJoin.new('hello')
618
- manager.join_sql.must_be_like %{ 'hello' }
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
- it 'returns nil join sql' do
622
- manager = Arel::SelectManager.new Table.engine
623
- manager.join_sql.must_be_nil
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
- describe 'order_clauses' do
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 table
632
- manager.order table[:id]
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
@@ -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
- assert_equal 'INSERT INTO NULL VALUES(NULL)', im.to_sql
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