Class: Blacklight::SearchState

Inherits:
Object
  • Object
show all
Defined in:
lib/blacklight/search_state.rb,
lib/blacklight/search_state/filter_field.rb,
lib/blacklight/search_state/pivot_filter_field.rb

Overview

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

Defined Under Namespace

Classes: FilterField, PivotFilterField

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(params, blacklight_config, controller = nil) ⇒ SearchState

Returns a new instance of SearchState.

Parameters:

  • params (ActionController::Parameters)
  • blacklight_config (Blacklight::Config)
  • controller (ApplicationController) (defaults to: nil)

    used for the routing helpers



21
22
23
24
25
# File 'lib/blacklight/search_state.rb', line 21

def initialize(params, blacklight_config, controller = nil)
  @blacklight_config = blacklight_config
  @controller = controller
  @params = Blacklight::Parameters.new(params, self).permit_search_params.to_h.with_indifferent_access
end

Instance Attribute Details

#blacklight_configObject (readonly)

Must be called blacklight_config, because Blacklight::Facet calls blacklight_config.



10
11
12
# File 'lib/blacklight/search_state.rb', line 10

def blacklight_config
  @blacklight_config
end

#controllerObject (readonly)

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



14
15
16
# File 'lib/blacklight/search_state.rb', line 14

def controller
  @controller
end

#paramsObject (readonly)

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



14
15
16
# File 'lib/blacklight/search_state.rb', line 14

def params
  @params
end

Instance Method Details

#add_facet_params_and_redirect(field, item) ⇒ Object

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.



105
106
107
108
109
110
111
112
113
114
# File 'lib/blacklight/search_state.rb', line 105

def add_facet_params_and_redirect(field, item)
  new_params = filter(field).add(item).to_h

  # 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_paramsObject



40
41
42
# File 'lib/blacklight/search_state.rb', line 40

def clause_params
  params[:clause] || {}
end

#facet_pageObject



159
160
161
# File 'lib/blacklight/search_state.rb', line 159

def facet_page
  [params[facet_request_keys[:page]].to_i, 1].max
end

#facet_prefixObject



167
168
169
# File 'lib/blacklight/search_state.rb', line 167

def facet_prefix
  params[facet_request_keys[:prefix]]
end

#facet_sortObject



163
164
165
# File 'lib/blacklight/search_state.rb', line 163

def facet_sort
  params[facet_request_keys[:sort]]
end

#filter(field_key_or_field) ⇒ FilterField

Returns:



90
91
92
93
94
95
96
# File 'lib/blacklight/search_state.rb', line 90

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_fieldsObject



81
82
83
# File 'lib/blacklight/search_state.rb', line 81

def filter_fields
  blacklight_config.facet_fields.each_value.map { |value| filter(value) }
end

#filtersObject



85
86
87
# File 'lib/blacklight/search_state.rb', line 85

def filters
  @filters ||= filter_fields.select(&:any?)
end

#has_constraints?Boolean

Returns:

  • (Boolean)


32
33
34
# File 'lib/blacklight/search_state.rb', line 32

def has_constraints?
  !(query_param.blank? && filters.blank? && clause_params.blank?)
end

#pageObject



135
136
137
# File 'lib/blacklight/search_state.rb', line 135

def page
  [params[:page].to_i, 1].max
end

#params_for_search(params_to_merge = {}) {|params| ... } ⇒ ActionController::Parameters

Merge the source params with the params_to_merge hash

Parameters:

  • params_to_merge (Hash) (defaults to: {})

    to merge into above

Yields:

  • (params)

    The merged parameters hash before being sanitized

Returns:

  • (ActionController::Parameters)

    the current search parameters after being sanitized by Blacklight::Parameters.sanitize



120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/blacklight/search_state.rb', line 120

def params_for_search(params_to_merge = {})
  # params hash we'll return
  my_params = to_h.merge(self.class.new(params_to_merge, blacklight_config, controller))

  if block_given?
    yield my_params
  end

  if my_params[:page] && (my_params[:per_page] != params[:per_page] || my_params[:sort] != params[:sort])
    my_params[:page] = 1
  end

  Parameters.sanitize(my_params)
end

#per_pageObject



139
140
141
142
143
# File 'lib/blacklight/search_state.rb', line 139

def per_page
  params[:rows].presence&.to_i ||
    params[:per_page].presence&.to_i ||
    blacklight_config.default_per_page
end

#query_paramObject



36
37
38
# File 'lib/blacklight/search_state.rb', line 36

def query_param
  params[:q]
end

#remove_query_paramsObject



75
76
77
78
79
# File 'lib/blacklight/search_state.rb', line 75

def remove_query_params
  p = reset_search_params
  p.delete(:q)
  p
end

#reset(params = nil) ⇒ Blacklight::SearchState



45
46
47
# File 'lib/blacklight/search_state.rb', line 45

def reset(params = nil)
  self.class.new(params || {}, blacklight_config, controller)
end

#reset_search(additional_params = {}) ⇒ Blacklight::SearchState



50
51
52
# File 'lib/blacklight/search_state.rb', line 50

def reset_search(additional_params = {})
  reset(reset_search_params.merge(additional_params))
end

#routable?(doc) ⇒ Boolean

To build a show route, we must have a blacklight_config that has configured show views, and the doc must appropriate to the config

Returns:

  • (Boolean)


69
70
71
72
73
# File 'lib/blacklight/search_state.rb', line 69

def routable?(doc)
  return false unless respond_to?(:blacklight_config) && blacklight_config.view_config(:show).route

  doc.is_a? routable_model_for(blacklight_config)
end

#search_fieldObject



155
156
157
# File 'lib/blacklight/search_state.rb', line 155

def search_field
  blacklight_config.search_fields[search_field_key]
end

#sort_fieldObject



145
146
147
148
149
150
151
152
153
# File 'lib/blacklight/search_state.rb', line 145

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_hashObject Also known as: to_h



27
28
29
# File 'lib/blacklight/search_state.rb', line 27

def to_hash
  params.deep_dup
end

#url_for_document(doc, options = {}) ⇒ Object

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



58
59
60
61
62
63
64
# File 'lib/blacklight/search_state.rb', line 58

def url_for_document(doc, options = {})
  return doc unless routable?(doc)

  route = blacklight_config.view_config(:show).route.merge(action: :show, id: doc).merge(options)
  route[:controller] = params[:controller] if route[:controller] == :current
  route
end