Class: Hyrax::SolrQueryService

Inherits:
SearchBuilder
  • Object
show all
Defined in:
app/services/hyrax/solr_query_service.rb

Overview

Note:

Methods in this class are providing functionality previously supported by ActiveFedora::SolrQueryBuilder.

Supports building and executing a solr query.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(query: [], solr_service: Hyrax::SolrService) ⇒ SolrQueryService



14
15
16
17
# File 'app/services/hyrax/solr_query_service.rb', line 14

def initialize(query: [], solr_service: Hyrax::SolrService)
  @query = query
  @solr_service = solr_service
end

Instance Attribute Details

#queryObject (readonly)

Returns the value of attribute query.



12
13
14
# File 'app/services/hyrax/solr_query_service.rb', line 12

def query
  @query
end

#solr_serviceObject (readonly)

Returns the value of attribute solr_service.



12
13
14
# File 'app/services/hyrax/solr_query_service.rb', line 12

def solr_service
  @solr_service
end

Class Method Details

.document_modelClass

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns the model class to use for solr documents.

See Also:

  • Blacklight::Configuration#document_model


24
25
26
# File 'app/services/hyrax/solr_query_service.rb', line 24

def self.document_model
  CatalogController.blacklight_config.document_model
end

Instance Method Details

#accessible_by(ability:, action: :index) ⇒ SolrQueryService



133
134
135
136
137
# File 'app/services/hyrax/solr_query_service.rb', line 133

def accessible_by(ability:, action: :index)
  access_filters_query = construct_query_for_ability(ability, action)
  @query += [access_filters_query] if access_filters_query.present?
  self
end

#build(join_with: 'AND') ⇒ String



72
73
74
75
# File 'app/services/hyrax/solr_query_service.rb', line 72

def build(join_with: 'AND')
  return 'id:NEVER_USE_THIS_ID' if @query.blank? # forces this method to always return a valid solr query
  @query.join(padded_join_with(join_with))
end

#countInteger



65
66
67
# File 'app/services/hyrax/solr_query_service.rb', line 65

def count
  solr_service.count(build)
end

#get(**args) ⇒ Hash

execute the query using a GET request



31
32
33
# File 'app/services/hyrax/solr_query_service.rb', line 31

def get(**args)
  solr_service.get(build, **args)
end

#get_idsArray<String>



50
51
52
53
# File 'app/services/hyrax/solr_query_service.rb', line 50

def get_ids # rubocop:disable Naming/AccessorMethodName
  results = query_result
  results['response']['docs'].map { |doc| doc['id'] }
end

#get_objects(use_valkyrie: Hyrax.config.use_valkyrie?) ⇒ Array<Valkyrie::Resource|ActiveFedora::Base>



57
58
59
60
61
# File 'app/services/hyrax/solr_query_service.rb', line 57

def get_objects(use_valkyrie: Hyrax.config.use_valkyrie?)
  ids = get_ids
  return ids.map { |id| ActiveFedora::Base.find(id) } unless use_valkyrie
  query_service.find_many_by_ids(ids: ids)
end

#query_result(**args) ⇒ Hash

execute the solr query and return results



38
39
40
# File 'app/services/hyrax/solr_query_service.rb', line 38

def query_result(**args)
  solr_service.query_result(build, **args)
end

#resetHyrax::SolrQueryService



79
80
81
82
# File 'app/services/hyrax/solr_query_service.rb', line 79

def reset
  @query = []
  self
end

#solr_documents(**args) ⇒ Enumerable<SolrDocument>



44
45
46
# File 'app/services/hyrax/solr_query_service.rb', line 44

def solr_documents(**args)
  query_result(**args)['response']['docs'].map { |doc| self.class.document_model.new(doc) }
end

#with_field_pairs(field_pairs: {}, join_with: default_join_with, type: 'field') ⇒ SolrQueryService



122
123
124
125
126
127
# File 'app/services/hyrax/solr_query_service.rb', line 122

def with_field_pairs(field_pairs: {}, join_with: default_join_with, type: 'field')
  pairs_query = construct_query_for_pairs(field_pairs, join_with, type)
  return self if pairs_query.blank?
  @query += [pairs_query]
  self
end

#with_generic_type(generic_type: 'Work') ⇒ SolrQueryService



107
108
109
110
111
112
113
114
115
# File 'app/services/hyrax/solr_query_service.rb', line 107

def with_generic_type(generic_type: 'Work')
  # TODO: Generic type was originally stored as `sim`.  Since it is never multi-valued, it is moving to being stored
  #       as `si`.  Until a migration is created to correct existing solr docs, this query searches in both fields.
  #       @see https://github.com/samvera/hyrax/issues/6086
  field_pairs = { generic_type_si: generic_type, generic_type_sim: generic_type }
  type_query = construct_query_for_pairs(field_pairs, ' OR ', 'field')
  @query += [type_query]
  self
end

#with_ids(ids: []) ⇒ Hyrax::SolrQueryService

Returns the existing service with id query appended.

Raises:

  • (ArgumentError)


87
88
89
90
91
92
93
# File 'app/services/hyrax/solr_query_service.rb', line 87

def with_ids(ids: [])
  ids = ids.reject(&:blank?)
  raise ArgumentError, "Expected there to be at least one non-blank id." if ids.blank?
  id_query = construct_query_for_ids(ids)
  @query += [id_query]
  self
end

#with_model(model:) ⇒ SolrQueryService



98
99
100
101
102
# File 'app/services/hyrax/solr_query_service.rb', line 98

def with_model(model:)
  model_query = construct_query_for_model(model)
  @query += [model_query]
  self
end