Module: Seabright::RedisObject::ScriptSources

Defined in:
lib/redis_object/ext/script_cache.rb

Constant Summary collapse

FwdScript =
"redis.call('ZINTERSTORE', KEYS[1], 2, KEYS[2], KEYS[3], 'WEIGHTS', 1, 0)
local keys = redis.call('ZRANGE', KEYS[1], 0, KEYS[4])
redis.call('DEL', KEYS[1])
return keys".freeze
RevScript =
"redis.call('ZINTERSTORE', KEYS[1], 2, KEYS[2], KEYS[3], 'WEIGHTS', 1, 0)
local keys = redis.call('ZREVRANGE', KEYS[1], 0, KEYS[4])
redis.call('DEL', KEYS[1])
return keys".freeze
ColMatcher =
"
local out = {}
local val
local pattern
for i, v in ipairs(KEYS) do
	val = redis.call('HGET',v,ARGV[1])
	if val then
		if ARGV[2]:find('^pattern:') then
			pattern = ARGV[2]:gsub('^pattern:','')
			if val:match(pattern) then
				table.insert(out,KEYS[i])
			end
		elseif ARGV[2]:find('^ipattern:') then
			pattern = ARGV[2]:gsub('^ipattern:',''):lower()
			if val:lower():match(pattern) then
				table.insert(out,KEYS[i])
			end
		else
			if val == ARGV[2] then
				table.insert(out,KEYS[i])
			end
		end
	else
		if ARGV[2] == '#{NilPattern}' then
			table.insert(out,KEYS[i])
		end
	end
end
return out".gsub(/\t/,'').freeze
ColMultiMatcher =
"
local out = {}
local matchers = {}
local matcher = {}
local mod
for i=1,#ARGV do
	mod = i % 2
	if mod == 1 then
		matcher[1] = ARGV[i]
	else
		matcher[2] = ARGV[i]
		table.insert(matchers,matcher)
		matcher = {}
	end
end
local val
local good
local pattern
for i, v in ipairs(KEYS) do
	good = true
	for n=1,#matchers do
		val = redis.call('HGET',v,matchers[n][1])
		if val then
			if matchers[n][2]:find('^pattern:') then
				pattern = matchers[n][2]:gsub('^pattern:','')
				if val:match(pattern) then
					good = good
				else
					good = false
					break
				end
			elseif matchers[n][2]:find('^ipattern:') then
				pattern = matchers[n][2]:gsub('^ipattern:',''):lower()
				if val:lower():match(pattern) then
					good = good
				else
					good = false
					break
				end
			else
				if val ~= matchers[n][2] then
					good = false
					break
				end
			end
		else
			if matchers[n][2] == '#{NilPattern}' then
				good = good
			else
				good = false
				break
			end
		end
	end
	if good == true then
		table.insert(out,KEYS[i])
	end
end
return out".gsub(/\t/,'').freeze
ColOrMatcher =
"
local out = {}
local matchers = {}
local matcher = {}
local mod
for i=1,#ARGV do
	mod = i % 2
	if mod == 1 then
		matcher[1] = ARGV[i]
	else
		matcher[2] = ARGV[i]
		table.insert(matchers,matcher)
		matcher = {}
	end
end

local val
local good
local pattern
for i, v in ipairs(KEYS) do
	good = false
	for n=1,#matchers do
		val = redis.call('HGET',v,matchers[n][1])
		if val then
			if matchers[n][2]:find('^pattern:') then
				pattern = matchers[n][2]:gsub('^pattern:','')
				if val:match(pattern) then
					good = true
					break
				else
					good = good
				end
			elseif matchers[n][2]:find('^ipattern:') then
				pattern = matchers[n][2]:gsub('^ipattern:',''):lower()
				if val:lower():match(pattern) then
					good = true
					break
				else
					good = good
				end
			else
				if val == matchers[n][2] then
					good = true
					break
				end
			end
		else
			if matchers[n][2] == '#{NilPattern}' then
				good = good
				break
			else
				good = false
			end
		end
	end
	if good == true then
		table.insert(out,KEYS[i])
	end
end
return out".gsub(/\t/,'').freeze
KeyListFor =
GetKeyList + "
	return itms
".gsub(/\t/,'').freeze
Matcher =
GetKeyList + "
local out = {}
local val
local pattern
for i, v in ipairs(itms) do
	val = redis.call('HGET',v,ARGV[1])
	if val then
		if ARGV[2]:find('^pattern:') then
			pattern = ARGV[2]:gsub('^pattern:','')
			if val:match(pattern) then
				table.insert(out,itms[i])
			end
		elseif ARGV[2]:find('^ipattern:') then
			pattern = ARGV[2]:gsub('^ipattern:',''):lower()
			if val:lower():match(pattern) then
				table.insert(out,itms[i])
			end
		else
			if val == ARGV[2] then
				table.insert(out,itms[i])
			end
		end
	else
		if ARGV[2] == '#{NilPattern}' then
			table.insert(out,itms[i])
		end
	end
end
return out".gsub(/\t/,'').freeze
MultiMatcher =
GetKeyList + "
local out = {}
local matchers = {}
local matcher = {}
local mod
for i=1,#ARGV do
	mod = i % 2
	if mod == 1 then
		matcher[1] = ARGV[i]
	else
		matcher[2] = ARGV[i]
		table.insert(matchers,matcher)
		matcher = {}
	end
end
local val
local good
local pattern
for i, v in ipairs(itms) do
	good = true
	for n=1,#matchers do
		val = redis.call('HGET',v,matchers[n][1])
		if val then
			if matchers[n][2]:find('^pattern:') then
				pattern = matchers[n][2]:gsub('^pattern:','')
				if val:match(pattern) then
					good = good
				else
					good = false
					break
				end
			elseif matchers[n][2]:find('^ipattern:') then
				pattern = matchers[n][2]:gsub('^ipattern:',''):lower()
				if val:lower():match(pattern) then
					good = good
				else
					good = false
					break
				end
			else
				if val ~= matchers[n][2] then
					good = false
					break
				end
			end
		else
			if matchers[n][2] == '#{NilPattern}' then
				good = good
			else
				good = false
				break
			end
		end
	end
	if good == true then
		table.insert(out,itms[i])
	end
end
return out".gsub(/\t/,'').freeze
OrMatcher =
GetKeyList + "
local out = {}
local matchers = {}
local matcher = {}
local mod
for i=1,#ARGV do
	mod = i % 2
	if mod == 1 then
		matcher[1] = ARGV[i]
	else
		matcher[2] = ARGV[i]
		table.insert(matchers,matcher)
		matcher = {}
	end
end

local val
local good
local pattern
for i, v in ipairs(itms) do
	good = false
	for n=1,#matchers do
		val = redis.call('HGET',v,matchers[n][1])
		if val then
			if matchers[n][2]:find('^pattern:') then
				pattern = matchers[n][2]:gsub('^pattern:','')
				if val:match(pattern) then
					good = true
					break
				else
					good = good
				end
			elseif matchers[n][2]:find('^ipattern:') then
				pattern = matchers[n][2]:gsub('^ipattern:',''):lower()
				if val:lower():match(pattern) then
					good = true
					break
				else
					good = good
				end
			else
				if val == matchers[n][2] then
					good = true
					break
				end
			end
		else
			if matchers[n][2] == '#{NilPattern}' then
				good = good
				break
			else
				good = false
			end
		end
	end
	if good == true then
		table.insert(out,itms[i])
	end
end
return out".gsub(/\t/,'').freeze
FirstMatcher =
GetKeyList + "
local val
local pattern
for i, v in ipairs(itms) do
	val = redis.call('HGET',v,ARGV[1])
	if val then
		if ARGV[2]:find('^pattern:') then
			pattern = ARGV[2]:gsub('^pattern:','')
			if val:match(pattern) then
				return itms[i]
			end
		elseif ARGV[2]:find('^ipattern:') then
			pattern = ARGV[2]:gsub('^ipattern:',''):lower()
			if val:lower():match(pattern) then
				return itms[i]
			end
		else
			if val == ARGV[2] then
				return itms[i]
			end
		end
	else
		if ARGV[2] == '#{NilPattern}' then
			return itms[i]
		end
	end
end
return ''".gsub(/\t/,'').freeze
FirstMultiMatcher =
GetKeyList + "
local matchers = {}
local matcher = {}
local mod
for i=1,#ARGV do
	mod = i % 2
	if mod == 1 then
		matcher[1] = ARGV[i]
	else
		matcher[2] = ARGV[i]
		table.insert(matchers,matcher)
		matcher = {}
	end
end
local val
local good
local pattern
for i, v in ipairs(itms) do
	good = true
	for n=1,#matchers do
		val = redis.call('HGET',v,matchers[n][1])
		if val then
			if matchers[n][2]:find('^pattern:') then
				pattern = matchers[n][2]:gsub('^pattern:','')
				if val:match(pattern) then
					good = good
				else
					good = false
					break
				end
			elseif matchers[n][2]:find('^ipattern:') then
				pattern = matchers[n][2]:gsub('^ipattern:',''):lower()
				if val:lower():match(pattern) then
					good = good
				else
					good = false
					break
				end
			else
				if val ~= matchers[n][2] then
					good = false
					break
				end
			end
		else
			if matchers[n][2] == '#{NilPattern}' then
				good = good
			else
				good = false
				break
			end
		end
	end
	if good == true then
		return itms[i]
	end
end
return ''".gsub(/\t/,'').freeze
FirstOrMatcher =
GetKeyList + "
local matchers = {}
local matcher = {}
local mod
for i=1,#ARGV do
	mod = i % 2
	if mod == 1 then
		matcher[1] = ARGV[i]
	else
		matcher[2] = ARGV[i]
		table.insert(matchers,matcher)
		matcher = {}
	end
end

local val
local good
local pattern
for i, v in ipairs(itms) do
	good = false
	for n=1,#matchers do
		val = redis.call('HGET',v,matchers[n][1])
		if val then
			if matchers[n][2]:find('^pattern:') then
				pattern = matchers[n][2]:gsub('^pattern:','')
				if val:match(pattern) then
					good = true
					break
				else
					good = good
				end
			elseif matchers[n][2]:find('^ipattern:') then
				pattern = matchers[n][2]:gsub('^ipattern:',''):lower()
				if val:lower():match(pattern) then
					good = true
					break
				else
					good = good
				end
			else
				if val == matchers[n][2] then
					good = true
					break
				end
			end
		else
			if matchers[n][2] == '#{NilPattern}' then
				good = good
				break
			else
				good = false
			end
		end
	end
	if good == true then
		return itms[i]
	end
end
return ''".gsub(/\t/,'').freeze