From 8487dcecbee6bd0d7fc349c0b1be9ca632f19846 Mon Sep 17 00:00:00 2001 From: D Chua Date: Fri, 4 Oct 2024 11:49:28 +0100 Subject: [PATCH] Add sort filters to search page By default the results returned are "best match" and the sort option in the filter is automatically selected. When the results are sorted by "most recent" we want to sort using the `public_updated_at` (the equivalent field in Solr is `metadata_modified`) and ordered by desc. This is passed as the `sort` parameter in the Solr query. --- app/controllers/solr_search_controller.rb | 4 +- app/services/search/solr.rb | 4 ++ app/views/solr_search/search.html.erb | 1 + spec/features/solr_search_page_spec.rb | 85 ++++++++++++++--------- 4 files changed, 62 insertions(+), 32 deletions(-) diff --git a/app/controllers/solr_search_controller.rb b/app/controllers/solr_search_controller.rb index ac354d89..a3179fa8 100644 --- a/app/controllers/solr_search_controller.rb +++ b/app/controllers/solr_search_controller.rb @@ -1,7 +1,9 @@ class SolrSearchController < ApplicationController before_action :search_for_dataset, only: [:search] - def search; end + def search + @sort = params["sort"] + end private diff --git a/app/services/search/solr.rb b/app/services/search/solr.rb index 503714a8..73691956 100644 --- a/app/services/search/solr.rb +++ b/app/services/search/solr.rb @@ -3,17 +3,21 @@ class Solr def self.search(params) query_param = params.fetch("q", "").squish page = params["page"] + sort_param = params["sort"] page && page.to_i.positive? ? page.to_i : 1 solr_client = client query = "*:*" if query_param.empty? + sort_query = "metadata_modified desc" if sort_param == "recent" + solr_client.get "select", params: { q: query, start: page, rows: 20, fl: field_list, + sort: sort_query, } end diff --git a/app/views/solr_search/search.html.erb b/app/views/solr_search/search.html.erb index 9f6f33eb..2e242a66 100644 --- a/app/views/solr_search/search.html.erb +++ b/app/views/solr_search/search.html.erb @@ -25,6 +25,7 @@
+ <%= render '/search/sort' if @num_results > 1 %> <%= number_with_delimiter(@num_results) %> <%= t('.result').pluralize(@num_results) %> <%= t('.found') %> diff --git a/spec/features/solr_search_page_spec.rb b/spec/features/solr_search_page_spec.rb index 3ced8d1f..b6386a39 100644 --- a/spec/features/solr_search_page_spec.rb +++ b/spec/features/solr_search_page_spec.rb @@ -3,43 +3,66 @@ RSpec.describe "Solr Search page", type: :feature do let(:results) { File.read(Rails.root.join("spec/fixtures/solr_response.json").to_s) } - before do - allow(Search::Solr).to receive(:search).and_return(JSON.parse(results)) - end + describe "Default search page behaviour" do + before do + allow(Search::Solr).to receive(:search).and_return(JSON.parse(results)) + end - scenario "Displays search heading" do - visit "/search/solr" - expect(page).to have_css("h1", text: "Search results") - end + scenario "Displays search heading" do + visit "/search/solr" + expect(page).to have_css("h1", text: "Search results") + end - scenario "Displays search box" do - visit "/search/solr" - expect(page).to have_content("Search data.gov.uk") - end + scenario "Displays search box" do + visit "/search/solr" + expect(page).to have_content("Search data.gov.uk") + end - scenario "Displays search results" do - visit "/search/solr" - expect(page).to have_content("2 results found") - end + scenario "Displays search results" do + visit "/search/solr" + expect(page).to have_content("2 results found") + end - scenario "Displays the title for each search result" do - visit "/search/solr" - expect(page).to have_css("h2", text: "A very interesting dataset") - expect(page).to have_css("h2", text: "A dataset with additional inspire metadata") - end + scenario "Displays the title for each search result" do + visit "/search/solr" + expect(page).to have_css("h2", text: "A very interesting dataset") + expect(page).to have_css("h2", text: "A dataset with additional inspire metadata") + end - scenario "Displays the publisher for each search result" do - visit "/search/solr" - results = all(".published_by") - expect(results.length).to be(2) - expect(results[0]).to have_content "Ministry of Housing, Communities and Local Government" - expect(results[1]).to have_content "Mole Valley District Council" + scenario "Displays the publisher for each search result" do + visit "/search/solr" + results = all(".published_by") + expect(results.length).to be(2) + expect(results[0]).to have_content "Ministry of Housing, Communities and Local Government" + expect(results[1]).to have_content "Mole Valley District Council" + end + + scenario "Displays the last updated for each search result" do + visit "/search/solr" + expect(page).to have_content("Last updated", count: 2) + expect(page).to have_content("30 June 2017") + expect(page).to have_content("17 August 2018") + end + + scenario "Results are sorted by best match" do + visit "/search/solr" + expect(page).to have_select("sort", selected: "Best match") + end end - scenario "Displays the last updated for each search result" do - visit "/search/solr" - expect(page).to have_content("Last updated", count: 2) - expect(page).to have_content("30 June 2017") - expect(page).to have_content("17 August 2018") + describe "When a user filters the results" do + before do + allow(Search::Solr).to receive(:search).and_return(JSON.parse(results)) + end + + scenario "Results are sorted by best match" do + filtered_solr_search_for("Best match") + expect(page).to have_select("sort", selected: "Best match") + end + + scenario "Results are sorted by most recent" do + filtered_solr_search_for("Most recent") + expect(page).to have_select("sort", selected: "Most recent") + end end end