31 lines
973 B
Ruby
31 lines
973 B
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Jobs
|
||
|
class SentimentBackfill < ::Jobs::Scheduled
|
||
|
every 5.minutes
|
||
|
cluster_concurrency 1
|
||
|
|
||
|
def execute(_args)
|
||
|
return if !SiteSetting.ai_sentiment_enabled
|
||
|
|
||
|
base_budget = SiteSetting.ai_sentiment_backfill_maximum_posts_per_hour
|
||
|
return if base_budget.zero?
|
||
|
# Split budget in 12 intervals, but make sure is at least one.
|
||
|
#
|
||
|
# This is not exact as we don't have a way of tracking how many
|
||
|
# posts we classified in the current hour, but it's a good enough approximation.
|
||
|
limit_per_job = [base_budget, 12].max / 12
|
||
|
|
||
|
classificator = DiscourseAi::Sentiment::PostClassification.new
|
||
|
return if !classificator.has_classifiers?
|
||
|
|
||
|
posts =
|
||
|
DiscourseAi::Sentiment::PostClassification.backfill_query(
|
||
|
max_age_days: SiteSetting.ai_sentiment_backfill_post_max_age_days,
|
||
|
).limit(limit_per_job)
|
||
|
|
||
|
classificator.bulk_classify!(posts)
|
||
|
end
|
||
|
end
|
||
|
end
|