69 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
class AccountSuggestions::SimilarProfilesSource < AccountSuggestions::Source
 | 
						|
  class QueryBuilder < AccountSearchService::QueryBuilder
 | 
						|
    def must_clauses
 | 
						|
      [
 | 
						|
        {
 | 
						|
          more_like_this: {
 | 
						|
            fields: %w(text text.stemmed),
 | 
						|
            like: @query.map { |id| { _index: 'accounts', _id: id } },
 | 
						|
          },
 | 
						|
        },
 | 
						|
 | 
						|
        {
 | 
						|
          term: {
 | 
						|
            properties: 'discoverable',
 | 
						|
          },
 | 
						|
        },
 | 
						|
      ]
 | 
						|
    end
 | 
						|
 | 
						|
    def must_not_clauses
 | 
						|
      [
 | 
						|
        {
 | 
						|
          terms: {
 | 
						|
            id: following_ids,
 | 
						|
          },
 | 
						|
        },
 | 
						|
 | 
						|
        {
 | 
						|
          term: {
 | 
						|
            properties: 'bot',
 | 
						|
          },
 | 
						|
        },
 | 
						|
      ]
 | 
						|
    end
 | 
						|
 | 
						|
    def should_clauses
 | 
						|
      {
 | 
						|
        term: {
 | 
						|
          properties: {
 | 
						|
            value: 'verified',
 | 
						|
            boost: 2,
 | 
						|
          },
 | 
						|
        },
 | 
						|
      }
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def get(account, limit: DEFAULT_LIMIT)
 | 
						|
    recently_followed_account_ids = account.active_relationships.recent.limit(5).pluck(:target_account_id)
 | 
						|
 | 
						|
    if Chewy.enabled? && !recently_followed_account_ids.empty?
 | 
						|
      ids_from_es = QueryBuilder.new(recently_followed_account_ids, account).build.limit(limit).hits.pluck('_id').map(&:to_i)
 | 
						|
      base_account_scope(account).where(id: ids_from_es).pluck(:id).zip([key].cycle)
 | 
						|
    else
 | 
						|
      []
 | 
						|
    end
 | 
						|
  rescue Faraday::ConnectionFailed
 | 
						|
    []
 | 
						|
  end
 | 
						|
 | 
						|
  private
 | 
						|
 | 
						|
  def key
 | 
						|
    :similar_to_recently_followed
 | 
						|
  end
 | 
						|
end
 |