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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5e39bec5d60742e7f9a9fb9e9cd4ffe66007b178
4
- data.tar.gz: 419f6dd81efed9dee7b8e3619ea5e55d710194fc
3
+ metadata.gz: feb40ab214f985e7c59f88cebb16ca40a75eb686
4
+ data.tar.gz: ec8328f304d326609fbc738db79fde27102fb7a5
5
5
  SHA512:
6
- metadata.gz: 1da9e2a431b98676221cddd2590d752aedb424afabd368a96f6904a3ecb43f801b1922a30dda7b48681e16397c8682ad718342680ab25332cc99239bce0941c7
7
- data.tar.gz: 354f84bff6fa88bff57d5018976b48f2f06ae7ff40e5a72811e1f3d864d0f401889a397cd27aab93e763be085bb7fde295343ef724c418066146a0df546d8409
6
+ metadata.gz: 515e9d3708aa53e8d819271d248c857679c906c4ac28b95aa997a1982b887c5e15aada064eeafcb788461e2b71f26e64d355634adf6c274a39d53e22d507b1ff
7
+ data.tar.gz: b0d545b698f646dab29ff5de7e8d633c784bf7cc7a93e8916dec85f15492fe0cac75d80b41b683b196b6ceb99c728e2b5c15722e4235d0157d8e4d50735eeaf6
@@ -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
- attr_reader :id
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.pipelined do |pipe|
358
- pipe.del(key_for(:attributes))
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
- pipe.del(key_for(name))
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")
@@ -1,3 +1,3 @@
1
1
  module RedisAssist
2
- VERSION = '0.4.9' unless defined?(::RedisAssist::VERSION)
2
+ VERSION = '0.5.0' unless defined?(::RedisAssist::VERSION)
3
3
  end
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.9
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-12 00:00:00.000000000 Z
11
+ date: 2013-07-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis