Add new public status index (#26344)

Co-authored-by: Eugen Rochko <eugen@zeonfederated.com>
Co-authored-by: Claire <claire.github-309c@sitedethib.com>
This commit is contained in:
jsgoldstein 2023-08-24 10:40:04 -04:00 committed by GitHub
parent 96bcee66fb
commit 30c191aaa0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
28 changed files with 584 additions and 87 deletions

View file

@ -0,0 +1,44 @@
# frozen_string_literal: true
module AccountStatusesSearch
extend ActiveSupport::Concern
included do
after_update_commit :enqueue_update_public_statuses_index, if: :saved_change_to_indexable?
after_destroy_commit :enqueue_remove_from_public_statuses_index, if: :indexable?
end
def enqueue_update_public_statuses_index
if indexable?
enqueue_add_to_public_statuses_index
else
enqueue_remove_from_public_statuses_index
end
end
def enqueue_add_to_public_statuses_index
return unless Chewy.enabled?
AddToPublicStatusesIndexWorker.perform_async(id)
end
def enqueue_remove_from_public_statuses_index
return unless Chewy.enabled?
RemoveFromPublicStatusesIndexWorker.perform_async(id)
end
def add_to_public_statuses_index!
return unless Chewy.enabled?
statuses.indexable.find_in_batches do |batch|
PublicStatusesIndex.import(query: batch)
end
end
def remove_from_public_statuses_index!
return unless Chewy.enabled?
PublicStatusesIndex.filter(term: { account_id: id }).delete_all
end
end

View file

@ -0,0 +1,54 @@
# frozen_string_literal: true
module StatusSearchConcern
extend ActiveSupport::Concern
included do
scope :indexable, -> { without_reblogs.where(visibility: :public).joins(:account).where(account: { indexable: true }) }
end
def searchable_by(preloaded = nil)
ids = []
ids << account_id if local?
if preloaded.nil?
ids += mentions.joins(:account).merge(Account.local).active.pluck(:account_id)
ids += favourites.joins(:account).merge(Account.local).pluck(:account_id)
ids += reblogs.joins(:account).merge(Account.local).pluck(:account_id)
ids += bookmarks.joins(:account).merge(Account.local).pluck(:account_id)
ids += poll.votes.joins(:account).merge(Account.local).pluck(:account_id) if poll.present?
else
ids += preloaded.mentions[id] || []
ids += preloaded.favourites[id] || []
ids += preloaded.reblogs[id] || []
ids += preloaded.bookmarks[id] || []
ids += preloaded.votes[id] || []
end
ids.uniq
end
def searchable_text
[
spoiler_text,
FormattingHelper.extract_status_plain_text(self),
preloadable_poll&.options&.join("\n\n"),
ordered_media_attachments.map(&:description).join("\n\n"),
].compact.join("\n\n")
end
def searchable_properties
[].tap do |properties|
properties << 'image' if ordered_media_attachments.any?(&:image?)
properties << 'video' if ordered_media_attachments.any?(&:video?)
properties << 'audio' if ordered_media_attachments.any?(&:audio?)
properties << 'media' if with_media?
properties << 'poll' if with_poll?
properties << 'link' if with_preview_card?
properties << 'embed' if preview_cards.any?(&:video?)
properties << 'sensitive' if sensitive?
properties << 'reply' if reply?
end
end
end