ar_pg_array 0.9.5 → 0.9.6
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/VERSION +1 -1
- data/lib/ar_pg_array/querying_arel.rb +145 -56
- data/lib/ar_pg_array/schema_arel.rb +25 -10
- metadata +6 -6
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.9.
|
1
|
+
0.9.6
|
@@ -1,80 +1,169 @@
|
|
1
|
-
|
2
|
-
module
|
3
|
-
|
4
|
-
|
5
|
-
!(operand1.eval(row) & operand2.eval(row)).empty?
|
1
|
+
if Arel::VERSION >= '2.0'
|
2
|
+
module Arel
|
3
|
+
module Nodes
|
4
|
+
class ArrayAny < Arel::Nodes::Binary
|
6
5
|
end
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
|
7
|
+
class ArrayAll < Arel::Nodes::Binary
|
8
|
+
end
|
9
|
+
|
10
|
+
class ArrayIncluded < Arel::Nodes::Binary
|
10
11
|
end
|
11
12
|
end
|
12
|
-
|
13
|
-
|
14
|
-
def
|
15
|
-
|
13
|
+
|
14
|
+
module Predications
|
15
|
+
def ar_any other
|
16
|
+
Nodes::ArrayAny.new self, other
|
16
17
|
end
|
17
|
-
|
18
|
-
def
|
19
|
-
|
18
|
+
|
19
|
+
def ar_all other
|
20
|
+
Nodes::ArrayAll.new self, other
|
20
21
|
end
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
def eval(row)
|
25
|
-
(operand1.eval(row) - operand2.eval(row)).empty?
|
22
|
+
|
23
|
+
def ar_included other
|
24
|
+
Nodes::ArrayIncluded.new self, other
|
26
25
|
end
|
27
|
-
|
28
|
-
|
29
|
-
|
26
|
+
end
|
27
|
+
|
28
|
+
module Visitors
|
29
|
+
class PostgreSQL
|
30
|
+
def visit_Arel_Nodes_ArrayAny o
|
31
|
+
"#{visit o.left} && #{visit o.right}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def visit_Arel_Nodes_ArrayAll o
|
35
|
+
"#{visit o.left} @> #{visit o.right}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def visit_Arel_Nodes_ArrayIncluded o
|
39
|
+
"#{visit o.left} <@ #{visit o.right}"
|
40
|
+
end
|
41
|
+
|
42
|
+
def visit_PGArrays_PgArray o
|
43
|
+
@connection.quote_array_for_arel_by_base_type(o, o.base_type)
|
44
|
+
end
|
45
|
+
|
46
|
+
alias :visit_PGArrays_PgAny :visit_PGArrays_PgArray
|
47
|
+
alias :visit_PGArrays_PgAll :visit_PGArrays_PgArray
|
48
|
+
alias :visit_PGArrays_PgIncluded :visit_PGArrays_PgArray
|
30
49
|
end
|
31
50
|
end
|
32
51
|
end
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
52
|
+
else
|
53
|
+
module Arel
|
54
|
+
module Predicates
|
55
|
+
class ArrayAny < Binary
|
56
|
+
def eval(row)
|
57
|
+
!(operand1.eval(row) & operand2.eval(row)).empty?
|
58
|
+
end
|
39
59
|
|
40
|
-
|
41
|
-
|
60
|
+
def predicate_sql
|
61
|
+
"&&"
|
62
|
+
end
|
42
63
|
end
|
43
64
|
|
44
|
-
|
45
|
-
|
65
|
+
class ArrayAll < Binary
|
66
|
+
def eval(row)
|
67
|
+
(operand2.eval(row) - operand1.eval(row)).empty?
|
68
|
+
end
|
69
|
+
|
70
|
+
def predicate_sql
|
71
|
+
"@>"
|
72
|
+
end
|
46
73
|
end
|
47
74
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
ar_included(other)
|
56
|
-
else
|
57
|
-
Predicates::In.new(self, other)
|
75
|
+
class ArrayIncluded < Binary
|
76
|
+
def eval(row)
|
77
|
+
(operand1.eval(row) - operand2.eval(row)).empty?
|
78
|
+
end
|
79
|
+
|
80
|
+
def predicate_sql
|
81
|
+
"<@"
|
58
82
|
end
|
59
83
|
end
|
60
84
|
end
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
85
|
+
|
86
|
+
class Attribute
|
87
|
+
methods = lambda do
|
88
|
+
def ar_any(other)
|
89
|
+
Predicates::ArrayAny.new(self, other)
|
90
|
+
end
|
91
|
+
|
92
|
+
def ar_all(other)
|
93
|
+
Predicates::ArrayAll.new(self, other)
|
94
|
+
end
|
95
|
+
|
96
|
+
def ar_included(other)
|
97
|
+
Predicates::ArrayIncluded.new(self, other)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
if defined? PREDICATES
|
101
|
+
PREDICATES.concat [:ar_any, :ar_all, :ar_included]
|
102
|
+
class_exec &methods
|
103
|
+
else
|
104
|
+
Predications.class_exec &methods
|
105
|
+
end
|
66
106
|
end
|
67
107
|
end
|
68
|
-
end
|
69
108
|
|
70
|
-
module PGArrays
|
71
|
-
|
72
|
-
|
73
|
-
|
109
|
+
module PGArrays
|
110
|
+
class PgArray
|
111
|
+
def to_sql( formatter = nil )
|
112
|
+
formatter.engine.connection.quote_array_for_arel_by_base_type(self, base_type)
|
113
|
+
end
|
114
|
+
|
115
|
+
def to_a
|
116
|
+
self
|
117
|
+
end
|
74
118
|
end
|
75
|
-
|
76
|
-
|
77
|
-
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
module ActiveRecord
|
123
|
+
class PredicateBuilder
|
124
|
+
def build_from_hash(attributes, default_table)
|
125
|
+
predicates = attributes.map do |column, value|
|
126
|
+
table = default_table
|
127
|
+
|
128
|
+
if value.is_a?(Hash)
|
129
|
+
table = Arel::Table.new(column, :engine => @engine)
|
130
|
+
build_from_hash(value, table)
|
131
|
+
else
|
132
|
+
column = column.to_s
|
133
|
+
|
134
|
+
if column.include?('.')
|
135
|
+
table_name, column = column.split('.', 2)
|
136
|
+
table = Arel::Table.new(table_name, :engine => @engine)
|
137
|
+
end
|
138
|
+
|
139
|
+
attribute = table[column] || Arel::Attribute.new(table, column)
|
140
|
+
|
141
|
+
case value
|
142
|
+
when PGArrays::PgAny
|
143
|
+
attribute.ar_any(value)
|
144
|
+
when PGArrays::PgAll
|
145
|
+
attribute.ar_all(value)
|
146
|
+
when PGArrays::PgIncludes
|
147
|
+
attribute.ar_included(value)
|
148
|
+
when Array, ActiveRecord::Associations::AssociationCollection, ActiveRecord::Relation
|
149
|
+
values = value.to_a.map { |x|
|
150
|
+
x.is_a?(ActiveRecord::Base) ? x.id : x
|
151
|
+
}
|
152
|
+
attribute.in(values)
|
153
|
+
when Range, Arel::Relation
|
154
|
+
attribute.in(value)
|
155
|
+
when ActiveRecord::Base
|
156
|
+
attribute.eq(value.id)
|
157
|
+
when Class
|
158
|
+
# FIXME: I think we need to deprecate this behavior
|
159
|
+
attribute.eq(value.name)
|
160
|
+
else
|
161
|
+
attribute.eq(value)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
predicates.flatten
|
78
167
|
end
|
79
168
|
end
|
80
169
|
end
|
@@ -65,26 +65,41 @@ module Arel
|
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
68
|
-
|
68
|
+
if Arel::VERSION < '2.0'
|
69
|
+
module Sql
|
70
|
+
module Attributes
|
71
|
+
class << self
|
72
|
+
def for_with_postgresql_arrays(column)
|
73
|
+
if column.type.to_s =~ /^(.+)_array$/
|
74
|
+
('Arel::Sql::Attributes::' + for_without_postgresql_arrays(column.base_column).name.split('::').last + 'Array').constantize
|
75
|
+
else
|
76
|
+
for_without_postgresql_arrays(column)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
alias_method_chain :for, :postgresql_arrays
|
80
|
+
end
|
81
|
+
|
82
|
+
%w{Integer Float Decimal Boolean String Time}.each do |basetype|
|
83
|
+
module_eval <<-"END"
|
84
|
+
class #{basetype}Array < Arel::Attributes::#{basetype}Array
|
85
|
+
include Attributes
|
86
|
+
end
|
87
|
+
END
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
else
|
69
92
|
module Attributes
|
70
93
|
class << self
|
71
94
|
def for_with_postgresql_arrays(column)
|
72
95
|
if column.type.to_s =~ /^(.+)_array$/
|
73
|
-
('Arel::
|
96
|
+
('Arel::Attributes::' + for_without_postgresql_arrays(column.base_column).name.split('::').last + 'Array').constantize
|
74
97
|
else
|
75
98
|
for_without_postgresql_arrays(column)
|
76
99
|
end
|
77
100
|
end
|
78
101
|
alias_method_chain :for, :postgresql_arrays
|
79
102
|
end
|
80
|
-
|
81
|
-
%w{Integer Float Decimal Boolean String Time}.each do |basetype|
|
82
|
-
module_eval <<-"END"
|
83
|
-
class #{basetype}Array < Arel::Attributes::#{basetype}Array
|
84
|
-
include Attributes
|
85
|
-
end
|
86
|
-
END
|
87
|
-
end
|
88
103
|
end
|
89
104
|
end
|
90
105
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ar_pg_array
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 55
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 9
|
9
|
-
-
|
10
|
-
version: 0.9.
|
9
|
+
- 6
|
10
|
+
version: 0.9.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Sokolov Yura aka funny_falcon
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-04-13 00:00:00 +04:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -93,7 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
93
93
|
requirements: []
|
94
94
|
|
95
95
|
rubyforge_project: ar-pg-array
|
96
|
-
rubygems_version: 1.
|
96
|
+
rubygems_version: 1.6.2
|
97
97
|
signing_key:
|
98
98
|
specification_version: 3
|
99
99
|
summary: Use power of PostgreSQL Arrays in ActiveRecord
|