Class: Sidekiq::SortedSet

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/sidekiq/api.rb

Direct Known Subclasses

RetrySet, ScheduledSet

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name) ⇒ SortedSet

Returns a new instance of SortedSet.



266
267
268
269
# File 'lib/sidekiq/api.rb', line 266

def initialize(name)
  @name = name
  @_size = size
end

Instance Attribute Details

#nameObject (readonly)

Returns the value of attribute name.



264
265
266
# File 'lib/sidekiq/api.rb', line 264

def name
  @name
end

Instance Method Details

#clearObject



352
353
354
355
356
# File 'lib/sidekiq/api.rb', line 352

def clear
  Sidekiq.redis do |conn|
    conn.del(name)
  end
end

#delete(score, jid = nil) ⇒ Object



322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
# File 'lib/sidekiq/api.rb', line 322

def delete(score, jid = nil)
  if jid
    elements = Sidekiq.redis do |conn|
      conn.zrangebyscore(name, score, score)
    end

    elements_with_jid = elements.map do |element|
      message = Sidekiq.load_json(element)

      if message["jid"] == jid
        _, @_size = Sidekiq.redis do |conn|
          conn.multi do
            conn.zrem(name, element)
            conn.zcard name
          end
        end
      end
    end
    elements_with_jid.count != 0
  else
    count, @_size = Sidekiq.redis do |conn|
      conn.multi do
        conn.zremrangebyscore(name, score, score)
        conn.zcard name
      end
    end
    count != 0
  end
end

#each(&block) ⇒ Object



281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
# File 'lib/sidekiq/api.rb', line 281

def each(&block)
  initial_size = @_size
  offset_size = 0
  page = -1
  page_size = 50

  loop do
    range_start = page * page_size + offset_size
    range_end   = page * page_size + offset_size + (page_size - 1)
    elements = Sidekiq.redis do |conn|
      conn.zrange name, range_start, range_end, :with_scores => true
    end
    break if elements.empty?
    page -= 1
    elements.each do |element, score|
      block.call SortedEntry.new(self, score, element)
    end
    offset_size = initial_size - @_size
  end
end

#fetch(score, jid = nil) ⇒ Object



302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
# File 'lib/sidekiq/api.rb', line 302

def fetch(score, jid = nil)
  elements = Sidekiq.redis do |conn|
    conn.zrangebyscore(name, score, score)
  end

  elements.inject([]) do |result, element|
    entry = SortedEntry.new(self, score, element)
    if jid
      result << entry if entry.jid == jid
    else
      result << entry
    end
    result
  end
end

#find_job(jid) ⇒ Object



318
319
320
# File 'lib/sidekiq/api.rb', line 318

def find_job(jid)
  self.detect { |j| j.jid == jid }
end

#schedule(timestamp, message) ⇒ Object



275
276
277
278
279
# File 'lib/sidekiq/api.rb', line 275

def schedule(timestamp, message)
  Sidekiq.redis do |conn|
    conn.zadd(name, timestamp.to_f.to_s, Sidekiq.dump_json(message))
  end
end

#sizeObject



271
272
273
# File 'lib/sidekiq/api.rb', line 271

def size
  Sidekiq.redis {|c| c.zcard(name) }
end