Sha256: 02f7c783fa7018e10f9cc2502f2ae060ecc7c5c54397b61caee1f9bd4ecb5999

Contents?: true

Size: 1.23 KB

Versions: 7

Compression:

Stored size: 1.23 KB

Contents

# frozen_string_literal: true
module Valkyrie::Persistence::Solr::Queries
  # Responsible for returning all members of a given resource as
  # {Valkyrie::Resource}s
  class FindMembersQuery
    attr_reader :resource, :connection, :resource_factory, :model
    def initialize(resource:, connection:, resource_factory:, model:)
      @resource = resource
      @connection = connection
      @resource_factory = resource_factory
      @model = model
    end

    def run
      enum_for(:each)
    end

    def each
      return [] unless resource.id.present?
      unordered_members.sort_by { |x| member_ids.index(x.id) }.each do |member|
        yield member
      end
    end

    def unordered_members
      docs.map do |doc|
        resource_factory.to_resource(object: doc)
      end
    end

    def docs
      options = { q: query, rows: 1_000_000_000 }
      options[:fq] = "{!raw f=internal_resource_ssim}#{model}" if model
      options[:defType] = 'lucene'
      result = connection.get("select", params: options)
      result["response"]["docs"]
    end

    def member_ids
      Array.wrap(resource.member_ids)
    end

    def query
      "{!join from=#{MEMBER_IDS} to=join_id_ssi}id:#{id}"
    end

    def id
      resource.id.to_s
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
valkyrie-1.2.0.rc1 lib/valkyrie/persistence/solr/queries/find_members_query.rb
valkyrie-1.1.2 lib/valkyrie/persistence/solr/queries/find_members_query.rb
valkyrie-1.1.1 lib/valkyrie/persistence/solr/queries/find_members_query.rb
valkyrie-1.1.0 lib/valkyrie/persistence/solr/queries/find_members_query.rb
valkyrie-1.0.0 lib/valkyrie/persistence/solr/queries/find_members_query.rb
valkyrie-1.0.0.rc2 lib/valkyrie/persistence/solr/queries/find_members_query.rb
valkyrie-1.0.0.rc1 lib/valkyrie/persistence/solr/queries/find_members_query.rb