arel 0.1.0 → 0.1.2

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