From 119268e118f64bb45b8e2700b4b44c2cf726f6a4 Mon Sep 17 00:00:00 2001 From: evazion Date: Sun, 13 Dec 2020 00:45:22 -0600 Subject: [PATCH] autocomplete: fix exception when completing saved search labels. Fix an exception that was thrown when trying to autocomplete saved search labels (e.g. `search:all`) as an anonymous user. This was a pre-existing bug. --- app/logical/autocomplete_service.rb | 3 ++- app/models/saved_search.rb | 8 ++++++++ test/unit/autocomplete_service_test.rb | 2 ++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/app/logical/autocomplete_service.rb b/app/logical/autocomplete_service.rb index 8ae91392d..8ec4d6a23 100644 --- a/app/logical/autocomplete_service.rb +++ b/app/logical/autocomplete_service.rb @@ -155,7 +155,8 @@ class AutocompleteService end def autocomplete_saved_search_label(string) - labels = SavedSearch.search_labels(current_user.id, label: string).take(limit) + string = "*" + string + "*" unless string.include?("*") + labels = current_user.saved_searches.labels_like(string).take(limit) labels.map do |label| { label: label.tr("_", " "), value: label } diff --git a/app/models/saved_search.rb b/app/models/saved_search.rb index e384da9a1..9036608a9 100644 --- a/app/models/saved_search.rb +++ b/app/models/saved_search.rb @@ -63,6 +63,14 @@ class SavedSearch < ApplicationRecord .gsub(/[[:space:]]/, "_") end + def all_labels + select(Arel.sql("distinct unnest(labels) as label")).order(:label) + end + + def labels_like(label) + all_labels.select { |ss| ss.label.ilike?(label) }.map(&:label) + end + def search_labels(user_id, params) labels = labels_for(user_id) diff --git a/test/unit/autocomplete_service_test.rb b/test/unit/autocomplete_service_test.rb index 8379bb295..29d8ea6ce 100644 --- a/test/unit/autocomplete_service_test.rb +++ b/test/unit/autocomplete_service_test.rb @@ -61,8 +61,10 @@ class AutocompleteServiceTest < ActiveSupport::TestCase create(:saved_search, query: "bkub", labels: ["artists"], user: user) assert_autocomplete_equals(["artists"], "art", :saved_search_label, current_user: user) + assert_autocomplete_equals([], "art", :saved_search_label, current_user: User.anonymous) assert_autocomplete_equals(["search:artists"], "search:art", :tag_query, current_user: user) + assert_autocomplete_equals([], "search:art", :saved_search_label, current_user: User.anonymous) end should "autocomplete single tags" do