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

Version Path
scrivito_sdk-0.65.2 lib/scrivito/backend/obj_query.rb
scrivito_sdk-0.65.1 lib/scrivito/backend/obj_query.rb
scrivito_sdk-0.65.0 lib/scrivito/backend/obj_query.rb
scrivito_sdk-0.65.0.rc2 lib/scrivito/backend/obj_query.rb
scrivito_sdk-0.65.0.rc1 lib/scrivito/backend/obj_query.rb