class Jason::LuaGenerator

Public Instance Methods

cache_json(model_name, id, payload) click to toggle source

TODO load these scripts and evalsha

# File lib/jason/lua_generator.rb, line 3
  def cache_json(model_name, id, payload)
    cmd = <<~LUA
      local gidx = redis.call('INCR', 'jason:gidx')
      redis.call( 'set', 'jason:cache:' .. ARGV[1] .. ':' .. ARGV[2] .. ':gidx', gidx )
      redis.call( 'hset', 'jason:cache:' .. ARGV[1], ARGV[2], ARGV[3] )
      return gidx
    LUA

    result = $redis_jason.eval cmd, [], [model_name, id, payload.to_json]
  end
get_payload(model_name, sub_id) click to toggle source
# File lib/jason/lua_generator.rb, line 14
  def get_payload(model_name, sub_id)
    # If value has changed, return old value and new idx. Otherwise do nothing.
    cmd = <<~LUA
      local t = {}
      local models = {}
      local ids = redis.call('smembers', 'jason:subscriptions:' .. ARGV[2] .. ':ids:' .. ARGV[1])

      for k,id in pairs(ids) do
        models[#models+1] = redis.call( 'hget', 'jason:cache:' .. ARGV[1], id)
      end

      t[#t+1] = models
      t[#t+1] = redis.call( 'get', 'jason:subscription:' .. ARGV[2] .. ':' .. ARGV[1] .. ':idx' )

      return t
    LUA

    $redis_jason.eval cmd, [], [model_name, sub_id]
  end
get_subscription(model_name, id, sub_id, gidx) click to toggle source
# File lib/jason/lua_generator.rb, line 34
  def get_subscription(model_name, id, sub_id, gidx)
    # If value has changed, return old value and new idx. Otherwise do nothing.
    cmd = <<~LUA
      local last_gidx = redis.call('get', 'jason:cache:' .. ARGV[1] .. ':' .. ARGV[2] .. ':gidx') or 0

      if (ARGV[4] >= last_gidx) then
        local sub_idx = redis.call( 'incr', 'jason:subscription:' .. ARGV[3] .. ':' .. ARGV[1] .. ':idx' )
        return sub_idx
      else
        return false
      end
    LUA

    $redis_jason.eval cmd, [], [model_name, id, sub_id, gidx]
  end
update_set_with_diff(key, add_members, remove_members) click to toggle source
# File lib/jason/lua_generator.rb, line 50
  def update_set_with_diff(key, add_members, remove_members)
    cmd = <<~LUA
      local old_members = redis.call('smembers', KEYS[1])
      local add_size = ARGV[1]

      for k, m in pairs({unpack(ARGV, 2, add_size + 1)}) do
        redis.call('sadd', KEYS[1], m)
      end

      for k, m in pairs({unpack(ARGV, add_size + 2, #ARGV)}) do
        redis.call('srem', KEYS[1], m)
      end

      return old_members
    LUA

    args = [add_members.size, add_members, remove_members].flatten

    old_members = $redis_jason.eval cmd, [key], args
    return [old_members, (old_members + add_members - remove_members).uniq]
  end