Skip to content

Commit 8555711

Browse files
authored
Merge pull request #72 from MITLibraries/rdi-241-support-for-multivalue-facets
Support multivalue facets
2 parents 5590545 + d7e7593 commit 8555711

File tree

4 files changed

+52
-10
lines changed

4 files changed

+52
-10
lines changed

app/helpers/facet_helper.rb

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,21 @@
11
module FacetHelper
22
def add_facet(query, facet, term)
3-
new_query = query.clone
3+
new_query = query.deep_dup
44
new_query[:page] = 1
5-
new_query[facet.to_sym] = term
5+
6+
# source is being treated as single value in facet application
7+
# even though we allow OR-ing multiple sources via advanced search
8+
# This might feel somewhat odd, but until we get feedback from UX this
9+
# seems like the best solution as each record only has a single source
10+
# in the data so there will never be a case to apply multiple in an AND
11+
# which is all we support in facet application.
12+
if new_query[facet].present? && facet != 'source'
13+
new_query[facet] << term
14+
new_query[facet].uniq!
15+
else
16+
new_query[facet] = [term]
17+
end
18+
619
new_query
720
end
821

@@ -14,7 +27,7 @@ def nice_labels
1427
end
1528

1629
def remove_facet(query, facet)
17-
new_query = query.clone
30+
new_query = query.deep_dup
1831
new_query[:page] = 1
1932
new_query.delete facet.to_sym
2033
new_query

app/helpers/form_helper.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ module FormHelper
22
def source_checkbox(source, params)
33
"<div class='field-subitem'>
44
<label class='field-checkbox'>
5-
<input type='checkbox' value='#{source}' name='source[]' class='source'#{if params[:source]&.include?(source)
6-
' checked'
7-
end}>
5+
<input type='checkbox' value='#{source.downcase}' name='source[]' class='source'#{if params[:source]&.include?(source.downcase)
6+
' checked'
7+
end}>
88
#{source}
99
</label>
1010
</div>".html_safe

app/models/query_builder.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ class QueryBuilder
22
attr_reader :query
33

44
RESULTS_PER_PAGE = 20
5-
QUERY_PARAMS = %w[q citation contentType contributors fundingInformation identifiers locations subjects title].freeze
6-
FILTER_PARAMS = [:source].freeze
5+
QUERY_PARAMS = %w[q citation contributors fundingInformation identifiers locations subjects title].freeze
6+
FILTER_PARAMS = %i[source contentType].freeze
77

88
def initialize(enhanced_query)
99
@query = {}
@@ -31,5 +31,6 @@ def extract_query(enhanced_query)
3131
def extract_filters(enhanced_query)
3232
# NOTE: ui and backend naming are not aligned so we can't loop here. we should fix in UI
3333
@query['sourceFacet'] = enhanced_query[:source]
34+
@query['contentType'] = enhanced_query[:contentType]
3435
end
3536
end

test/helpers/facet_helper_test.rb

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class FacetHelperTest < ActionView::TestCase
1111
expected_query = {
1212
page: 1,
1313
q: 'data',
14-
contentType: 'dataset'
14+
'contentType' => ['dataset']
1515
}
1616
assert_equal expected_query, add_facet(original_query, 'contentType', 'dataset')
1717
end
@@ -24,11 +24,39 @@ class FacetHelperTest < ActionView::TestCase
2424
expected_query = {
2525
page: 1,
2626
q: 'data',
27-
contentType: 'dataset'
27+
'contentType' => ['dataset']
2828
}
2929
assert_equal expected_query, add_facet(original_query, 'contentType', 'dataset')
3030
end
3131

32+
test 'add_facet can apply multiple values for each facet group' do
33+
original_query = {
34+
page: 3,
35+
q: 'data',
36+
'contentType' => ['still image']
37+
}
38+
expected_query = {
39+
page: 1,
40+
q: 'data',
41+
'contentType' => ['still image', 'dataset']
42+
}
43+
assert_equal expected_query, add_facet(original_query, 'contentType', 'dataset')
44+
end
45+
46+
test 'add_facet with source value overwrites existing sources' do
47+
original_query = {
48+
page: 3,
49+
q: 'data',
50+
'source' => ['source the first', 'source the second']
51+
}
52+
expected_query = {
53+
page: 1,
54+
q: 'data',
55+
'source' => ['source the only']
56+
}
57+
assert_equal expected_query, add_facet(original_query, 'source', 'source the only')
58+
end
59+
3260
test 'nice_labels allows translation of machine categories to human readable headings' do
3361
needle = 'contentType'
3462
assert_equal 'Content types', nice_labels[needle]

0 commit comments

Comments
 (0)