Sha256: 353440873eec8b6c6107597f6053208c8c0b97654b642e6de28133f02a4b2ac6

Contents?: true

Size: 1.27 KB

Versions: 5

Compression:

Stored size: 1.27 KB

Contents

module CurationConcerns
  class PresenterFactory
    class << self
      # @param [Array] ids the list of ids to load
      # @param [Class] klass the class of presenter to make
      # @return [Array] presenters for the documents in order of the ids
      def build_presenters(ids, klass, ability)
        new(ids, klass, ability).build
      end
    end

    attr_reader :ids, :klass, :ability

    def initialize(ids, klass, ability)
      @ids = ids
      @klass = klass
      @ability = ability
    end

    def build
      return [] if ids.blank?
      docs = load_docs
      ids.map do |id|
        solr_doc = docs.find { |doc| doc.id == id }
        klass.new(solr_doc, ability) if solr_doc
      end.compact
    end

    private

      # @return [Array<SolrDocument>] a list of solr documents in no particular order
      def load_docs
        query("{!terms f=id}#{ids.join(',')}", rows: 1000)
          .map { |res| SolrDocument.new(res) }
      end

      # Query solr using POST so that the query doesn't get too large for a URI
      def query(query, args = {})
        args[:q] = query
        args[:qt] = 'standard'
        conn = ActiveFedora::SolrService.instance.conn
        result = conn.post('select', data: args)
        result.fetch('response').fetch('docs')
      end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
curation_concerns-1.0.0.beta3 app/presenters/curation_concerns/presenter_factory.rb
curation_concerns-1.0.0.beta2 app/presenters/curation_concerns/presenter_factory.rb
curation_concerns-1.0.0.beta1 app/presenters/curation_concerns/presenter_factory.rb
curation_concerns-0.14.0 app/presenters/curation_concerns/presenter_factory.rb
curation_concerns-0.14.0.pre4 app/presenters/curation_concerns/presenter_factory.rb