class Blacklight::SearchState

This class encapsulates the search state as represented by the query parameters namely: :f, :q, :page, :per_page and, :sort

Attributes

blacklight_config[R]
controller[R]

This method is never accessed in this class, but may be used by subclasses that need to access the url_helpers

params[R]

Public Class Methods

new(params, blacklight_config, controller = nil) click to toggle source

@param [ActionController::Parameters] params @param [Blacklight::Config] blacklight_config @param [ApplicationController] controller used for the routing helpers

# File lib/blacklight/search_state.rb, line 23
def initialize(params, blacklight_config, controller = nil)
  @params = self.class.normalize_params(params)
  @blacklight_config = blacklight_config
  @controller = controller
end
normalize_params(untrusted_params = {}) click to toggle source
# File lib/blacklight/search_state.rb, line 29
def self.normalize_params(untrusted_params = {})
  params = untrusted_params

  if params.respond_to?(:to_unsafe_h)
    # This is the typical (not-ActionView::TestCase) code path.
    params = params.to_unsafe_h
    # In Rails 5 to_unsafe_h returns a HashWithIndifferentAccess, in Rails 4 it returns Hash
    params = params.with_indifferent_access if params.instance_of? Hash
  elsif params.is_a? Hash
    # This is an ActionView::TestCase workaround for Rails 4.2.
    params = params.dup.with_indifferent_access
  else
    params = params.dup.to_h.with_indifferent_access
  end

  # Normalize facet parameters mangled by facebook
  if params[:f].is_a?(Hash) && params[:f].values.any? { |x| x.is_a?(Hash) }
    params[:f] = params[:f].transform_values do |value|
      value.is_a?(Hash) ? value.values : value
    end
  end

  params
end

Public Instance Methods

add_facet_params(field, item) click to toggle source

adds the value and/or field to params Does NOT remove request keys and otherwise ensure that the hash is suitable for a redirect. See add_facet_params_and_redirect

# File lib/blacklight/search_state.rb, line 154
def add_facet_params(field, item)
  filter(field).add(item).params
end
add_facet_params_and_redirect(field, item) click to toggle source

Used in catalog/facet action, facets.rb view, for a click on a facet value. Add on the facet params to existing search constraints. Remove any paginator-specific request params, or other request params that should be removed for a 'fresh' display. Change the action to 'index' to send them back to catalog/index with their new facet choice.

# File lib/blacklight/search_state.rb, line 166
def add_facet_params_and_redirect(field, item)
  new_params = Deprecation.silence(self.class) do
    add_facet_params(field, item)
  end

  # Delete any request params from facet-specific action, needed
  # to redir to index action properly.
  request_keys = blacklight_config.facet_paginator_class.request_keys
  new_params.extract!(*request_keys.values)

  new_params
end
clause_params() click to toggle source
# File lib/blacklight/search_state.rb, line 93
def clause_params
  params[:clause] || {}
end
facet_page() click to toggle source
# File lib/blacklight/search_state.rb, line 242
def facet_page
  [params[facet_request_keys[:page]].to_i, 1].max
end
facet_prefix() click to toggle source
# File lib/blacklight/search_state.rb, line 250
def facet_prefix
  params[facet_request_keys[:prefix]]
end
facet_sort() click to toggle source
# File lib/blacklight/search_state.rb, line 246
def facet_sort
  params[facet_request_keys[:sort]]
end
filter(field_key_or_field) click to toggle source
# File lib/blacklight/search_state.rb, line 142
def filter(field_key_or_field)
  field = field_key_or_field if field_key_or_field.is_a? Blacklight::Configuration::Field
  field ||= blacklight_config.facet_fields[field_key_or_field]
  field ||= Blacklight::Configuration::NullField.new(key: field_key_or_field)

  (field.filter_class || FilterField).new(field, self)
end
filter_params() click to toggle source
# File lib/blacklight/search_state.rb, line 97
def filter_params
  params[:f] || {}
end
filters() click to toggle source
# File lib/blacklight/search_state.rb, line 134
def filters
  @filters ||= blacklight_config.facet_fields.each_value.map do |value|
    f = filter(value)

    f if f.any?
  end.compact
end
has_constraints?() click to toggle source
# File lib/blacklight/search_state.rb, line 83
def has_constraints?
  Deprecation.silence(Blacklight::SearchState) do
    !(query_param.blank? && filter_params.blank? && filters.blank? && clause_params.blank?)
  end
end
has_facet?(config, value: nil) click to toggle source
# File lib/blacklight/search_state.rb, line 190
def has_facet?(config, value: nil)
  if value
    filter(config).include?(value)
  else
    filter(config).any?
  end
end
method_missing(method_name, *arguments, &block) click to toggle source
Calls superclass method
# File lib/blacklight/search_state.rb, line 64
def method_missing(method_name, *arguments, &block)
  if @params.respond_to?(method_name)
    Deprecation.warn(self.class, "Calling `#{method_name}` on Blacklight::SearchState " \
      'is deprecated and will be removed in Blacklight 8. Call #to_h first if you ' \
      ' need to use hash methods (or, preferably, use your own SearchState implementation)')
    @params.public_send(method_name, *arguments, &block)
  else
    super
  end
end
page() click to toggle source
# File lib/blacklight/search_state.rb, line 218
def page
  [params[:page].to_i, 1].max
end
per_page() click to toggle source
# File lib/blacklight/search_state.rb, line 222
def per_page
  params[:rows].presence&.to_i ||
    params[:per_page].presence&.to_i ||
    blacklight_config.default_per_page
end
query_param() click to toggle source
# File lib/blacklight/search_state.rb, line 89
def query_param
  params[:q]
end
remove_facet_params(field, item) click to toggle source

copies the current params (or whatever is passed in as the 3rd arg) removes the field value from params removes the field if there are no more values in params[field] removes additional params (page, id, etc..) @param [String] field @param [String] item

# File lib/blacklight/search_state.rb, line 185
def remove_facet_params(field, item)
  filter(field).remove(item).params
end
remove_query_params() click to toggle source
# File lib/blacklight/search_state.rb, line 128
def remove_query_params
  p = reset_search_params
  p.delete(:q)
  p
end
reset(params = nil) click to toggle source

@return [Blacklight::SearchState]

# File lib/blacklight/search_state.rb, line 103
def reset(params = nil)
  self.class.new(params || ActionController::Parameters.new, blacklight_config, controller)
end
respond_to_missing?(method_name, include_private = false) click to toggle source
Calls superclass method
# File lib/blacklight/search_state.rb, line 75
def respond_to_missing?(method_name, include_private = false)
  @params.respond_to?(method_name, include_private) || super
end
search_field() click to toggle source
# File lib/blacklight/search_state.rb, line 238
def search_field
  blacklight_config.search_fields[search_field_key]
end
sort_field() click to toggle source
# File lib/blacklight/search_state.rb, line 228
def sort_field
  if sort_field_key.blank?
    # no sort param provided, use default
    blacklight_config.default_sort_field
  else
    # check for sort field key
    blacklight_config.sort_fields[sort_field_key]
  end
end
to_h()
Alias for: to_hash
to_hash() click to toggle source
# File lib/blacklight/search_state.rb, line 54
def to_hash
  @params.deep_dup
end
Also aliased as: to_h
to_unsafe_h() click to toggle source
# File lib/blacklight/search_state.rb, line 59
def to_unsafe_h
  Deprecation.warn(self.class, 'Use SearchState#to_h instead of SearchState#to_unsafe_h')
  to_hash
end
url_for_document(doc, options = {}) click to toggle source

Extension point for downstream applications to provide more interesting routing to documents

# File lib/blacklight/search_state.rb, line 116
def url_for_document(doc, options = {})
  if respond_to?(:blacklight_config) &&
      blacklight_config.view_config(:show).route &&
      (!doc.respond_to?(:to_model) || doc.to_model.is_a?(SolrDocument))
    route = blacklight_config.view_config(:show).route.merge(action: :show, id: doc).merge(options)
    route[:controller] = params[:controller] if route[:controller] == :current
    route
  else
    doc
  end
end

Private Instance Methods

facet_request_keys() click to toggle source
# File lib/blacklight/search_state.rb, line 264
def facet_request_keys
  blacklight_config.facet_paginator_class.request_keys
end
reset_search_params() click to toggle source

Reset any search parameters that store search context and need to be reset when e.g. constraints change @return [ActionController::Parameters]

# File lib/blacklight/search_state.rb, line 272
def reset_search_params
  Parameters.sanitize(params).except(:page, :counter)
end
search_field_key() click to toggle source
# File lib/blacklight/search_state.rb, line 256
def search_field_key
  params[:search_field]
end
sort_field_key() click to toggle source
# File lib/blacklight/search_state.rb, line 260
def sort_field_key
  params[:sort]
end