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,10 +1,14 @@
1
- $LOAD_PATH.unshift(File.dirname(__FILE__))
1
+ require 'active_support/inflector'
2
+ require 'active_support/core_ext/module/delegation'
3
+ require 'active_support/core_ext/class/attribute_accessors'
2
4
 
3
- require 'rubygems'
4
- require 'activesupport'
5
- require 'activerecord'
5
+ require 'active_record'
6
6
  require 'active_record/connection_adapters/abstract/quoting'
7
7
 
8
- require 'arel/algebra'
9
- require 'arel/engines'
10
- require 'arel/session'
8
+ module Arel
9
+ require 'arel/algebra'
10
+ require 'arel/engines'
11
+ autoload :Session, 'arel/session'
12
+
13
+ VERSION = "0.1.2"
14
+ end
@@ -1,4 +1,9 @@
1
- require 'arel/algebra/extensions'
1
+ require 'arel/algebra/core_extensions'
2
+
3
+ require 'arel/algebra/attribute'
4
+ require 'arel/algebra/expression'
5
+ require 'arel/algebra/ordering'
2
6
  require 'arel/algebra/predicates'
3
7
  require 'arel/algebra/relations'
4
- require 'arel/algebra/primitives'
8
+ require 'arel/algebra/value'
9
+
@@ -82,31 +82,31 @@ module Arel
82
82
 
83
83
  module Predications
84
84
  def eq(other)
85
- Equality.new(self, other)
85
+ Predicates::Equality.new(self, other)
86
86
  end
87
87
 
88
88
  def lt(other)
89
- LessThan.new(self, other)
89
+ Predicates::LessThan.new(self, other)
90
90
  end
91
91
 
92
92
  def lteq(other)
93
- LessThanOrEqualTo.new(self, other)
93
+ Predicates::LessThanOrEqualTo.new(self, other)
94
94
  end
95
95
 
96
96
  def gt(other)
97
- GreaterThan.new(self, other)
97
+ Predicates::GreaterThan.new(self, other)
98
98
  end
99
99
 
100
100
  def gteq(other)
101
- GreaterThanOrEqualTo.new(self, other)
101
+ Predicates::GreaterThanOrEqualTo.new(self, other)
102
102
  end
103
103
 
104
104
  def matches(regexp)
105
- Match.new(self, regexp)
105
+ Predicates::Match.new(self, regexp)
106
106
  end
107
107
 
108
108
  def in(array)
109
- In.new(self, array)
109
+ Predicates::In.new(self, array)
110
110
  end
111
111
  end
112
112
  include Predications
@@ -0,0 +1,4 @@
1
+ require 'arel/algebra/core_extensions/object'
2
+ require 'arel/algebra/core_extensions/class'
3
+ require 'arel/algebra/core_extensions/symbol'
4
+ require 'arel/algebra/core_extensions/hash'
@@ -2,7 +2,7 @@ module Arel
2
2
  module ClassExtensions
3
3
  def attributes(*attrs)
4
4
  @attributes = attrs
5
- attr_reader *attrs
5
+ attr_reader(*attrs)
6
6
  end
7
7
 
8
8
  def deriving(*methods)
@@ -25,7 +25,7 @@ module Arel
25
25
  }
26
26
  class_eval methods[method_name], __FILE__, __LINE__
27
27
  end
28
-
28
+
29
29
  Class.send(:include, self)
30
30
  end
31
31
  end
@@ -5,7 +5,7 @@ module Arel
5
5
  bound.merge(key.bind(relation) => value.bind(relation))
6
6
  end
7
7
  end
8
-
8
+
9
9
  Hash.send(:include, self)
10
10
  end
11
11
  end
@@ -11,7 +11,7 @@ module Arel
11
11
  def let
12
12
  yield(self)
13
13
  end
14
-
14
+
15
15
  Object.send(:include, self)
16
16
  end
17
17
  end
@@ -3,7 +3,7 @@ module Arel
3
3
  def to_attribute(relation)
4
4
  Arel::Attribute.new(relation, self)
5
5
  end
6
-
6
+
7
7
  Symbol.send(:include, self)
8
8
  end
9
9
  end
@@ -15,7 +15,7 @@ module Arel
15
15
  attributes :attribute
16
16
  deriving :initialize, :==
17
17
  end
18
-
18
+
19
19
  class Descending < Ordering
20
20
  attributes :attribute
21
21
  deriving :initialize, :==
@@ -1,41 +1,43 @@
1
1
  module Arel
2
- class Predicate
3
- def or(other_predicate)
4
- Or.new(self, other_predicate)
5
- end
2
+ module Predicates
3
+ class Predicate
4
+ def or(other_predicate)
5
+ Or.new(self, other_predicate)
6
+ end
6
7
 
7
- def and(other_predicate)
8
- And.new(self, other_predicate)
8
+ def and(other_predicate)
9
+ And.new(self, other_predicate)
10
+ end
9
11
  end
10
- end
11
12
 
12
- class Binary < Predicate
13
- attributes :operand1, :operand2
14
- deriving :initialize
13
+ class Binary < Predicate
14
+ attributes :operand1, :operand2
15
+ deriving :initialize
15
16
 
16
- def ==(other)
17
- self.class === other and
18
- @operand1 == other.operand1 and
19
- @operand2 == other.operand2
20
- end
17
+ def ==(other)
18
+ self.class === other and
19
+ @operand1 == other.operand1 and
20
+ @operand2 == other.operand2
21
+ end
21
22
 
22
- def bind(relation)
23
- self.class.new(operand1.find_correlate_in(relation), operand2.find_correlate_in(relation))
23
+ def bind(relation)
24
+ self.class.new(operand1.find_correlate_in(relation), operand2.find_correlate_in(relation))
25
+ end
24
26
  end
25
- end
26
27
 
27
- class Equality < Binary
28
- def ==(other)
29
- Equality === other and
30
- ((operand1 == other.operand1 and operand2 == other.operand2) or
31
- (operand1 == other.operand2 and operand2 == other.operand1))
28
+ class Equality < Binary
29
+ def ==(other)
30
+ Equality === other and
31
+ ((operand1 == other.operand1 and operand2 == other.operand2) or
32
+ (operand1 == other.operand2 and operand2 == other.operand1))
33
+ end
32
34
  end
33
- end
34
35
 
35
- class GreaterThanOrEqualTo < Binary; end
36
- class GreaterThan < Binary; end
37
- class LessThanOrEqualTo < Binary; end
38
- class LessThan < Binary; end
39
- class Match < Binary; end
40
- class In < Binary; end
36
+ class GreaterThanOrEqualTo < Binary; end
37
+ class GreaterThan < Binary; end
38
+ class LessThanOrEqualTo < Binary; end
39
+ class LessThan < Binary; end
40
+ class Match < Binary; end
41
+ class In < Binary; end
42
+ end
41
43
  end
@@ -110,7 +110,7 @@ module Arel
110
110
  private
111
111
  def matching_attributes(attribute)
112
112
  (@matching_attributes ||= attributes.inject({}) do |hash, a|
113
- (hash[a.root] ||= []) << a
113
+ (hash[a.is_a?(Value) ? a.value : a.root] ||= []) << a
114
114
  hash
115
115
  end)[attribute.root] || []
116
116
  end
@@ -1,35 +1,37 @@
1
1
  module Arel
2
- class Binary < Predicate
3
- def eval(row)
4
- operand1.eval(row).send(operator, operand2.eval(row))
2
+ module Predicates
3
+ class Binary < Predicate
4
+ def eval(row)
5
+ operand1.eval(row).send(operator, operand2.eval(row))
6
+ end
5
7
  end
6
- end
7
8
 
8
- class Equality < Binary
9
- def operator; :== end
10
- end
9
+ class Equality < Binary
10
+ def operator; :== end
11
+ end
11
12
 
12
- class GreaterThanOrEqualTo < Binary
13
- def operator; :>= end
14
- end
13
+ class GreaterThanOrEqualTo < Binary
14
+ def operator; :>= end
15
+ end
15
16
 
16
- class GreaterThan < Binary
17
- def operator; :> end
18
- end
17
+ class GreaterThan < Binary
18
+ def operator; :> end
19
+ end
19
20
 
20
- class LessThanOrEqualTo < Binary
21
- def operator; :<= end
22
- end
21
+ class LessThanOrEqualTo < Binary
22
+ def operator; :<= end
23
+ end
23
24
 
24
- class LessThan < Binary
25
- def operator; :< end
26
- end
25
+ class LessThan < Binary
26
+ def operator; :< end
27
+ end
27
28
 
28
- class Match < Binary
29
- def operator; :=~ end
30
- end
29
+ class Match < Binary
30
+ def operator; :=~ end
31
+ end
31
32
 
32
- class In < Binary
33
- def operator; :include? end
33
+ class In < Binary
34
+ def operator; :include? end
35
+ end
34
36
  end
35
37
  end
@@ -3,5 +3,5 @@ require 'arel/engines/sql/relations'
3
3
  require 'arel/engines/sql/primitives'
4
4
  require 'arel/engines/sql/predicates'
5
5
  require 'arel/engines/sql/formatters'
6
- require 'arel/engines/sql/extensions'
6
+ require 'arel/engines/sql/core_extensions'
7
7
  require 'arel/engines/sql/christener'
@@ -0,0 +1,4 @@
1
+ require 'arel/engines/sql/core_extensions/object'
2
+ require 'arel/engines/sql/core_extensions/array'
3
+ require 'arel/engines/sql/core_extensions/range'
4
+ require 'arel/engines/sql/core_extensions/nil_class'
@@ -8,7 +8,7 @@ module Arel
8
8
  def inclusion_predicate_sql
9
9
  "IN"
10
10
  end
11
-
11
+
12
12
  Array.send(:include, self)
13
13
  end
14
14
  end
@@ -4,7 +4,7 @@ module Arel
4
4
  def equality_predicate_sql
5
5
  'IS'
6
6
  end
7
-
7
+
8
8
  NilClass.send(:include, self)
9
9
  end
10
10
  end
@@ -8,7 +8,7 @@ module Arel
8
8
  def equality_predicate_sql
9
9
  '='
10
10
  end
11
-
11
+
12
12
  Object.send(:include, self)
13
13
  end
14
14
  end
@@ -8,7 +8,7 @@ module Arel
8
8
  def inclusion_predicate_sql
9
9
  "BETWEEN"
10
10
  end
11
-
11
+
12
12
  Range.send(:include, self)
13
13
  end
14
14
  end
@@ -13,7 +13,6 @@ module Arel
13
13
 
14
14
  class SelectClause < Formatter
15
15
  def attribute(attribute)
16
- # FIXME this should check that the column exists
17
16
  "#{quote_table_name(name_for(attribute.original_relation))}.#{quote_column_name(attribute.name)}" +
18
17
  (attribute.alias ? " AS #{quote(attribute.alias.to_s)}" : "")
19
18
  end
@@ -92,8 +91,12 @@ module Arel
92
91
  end
93
92
 
94
93
  def table(table)
95
- quote_table_name(table.name) +
96
- (table.name != name_for(table) ? " AS " + quote_table_name(name_for(table)) : '')
94
+ if table.name =~ /\s/
95
+ table.name
96
+ else
97
+ quote_table_name(table.name) +
98
+ (table.name != name_for(table) ? " AS " + quote_table_name(name_for(table)) : '')
99
+ end
97
100
  end
98
101
  end
99
102
 
@@ -1,51 +1,53 @@
1
1
  module Arel
2
- class Binary < Predicate
3
- def to_sql(formatter = nil)
4
- "#{operand1.to_sql} #{predicate_sql} #{operand1.format(operand2)}"
2
+ module Predicates
3
+ class Binary < Predicate
4
+ def to_sql(formatter = nil)
5
+ "#{operand1.to_sql} #{predicate_sql} #{operand1.format(operand2)}"
6
+ end
5
7
  end
6
- end
7
8
 
8
- class CompoundPredicate < Binary
9
- def to_sql(formatter = nil)
10
- "(#{operand1.to_sql(formatter)} #{predicate_sql} #{operand2.to_sql(formatter)})"
9
+ class CompoundPredicate < Binary
10
+ def to_sql(formatter = nil)
11
+ "(#{operand1.to_sql(formatter)} #{predicate_sql} #{operand2.to_sql(formatter)})"
12
+ end
11
13
  end
12
- end
13
14
 
14
- class Or < CompoundPredicate
15
- def predicate_sql; "OR" end
16
- end
15
+ class Or < CompoundPredicate
16
+ def predicate_sql; "OR" end
17
+ end
17
18
 
18
- class And < CompoundPredicate
19
- def predicate_sql; "AND" end
20
- end
19
+ class And < CompoundPredicate
20
+ def predicate_sql; "AND" end
21
+ end
21
22
 
22
- class Equality < Binary
23
- def predicate_sql
24
- operand2.equality_predicate_sql
23
+ class Equality < Binary
24
+ def predicate_sql
25
+ operand2.equality_predicate_sql
26
+ end
25
27
  end
26
- end
27
28
 
28
- class GreaterThanOrEqualTo < Binary
29
- def predicate_sql; '>=' end
30
- end
29
+ class GreaterThanOrEqualTo < Binary
30
+ def predicate_sql; '>=' end
31
+ end
31
32
 
32
- class GreaterThan < Binary
33
- def predicate_sql; '>' end
34
- end
33
+ class GreaterThan < Binary
34
+ def predicate_sql; '>' end
35
+ end
35
36
 
36
- class LessThanOrEqualTo < Binary
37
- def predicate_sql; '<=' end
38
- end
37
+ class LessThanOrEqualTo < Binary
38
+ def predicate_sql; '<=' end
39
+ end
39
40
 
40
- class LessThan < Binary
41
- def predicate_sql; '<' end
42
- end
41
+ class LessThan < Binary
42
+ def predicate_sql; '<' end
43
+ end
43
44
 
44
- class Match < Binary
45
- def predicate_sql; 'LIKE' end
46
- end
45
+ class Match < Binary
46
+ def predicate_sql; 'LIKE' end
47
+ end
47
48
 
48
- class In < Binary
49
- def predicate_sql; operand2.inclusion_predicate_sql end
49
+ class In < Binary
50
+ def predicate_sql; operand2.inclusion_predicate_sql end
51
+ end
50
52
  end
51
53
  end