redis_assist 0.4.9 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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