local queries = cmsgpack.unpack(ARGV) local ids = cmsgpack.unpack(ARGV) local model_name = cmsgpack.unpack(ARGV) local uniques = cmsgpack.unpack(ARGV) local tracked = cmsgpack.unpack(ARGV)

local function remove_indices(model_key, id)

local memo = model_key  .. ":_indices"
local existing = redis.call("SMEMBERS", memo)

for _, key in ipairs(existing) do
    redis.call("SREM", key, id)
    redis.call("SREM", memo, key)
end

end

local function remove_uniques(model_key, model_name, uniques)

local memo = model_key .. ":_uniques"

for _, unique_key in pairs(uniques) do
    local key = model_name .. ":uniques:" .. unique_key

    redis.call("HDEL", key, redis.call("HGET", memo, key))
    redis.call("HDEL", memo, key)
end

end

local function remove_tracked(model_key, tracked)

for _, tracked_key in ipairs(tracked) do
    local key = model_key .. ":" .. tracked_key

    redis.call("DEL", key)
end

end

local function delete(model_key, model_name, id)

local keys = {
    model_key .. ":counters",
    model_key .. ":_indices",
    model_key .. ":_uniques",
    model_key
}

redis.call("SREM", model_name .. ":all", id)
redis.call("DEL", unpack(keys))

end

local results = {} for _, query in pairs(queries) do

results = redis.call(unpack(query))

end

if next(ids) then

redis.call("DEL", unpack(ids))

end

if results ~= nil then

local model = redis.call("HGETALL", model_name .. ":" .. results[1])
table.insert(model, 'id')
table.insert(model, results[1])

local model_key = model_name .. ":" .. results[1]

remove_indices(model_key, results[1])
remove_uniques(model_key, model_name, uniques)
remove_tracked(model_key, tracked)
delete(model_key, model_name, results[1])

return model

end

return nil