redis_assist 0.4.9 → 0.5.0
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/redis_assist/base.rb +98 -9
- data/lib/redis_assist/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: feb40ab214f985e7c59f88cebb16ca40a75eb686
|
4
|
+
data.tar.gz: ec8328f304d326609fbc738db79fde27102fb7a5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 515e9d3708aa53e8d819271d248c857679c906c4ac28b95aa997a1982b887c5e15aada064eeafcb788461e2b71f26e64d355634adf6c274a39d53e22d507b1ff
|
7
|
+
data.tar.gz: b0d545b698f646dab29ff5de7e8d633c784bf7cc7a93e8916dec85f15492fe0cac75d80b41b683b196b6ceb99c728e2b5c15722e4235d0157d8e4d50735eeaf6
|
data/lib/redis_assist/base.rb
CHANGED
@@ -8,12 +8,13 @@ module RedisAssist
|
|
8
8
|
def self.inherited(base)
|
9
9
|
base.before_create {|record| record.send(:created_at=, Time.now.to_f) if record.respond_to?(:created_at) }
|
10
10
|
base.before_update {|record| record.send(:updated_at=, Time.now.to_f) if record.respond_to?(:updated_at) }
|
11
|
-
base.after_delete {|record| record.send(:deleted_at=, Time.now.to_f) if record.respond_to?(:deleted_at) }
|
12
11
|
base.after_create {|record| record.send(:new_record=, false) }
|
13
12
|
end
|
14
13
|
|
14
|
+
|
15
15
|
class << self
|
16
16
|
|
17
|
+
|
17
18
|
def attr_persist(name, opts={})
|
18
19
|
persisted_attrs[name] = opts
|
19
20
|
|
@@ -26,10 +27,53 @@ module RedisAssist
|
|
26
27
|
end
|
27
28
|
end
|
28
29
|
|
30
|
+
|
31
|
+
# Get count of records
|
32
|
+
def count
|
33
|
+
redis.zcard(index_key_for(:id))
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
def first(amount=1)
|
38
|
+
offset = amount - 1
|
39
|
+
members = redis.zrange(index_key_for(:id), 0, offset)
|
40
|
+
find(amount > 1 ? members : members.first)
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
def last(amount=1)
|
45
|
+
offset = amount * -1
|
46
|
+
members = redis.zrange(index_key_for(:id), offset, -1)
|
47
|
+
find(amount > 1 ? members : members.first)
|
48
|
+
end
|
49
|
+
|
50
|
+
|
29
51
|
def find(ids, opts={})
|
30
52
|
ids.is_a?(Array) ? find_by_ids(ids, opts) : find_by_id(ids, opts)
|
31
53
|
end
|
32
|
-
|
54
|
+
|
55
|
+
|
56
|
+
# find articles in batches
|
57
|
+
def find_in_batches(params={})
|
58
|
+
start = params[:start] || 0
|
59
|
+
marker = start
|
60
|
+
batch_size = params[:batch_size] || 500
|
61
|
+
record_ids = redis.zrange(index_key_for(:id), marker, marker + batch_size - 1)
|
62
|
+
|
63
|
+
while record_ids.length > 0
|
64
|
+
records_count = record_ids.length
|
65
|
+
marker += records_count
|
66
|
+
records = find(record_ids)
|
67
|
+
|
68
|
+
yield records
|
69
|
+
|
70
|
+
break if records_count < batch_size
|
71
|
+
|
72
|
+
record_ids = redis.zrange(index_key_for(:id), marker, marker + batch_size - 1)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
|
33
77
|
# Deprecated finds
|
34
78
|
def find_by_id(id, opts={})
|
35
79
|
raw_attributes = load_attributes(id)
|
@@ -38,6 +82,7 @@ module RedisAssist
|
|
38
82
|
(obj.deleted? && !opts[:deleted].eql?(true)) ? nil : obj
|
39
83
|
end
|
40
84
|
|
85
|
+
|
41
86
|
def find_by_ids(ids, opts={})
|
42
87
|
attrs = load_attributes(*ids)
|
43
88
|
raw_attributes = attrs
|
@@ -49,15 +94,18 @@ module RedisAssist
|
|
49
94
|
end
|
50
95
|
end
|
51
96
|
|
97
|
+
|
52
98
|
def create(attrs={})
|
53
99
|
roll = new(attrs)
|
54
100
|
roll.save ? roll : false
|
55
101
|
end
|
56
102
|
|
103
|
+
|
57
104
|
def exists?(id)
|
58
105
|
redis.exists(key_for(id, :attributes))
|
59
106
|
end
|
60
107
|
|
108
|
+
|
61
109
|
# TODO: needs a refactor. Should this be an interface for skipping validations?
|
62
110
|
# Should we optimize and skip the find? Support an array of ids?
|
63
111
|
def update(id, params={})
|
@@ -92,6 +140,7 @@ module RedisAssist
|
|
92
140
|
record.send(:invoke_callback, :after_update)
|
93
141
|
end
|
94
142
|
|
143
|
+
|
95
144
|
def transform(direction, attr, val)
|
96
145
|
transformer = RedisAssist.transforms[persisted_attrs[attr][:as]]
|
97
146
|
|
@@ -102,41 +151,55 @@ module RedisAssist
|
|
102
151
|
end
|
103
152
|
end
|
104
153
|
|
154
|
+
|
105
155
|
def fields
|
106
156
|
persisted_attrs.select{|k,v| !(v[:as].eql?(:list) || v[:as].eql?(:hash)) }
|
107
157
|
end
|
108
158
|
|
159
|
+
|
109
160
|
def lists
|
110
161
|
persisted_attrs.select{|k,v| v[:as].eql?(:list) }
|
111
162
|
end
|
112
163
|
|
164
|
+
|
113
165
|
def hashes
|
114
166
|
persisted_attrs.select{|k,v| v[:as].eql?(:hash) }
|
115
167
|
end
|
116
168
|
|
169
|
+
|
117
170
|
# TODO: Attribute class
|
118
171
|
def persisted_attrs
|
119
172
|
@persisted_attrs ||= {}
|
120
173
|
end
|
121
174
|
|
175
|
+
|
176
|
+
def index_key_for(index_name)
|
177
|
+
"#{key_prefix}:index:#{index_name}"
|
178
|
+
end
|
179
|
+
|
180
|
+
|
122
181
|
def key_for(id, attribute)
|
123
182
|
"#{key_prefix}:#{id}:#{attribute}"
|
124
183
|
end
|
125
184
|
|
185
|
+
|
126
186
|
def key_prefix(val=nil)
|
127
187
|
return self.key_prefix = val if val
|
128
188
|
return @key_prefix if @key_prefix
|
129
189
|
return self.key_prefix = StringHelper.underscore(name)
|
130
190
|
end
|
131
191
|
|
192
|
+
|
132
193
|
def key_prefix=(val)
|
133
194
|
@key_prefix = val
|
134
195
|
end
|
135
196
|
|
197
|
+
|
136
198
|
def redis
|
137
199
|
RedisAssist::Config.redis_client
|
138
200
|
end
|
139
201
|
|
202
|
+
|
140
203
|
def load_attributes(*ids)
|
141
204
|
future_attrs = {}
|
142
205
|
attrs = {}
|
@@ -170,12 +233,15 @@ module RedisAssist
|
|
170
233
|
future_attrs
|
171
234
|
end
|
172
235
|
|
236
|
+
|
173
237
|
def hash_to_redis(obj)
|
174
238
|
obj.each_with_object([]) {|kv,args| args<<kv[0]<<kv[1] }
|
175
239
|
end
|
176
240
|
|
241
|
+
|
177
242
|
private
|
178
243
|
|
244
|
+
|
179
245
|
def define_list(name)
|
180
246
|
define_method(name) do
|
181
247
|
read_list(name)
|
@@ -186,6 +252,7 @@ module RedisAssist
|
|
186
252
|
end
|
187
253
|
end
|
188
254
|
|
255
|
+
|
189
256
|
def define_hash(name)
|
190
257
|
define_method(name) do
|
191
258
|
read_hash(name)
|
@@ -196,6 +263,7 @@ module RedisAssist
|
|
196
263
|
end
|
197
264
|
end
|
198
265
|
|
266
|
+
|
199
267
|
def define_attribute(name)
|
200
268
|
define_method(name) do
|
201
269
|
read_attribute(name)
|
@@ -207,9 +275,13 @@ module RedisAssist
|
|
207
275
|
end
|
208
276
|
end
|
209
277
|
|
278
|
+
|
210
279
|
attr_accessor :attributes
|
211
|
-
|
212
|
-
|
280
|
+
|
281
|
+
def id
|
282
|
+
@id.to_i
|
283
|
+
end
|
284
|
+
|
213
285
|
def initialize(attrs={})
|
214
286
|
self.attributes = {}
|
215
287
|
self.lists = {}
|
@@ -303,9 +375,17 @@ module RedisAssist
|
|
303
375
|
self.id = generate_id if new_record?
|
304
376
|
|
305
377
|
redis.multi do
|
378
|
+
# Add to the index
|
379
|
+
insert_into_index(:id, id, id) if new_record?
|
380
|
+
|
381
|
+
# Remove soft-deleted record from index
|
382
|
+
if deleted?
|
383
|
+
remove_from_index(:id, id)
|
384
|
+
insert_into_index(:deleted_at, deleted_at.to_i, id)
|
385
|
+
end
|
386
|
+
|
306
387
|
# build the arguments to pass to redis hmset
|
307
388
|
# and insure the attributes are explicitely declared
|
308
|
-
|
309
389
|
unless attributes.is_a?(Redis::Future)
|
310
390
|
attribute_args = hash_to_redis(attributes)
|
311
391
|
redis.hmset(key_for(:attributes), *attribute_args)
|
@@ -354,10 +434,11 @@ module RedisAssist
|
|
354
434
|
self.deleted_at = Time.now.to_f if respond_to?(:deleted_at)
|
355
435
|
save
|
356
436
|
else
|
357
|
-
redis.
|
358
|
-
|
437
|
+
redis.multi do
|
438
|
+
redis.zrem(self.class.primary_key_index_key, id)
|
439
|
+
redis.del(key_for(:attributes))
|
359
440
|
lists.merge(hashes).each do |name|
|
360
|
-
|
441
|
+
redis.del(key_for(name))
|
361
442
|
end
|
362
443
|
end
|
363
444
|
end
|
@@ -365,7 +446,7 @@ module RedisAssist
|
|
365
446
|
invoke_callback(:after_delete)
|
366
447
|
self
|
367
448
|
end
|
368
|
-
|
449
|
+
|
369
450
|
def new_record?
|
370
451
|
!!new_record
|
371
452
|
end
|
@@ -385,6 +466,14 @@ module RedisAssist
|
|
385
466
|
|
386
467
|
private
|
387
468
|
|
469
|
+
|
470
|
+
def insert_into_index(name, score, member)
|
471
|
+
redis.zadd(self.class.index_key_for(name), score, member)
|
472
|
+
end
|
473
|
+
|
474
|
+
def remove_from_index(name, member)
|
475
|
+
redis.zrem(self.class.index_key_for(name), member)
|
476
|
+
end
|
388
477
|
|
389
478
|
def generate_id
|
390
479
|
redis.incr("#{self.class.key_prefix}:id_sequence")
|
data/lib/redis_assist/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis_assist
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tyler Love
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-07-
|
11
|
+
date: 2013-07-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|