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