Sha256: 59e9fc6a21f0dcf2faa5f2d99d9ec5b2f07355e0d9accf14a28cb32b798380b4

Contents?: true

Size: 1.66 KB

Versions: 5

Compression:

Stored size: 1.66 KB

Contents

module ActiveFedora::Associations
  ##
  # Finds the objects which associate with a given record and are contained
  # within the given container. Uses #repository to find the objects.
  class ContainedFinder
    attr_reader :container, :repository, :proxy_class
    delegate :contained_ids, to: :container
    # @param [#contained_ids] container a container that records are stored
    #   under.
    # @param [#translate_uri_to_id, #find] repository a repository to build
    #   objects from.
    # @param [ActiveFedora::Base] proxy_class class that represents an
    #   ore:Proxy
    def initialize(container:, repository:, proxy_class:)
      @container = container
      @repository = repository
      @proxy_class = proxy_class
    end

    # @param [ActiveFedora::Base] record a record which you want to find the
    #   reference node for.
    # @return [Array<ActiveFedora::Base>] This returns whatever type
    #   repository.find returns.
    def find(record)
      record.reload
      repository.find(matching_ids(record))
    end

    private

    def matching_ids(record)
      IDComposite.new(proxy_ids(record) & contained_ids, repository.translate_uri_to_id)
    end

    def proxy_ids(record)
      relation_subjects(record)
    end

    # This could be done with Prefer InboundReferences, but that is
    # a slow fedora call
    def relation_subjects(record)
      query = ActiveFedora::SolrQueryBuilder.construct_query_for_rel(
        [[:has_model, proxy_class.to_class_uri], [:proxyFor, record.id]]
      )
      results = ActiveFedora::SolrService.query(query, fl: 'id')
      results.map { |res| ::RDF::URI(ActiveFedora::Base.id_to_uri(res['id'])) }
    end
  end

end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
active-fedora-9.5.0 lib/active_fedora/associations/contained_finder.rb
active-fedora-9.4.3 lib/active_fedora/associations/contained_finder.rb
active-fedora-9.4.2 lib/active_fedora/associations/contained_finder.rb
active-fedora-9.4.1 lib/active_fedora/associations/contained_finder.rb
active-fedora-9.4.0 lib/active_fedora/associations/contained_finder.rb