module RedMatryoshka::RelatedCache

Public Instance Methods

remove_cache() click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 44
def remove_cache
  retrieve_cache_klass(self).each do |klass|
    cache_klass = klass.new
    listener_options = cache_klass.classes_to_listen_for[self.class.name]

    cache_klass.set_sub_id(send(listener_options[:sub])) unless listener_options[:sub].nil?

    RedMatryoshka::Cache.new(cache_klass).delete(record(klass).id)

    remove_sub_cache(klass)
  end
end
remove_dependent_cache() click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 57
def remove_dependent_cache
  retrieve_cache_klass(self).each do |klass|
    instantiate_klass = klass.new

    dependencies(instantiate_klass).each do |dependence|
      keys = keys_to_update(klass, dependence)
      redis.multi do
        keys.each do |key|
          redis.del key
        end
      end
    end
  end
end
update_cache() click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 15
def update_cache
  retrieve_cache_klass(self).each do |klass|
    cache_klass = klass.new
    listener_options = cache_klass.classes_to_listen_for[self.class.name]

    cache_klass.set_sub_id(send(listener_options[:sub])) unless listener_options[:sub].nil?

    RedMatryoshka::Cache.new(cache_klass).cache(record(klass).reload)

    update_sub_cache(klass)
  end
end
update_dependent_cache() click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 28
def update_dependent_cache
  retrieve_cache_klass(self).each do |klass|
    instantiate_klass = klass.new
    hash = main_hash_for_dependence(klass)

    dependencies(instantiate_klass).each do |dependence|
      keys = keys_to_update(klass, dependence)
      redis.multi do
        keys.each do |key|
          redis.mapped_hmset(key, hash)
        end
      end
    end
  end
end

Private Instance Methods

cache_klass_with_module(klass) click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 108
def cache_klass_with_module(klass)
  if RedMatryoshka.configuration.module.present?
    "#{RedMatryoshka.configuration.module}::#{klass}".constantize
  else
    klass.constantize
  end
rescue NameError
  if klass.is_a? String
    klass.constantize
  else
    klass
  end
end
dependencies(cache_klass) click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 104
def dependencies(cache_klass)
  cache_klass.classes_dependencies_of.map { |klass| cache_klass_with_module(klass) }
end
keys_to_update(klass, dependence) click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 148
def keys_to_update(klass, dependence)
  redis.eval(
    lua_script,
    [
      cache_klass_with_module(dependence).new.cache_key("*"),
      klass.new.cache_key("#{id}:id", false)
    ]
  )
end
lua_script() click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 141
def lua_script
  File.open(
    File.dirname(__dir__) + "/utils/hassociate.lua",
    "rb"
  ).read
end
main_hash_for_dependence(klass) click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 122
def main_hash_for_dependence(klass)
  cache_klass = klass.new
  listener_options = cache_klass.classes_to_listen_for[self.class.name]

  cache_klass.set_sub_id(send(listener_options[:sub])) unless listener_options[:sub].nil?

  hash = RedMatryoshka::Cache.new(cache_klass).cache_doll(record(klass).reload).flatten
  id = record(klass).id

  hash.inject({}) do |cache_hash, (k, v)|
    new_key = klass.new.cache_key("#{id}:#{k}", false)
    cache_hash.merge(new_key => v)
  end
end
record(klass) click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 162
def record(klass)
  listener_options = klass.new.classes_to_listen_for[self.class.name]

  if listener_options[:record] != :self
    send(listener_options[:record])
  else
    self
  end
end
redis() click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 137
def redis
  @redis ||= RedMatryoshka.configuration.redis
end
remove_sub_cache(klass) click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 86
def remove_sub_cache(klass)
  cache_klass = klass.new

  # TODO: Use LUA script instead
  sub_keys_to_update(klass).each do |key|
    redis.multi do
      redis.del key
    end
  end
end
retrieve_cache_klass(record) click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 97
def retrieve_cache_klass(record)
  RedMatryoshka::Base.descendants.inject([]) do |descendants, d|
    descendants << d if d.new.classes_to_listen_for.keys.include? record.class.name
    descendants
  end
end
sub_keys_to_update(klass) click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 158
def sub_keys_to_update(klass)
  redis.keys(klass.new.cache_key("*:#{id}"))
end
update_sub_cache(klass) click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 74
def update_sub_cache(klass)
  cache_klass = klass.new
  hash = RedMatryoshka::Cache.new(cache_klass).cache_doll(record(klass)).flatten

  # TODO: Use LUA script instead
  sub_keys_to_update(klass).each do |key|
    redis.multi do
      redis.mapped_hmset(key, hash)
    end
  end
end