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.
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