Sha256: 8625a95141c4c20e1730694113d3105d31d4baff7983c318af8f0299e4d6120c

Contents?: true

Size: 1.9 KB

Versions: 30

Compression:

Stored size: 1.9 KB

Contents

module Scrivito
module Backend

module ObjQuery

  def self.query(revision, index, keys)
    cache = Backend::ObjDataCache.view_for_revision(revision)

    missing_keys = []

    ids_from_cache = keys.map do |key|
      result =
        if key == nil
          # querys for `nil` are not supported since they kill performance.
          # return empty list without asking the backend.
          []
        else
          cache.read_index(index.id, key, &index.method(:update))
        end

      missing_keys << key unless result

      result
    end

    if missing_keys.blank?
      return load_nested_ids(revision, ids_from_cache)
    end

    backend_ids, tentative = 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, persistent: !tentative)
    end

    cache_obj_datas.map do |obj_datas|
      obj_datas || grouped_backend_results.shift
    end
  end

  # 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
  private_class_method def self.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|
      # use 'compact' to filter out any objs that are still referenced by id
      # in the cache, but have been deleted in the backend concurrently.
      all_obj_datas.shift(ids.length).compact if ids
    end
  end

end

end
end

Version data entries

30 entries across 30 versions & 1 rubygems

Version Path
scrivito_sdk-1.12.0.rc2 app/cms/scrivito/backend/obj_query.rb
scrivito_sdk-1.12.0.rc1 app/cms/scrivito/backend/obj_query.rb
scrivito_sdk-1.11.0 app/cms/scrivito/backend/obj_query.rb
scrivito_sdk-1.11.0.rc1 app/cms/scrivito/backend/obj_query.rb
scrivito_sdk-1.10.0 app/cms/scrivito/backend/obj_query.rb
scrivito_sdk-1.10.0.rc5 app/cms/scrivito/backend/obj_query.rb
scrivito_sdk-1.10.0.rc4 app/cms/scrivito/backend/obj_query.rb
scrivito_sdk-1.10.0.rc3 app/cms/scrivito/backend/obj_query.rb
scrivito_sdk-1.10.0.rc2 lib/scrivito/backend/obj_query.rb
scrivito_sdk-1.10.0.rc1 lib/scrivito/backend/obj_query.rb