module Europeana::Blacklight::Response::Facets

Facets for {Europeana::Blacklight::Response}

Based on {Blacklight::SolrResponse::Facets} v5.10.2

Public Instance Methods

aggregations() click to toggle source
# File lib/europeana/blacklight/response/facets.rb, line 76
def aggregations
  @aggregations ||= {}.merge(facet_field_aggregations).merge(facet_query_aggregations)
end
facet_fields() click to toggle source
# File lib/europeana/blacklight/response/facets.rb, line 80
def facet_fields
  @facet_fields ||= self['facets'] || []
end
facet_queries() click to toggle source
# File lib/europeana/blacklight/response/facets.rb, line 84
def facet_queries
  @facet_queries ||= self['facet_queries'] || {}
end

Private Instance Methods

facet_field_aggregation_options(name) click to toggle source
# File lib/europeana/blacklight/response/facets.rb, line 132
def facet_field_aggregation_options(name)
  options = {}

  if params[:"f.#{name}.facet.limit"]
    options[:limit] = params[:"f.#{name}.facet.limit"].to_i
  elsif params[:'facet.limit']
    options[:limit] = params[:'facet.limit'].to_i
  end

  if params[:"f.#{name}.facet.offset"]
    options[:offset] = params[:"f.#{name}.facet.offset"].to_i
  elsif params[:'facet.offset']
    options[:offset] = params[:'facet.offset'].to_i
  end

  options
end
facet_field_aggregations() click to toggle source

Convert API's facets response into a hash of {Europeana::Blacklight::Response::Facet::FacetField} objects

# File lib/europeana/blacklight/response/facets.rb, line 93
def facet_field_aggregations
  facet_fields.each_with_object({}) do |facet, hash|
    facet_field_name = facet['name']

    items = facet['fields'].map do |value|
      FacetItem.new(value: value['label'], hits: value['count'])
    end

    if blacklight_config && blacklight_config.facet_fields[facet_field_name]
      if blacklight_config.facet_fields[facet_field_name].group.present?
        items = grouped_facet_field_items(facet_field_name, items)
      end
    end

    hash[facet_field_name] = FacetField.new(facet_field_name, items, facet_field_aggregation_options(facet_field_name))

    next unless blacklight_config && !blacklight_config.facet_fields[facet_field_name]
    # alias all the possible blacklight config names..
    blacklight_config.facet_fields.select { |_k, v| v.field == facet_field_name }.each do |key, _|
      hash[key] = hash[facet_field_name]
    end
  end
end
facet_query_aggregations() click to toggle source

Aggregate API's facet_query response into the virtual facet fields defined in the blacklight configuration

# File lib/europeana/blacklight/response/facets.rb, line 153
def facet_query_aggregations
  return {} unless blacklight_config

  query_facet_fields = blacklight_config.facet_fields.select { |_k, v| v.query }
  query_facet_fields.each_with_object({}) do |(field_name, facet_field), hash|
    facet_query_params = facet_field.query.map { |_k, v| v[:fq] }
    response_facet_queries = facet_queries.dup
    response_facet_queries.select! { |k, _hits| facet_query_params.include?(k) }
    response_facet_queries.reject! { |_k, hits| hits == 0 }

    items = response_facet_queries.map do |value, hits|
      salient_fields = facet_field.query.select { |_k, v| v[:fq] == value }
      key = ((salient_fields.keys if salient_fields.respond_to? :keys) || salient_fields.first).first
      FacetItem.new(value: key, hits: hits, label: facet_field.query[key][:label])
    end

    hash[field_name] = FacetField.new(field_name, items)
  end
end
grouped_facet_field_items(facet_field_name, items) click to toggle source
# File lib/europeana/blacklight/response/facets.rb, line 117
def grouped_facet_field_items(facet_field_name, items)
  groups = {}

  items.each do |item|
    item_group = blacklight_config.facet_fields[facet_field_name].group.call(item)
    if groups.key?(item_group)
      groups[item_group].hits += item.hits
    else
      groups[item_group] = FacetItem.new(item_group, item.hits)
    end
  end

  groups.values.sort_by { |item| -item.hits }
end