redis.log(redis.LOG_NOTICE, ‘Redlics’)
local func = cmsgpack.unpack(ARGV) local keys = cmsgpack.unpack(ARGV) local options = cmsgpack.unpack(ARGV)
local function operate(operator, keys)
redis.call('BITOP', operator, options['dest'], unpack(keys)) return options['dest']
end
local function AND(keys) return operate(‘AND’, keys) end local function OR(keys) return operate(‘OR’, keys) end local function XOR(keys) return operate(‘XOR’, keys) end local function NOT(keys) return operate(‘NOT’, keys) end local function MINUS(keys)
local items = keys local src = table.remove(items, 1) local and_op = AND(keys) return XOR({ src, and_op })
end
local function operation(keys, options)
if options['operator'] == 'MINUS' then return MINUS(keys) else return operate(options['operator'], keys) end
end
local function counts(keys, options)
local result if options['bucketized'] then result = 0 for i,v in ipairs(keys) do result = result + (redis.call('HGET', v[1], v[2]) or 0) end else result = redis.call('MGET', unpack(keys)) end return result
end
local function plot_counts(keys, options)
local plot = {} if options['bucketized'] then for i,v in ipairs(keys) do plot[v[1]..v[2]] = (redis.call('HGET', v[1], v[2]) or 0) end else local values = redis.call('MGET', unpack(keys)) for i,v in ipairs(keys) do plot[v] = values[i] end end return cjson.encode(plot)
end
local function plot_tracks(keys, options)
local plot = {} for i,v in ipairs(keys) do plot[v] = redis.call('bitcount', keys[i]) end return cjson.encode(plot)
end
local exportFuncs = {
operation = operation, counts = counts, plot_counts = plot_counts, plot_tracks = plot_tracks
}
return exportFuncs(keys, options)