Module: Kithe::BlacklightTools::SearchServiceBulkLoad

Extended by:
ActiveSupport::Concern
Included in:
BulkLoadingSearchService
Defined in:
lib/kithe/blacklight_tools/search_service_bulk_load.rb

Overview

Mix-in module to a Blacklight::SearchService, that will bulk load actual AR records corresponding to Solr hits, and set them as ‘model` attribute on each SolrDocument in the results.

A very basic rough implementation for basic use cases.

  • Assumes all documents that come back in the Solr results was indexed Kithe::Model, and their Solr ID’s are the Kithe::Model ‘id` pk, or from the AR model attribute name set in `Kithe.indexable_settings.solr_id_value_attribute`

  • Requires your SolrDocument class to have a ‘model` attribute, you can just add `attr_accessor :model` to your local SolrDocument class BL generated in `./app/models/solr_document.rb`. Loaded models will be stored there on your results.

Just ‘include` this model in a Blacklight::SearchService subclass. If you need no additional SearchService customization, but just the standard Blacklight::SearchService with this functionality, for convenience see the Kithe::BlacklightTools::BulkLoadingSearchServicce

SORRY: No automated tests at present, too hard for us at the moment to figure out how to test a Blacklight extension in a reliable and sane way.

Instance Method Summary collapse

Instance Method Details

#search_resultsObject



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/kithe/blacklight_tools/search_service_bulk_load.rb', line 31

def search_results
  (response, _documents) = super

  if bulk_load_records
    id_hash = response.documents.collect {|r| [r.id, r] }.to_h

    scope = Kithe::Model.where(Kithe.indexable_settings.solr_id_value_attribute => id_hash.keys)
    scope = scope.instance_exec(&bulk_load_scope) if bulk_load_scope

    scope.find_each do |model|
      id_hash[model.send(Kithe.indexable_settings.solr_id_value_attribute)].model = model
    end

    orphaned_solr_docs = id_hash.values.select { |doc| doc.model.nil? }
    if orphaned_solr_docs.present?
      Rails.logger.warn("Kithe::Blacklight::BulkLoading: Missing db records for solr doc id's: #{orphaned_solr_docs.collect(&:id).join(' ')}")
    end
  end

  if _documents.nil?
    # NIL, not even empty array -- we are in Blacklight 8+ where this method is supposed
    # to return just ONE object, response
    response
  else
    # Blacklight 7, where this method needs to return two objects
    [response, _documents]
  end
end