Skip to content

Commit 379b8ff

Browse files
committed
Refactor SearchBuilder search logic customizations for Blacklight 9.0.0.beta8
This seems to be what it requires of us. Under discussion in projectblacklight/blacklight#3762 it is somewhat possible it will change before 9.0.0 final, although some people strongly prefer it this way.
1 parent 16b6a5f commit 379b8ff

8 files changed

+122
-64
lines changed

app/controllers/collection_show_controller.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,11 @@ def blacklight_config
4040
configure_blacklight do |config|
4141
# Our custom sub-class to limit just to docs in collection, with collection id
4242
# taken from params[:collection_id]
43+
#
44+
# Blacklight 9 requires this logic to be duplicated in two parallel search builder
45+
# classes, see https://github.com/projectblacklight/blacklight/pull/3762
4346
config.search_builder_class = ::SearchBuilder::WithinCollectionBuilder
47+
config.facet_search_builder_class = ::SearchBuilder::WithinCollectionFacetBuilder
4448

4549
# and we need to make sure collection_id is allowed by BL, don't totally
4650
# understand this, as of BL 7.25

app/controllers/featured_topic_controller.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ class FeaturedTopicController < CatalogController
44

55
configure_blacklight do |config|
66
# Limit just to items in the featured topic.
7+
# For Blacklight 9, we need to do this in two classes.
78
config.search_builder_class = ::SearchBuilder::WithinFeaturedTopicBuilder
9+
config.facet_search_builder_class = ::SearchBuilder::WithinFeaturedTopicFacetBuilder
810

911
# And we need to make sure the :slug param is allowed by blacklight,
1012
# don't totally understand why, as of BL 7.25
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Blacklight 9 requires all local custom SearchBuilder logic to be duplicated in two
2+
# places, also into a corresponding FacetSearchBuilder class. So we do it here, so
3+
# it can be done in two places DRY. Sorry for increase of complexity.
4+
#
5+
# See https://github.com/projectblacklight/blacklight/pull/3762
6+
module SearchBuilderBehavior
7+
extend ActiveSupport::Concern
8+
9+
# For blacklight_range_limit plugin
10+
include BlacklightRangeLimit::RangeLimitBuilder
11+
12+
# Scihist SearchBuilder extensions
13+
include SearchBuilder::AccessControlFilter
14+
include SearchBuilder::AdminOnlySearchFields
15+
include SearchBuilder::CustomSortLogic
16+
include SearchBuilder::AllSearchResultIdsBuilder
17+
18+
##
19+
# @example Adding a new step to the processor chain
20+
#
21+
# included do
22+
# self.default_processor_chain += [:add_custom_data_to_query]
23+
# end
24+
#
25+
# def add_custom_data_to_query(solr_parameters)
26+
# solr_parameters[:custom] = blacklight_params[:user_value]
27+
# end
28+
end
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# Applies a limit to search just within a given collection, filtering on solr
2+
# field where we've stored the containing collection ids.
3+
#
4+
# :collection_id needs to be provided in context, the actual UUID pk of collection,
5+
# since that's what we index.
6+
#
7+
# Used on CollectionShowController search within a collection
8+
#
9+
# Blacklight 9 requires all custom search builder logic to be duplicated in a FacetSearchBuilder,
10+
# so it lives here to keep it DRY.
11+
# See https://github.com/projectblacklight/blacklight/pull/3762
12+
module WithinCollectionBuilderBehavior
13+
extend ActiveSupport::Concern
14+
15+
included do
16+
class_attribute :collection_id_solr_field, default: "collection_id_ssim"
17+
class_attribute :box_id_solr_field, default: "box_tsi"
18+
class_attribute :folder_id_solr_field, default: "folder_tsi"
19+
20+
self.default_processor_chain += [:within_collection]
21+
end
22+
23+
def within_collection(solr_parameters)
24+
solr_parameters[:fq] ||= []
25+
solr_parameters[:fq] << "{!term f=#{collection_id_solr_field}}#{collection_id}"
26+
solr_parameters[:fq] << "#{box_id_solr_field}:(#{box_id})" if box_id.present?
27+
solr_parameters[:fq] << "#{folder_id_solr_field}:(#{folder_id})" if folder_id.present?
28+
end
29+
30+
private
31+
32+
# Overrides CustomSortLogic#default_sort_order
33+
def default_sort_order
34+
scope.context.dig(:collection_default_sort_order) || super
35+
end
36+
37+
def collection_id
38+
scope.context.fetch(:collection_id)
39+
end
40+
41+
def box_id
42+
safe_solr_escape scope.context.fetch :box_id
43+
end
44+
45+
def folder_id
46+
safe_solr_escape scope.context.fetch :folder_id
47+
end
48+
49+
def safe_solr_escape str
50+
RSolr.solr_escape str unless str.nil?
51+
end
52+
53+
end
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Applies a limit to search just within a given featured topic.
2+
#
3+
# :slug needs to be provided in context.
4+
#
5+
# Used on FeaturedTopicController.
6+
# Blacklight 9 requires all custom search builder logic to be duplicated in a FacetSearchBuilder,
7+
# so it lives here to keep it DRY.
8+
#
9+
# See https://github.com/projectblacklight/blacklight/pull/3762
10+
module WithinFeaturedTopicBuilderBehavior
11+
extend ActiveSupport::Concern
12+
13+
included do
14+
self.default_processor_chain += [:within_featured_topic]
15+
end
16+
17+
def within_featured_topic(solr_parameters)
18+
featured_topic = FeaturedTopic.from_slug(blacklight_params[:slug])
19+
solr_parameters[:fq] ||= []
20+
solr_parameters[:fq] << featured_topic.solr_fq
21+
end
22+
end

app/models/search_builder.rb

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,10 @@
11
# frozen_string_literal: true
22
#
3-
# TODO: chf_sufia mixin's or equivalents for:
4-
# * SearchBuilder::RestrictAdminSearchFields => Makes sure admin notes are only searchable if logged in
5-
# * SearchBuilder::SyntheticCategoryLimit => something with making our 'topics'/synthetic categories
6-
# work as limits, probably just for showing the main page for a 'topic'
3+
# Blacklight 9 requires all custom search builder logic to be duplicated in a FacetSearchBuilder,
4+
# so please do all customization in the `SearchBuilderBehavior` module so it can be kept DRY.
5+
# See https://github.com/projectblacklight/blacklight/pull/3762
76
class SearchBuilder < Blacklight::SearchBuilder
87
include Blacklight::Solr::SearchBuilderBehavior
9-
include BlacklightRangeLimit::RangeLimitBuilder
108

11-
12-
# Scihist SearchBuilder extensions
13-
include SearchBuilder::AccessControlFilter
14-
include SearchBuilder::AdminOnlySearchFields
15-
include SearchBuilder::CustomSortLogic
16-
include SearchBuilder::AllSearchResultIdsBuilder
17-
18-
##
19-
# @example Adding a new step to the processor chain
20-
# self.default_processor_chain += [:add_custom_data_to_query]
21-
#
22-
# def add_custom_data_to_query(solr_parameters)
23-
# solr_parameters[:custom] = blacklight_params[:user_value]
24-
# end
9+
include SearchBuilderBehavior
2510
end
Lines changed: 7 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# frozen_string_literal: true
2+
23
class SearchBuilder
34
# Applies a limit to search just within a given collection, filtering on solr
45
# field where we've stored the containing collection ids.
@@ -7,42 +8,12 @@ class SearchBuilder
78
# since that's what we index.
89
#
910
# Used on CollectionShowController search within a collection
11+
#
12+
# Blacklight 9 requires all custom search builder logic to be duplicated in a FacetSearchBuilder,
13+
# so all logic is located in the `WithinCollectionBuilderBehavior` module so it can be kept DRY.
14+
# See https://github.com/projectblacklight/blacklight/pull/3762
15+
#
1016
class WithinCollectionBuilder < ::SearchBuilder
11-
class_attribute :collection_id_solr_field, default: "collection_id_ssim"
12-
class_attribute :box_id_solr_field, default: "box_tsi"
13-
class_attribute :folder_id_solr_field, default: "folder_tsi"
14-
15-
self.default_processor_chain += [:within_collection]
16-
17-
def within_collection(solr_parameters)
18-
solr_parameters[:fq] ||= []
19-
solr_parameters[:fq] << "{!term f=#{collection_id_solr_field}}#{collection_id}"
20-
solr_parameters[:fq] << "#{box_id_solr_field}:(#{box_id})" if box_id.present?
21-
solr_parameters[:fq] << "#{folder_id_solr_field}:(#{folder_id})" if folder_id.present?
22-
end
23-
24-
private
25-
26-
# Overrides CustomSortLogic#default_sort_order
27-
def default_sort_order
28-
scope.context.dig(:collection_default_sort_order) || super
29-
end
30-
31-
def collection_id
32-
scope.context.fetch(:collection_id)
33-
end
34-
35-
def box_id
36-
safe_solr_escape scope.context.fetch :box_id
37-
end
38-
39-
def folder_id
40-
safe_solr_escape scope.context.fetch :folder_id
41-
end
42-
43-
def safe_solr_escape str
44-
RSolr.solr_escape str unless str.nil?
45-
end
46-
17+
include WithinCollectionBuilderBehavior
4718
end
4819
end

app/models/search_builder/within_featured_topic_builder.rb

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,8 @@ class SearchBuilder
44
# :slug needs to be provided in context.
55
#
66
# Used on FeaturedTopicController.
7+
#
78
class WithinFeaturedTopicBuilder < ::SearchBuilder
8-
extend ActiveSupport::Concern
9-
10-
self.default_processor_chain += [:within_featured_topic]
11-
12-
def within_featured_topic(solr_parameters)
13-
featured_topic = FeaturedTopic.from_slug(blacklight_params[:slug])
14-
solr_parameters[:fq] ||= []
15-
solr_parameters[:fq] << featured_topic.solr_fq
16-
end
9+
include WithinFeaturedTopicBuilderBehavior
1710
end
1811
end

0 commit comments

Comments
 (0)