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.
- data/.gitmodules +3 -0
- data/README.markdown +26 -26
- data/Rakefile +34 -46
- data/Thorfile +122 -0
- data/arel.gemspec +205 -201
- data/lib/arel.rb +11 -7
- data/lib/arel/algebra.rb +7 -2
- data/lib/arel/algebra/{primitives/attribute.rb → attribute.rb} +7 -7
- data/lib/arel/algebra/core_extensions.rb +4 -0
- data/lib/arel/algebra/{extensions → core_extensions}/class.rb +2 -2
- data/lib/arel/algebra/{extensions → core_extensions}/hash.rb +1 -1
- data/lib/arel/algebra/{extensions → core_extensions}/object.rb +1 -1
- data/lib/arel/algebra/{extensions → core_extensions}/symbol.rb +1 -1
- data/lib/arel/algebra/{primitives/expression.rb → expression.rb} +0 -0
- data/lib/arel/algebra/{primitives/ordering.rb → ordering.rb} +1 -1
- data/lib/arel/algebra/predicates.rb +32 -30
- data/lib/arel/algebra/relations/relation.rb +1 -1
- data/lib/arel/algebra/{primitives/value.rb → value.rb} +0 -0
- data/lib/arel/engines/memory/predicates.rb +26 -24
- data/lib/arel/engines/sql.rb +1 -1
- data/lib/arel/engines/sql/core_extensions.rb +4 -0
- data/lib/arel/engines/sql/{extensions → core_extensions}/array.rb +1 -1
- data/lib/arel/engines/sql/{extensions → core_extensions}/nil_class.rb +1 -1
- data/lib/arel/engines/sql/{extensions → core_extensions}/object.rb +1 -1
- data/lib/arel/engines/sql/{extensions → core_extensions}/range.rb +1 -1
- data/lib/arel/engines/sql/formatters.rb +6 -3
- data/lib/arel/engines/sql/predicates.rb +37 -35
- data/lib/arel/engines/sql/primitives.rb +10 -2
- data/lib/arel/engines/sql/relations/operations/join.rb +2 -2
- data/lib/arel/engines/sql/relations/relation.rb +33 -9
- data/lib/arel/engines/sql/relations/writes.rb +41 -10
- data/lib/arel/session.rb +9 -6
- data/spec/arel/algebra/unit/predicates/binary_spec.rb +23 -21
- data/spec/arel/algebra/unit/predicates/equality_spec.rb +20 -18
- data/spec/arel/algebra/unit/predicates/in_spec.rb +7 -5
- data/spec/arel/algebra/unit/primitives/attribute_spec.rb +10 -12
- data/spec/arel/algebra/unit/primitives/expression_spec.rb +1 -1
- data/spec/arel/algebra/unit/primitives/value_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/alias_spec.rb +2 -2
- data/spec/arel/algebra/unit/relations/delete_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/group_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/insert_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/join_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/order_spec.rb +2 -2
- data/spec/arel/algebra/unit/relations/project_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/relation_spec.rb +5 -5
- data/spec/arel/algebra/unit/relations/skip_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/table_spec.rb +2 -2
- data/spec/arel/algebra/unit/relations/take_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/update_spec.rb +1 -1
- data/spec/arel/algebra/unit/relations/where_spec.rb +1 -1
- data/spec/arel/algebra/unit/session/session_spec.rb +1 -1
- data/spec/arel/engines/memory/integration/joins/cross_engine_spec.rb +3 -4
- data/spec/arel/engines/memory/unit/relations/array_spec.rb +1 -1
- data/spec/arel/engines/memory/unit/relations/insert_spec.rb +8 -8
- data/spec/arel/engines/memory/unit/relations/join_spec.rb +1 -1
- data/spec/arel/engines/memory/unit/relations/order_spec.rb +1 -1
- data/spec/arel/engines/memory/unit/relations/project_spec.rb +1 -1
- data/spec/arel/engines/memory/unit/relations/skip_spec.rb +1 -1
- data/spec/arel/engines/memory/unit/relations/take_spec.rb +1 -1
- data/spec/arel/engines/memory/unit/relations/where_spec.rb +1 -1
- data/spec/arel/engines/sql/integration/joins/with_adjacency_spec.rb +1 -1
- data/spec/arel/engines/sql/integration/joins/with_aggregations_spec.rb +1 -1
- data/spec/arel/engines/sql/integration/joins/with_compounds_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/engine_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/predicates/binary_spec.rb +73 -70
- data/spec/arel/engines/sql/unit/predicates/equality_spec.rb +45 -28
- data/spec/arel/engines/sql/unit/predicates/in_spec.rb +57 -55
- data/spec/arel/engines/sql/unit/predicates/predicates_spec.rb +48 -46
- data/spec/arel/engines/sql/unit/primitives/attribute_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/primitives/expression_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/primitives/literal_spec.rb +13 -1
- data/spec/arel/engines/sql/unit/primitives/value_spec.rb +3 -3
- data/spec/arel/engines/sql/unit/relations/alias_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/delete_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/group_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/insert_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/join_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/order_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/project_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/skip_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/table_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/take_spec.rb +1 -1
- data/spec/arel/engines/sql/unit/relations/update_spec.rb +13 -7
- data/spec/arel/engines/sql/unit/relations/where_spec.rb +1 -1
- data/spec/connections/mysql_connection.rb +3 -3
- data/spec/connections/postgresql_connection.rb +2 -2
- data/spec/connections/sqlite3_connection.rb +3 -2
- data/spec/doubles/hash.rb +4 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_helper.rb +8 -0
- metadata +39 -25
- data/VERSION +0 -1
- data/lib/arel/algebra/extensions.rb +0 -4
- data/lib/arel/algebra/primitives.rb +0 -5
- data/lib/arel/engines/sql/extensions.rb +0 -4
data/lib/arel.rb
CHANGED
@@ -1,10 +1,14 @@
|
|
1
|
-
|
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 '
|
4
|
-
require 'activesupport'
|
5
|
-
require 'activerecord'
|
5
|
+
require 'active_record'
|
6
6
|
require 'active_record/connection_adapters/abstract/quoting'
|
7
7
|
|
8
|
-
|
9
|
-
require 'arel/
|
10
|
-
require 'arel/
|
8
|
+
module Arel
|
9
|
+
require 'arel/algebra'
|
10
|
+
require 'arel/engines'
|
11
|
+
autoload :Session, 'arel/session'
|
12
|
+
|
13
|
+
VERSION = "0.1.2"
|
14
|
+
end
|
data/lib/arel/algebra.rb
CHANGED
@@ -1,4 +1,9 @@
|
|
1
|
-
require 'arel/algebra/
|
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/
|
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
|
@@ -2,7 +2,7 @@ module Arel
|
|
2
2
|
module ClassExtensions
|
3
3
|
def attributes(*attrs)
|
4
4
|
@attributes = attrs
|
5
|
-
attr_reader
|
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
|
File without changes
|
@@ -1,41 +1,43 @@
|
|
1
1
|
module Arel
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
2
|
+
module Predicates
|
3
|
+
class Predicate
|
4
|
+
def or(other_predicate)
|
5
|
+
Or.new(self, other_predicate)
|
6
|
+
end
|
6
7
|
|
7
|
-
|
8
|
-
|
8
|
+
def and(other_predicate)
|
9
|
+
And.new(self, other_predicate)
|
10
|
+
end
|
9
11
|
end
|
10
|
-
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
13
|
+
class Binary < Predicate
|
14
|
+
attributes :operand1, :operand2
|
15
|
+
deriving :initialize
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
def ==(other)
|
18
|
+
self.class === other and
|
19
|
+
@operand1 == other.operand1 and
|
20
|
+
@operand2 == other.operand2
|
21
|
+
end
|
21
22
|
|
22
|
-
|
23
|
-
|
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
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
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
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
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
|
File without changes
|
@@ -1,35 +1,37 @@
|
|
1
1
|
module Arel
|
2
|
-
|
3
|
-
|
4
|
-
|
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
|
-
|
9
|
-
|
10
|
-
|
9
|
+
class Equality < Binary
|
10
|
+
def operator; :== end
|
11
|
+
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
13
|
+
class GreaterThanOrEqualTo < Binary
|
14
|
+
def operator; :>= end
|
15
|
+
end
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
|
17
|
+
class GreaterThan < Binary
|
18
|
+
def operator; :> end
|
19
|
+
end
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
21
|
+
class LessThanOrEqualTo < Binary
|
22
|
+
def operator; :<= end
|
23
|
+
end
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
25
|
+
class LessThan < Binary
|
26
|
+
def operator; :< end
|
27
|
+
end
|
27
28
|
|
28
|
-
|
29
|
-
|
30
|
-
|
29
|
+
class Match < Binary
|
30
|
+
def operator; :=~ end
|
31
|
+
end
|
31
32
|
|
32
|
-
|
33
|
-
|
33
|
+
class In < Binary
|
34
|
+
def operator; :include? end
|
35
|
+
end
|
34
36
|
end
|
35
37
|
end
|
data/lib/arel/engines/sql.rb
CHANGED
@@ -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/
|
6
|
+
require 'arel/engines/sql/core_extensions'
|
7
7
|
require 'arel/engines/sql/christener'
|
@@ -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
|
-
|
96
|
-
|
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
|
-
|
3
|
-
|
4
|
-
|
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
|
-
|
9
|
-
|
10
|
-
|
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
|
-
|
15
|
-
|
16
|
-
|
15
|
+
class Or < CompoundPredicate
|
16
|
+
def predicate_sql; "OR" end
|
17
|
+
end
|
17
18
|
|
18
|
-
|
19
|
-
|
20
|
-
|
19
|
+
class And < CompoundPredicate
|
20
|
+
def predicate_sql; "AND" end
|
21
|
+
end
|
21
22
|
|
22
|
-
|
23
|
-
|
24
|
-
|
23
|
+
class Equality < Binary
|
24
|
+
def predicate_sql
|
25
|
+
operand2.equality_predicate_sql
|
26
|
+
end
|
25
27
|
end
|
26
|
-
end
|
27
28
|
|
28
|
-
|
29
|
-
|
30
|
-
|
29
|
+
class GreaterThanOrEqualTo < Binary
|
30
|
+
def predicate_sql; '>=' end
|
31
|
+
end
|
31
32
|
|
32
|
-
|
33
|
-
|
34
|
-
|
33
|
+
class GreaterThan < Binary
|
34
|
+
def predicate_sql; '>' end
|
35
|
+
end
|
35
36
|
|
36
|
-
|
37
|
-
|
38
|
-
|
37
|
+
class LessThanOrEqualTo < Binary
|
38
|
+
def predicate_sql; '<=' end
|
39
|
+
end
|
39
40
|
|
40
|
-
|
41
|
-
|
42
|
-
|
41
|
+
class LessThan < Binary
|
42
|
+
def predicate_sql; '<' end
|
43
|
+
end
|
43
44
|
|
44
|
-
|
45
|
-
|
46
|
-
|
45
|
+
class Match < Binary
|
46
|
+
def predicate_sql; 'LIKE' end
|
47
|
+
end
|
47
48
|
|
48
|
-
|
49
|
-
|
49
|
+
class In < Binary
|
50
|
+
def predicate_sql; operand2.inclusion_predicate_sql end
|
51
|
+
end
|
50
52
|
end
|
51
53
|
end
|