discourse/app/jobs/scheduled/create_recent_post_search_i...

55 lines
1.6 KiB
Ruby

# frozen_string_literal: true
module Jobs
class CreateRecentPostSearchIndexes < ::Jobs::Scheduled
every 1.day
REGULAR_POST_SEARCH_DATA_INDEX_NAME = "idx_recent_regular_post_search_data"
def execute(_)
create_recent_regular_post_search_index
end
private
def create_recent_regular_post_search_index
if !PostSearchData
.where(private_message: false)
.offset(SiteSetting.search_enable_recent_regular_posts_offset_size - 1)
.limit(1)
.exists?
return
end
SiteSetting.search_recent_regular_posts_offset_post_id = regular_offset_post_id
DB.exec(<<~SQL)
DROP INDEX IF EXISTS temp_idx_recent_regular_post_search_data;
SQL
DB.exec(<<~SQL, post_id: SiteSetting.search_recent_regular_posts_offset_post_id)
CREATE INDEX #{Rails.env.test? ? "" : "CONCURRENTLY"} temp_idx_recent_regular_post_search_data
ON post_search_data USING GIN(search_data)
WHERE NOT private_message AND post_id >= :post_id
SQL
DB.exec(<<~SQL)
#{Rails.env.test? ? "" : "BEGIN;"}
DROP INDEX IF EXISTS #{REGULAR_POST_SEARCH_DATA_INDEX_NAME};
ALTER INDEX temp_idx_recent_regular_post_search_data RENAME TO #{REGULAR_POST_SEARCH_DATA_INDEX_NAME};
#{Rails.env.test? ? "" : "COMMIT;"}
SQL
end
def regular_offset_post_id
PostSearchData
.order("post_id DESC")
.where(private_message: false)
.offset(SiteSetting.search_recent_posts_size - 1)
.limit(1)
.pluck(:post_id)
.first
end
end
end