arel 0.1.0 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|