activerecord-collections 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/active_record/collection.rb +5 -0
- data/lib/active_record/collections/batching.rb +21 -25
- data/lib/active_record/collections/collectable.rb +17 -3
- data/lib/active_record/collections/delegation.rb +4 -4
- data/lib/active_record/collections/relation.rb +15 -17
- data/lib/active_record/collections/serialization.rb +3 -1
- data/lib/active_record/collections/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a957127ae2a21f3a1b1d86589127c32b61ea74ec
|
4
|
+
data.tar.gz: ea061b5fa0357a66cd1f93d63332b297d25ac8f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9b05f147793bc3239373ef8c0ecc232650f6e8972d1ee7d98942f1259904e0b3451caf3c45422dae6167ecef2708968e06d7a80a0b8e5f7904aaf98a0c52038f
|
7
|
+
data.tar.gz: ea45a2d8364d10f0c1d9a998ca9a372db81ab7098fc39ceffc71cc2732491891bf673270cea2c8fb0358e9f7a8bc5b98bfcd36d742ea8f35ac21d865ab4c4e6e
|
@@ -9,6 +9,11 @@ module ActiveRecord
|
|
9
9
|
attr_reader :relation, :options
|
10
10
|
|
11
11
|
class << self
|
12
|
+
attr_reader :collections
|
13
|
+
def inherited(subclass)
|
14
|
+
(@collections ||= []) << subclass
|
15
|
+
end
|
16
|
+
|
12
17
|
def collectable(klass=nil)
|
13
18
|
unless klass.nil?
|
14
19
|
raise ArgumentError, "The collection model must inherit from ActiveRecord::Base" unless klass.ancestors.include?(ActiveRecord::Base)
|
@@ -57,20 +57,20 @@ module ActiveRecord
|
|
57
57
|
end
|
58
58
|
alias_method :batched?, :is_batched?
|
59
59
|
|
60
|
-
def batch(
|
61
|
-
dup.batch!(
|
60
|
+
def batch(batch_size: nil)
|
61
|
+
dup.batch!(batch_size: batch_size)
|
62
62
|
end
|
63
63
|
|
64
|
-
def batch!(
|
65
|
-
batchify!(
|
64
|
+
def batch!(batch_size: nil)
|
65
|
+
batchify!(1, (batch_size || limit_value || default_batch_size))
|
66
66
|
end
|
67
67
|
|
68
|
-
def per_batch(bs
|
68
|
+
def per_batch(bs)
|
69
69
|
dup.per_batch!(bs)
|
70
70
|
end
|
71
71
|
|
72
|
-
def per_batch!(bs
|
73
|
-
batchify!(current_batch,
|
72
|
+
def per_batch!(bs)
|
73
|
+
batchify!(current_batch, bs)
|
74
74
|
end
|
75
75
|
|
76
76
|
def batchify!(btch, bs)
|
@@ -80,11 +80,11 @@ module ActiveRecord
|
|
80
80
|
end
|
81
81
|
|
82
82
|
def total_batches
|
83
|
-
(total_count.to_f / (
|
83
|
+
(total_count.to_f / (limit_value || total_count).to_f).ceil
|
84
84
|
end
|
85
85
|
|
86
86
|
def current_batch
|
87
|
-
(
|
87
|
+
(offset_value.to_i / (limit_value || 1)) + 1
|
88
88
|
end
|
89
89
|
|
90
90
|
def batch_size
|
@@ -134,18 +134,16 @@ module ActiveRecord
|
|
134
134
|
alias_method :in_batches, :as_batches
|
135
135
|
|
136
136
|
def each_batch(&block)
|
137
|
-
batch!
|
138
|
-
|
139
137
|
if total_batches <= 1
|
140
|
-
yield
|
141
|
-
return [
|
138
|
+
yield dup.as_batch if block_given?
|
139
|
+
return [dup.as_batch]
|
142
140
|
end
|
143
141
|
|
144
|
-
first_batch!
|
145
142
|
batched = []
|
143
|
+
first_batch!
|
146
144
|
total_batches.times do
|
147
|
-
batched <<
|
148
|
-
yield
|
145
|
+
batched << dup.as_batch
|
146
|
+
yield dup.as_batch if block_given?
|
149
147
|
next_batch!
|
150
148
|
end
|
151
149
|
first_batch!
|
@@ -153,16 +151,14 @@ module ActiveRecord
|
|
153
151
|
end
|
154
152
|
|
155
153
|
def batch_map(&block)
|
156
|
-
batch!
|
157
|
-
|
158
154
|
if total_batches <= 1
|
159
|
-
return (block_given? ? yield(
|
155
|
+
return (block_given? ? yield(dup.as_batch) : dup.as_batch)
|
160
156
|
end
|
161
157
|
|
162
|
-
first_batch!
|
163
158
|
batched = []
|
159
|
+
first_batch!
|
164
160
|
total_batches.times do
|
165
|
-
batched << (block_given? ? yield(
|
161
|
+
batched << (block_given? ? yield(dup.as_batch) : dup.as_batch)
|
166
162
|
next_batch!
|
167
163
|
end
|
168
164
|
first_batch!
|
@@ -178,7 +174,7 @@ module ActiveRecord
|
|
178
174
|
end
|
179
175
|
|
180
176
|
def first_batch!
|
181
|
-
|
177
|
+
batchify!(1, batch_size)
|
182
178
|
end
|
183
179
|
|
184
180
|
def next_batch?
|
@@ -190,7 +186,7 @@ module ActiveRecord
|
|
190
186
|
end
|
191
187
|
|
192
188
|
def next_batch!
|
193
|
-
|
189
|
+
batchify!(current_batch + 1, batch_size)
|
194
190
|
end
|
195
191
|
|
196
192
|
def prev_batch?
|
@@ -202,7 +198,7 @@ module ActiveRecord
|
|
202
198
|
end
|
203
199
|
|
204
200
|
def prev_batch!
|
205
|
-
|
201
|
+
batchify!(current_batch - 1, batch_size)
|
206
202
|
end
|
207
203
|
|
208
204
|
def last_batch
|
@@ -210,7 +206,7 @@ module ActiveRecord
|
|
210
206
|
end
|
211
207
|
|
212
208
|
def last_batch!
|
213
|
-
|
209
|
+
batchify!(total_batches, batch_size)
|
214
210
|
end
|
215
211
|
end
|
216
212
|
end
|
@@ -2,16 +2,29 @@ module ActiveRecord
|
|
2
2
|
module Collections
|
3
3
|
module Collectable
|
4
4
|
module Model
|
5
|
+
def collection_class(klass=nil)
|
6
|
+
@collection_class = klass unless klass.nil?
|
7
|
+
@collection_class
|
8
|
+
end
|
9
|
+
|
10
|
+
def kollektion
|
11
|
+
@collection_class || ActiveRecord::Collection.collections.to_a.select { |c| c.collectable == self }.first || ActiveRecord::Collection
|
12
|
+
end
|
13
|
+
|
5
14
|
def collection(*criteria)
|
6
|
-
|
15
|
+
kollektion.new(self, *criteria)
|
7
16
|
end
|
8
17
|
alias_method :collect, :collection
|
9
18
|
end
|
10
19
|
|
11
20
|
module Relation
|
21
|
+
def kollektion
|
22
|
+
klass.kollektion
|
23
|
+
end
|
24
|
+
|
12
25
|
def collection
|
13
26
|
# do this with a hash so that we don't cause the relation query to execute
|
14
|
-
|
27
|
+
kollektion.from_hash({
|
15
28
|
klass: klass,
|
16
29
|
select: select_values,
|
17
30
|
distinct: distinct_value,
|
@@ -19,7 +32,8 @@ module ActiveRecord
|
|
19
32
|
references: references_values,
|
20
33
|
includes: includes_values,
|
21
34
|
where: where_values.map { |v| v.is_a?(String) ? v : v.to_sql },
|
22
|
-
|
35
|
+
group: group_values.map { |v| (v.is_a?(String) || v.is_a?(Symbol)) ? v : v.to_sql },
|
36
|
+
order: order_values.map { |v| (v.is_a?(String) || v.is_a?(Symbol)) ? v : v.to_sql },
|
23
37
|
bind: bind_values.map { |b| {name: b.first.name, value: b.last} },
|
24
38
|
limit: limit_value,
|
25
39
|
offset: offset_value
|
@@ -66,8 +66,8 @@ module ActiveRecord
|
|
66
66
|
protected
|
67
67
|
|
68
68
|
def call_on_records(meth, *args)
|
69
|
-
return
|
70
|
-
if
|
69
|
+
return flat_batch_map do |batch|
|
70
|
+
if collectable.columns.map(&:name).include?(meth.to_s) && !batch.loaded?
|
71
71
|
batch.pluck(meth)
|
72
72
|
else
|
73
73
|
batch.map { |record| record.send(meth, *args) }
|
@@ -76,8 +76,8 @@ module ActiveRecord
|
|
76
76
|
end
|
77
77
|
|
78
78
|
def records_respond_to?(meth, include_private=false)
|
79
|
-
|
80
|
-
(include_private &&
|
79
|
+
collectable.public_instance_methods.include?(meth) ||
|
80
|
+
(include_private && collectable.private_instance_methods.include?(meth)) ||
|
81
81
|
(!records.nil? && records.loaded? && records.first.respond_to?(meth, include_private))
|
82
82
|
end
|
83
83
|
|
@@ -53,7 +53,6 @@ module ActiveRecord
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def select!(*args)
|
56
|
-
#reset!
|
57
56
|
@relation = relation.select(*args)
|
58
57
|
self
|
59
58
|
end
|
@@ -63,7 +62,6 @@ module ActiveRecord
|
|
63
62
|
end
|
64
63
|
|
65
64
|
def distinct!(bool=true)
|
66
|
-
#reset!
|
67
65
|
@relation = relation.distinct(bool)
|
68
66
|
self
|
69
67
|
end
|
@@ -73,8 +71,7 @@ module ActiveRecord
|
|
73
71
|
end
|
74
72
|
|
75
73
|
def where!(*args, &block)
|
76
|
-
|
77
|
-
relation.where!(*args, &block)
|
74
|
+
@relation = relation.where(*args, &block)
|
78
75
|
self
|
79
76
|
end
|
80
77
|
|
@@ -83,7 +80,6 @@ module ActiveRecord
|
|
83
80
|
end
|
84
81
|
|
85
82
|
def not!(*args, &block)
|
86
|
-
#reset!
|
87
83
|
@relation = relation.where.not(*args, &block)
|
88
84
|
self
|
89
85
|
end
|
@@ -93,7 +89,6 @@ module ActiveRecord
|
|
93
89
|
end
|
94
90
|
|
95
91
|
def or!(*args, &block)
|
96
|
-
#reset!
|
97
92
|
@relation = relation.or.where(*args, &block)
|
98
93
|
self
|
99
94
|
end
|
@@ -103,18 +98,25 @@ module ActiveRecord
|
|
103
98
|
end
|
104
99
|
|
105
100
|
def order!(*args, &block)
|
106
|
-
#reset!(false)
|
107
101
|
relation.order!(*args, &block)
|
108
102
|
self
|
109
103
|
end
|
110
104
|
|
105
|
+
def group(*args)
|
106
|
+
dup.group!(*args)
|
107
|
+
end
|
108
|
+
|
109
|
+
def group!(*args)
|
110
|
+
@relation = relation.group(*args)
|
111
|
+
self
|
112
|
+
end
|
113
|
+
|
111
114
|
def limit(*args, &block)
|
112
115
|
dup.limit!(*args, &block)
|
113
116
|
end
|
114
117
|
|
115
118
|
def limit!(*args, &block)
|
116
|
-
|
117
|
-
relation.limit!(*args, &block)
|
119
|
+
@relation = relation.limit(*args, &block)
|
118
120
|
self
|
119
121
|
end
|
120
122
|
|
@@ -123,8 +125,7 @@ module ActiveRecord
|
|
123
125
|
end
|
124
126
|
|
125
127
|
def offset!(*args, &block)
|
126
|
-
|
127
|
-
relation.offset!(*args, &block)
|
128
|
+
@relation = relation.offset(*args, &block)
|
128
129
|
self
|
129
130
|
end
|
130
131
|
|
@@ -133,8 +134,7 @@ module ActiveRecord
|
|
133
134
|
end
|
134
135
|
|
135
136
|
def joins!(*args)
|
136
|
-
|
137
|
-
relation.joins!(*args)
|
137
|
+
@relation = relation.joins(*args)
|
138
138
|
self
|
139
139
|
end
|
140
140
|
|
@@ -143,8 +143,7 @@ module ActiveRecord
|
|
143
143
|
end
|
144
144
|
|
145
145
|
def includes!(*args)
|
146
|
-
|
147
|
-
relation.includes!(*args)
|
146
|
+
@relation = relation.includes(*args)
|
148
147
|
self
|
149
148
|
end
|
150
149
|
|
@@ -153,8 +152,7 @@ module ActiveRecord
|
|
153
152
|
end
|
154
153
|
|
155
154
|
def references!(*table_names)
|
156
|
-
|
157
|
-
relation.references!(*table_names)
|
155
|
+
@relation = relation.references(*table_names)
|
158
156
|
self
|
159
157
|
end
|
160
158
|
|
@@ -19,6 +19,7 @@ module ActiveRecord
|
|
19
19
|
collection.references!(*hash[:references]) unless hash[:references].empty?
|
20
20
|
collection.includes!(*hash[:includes]) unless hash[:includes].empty?
|
21
21
|
collection.where!(*hash[:bind].map { |b| b[:value] }.unshift(hash[:where].join(" AND ").gsub(/\$\d/,'?'))) unless hash[:where].empty?
|
22
|
+
collection.group!(hash[:group]) unless hash[:group].empty?
|
22
23
|
collection.order!(hash[:order]) unless hash[:order].empty?
|
23
24
|
collection.limit!(hash[:limit]) unless hash[:limit].nil?
|
24
25
|
collection.offset!(hash[:offset]) unless hash[:offset].nil?
|
@@ -38,7 +39,8 @@ module ActiveRecord
|
|
38
39
|
references: references_values,
|
39
40
|
includes: includes_values,
|
40
41
|
where: where_values.map { |v| v.is_a?(String) ? v : v.to_sql },
|
41
|
-
|
42
|
+
group: group_values.map { |v| (v.is_a?(String) || v.is_a?(Symbol)) ? v : v.to_sql },
|
43
|
+
order: order_values.map { |v| (v.is_a?(String) || v.is_a?(Symbol)) ? v : v.to_sql },
|
42
44
|
bind: bind_values.map { |b| {name: b.first.name, value: b.last} }
|
43
45
|
}
|
44
46
|
if include_limit || try(:is_batch?)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-collections
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark Rebec
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-01
|
11
|
+
date: 2015-02-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|