params[:q],
current_account,
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
q: token.slice(1),
resolve: false,
limit: 4,
+ exclude_unreviewed: true,
},
}).then(({ data }) => {
dispatch(readyComposeSuggestionsTags(token, data.hashtags));
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
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
def find_normalized(name)
TagSearchService.new.call(
@query,
limit: @limit,
- offset: @offset
+ offset: @offset,
+ exclude_unreviewed: @options[:exclude_unreviewed]
)
end
class TagSearchService < BaseService
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
},
}
- 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
nil
end
def from_database
- Tag.search_for(@query, @limit, @offset)
+ Tag.search_for(@query, @limit, @offset, @options)
end
end
it 'includes the tag in the results' do
query = '#tag'
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)
- 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])
end
it 'does not include tag when starts with @ character' do