class CacheStore

Public Class Methods

new() click to toggle source
# File lib/mongoid_cache_store.rb, line 8
def initialize
  @doc_ids_hash = {}
  @related_docs_hash = {}
  @documents = {}
end

Public Instance Methods

cache_docs(doc_ids, doc_class, related_infos = []) click to toggle source
{field_name: 'image_id', klass: Users::ProfileImage}
# File lib/mongoid_cache_store.rb, line 15
def cache_docs(doc_ids, doc_class, related_infos = [])
  doc_type = doc_class.to_s.underscore
  @doc_ids_hash[doc_type] ||= {}
  [doc_ids].flatten.compact.uniq.each{|doc_id| @doc_ids_hash[doc_type][doc_id.to_s] = nil}
  @related_docs_hash[doc_type] ||= []
  @related_docs_hash[doc_type] += related_infos

  self
end
document(doc_id, doc_class) click to toggle source
# File lib/mongoid_cache_store.rb, line 25
def document(doc_id, doc_class)
  return nil if doc_id.blank?
  doc_type = doc_class.to_s.underscore
  ensure_query(doc_class, doc_id)

  @documents[doc_type][doc_id.to_s]
end
sorted_documents(doc_class, doc_ids = nil) click to toggle source
# File lib/mongoid_cache_store.rb, line 40
def sorted_documents(doc_class, doc_ids = nil)
  doc_type = doc_class.to_s.underscore
  ensure_query(doc_class, doc_ids)
  return [] if @documents[doc_type].blank?

  doc_ids == nil ?
    @documents[doc_type].values.compact :
    doc_ids.map{|doc_id| @documents[doc_type][doc_id.to_s]}.compact
end
valid_doc_ids(doc_class, doc_ids = nil) click to toggle source
# File lib/mongoid_cache_store.rb, line 33
def valid_doc_ids(doc_class, doc_ids = nil)
  doc_type = doc_class.to_s.underscore
  ensure_query(doc_class, doc_ids)

  doc_ids.blank? ? cached_ids(doc_type) : doc_ids.select{|doc_id| @documents[doc_type][doc_id.to_s].present?}
end

Private Instance Methods

cached_ids(doc_type) click to toggle source
# File lib/mongoid_cache_store.rb, line 52
def cached_ids(doc_type)
  return [] if @documents[doc_type].blank?
  @documents[doc_type].select{|k,v| v.present?}.keys.compact
end
ensure_query(doc_class, doc_ids) click to toggle source

ensure that there are no missing docs for doc_class

# File lib/mongoid_cache_store.rb, line 58
def ensure_query(doc_class, doc_ids)
  doc_ids = [doc_ids].flatten.uniq.map(&:to_s)
  doc_type = doc_class.to_s.underscore

  if doc_ids.present? && (@doc_ids_hash[doc_type].blank? || doc_ids.reject{|doc_id| @doc_ids_hash[doc_type].has_key?(doc_id.to_s)}.present?)
    cache_docs(doc_ids, doc_class)
  end

  if @documents[doc_type].blank? || @doc_ids_hash[doc_type].keys.reject{|doc_id| @documents[doc_type].has_key?(doc_id.to_s)}.present?
    find_documents(doc_type)
  end
end
find_documents(doc_type) click to toggle source

update cache for doc_type

# File lib/mongoid_cache_store.rb, line 72
def find_documents(doc_type)
  klass = doc_type.camelize.constantize

  return if @doc_ids_hash[doc_type].blank?

  # find docs with ids missing from cache
  doc_ids = @doc_ids_hash[doc_type].keys
  doc_ids -= @documents[doc_type].keys if @documents[doc_type]

  return if doc_ids.blank?

  docs = klass.where(:_id.in => doc_ids.dup).to_a

  @related_docs_hash[doc_type].each do |related_doc|
    related_doc_ids = docs.map do |doc|
      field_name = related_doc[:field_name]
      field_names = field_name.split(".")
      field_names.each do |fname|
        if doc.respond_to?(:each)
          doc = doc.map{|r_doc| r_doc.send(fname)}.flatten
        else
          doc = doc.send(fname)
        end
      end
      doc
    end.flatten.uniq
    cache_docs(related_doc_ids, related_doc[:klass])
  end

  @documents[doc_type] ||= {}
  doc_ids.each{|doc_id| @documents[doc_type].store(doc_id, nil)}
  (docs || []).each{|doc| @documents[doc_type][doc.id.to_s] = doc}
end