local rcall = redis.call
local removeJobChildren
local removeJobWithChildren
removeJobChildren = function(prefix, jobKey, options)
if not options.ignoreProcessed then
local processed = rcall("HGETALL", jobKey .. ":processed")
if #processed > 0 then
for i = 1, #processed, 2 do
local childJobId = getJobIdFromKey(processed[i])
local childJobPrefix = getJobKeyPrefix(processed[i], childJobId)
removeJobWithChildren(childJobPrefix, childJobId, jobKey, options)
end
end
local failed = rcall("HGETALL", jobKey .. ":failed")
if #failed > 0 then
for i = 1, #failed, 2 do
local childJobId = getJobIdFromKey(failed[i])
local childJobPrefix = getJobKeyPrefix(failed[i], childJobId)
removeJobWithChildren(childJobPrefix, childJobId, jobKey, options)
end
end
local unsuccessful = rcall("ZRANGE", jobKey .. ":unsuccessful", 0, -1)
if #unsuccessful > 0 then
for i = 1, #unsuccessful, 1 do
local childJobId = getJobIdFromKey(unsuccessful[i])
local childJobPrefix = getJobKeyPrefix(unsuccessful[i], childJobId)
removeJobWithChildren(childJobPrefix, childJobId, jobKey, options)
end
end
end
local dependencies = rcall("SMEMBERS", jobKey .. ":dependencies")
if #dependencies > 0 then
for i, childJobKey in ipairs(dependencies) do
local childJobId = getJobIdFromKey(childJobKey)
local childJobPrefix = getJobKeyPrefix(childJobKey, childJobId)
removeJobWithChildren(childJobPrefix, childJobId, jobKey, options)
end
end
end
removeJobWithChildren = function(prefix, jobId, parentKey, options)
local jobKey = prefix .. jobId
if options.ignoreLocked then
if isLocked(prefix, jobId) then
return
end
end
local failedSet = prefix .. "failed"
if not (options.ignoreProcessed and rcall("ZSCORE", failedSet, jobId)) then
removeParentDependencyKey(jobKey, false, parentKey, nil)
if options.removeChildren then
removeJobChildren(prefix, jobKey, options)
end
local prev = removeJobFromAnyState(prefix, jobId)
local deduplicationId = rcall("HGET", jobKey, "deid")
removeDeduplicationKeyIfNeededOnRemoval(prefix, jobId, deduplicationId)
if removeJobKeys(jobKey) > 0 then
local metaKey = prefix .. "meta"
local maxEvents = getOrSetMaxEvents(metaKey)
rcall("XADD", prefix .. "events", "MAXLEN", "~", maxEvents, "*", "event", "removed",
"jobId", jobId, "prev", prev)
end
end
end