Sha256: 2e4587e52f96e7d3ee792128aba26aa854fa403d81d5469f628ae2ff18c9b554

Contents?: true

Size: 1.91 KB

Versions: 16

Compression:

Stored size: 1.91 KB

Contents

# frozen_string_literal: true

module Spotlight
  ##
  # Expose Solr index metadata about fields
  class FieldMetadata
    FACET_LIMIT = 20

    attr_reader :exhibit, :repository, :blacklight_config

    def initialize(exhibit, repository, blacklight_config)
      @exhibit = exhibit
      @repository = repository
      @blacklight_config = blacklight_config
    end

    def field(key)
      {
        document_count: document_counts.fetch(field_name(key), 0),
        value_count: terms.fetch(field_name(key), []).length,
        terms: terms.fetch(field_name(key), [])
      }
    end

    def search_params
      search_builder.merge(rows: 0, 'facet.limit' => FACET_LIMIT + 1)
    end

    private

    def field_name(key)
      if blacklight_config.facet_fields[key]
        blacklight_config.facet_fields[key].field
      else
        key
      end
    end

    def search_builder_class
      blacklight_config.search_builder_class
    end

    def search_builder
      search_builder_class.new(self)
    end

    def solr_response
      @solr_response ||= repository.search(search_params.merge('facet.query' => facet_fields.map { |_key, fields| "#{fields.field}:[* TO *]" },
                                                               'rows' => 0,
                                                               'facet' => true))
    end

    # This gets the number of *documents* with a field
    def document_counts
      @document_count ||= begin
        solr_response.facet_queries.each_with_object({}) do |(k, v), h|
          h[k.split(/:/).first] = v
        end
      end
    end

    def terms
      @terms ||= begin
        solr_response.aggregations.each_with_object({}) do |(facet_name, facet), h|
          h[facet_name] = facet.items.map(&:label)
        end
      end
    end

    def facet_fields
      blacklight_config.facet_fields.reject { |_k, v| v.pivot || v.query }
    end

    alias current_exhibit exhibit
  end
end

Version data entries

16 entries across 16 versions & 1 rubygems

Version Path
blacklight-spotlight-2.13.0 app/models/spotlight/field_metadata.rb
blacklight-spotlight-2.12.1 app/models/spotlight/field_metadata.rb
blacklight-spotlight-2.12.0 app/models/spotlight/field_metadata.rb
blacklight-spotlight-2.11.0 app/models/spotlight/field_metadata.rb
blacklight-spotlight-2.10.0 app/models/spotlight/field_metadata.rb
blacklight-spotlight-2.9.0 app/models/spotlight/field_metadata.rb
blacklight-spotlight-2.8.0 app/models/spotlight/field_metadata.rb
blacklight-spotlight-2.7.2 app/models/spotlight/field_metadata.rb
blacklight-spotlight-2.7.1 app/models/spotlight/field_metadata.rb
blacklight-spotlight-2.7.0 app/models/spotlight/field_metadata.rb
blacklight-spotlight-2.6.1.1 app/models/spotlight/field_metadata.rb
blacklight-spotlight-2.6.1 app/models/spotlight/field_metadata.rb
blacklight-spotlight-2.6.0 app/models/spotlight/field_metadata.rb
blacklight-spotlight-2.5.2 app/models/spotlight/field_metadata.rb
blacklight-spotlight-2.5.1 app/models/spotlight/field_metadata.rb
blacklight-spotlight-2.5.0 app/models/spotlight/field_metadata.rb