From 04551b81548b7e0bfa933ab5efe7b6acfaf31e5a Mon Sep 17 00:00:00 2001 From: evazion Date: Wed, 30 Mar 2022 01:50:58 -0500 Subject: [PATCH] autocomplete: replace calls to PostQueryBuilder with PostQuery. --- app/logical/autocomplete_service.rb | 33 ++++++++++++++++------------- app/logical/post_query.rb | 2 +- app/logical/post_query/ast.rb | 5 +++++ 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/app/logical/autocomplete_service.rb b/app/logical/autocomplete_service.rb index c4012dfd9..a99c70d3c 100644 --- a/app/logical/autocomplete_service.rb +++ b/app/logical/autocomplete_service.rb @@ -45,7 +45,7 @@ class AutocompleteService def autocomplete_results case type when :tag_query - autocomplete_tag_query(query) + autocomplete_tag_query when :tag autocomplete_tag(query) when :artist @@ -70,17 +70,20 @@ class AutocompleteService end # Complete a tag search (a regular tag or a metatag) - # @param string [String] the string to complete + # # @return [Array] the autocomplete results - def autocomplete_tag_query(string) - term = PostQueryBuilder.new(string).terms.first - return [] if term.nil? - - case term.type - when :tag - autocomplete_tag(term.name) - when :metatag - autocomplete_metatag(term.name, term.value) + def autocomplete_tag_query + if parsed_query.tag? + tag = parsed_query.tag_names.first + autocomplete_tag(tag) + elsif parsed_query.wildcard? + wildcard = parsed_query.wildcards.first + autocomplete_tag(wildcard.name) + elsif parsed_query.metatag? + metatag = parsed_query.metatags.first + autocomplete_metatag(metatag.name, metatag.value) + else + [] end end @@ -330,7 +333,7 @@ class AutocompleteService # Whether the results can be safely cached with `Cache-Control: public`. # Queries that don't depend on the current user are safe to cache publicly. def cache_publicly? - if type == :tag_query && parsed_search&.type == :tag + if type == :tag_query && parsed_query.tag? true elsif type.in?(%i[tag artist wiki_page pool opensearch]) true @@ -339,9 +342,9 @@ class AutocompleteService end end - def parsed_search - PostQueryBuilder.new(query).terms.first + def parsed_query + PostQuery.new(query.delete_prefix("-").delete_prefix("~")) end - memoize :autocomplete_results + memoize :autocomplete_results, :parsed_query end diff --git a/app/logical/post_query.rb b/app/logical/post_query.rb index bf581f37b..63ec0bfcc 100644 --- a/app/logical/post_query.rb +++ b/app/logical/post_query.rb @@ -4,7 +4,7 @@ class PostQuery extend Memoist attr_reader :search, :parser, :builder, :ast - delegate :tag_names, :metatags, to: :ast + delegate :tag?, :metatag?, :wildcard?, :metatags, :wildcards, :tag_names, :metatags, to: :ast def initialize(search, current_user: User.anonymous, tag_limit: nil, safe_mode: false, hide_deleted_posts: false) @search = search diff --git a/app/logical/post_query/ast.rb b/app/logical/post_query/ast.rb index ce1073a9e..b5a1ef969 100644 --- a/app/logical/post_query/ast.rb +++ b/app/logical/post_query/ast.rb @@ -242,6 +242,11 @@ class PostQuery nodes.select(&:metatag?).uniq.sort end + # @return [Array] A list of all unique wildcard nodes in the AST. + def wildcards + nodes.select(&:wildcard?).uniq.sort + end + # @return [Array] The names of all unique tags in the AST. def tag_names tags.map(&:name)