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