Sha256: 032d90ee2898181b4b1582441bb04586df652765b3504256aee520ca5cba17f3
Contents?: true
Size: 1.49 KB
Versions: 5
Compression:
Stored size: 1.49 KB
Contents
module Scrivito module Backend module ObjQuery class << self def query(revision, index, keys) cache = Backend::ObjDataCache.view_for_revision(revision) missing_keys = [] ids_from_cache = keys.map do |key| result = cache.read_index(index.id, key) missing_keys << key unless result result end if missing_keys.blank? return load_nested_ids(revision, ids_from_cache) end backend_ids = revision.obj_search_request(index.query(missing_keys)) all_obj_datas = load_nested_ids(revision, ids_from_cache + [backend_ids]) cache_obj_datas = all_obj_datas[0..-2] backend_obj_datas = all_obj_datas.last grouped_backend_results = index.group_by(missing_keys, backend_obj_datas) grouped_backend_results.each_with_index do |result, i| ids = result.map { |obj_data| obj_data.value_of("_id") } cache.write_index(index.id, missing_keys[i], ids) end cache_obj_datas.map do |obj_datas| obj_datas || grouped_backend_results.shift end end private # nested_ids is a list containing elements that are either lists of ids or nil # returns a corresponding list # containing elements that are either lists of obj_datas or nil def load_nested_ids(revision, nested_ids) all_ids = nested_ids.inject([]) do |list, ids| ids ? list + ids : list end all_obj_datas = Backend::ObjLoad.load(revision, all_ids) nested_ids.map do |ids| all_obj_datas.shift(ids.length) if ids end end end end end end
Version data entries
5 entries across 5 versions & 1 rubygems