arel 0.1.0 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. data/.gitmodules +3 -0
  2. data/README.markdown +26 -26
  3. data/Rakefile +34 -46
  4. data/Thorfile +122 -0
  5. data/arel.gemspec +205 -201
  6. data/lib/arel.rb +11 -7
  7. data/lib/arel/algebra.rb +7 -2
  8. data/lib/arel/algebra/{primitives/attribute.rb → attribute.rb} +7 -7
  9. data/lib/arel/algebra/core_extensions.rb +4 -0
  10. data/lib/arel/algebra/{extensions → core_extensions}/class.rb +2 -2
  11. data/lib/arel/algebra/{extensions → core_extensions}/hash.rb +1 -1
  12. data/lib/arel/algebra/{extensions → core_extensions}/object.rb +1 -1
  13. data/lib/arel/algebra/{extensions → core_extensions}/symbol.rb +1 -1
  14. data/lib/arel/algebra/{primitives/expression.rb → expression.rb} +0 -0
  15. data/lib/arel/algebra/{primitives/ordering.rb → ordering.rb} +1 -1
  16. data/lib/arel/algebra/predicates.rb +32 -30
  17. data/lib/arel/algebra/relations/relation.rb +1 -1
  18. data/lib/arel/algebra/{primitives/value.rb → value.rb} +0 -0
  19. data/lib/arel/engines/memory/predicates.rb +26 -24
  20. data/lib/arel/engines/sql.rb +1 -1
  21. data/lib/arel/engines/sql/core_extensions.rb +4 -0
  22. data/lib/arel/engines/sql/{extensions → core_extensions}/array.rb +1 -1
  23. data/lib/arel/engines/sql/{extensions → core_extensions}/nil_class.rb +1 -1
  24. data/lib/arel/engines/sql/{extensions → core_extensions}/object.rb +1 -1
  25. data/lib/arel/engines/sql/{extensions → core_extensions}/range.rb +1 -1
  26. data/lib/arel/engines/sql/formatters.rb +6 -3
  27. data/lib/arel/engines/sql/predicates.rb +37 -35
  28. data/lib/arel/engines/sql/primitives.rb +10 -2
  29. data/lib/arel/engines/sql/relations/operations/join.rb +2 -2
  30. data/lib/arel/engines/sql/relations/relation.rb +33 -9
  31. data/lib/arel/engines/sql/relations/writes.rb +41 -10
  32. data/lib/arel/session.rb +9 -6
  33. data/spec/arel/algebra/unit/predicates/binary_spec.rb +23 -21
  34. data/spec/arel/algebra/unit/predicates/equality_spec.rb +20 -18
  35. data/spec/arel/algebra/unit/predicates/in_spec.rb +7 -5
  36. data/spec/arel/algebra/unit/primitives/attribute_spec.rb +10 -12
  37. data/spec/arel/algebra/unit/primitives/expression_spec.rb +1 -1
  38. data/spec/arel/algebra/unit/primitives/value_spec.rb +1 -1
  39. data/spec/arel/algebra/unit/relations/alias_spec.rb +2 -2
  40. data/spec/arel/algebra/unit/relations/delete_spec.rb +1 -1
  41. data/spec/arel/algebra/unit/relations/group_spec.rb +1 -1
  42. data/spec/arel/algebra/unit/relations/insert_spec.rb +1 -1
  43. data/spec/arel/algebra/unit/relations/join_spec.rb +1 -1
  44. data/spec/arel/algebra/unit/relations/order_spec.rb +2 -2
  45. data/spec/arel/algebra/unit/relations/project_spec.rb +1 -1
  46. data/spec/arel/algebra/unit/relations/relation_spec.rb +5 -5
  47. data/spec/arel/algebra/unit/relations/skip_spec.rb +1 -1
  48. data/spec/arel/algebra/unit/relations/table_spec.rb +2 -2
  49. data/spec/arel/algebra/unit/relations/take_spec.rb +1 -1
  50. data/spec/arel/algebra/unit/relations/update_spec.rb +1 -1
  51. data/spec/arel/algebra/unit/relations/where_spec.rb +1 -1
  52. data/spec/arel/algebra/unit/session/session_spec.rb +1 -1
  53. data/spec/arel/engines/memory/integration/joins/cross_engine_spec.rb +3 -4
  54. data/spec/arel/engines/memory/unit/relations/array_spec.rb +1 -1
  55. data/spec/arel/engines/memory/unit/relations/insert_spec.rb +8 -8
  56. data/spec/arel/engines/memory/unit/relations/join_spec.rb +1 -1
  57. data/spec/arel/engines/memory/unit/relations/order_spec.rb +1 -1
  58. data/spec/arel/engines/memory/unit/relations/project_spec.rb +1 -1
  59. data/spec/arel/engines/memory/unit/relations/skip_spec.rb +1 -1
  60. data/spec/arel/engines/memory/unit/relations/take_spec.rb +1 -1
  61. data/spec/arel/engines/memory/unit/relations/where_spec.rb +1 -1
  62. data/spec/arel/engines/sql/integration/joins/with_adjacency_spec.rb +1 -1
  63. data/spec/arel/engines/sql/integration/joins/with_aggregations_spec.rb +1 -1
  64. data/spec/arel/engines/sql/integration/joins/with_compounds_spec.rb +1 -1
  65. data/spec/arel/engines/sql/unit/engine_spec.rb +1 -1
  66. data/spec/arel/engines/sql/unit/predicates/binary_spec.rb +73 -70
  67. data/spec/arel/engines/sql/unit/predicates/equality_spec.rb +45 -28
  68. data/spec/arel/engines/sql/unit/predicates/in_spec.rb +57 -55
  69. data/spec/arel/engines/sql/unit/predicates/predicates_spec.rb +48 -46
  70. data/spec/arel/engines/sql/unit/primitives/attribute_spec.rb +1 -1
  71. data/spec/arel/engines/sql/unit/primitives/expression_spec.rb +1 -1
  72. data/spec/arel/engines/sql/unit/primitives/literal_spec.rb +13 -1
  73. data/spec/arel/engines/sql/unit/primitives/value_spec.rb +3 -3
  74. data/spec/arel/engines/sql/unit/relations/alias_spec.rb +1 -1
  75. data/spec/arel/engines/sql/unit/relations/delete_spec.rb +1 -1
  76. data/spec/arel/engines/sql/unit/relations/group_spec.rb +1 -1
  77. data/spec/arel/engines/sql/unit/relations/insert_spec.rb +1 -1
  78. data/spec/arel/engines/sql/unit/relations/join_spec.rb +1 -1
  79. data/spec/arel/engines/sql/unit/relations/order_spec.rb +1 -1
  80. data/spec/arel/engines/sql/unit/relations/project_spec.rb +1 -1
  81. data/spec/arel/engines/sql/unit/relations/skip_spec.rb +1 -1
  82. data/spec/arel/engines/sql/unit/relations/table_spec.rb +1 -1
  83. data/spec/arel/engines/sql/unit/relations/take_spec.rb +1 -1
  84. data/spec/arel/engines/sql/unit/relations/update_spec.rb +13 -7
  85. data/spec/arel/engines/sql/unit/relations/where_spec.rb +1 -1
  86. data/spec/connections/mysql_connection.rb +3 -3
  87. data/spec/connections/postgresql_connection.rb +2 -2
  88. data/spec/connections/sqlite3_connection.rb +3 -2
  89. data/spec/doubles/hash.rb +4 -0
  90. data/spec/spec.opts +3 -0
  91. data/spec/spec_helper.rb +8 -0
  92. metadata +39 -25
  93. data/VERSION +0 -1
  94. data/lib/arel/algebra/extensions.rb +0 -4
  95. data/lib/arel/algebra/primitives.rb +0 -5
  96. data/lib/arel/engines/sql/extensions.rb +0 -4
@@ -1,83 +1,85 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
- describe In do
5
- before do
6
- @relation = Table.new(:users)
7
- @attribute = @relation[:id]
8
- end
4
+ module Predicates
5
+ describe In do
6
+ before do
7
+ @relation = Table.new(:users)
8
+ @attribute = @relation[:id]
9
+ end
9
10
 
10
- describe '#to_sql' do
11
- describe 'when relating to an array' do
12
- describe 'when the array\'s elements are the same type as the attribute' do
13
- before do
14
- @array = [1, 2, 3]
15
- end
11
+ describe '#to_sql' do
12
+ describe 'when relating to an array' do
13
+ describe 'when the array\'s elements are the same type as the attribute' do
14
+ before do
15
+ @array = [1, 2, 3]
16
+ end
16
17
 
17
- it 'manufactures sql with a comma separated list' do
18
- sql = In.new(@attribute, @array).to_sql
18
+ it 'manufactures sql with a comma separated list' do
19
+ sql = In.new(@attribute, @array).to_sql
19
20
 
20
- adapter_is :mysql do
21
- sql.should be_like(%Q{`users`.`id` IN (1, 2, 3)})
21
+ adapter_is :mysql do
22
+ sql.should be_like(%Q{`users`.`id` IN (1, 2, 3)})
23
+ end
24
+
25
+ adapter_is_not :mysql do
26
+ sql.should be_like(%Q{"users"."id" IN (1, 2, 3)})
27
+ end
22
28
  end
29
+ end
23
30
 
24
- adapter_is_not :mysql do
25
- sql.should be_like(%Q{"users"."id" IN (1, 2, 3)})
31
+ describe 'when the array\'s elements are not same type as the attribute' do
32
+ before do
33
+ @array = ['1-asdf', 2, 3]
34
+ end
35
+
36
+ it 'formats values in the array as the type of the attribute' do
37
+ sql = In.new(@attribute, @array).to_sql
38
+
39
+ adapter_is :mysql do
40
+ sql.should be_like(%Q{`users`.`id` IN (1, 2, 3)})
41
+ end
42
+
43
+ adapter_is_not :mysql do
44
+ sql.should be_like(%Q{"users"."id" IN (1, 2, 3)})
45
+ end
26
46
  end
27
47
  end
28
48
  end
29
49
 
30
- describe 'when the array\'s elements are not same type as the attribute' do
50
+ describe 'when relating to a range' do
31
51
  before do
32
- @array = ['1-asdf', 2, 3]
52
+ @range = 1..2
33
53
  end
34
54
 
35
- it 'formats values in the array as the type of the attribute' do
36
- sql = In.new(@attribute, @array).to_sql
55
+ it 'manufactures sql with a between' do
56
+ sql = In.new(@attribute, @range).to_sql
37
57
 
38
58
  adapter_is :mysql do
39
- sql.should be_like(%Q{`users`.`id` IN (1, 2, 3)})
59
+ sql.should be_like(%Q{`users`.`id` BETWEEN 1 AND 2})
40
60
  end
41
61
 
42
62
  adapter_is_not :mysql do
43
- sql.should be_like(%Q{"users"."id" IN (1, 2, 3)})
63
+ sql.should be_like(%Q{"users"."id" BETWEEN 1 AND 2})
44
64
  end
45
65
  end
46
66
  end
47
- end
48
-
49
- describe 'when relating to a range' do
50
- before do
51
- @range = 1..2
52
- end
53
-
54
- it 'manufactures sql with a between' do
55
- sql = In.new(@attribute, @range).to_sql
56
-
57
- adapter_is :mysql do
58
- sql.should be_like(%Q{`users`.`id` BETWEEN 1 AND 2})
59
- end
60
-
61
- adapter_is_not :mysql do
62
- sql.should be_like(%Q{"users"."id" BETWEEN 1 AND 2})
63
- end
64
- end
65
- end
66
67
 
67
- describe 'when relating to a relation' do
68
- it 'manufactures sql with a subselect' do
69
- sql = In.new(@attribute, @relation).to_sql
68
+ describe 'when relating to a relation' do
69
+ it 'manufactures sql with a subselect' do
70
+ sql = In.new(@attribute, @relation).to_sql
70
71
 
71
- adapter_is :mysql do
72
- sql.should be_like(%Q{
73
- `users`.`id` IN (SELECT `users`.`id`, `users`.`name` FROM `users`)
74
- })
75
- end
72
+ adapter_is :mysql do
73
+ sql.should be_like(%Q{
74
+ `users`.`id` IN (SELECT `users`.`id`, `users`.`name` FROM `users`)
75
+ })
76
+ end
76
77
 
77
- adapter_is_not :mysql do
78
- sql.should be_like(%Q{
79
- "users"."id" IN (SELECT "users"."id", "users"."name" FROM "users")
80
- })
78
+ adapter_is_not :mysql do
79
+ sql.should be_like(%Q{
80
+ "users"."id" IN (SELECT "users"."id", "users"."name" FROM "users")
81
+ })
82
+ end
81
83
  end
82
84
  end
83
85
  end
@@ -1,62 +1,64 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
- describe Predicate do
5
- before do
6
- @relation = Table.new(:users)
7
- @attribute1 = @relation[:id]
8
- @attribute2 = @relation[:name]
9
- @operand1 = Equality.new(@attribute1, 1)
10
- @operand2 = Equality.new(@attribute2, "name")
11
- end
4
+ module Predicates
5
+ describe Predicate do
6
+ before do
7
+ @relation = Table.new(:users)
8
+ @attribute1 = @relation[:id]
9
+ @attribute2 = @relation[:name]
10
+ @operand1 = Equality.new(@attribute1, 1)
11
+ @operand2 = Equality.new(@attribute2, "name")
12
+ end
12
13
 
13
- describe "when being combined with another predicate with AND logic" do
14
- describe "#to_sql" do
15
- it "manufactures sql with an AND operation" do
16
- sql = @operand1.and(@operand2).to_sql
14
+ describe "when being combined with another predicate with AND logic" do
15
+ describe "#to_sql" do
16
+ it "manufactures sql with an AND operation" do
17
+ sql = @operand1.and(@operand2).to_sql
17
18
 
18
- adapter_is :mysql do
19
- sql.should be_like(%Q{
20
- (`users`.`id` = 1 AND `users`.`name` = 'name')
21
- })
22
- end
19
+ adapter_is :mysql do
20
+ sql.should be_like(%Q{
21
+ (`users`.`id` = 1 AND `users`.`name` = 'name')
22
+ })
23
+ end
23
24
 
24
- adapter_is :sqlite3 do
25
- sql.should be_like(%Q{
26
- ("users"."id" = 1 AND "users"."name" = 'name')
27
- })
28
- end
25
+ adapter_is :sqlite3 do
26
+ sql.should be_like(%Q{
27
+ ("users"."id" = 1 AND "users"."name" = 'name')
28
+ })
29
+ end
29
30
 
30
- adapter_is :postgresql do
31
- sql.should be_like(%Q{
32
- ("users"."id" = 1 AND "users"."name" = E'name')
33
- })
31
+ adapter_is :postgresql do
32
+ sql.should be_like(%Q{
33
+ ("users"."id" = 1 AND "users"."name" = E'name')
34
+ })
35
+ end
34
36
  end
35
37
  end
36
38
  end
37
- end
38
39
 
39
- describe "when being combined with another predicate with OR logic" do
40
- describe "#to_sql" do
41
- it "manufactures sql with an OR operation" do
42
- sql = @operand1.or(@operand2).to_sql
40
+ describe "when being combined with another predicate with OR logic" do
41
+ describe "#to_sql" do
42
+ it "manufactures sql with an OR operation" do
43
+ sql = @operand1.or(@operand2).to_sql
43
44
 
44
- adapter_is :mysql do
45
- sql.should be_like(%Q{
46
- (`users`.`id` = 1 OR `users`.`name` = 'name')
47
- })
48
- end
45
+ adapter_is :mysql do
46
+ sql.should be_like(%Q{
47
+ (`users`.`id` = 1 OR `users`.`name` = 'name')
48
+ })
49
+ end
49
50
 
50
- adapter_is :sqlite3 do
51
- sql.should be_like(%Q{
52
- ("users"."id" = 1 OR "users"."name" = 'name')
53
- })
54
- end
51
+ adapter_is :sqlite3 do
52
+ sql.should be_like(%Q{
53
+ ("users"."id" = 1 OR "users"."name" = 'name')
54
+ })
55
+ end
55
56
 
56
- adapter_is :postgresql do
57
- sql.should be_like(%Q{
58
- ("users"."id" = 1 OR "users"."name" = E'name')
59
- })
57
+ adapter_is :postgresql do
58
+ sql.should be_like(%Q{
59
+ ("users"."id" = 1 OR "users"."name" = E'name')
60
+ })
61
+ end
60
62
  end
61
63
  end
62
64
  end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Attribute do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Expression do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe SqlLiteral do
@@ -18,6 +18,18 @@ module Arel
18
18
  sql.should be_like(%Q{SELECT COUNT(*) AS count_id FROM "users"})
19
19
  end
20
20
  end
21
+
22
+ it "manufactures expressions on literal SQL fragment" do
23
+ sql = @relation.project(SqlLiteral.new("2 * credit_limit").sum).to_sql
24
+
25
+ adapter_is :mysql do
26
+ sql.should be_like(%Q{SELECT SUM(2 * credit_limit) AS sum_id FROM `users`})
27
+ end
28
+
29
+ adapter_is_not :mysql do
30
+ sql.should be_like(%Q{SELECT SUM(2 * credit_limit) AS sum_id FROM "users"})
31
+ end
32
+ end
21
33
  end
22
34
  end
23
35
  end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Value do
@@ -9,11 +9,11 @@ module Arel
9
9
  describe '#to_sql' do
10
10
  it "appropriately quotes the value" do
11
11
  Value.new(1, @relation).to_sql.should be_like('1')
12
-
12
+
13
13
  adapter_is_not :postgresql do
14
14
  Value.new('asdf', @relation).to_sql.should be_like("'asdf'")
15
15
  end
16
-
16
+
17
17
  adapter_is :postgresql do
18
18
  Value.new('asdf', @relation).to_sql.should be_like("E'asdf'")
19
19
  end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Alias do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Deletion do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Group do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Insert do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Join do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Order do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Project do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Skip do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Table do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Take do
@@ -1,4 +1,10 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
+
3
+ class User
4
+ def self.primary_key
5
+ "id"
6
+ end
7
+ end
2
8
 
3
9
  module Arel
4
10
  describe Update do
@@ -45,17 +51,17 @@ module Arel
45
51
 
46
52
  adapter_is :sqlite3 do
47
53
  sql.should be_like(%Q{
48
- UPDATE "users"
49
- SET "name" = 'nick'
50
- LIMIT 1
54
+ UPDATE "users" SET
55
+ "name" = 'nick'
56
+ WHERE "id" IN (SELECT "id" FROM "users" LIMIT 1)
51
57
  })
52
58
  end
53
59
 
54
60
  adapter_is :postgresql do
55
61
  sql.should be_like(%Q{
56
- UPDATE "users"
57
- SET "name" = E'nick'
58
- LIMIT 1
62
+ UPDATE "users" SET
63
+ "name" = E'nick'
64
+ WHERE "id" IN (SELECT "id" FROM "users" LIMIT 1)
59
65
  })
60
66
  end
61
67
  end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Where do
@@ -1,13 +1,13 @@
1
- require "rubygems"
2
- require "activerecord"
3
1
  puts "Using native MySQL"
2
+ require "active_record"
3
+ require 'logger'
4
4
 
5
5
  ActiveRecord::Base.logger = Logger.new("debug.log")
6
6
 
7
7
  ActiveRecord::Base.configurations = {
8
8
  'unit' => {
9
9
  :adapter => 'mysql',
10
- :username => 'rails',
10
+ :username => 'root',
11
11
  :encoding => 'utf8',
12
12
  :database => 'arel_unit',
13
13
  }
@@ -1,6 +1,6 @@
1
- require "rubygems"
2
- require "activerecord"
3
1
  puts "Using native PostgreSQL"
2
+ require "active_record"
3
+ require 'logger'
4
4
 
5
5
  ActiveRecord::Base.logger = Logger.new("debug.log")
6
6