activerecord-collections 0.0.8 → 0.0.9
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.
- 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
|