Fixed #731 - Code review issues. Added delete_jobs parameter and pipelining.

This commit is contained in:
Theo 2017-10-04 11:29:33 +01:00
parent 160fe99323
commit c095fe1825
2 changed files with 29 additions and 7 deletions

View File

@ -111,11 +111,15 @@ class Queue(object):
script = self.connection.register_script(script) script = self.connection.register_script(script)
return script(keys=[self.key]) return script(keys=[self.key])
def delete(self): def delete(self, delete_jobs=True):
"""Deletes the queue and all the associated messages on the queue.""" """Deletes the queue. If delete_jobs is true it removes all the associated messages on the queue first."""
self.empty() if delete_jobs:
self.connection.srem(self.redis_queues_keys, self._key) self.empty()
self.connection.delete(self._key)
with self.connection._pipeline() as pipeline:
pipeline.srem(self.redis_queues_keys, self._key)
pipeline.delete(self._key)
pipeline.execute()
def is_empty(self): def is_empty(self):
"""Returns whether the current queue is empty.""" """Returns whether the current queue is empty."""

View File

@ -75,14 +75,32 @@ class TestQueue(RQTestCase):
def test_queue_delete(self): def test_queue_delete(self):
"""Test queue.delete properly removes queue""" """Test queue.delete properly removes queue"""
q = Queue('example') q = Queue('example')
self.testconn.rpush('rq:queue:example', 'foo') job = q.enqueue(say_hello)
self.testconn.rpush('rq:queue:example', 'bar') job2 = q.enqueue(say_hello)
self.assertEqual(2, len(q.get_job_ids())) self.assertEqual(2, len(q.get_job_ids()))
q.delete() q.delete()
self.assertEqual(0, len(q.get_job_ids())) self.assertEqual(0, len(q.get_job_ids()))
self.assertEqual(False, self.testconn.exists(job.key))
self.assertEqual(False, self.testconn.exists(job2.key))
self.assertEqual(0, len(self.testconn.smembers(Queue.redis_queues_keys)))
self.assertEqual(False, self.testconn.exists(q.key))
def test_queue_delete_but_keep_jobs(self):
"""Test queue.delete properly removes queue but keeps the job keys in the redis store"""
q = Queue('example')
job = q.enqueue(say_hello)
job2 = q.enqueue(say_hello)
self.assertEqual(2, len(q.get_job_ids()))
q.delete(delete_jobs=False)
self.assertEqual(0, len(q.get_job_ids()))
self.assertEqual(True, self.testconn.exists(job.key))
self.assertEqual(True, self.testconn.exists(job2.key))
self.assertEqual(0, len(self.testconn.smembers(Queue.redis_queues_keys))) self.assertEqual(0, len(self.testconn.smembers(Queue.redis_queues_keys)))
self.assertEqual(False, self.testconn.exists(q.key)) self.assertEqual(False, self.testconn.exists(q.key))