123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- # frozen_string_literal: true
- class StatusesSearchService < BaseService
- def call(query, account = nil, options = {})
- MastodonOTELTracer.in_span('StatusesSearchService#call') do |span|
- @query = query&.strip
- @account = account
- @options = options
- @limit = options[:limit].to_i
- @offset = options[:offset].to_i
- convert_deprecated_options!
- span.add_attributes(
- 'search.offset' => @offset,
- 'search.limit' => @limit,
- 'search.backend' => Chewy.enabled? ? 'elasticsearch' : 'database'
- )
- status_search_results.tap do |results|
- span.set_attribute('search.results.count', results.size)
- end
- end
- end
- private
- def status_search_results
- request = parsed_query.request
- results = request.collapse(field: :id).order(id: { order: :desc }).limit(@limit).offset(@offset).objects.compact
- account_ids = results.map(&:account_id)
- account_domains = results.map(&:account_domain)
- preloaded_relations = @account.relations_map(account_ids, account_domains)
- results.reject { |status| StatusFilter.new(status, @account, preloaded_relations).filtered? }
- rescue Faraday::ConnectionFailed, Parslet::ParseFailed
- []
- end
- def parsed_query
- SearchQueryTransformer.new.apply(SearchQueryParser.new.parse(@query), current_account: @account)
- end
- def convert_deprecated_options!
- syntax_options = []
- if @options[:account_id]
- username = Account.select(:username, :domain).find(@options[:account_id]).acct
- syntax_options << "from:@#{username}"
- end
- if @options[:min_id]
- timestamp = Mastodon::Snowflake.to_time(@options[:min_id].to_i)
- syntax_options << "after:\"#{timestamp.iso8601}\""
- end
- if @options[:max_id]
- timestamp = Mastodon::Snowflake.to_time(@options[:max_id].to_i)
- syntax_options << "before:\"#{timestamp.iso8601}\""
- end
- @query = "#{@query} #{syntax_options.join(' ')}".strip if syntax_options.any?
- end
- end
|