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