Make it so normal search returns even unreviewed matches, but autosuggestions do not. Fix #11960master^2
@@ -22,7 +22,7 @@ class Api::V2::SearchController < Api::BaseController | |||||
params[:q], | params[:q], | ||||
current_account, | current_account, | ||||
limit_param(RESULTS_LIMIT), | limit_param(RESULTS_LIMIT), | ||||
search_params.merge(resolve: truthy_param?(:resolve)) | |||||
search_params.merge(resolve: truthy_param?(:resolve), exclude_unreviewed: truthy_param?(:exclude_unreviewed)) | |||||
) | ) | ||||
end | end | ||||
@@ -369,6 +369,7 @@ const fetchComposeSuggestionsTags = throttle((dispatch, getState, token) => { | |||||
q: token.slice(1), | q: token.slice(1), | ||||
resolve: false, | resolve: false, | ||||
limit: 4, | limit: 4, | ||||
exclude_unreviewed: true, | |||||
}, | }, | ||||
}).then(({ data }) => { | }).then(({ data }) => { | ||||
dispatch(readyComposeSuggestionsTags(token, data.hashtags)); | dispatch(readyComposeSuggestionsTags(token, data.hashtags)); | ||||
@@ -124,16 +124,15 @@ class Tag < ApplicationRecord | |||||
end | end | ||||
end | end | ||||
def search_for(term, limit = 5, offset = 0) | |||||
def search_for(term, limit = 5, offset = 0, options = {}) | |||||
normalized_term = normalize(term.strip).mb_chars.downcase.to_s | normalized_term = normalize(term.strip).mb_chars.downcase.to_s | ||||
pattern = sanitize_sql_like(normalized_term) + '%' | pattern = sanitize_sql_like(normalized_term) + '%' | ||||
query = Tag.listable.where(arel_table[:name].lower.matches(pattern)) | |||||
query = query.where(arel_table[:name].lower.eq(normalized_term).or(arel_table[:reviewed_at].not_eq(nil))) if options[:exclude_unreviewed] | |||||
Tag.listable | |||||
.where(arel_table[:name].lower.matches(pattern)) | |||||
.where(arel_table[:name].lower.eq(normalized_term).or(arel_table[:reviewed_at].not_eq(nil))) | |||||
.order(Arel.sql('length(name) ASC, name ASC')) | |||||
.limit(limit) | |||||
.offset(offset) | |||||
query.order(Arel.sql('length(name) ASC, name ASC')) | |||||
.limit(limit) | |||||
.offset(offset) | |||||
end | end | ||||
def find_normalized(name) | def find_normalized(name) | ||||
@@ -60,7 +60,8 @@ class SearchService < BaseService | |||||
TagSearchService.new.call( | TagSearchService.new.call( | ||||
@query, | @query, | ||||
limit: @limit, | limit: @limit, | ||||
offset: @offset | |||||
offset: @offset, | |||||
exclude_unreviewed: @options[:exclude_unreviewed] | |||||
) | ) | ||||
end | end | ||||
@@ -2,11 +2,12 @@ | |||||
class TagSearchService < BaseService | class TagSearchService < BaseService | ||||
def call(query, options = {}) | def call(query, options = {}) | ||||
@query = query.strip.gsub(/\A#/, '') | |||||
@offset = options[:offset].to_i | |||||
@limit = options[:limit].to_i | |||||
@query = query.strip.gsub(/\A#/, '') | |||||
@offset = options.delete(:offset).to_i | |||||
@limit = options.delete(:limit).to_i | |||||
@options = options | |||||
results = from_elasticsearch if Chewy.enabled? | |||||
results = from_elasticsearch if Chewy.enabled? | |||||
results ||= from_database | results ||= from_database | ||||
results | results | ||||
@@ -72,12 +73,15 @@ class TagSearchService < BaseService | |||||
}, | }, | ||||
} | } | ||||
TagsIndex.query(query).filter(filter).limit(@limit).offset(@offset).objects.compact | |||||
definition = TagsIndex.query(query) | |||||
definition = definition.filter(filter) if @options[:exclude_unreviewed] | |||||
definition.limit(@limit).offset(@offset).objects.compact | |||||
rescue Faraday::ConnectionFailed, Parslet::ParseFailed | rescue Faraday::ConnectionFailed, Parslet::ParseFailed | ||||
nil | nil | ||||
end | end | ||||
def from_database | def from_database | ||||
Tag.search_for(@query, @limit, @offset) | |||||
Tag.search_for(@query, @limit, @offset, @options) | |||||
end | end | ||||
end | end |
@@ -77,10 +77,10 @@ describe SearchService, type: :service do | |||||
it 'includes the tag in the results' do | it 'includes the tag in the results' do | ||||
query = '#tag' | query = '#tag' | ||||
tag = Tag.new | tag = Tag.new | ||||
allow(Tag).to receive(:search_for).with('tag', 10, 0).and_return([tag]) | |||||
allow(Tag).to receive(:search_for).with('tag', 10, 0, exclude_unreviewed: nil).and_return([tag]) | |||||
results = subject.call(query, nil, 10) | results = subject.call(query, nil, 10) | ||||
expect(Tag).to have_received(:search_for).with('tag', 10, 0) | |||||
expect(Tag).to have_received(:search_for).with('tag', 10, 0, exclude_unreviewed: nil) | |||||
expect(results).to eq empty_results.merge(hashtags: [tag]) | expect(results).to eq empty_results.merge(hashtags: [tag]) | ||||
end | end | ||||
it 'does not include tag when starts with @ character' do | it 'does not include tag when starts with @ character' do | ||||