Skip to content

Commit

Permalink
Add method for queue bulk-add.
Browse files Browse the repository at this point in the history
  • Loading branch information
coleifer committed Feb 4, 2019
1 parent 5e8cc75 commit 7f7e505
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 3 deletions.
26 changes: 26 additions & 0 deletions kt/scripts/kt.lua
Original file line number Diff line number Diff line change
Expand Up @@ -823,6 +823,32 @@ function queue_add(inmap, outmap)
end


-- add/enqueue multiple items to a queue
-- accepts: { queue, 0: data0, 1: data1, ... n: dataN, db }
-- returns { num }
function queue_madd(inmap, outmap)
local fn = function(db, i, o)
local n = 0
while i[tostring(n)] ~= nil do
local id = db:increment_double(i.queue, 1)
if not id then
kt.log("info", "unable to determine id when adding item to queue!")
return kt.RVELOGIC
end
local key = string.format("%s\t%012d", i.queue, id)
if not db:add(key, i[tostring(n)]) then
kt.log("info", "could not add key, already exists")
return kt.RVELOGIC
end
n = n + 1
end
o.num = n
return kt.RVSUCCESS
end
return _qfn(inmap, outmap, {"queue"}, fn)
end


function _queue_iter(db, queue, n, callback)
-- Perform a forward iteration through the queue (up to "n" items). The
-- user-defined callback returns a 2-tuple of (ok, incr) to signal that we
Expand Down
9 changes: 6 additions & 3 deletions tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -781,10 +781,13 @@ def test_queue_methods(self):
self.assertEqual(L.queue_rpop(queue='tq'), {})
self.assertEqual(L.queue_pop(queue='tq'), {})

# Verify we can remove data by value.
for i in range(5):
L.queue_add(queue='tq', data='i%s' % (i % 2))
# Test bulk-add feature.
data = {str(i): 'i%s' % (i % 2) for i in range(5)}
self.assertEqual(L.queue_madd(queue='tq', **data), {'num': '5'})
self.assertEqual(L.queue_peek(queue='tq', n=5), {
'0': 'i0', '1': 'i1', '2': 'i0', '3': 'i1', '4': 'i0'})

# Verify we can remove data by value.
self.assertEqual(L.queue_remove(queue='tq', data='i1'), {'num': '2'})
self.assertEqual(L.queue_remove(queue='tq', data='x'), {'num': '0'})
self.assertEqual(L.queue_size(queue='tq'), {'num': '3'})
Expand Down

0 comments on commit 7f7e505

Please sign in to comment.