diff --git a/app/models/ai_summary.rb b/app/models/ai_summary.rb index 5093877c5..6a880a5f2 100644 --- a/app/models/ai_summary.rb +++ b/app/models/ai_summary.rb @@ -51,5 +51,6 @@ def outdated # # Indexes # -# index_ai_summaries_on_target_type_and_target_id (target_type,target_id) +# idx_on_target_id_target_type_summary_type_3355609fbb (target_id,target_type,summary_type) UNIQUE +# index_ai_summaries_on_target_type_and_target_id (target_type,target_id) # diff --git a/config/settings.yml b/config/settings.yml index 2e004d568..bb3e0b752 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -368,6 +368,7 @@ discourse_ai: default: 0 min: 0 max: 1000 + hidden: true ai_hot_topic_gists_allowed_groups: type: group_list list_type: compact diff --git a/db/migrate/20241125132452_unique_ai_summaries.rb b/db/migrate/20241125132452_unique_ai_summaries.rb new file mode 100644 index 000000000..086812014 --- /dev/null +++ b/db/migrate/20241125132452_unique_ai_summaries.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true +class UniqueAiSummaries < ActiveRecord::Migration[7.1] + def up + execute <<~SQL + DELETE FROM ai_summaries ais1 + USING ai_summaries ais2 + WHERE ais1.id < ais2.id + AND ais1.target_id = ais2.target_id + AND ais1.target_type = ais2.target_type + AND ais1.summary_type = ais2.summary_type + SQL + + add_index :ai_summaries, %i[target_id target_type summary_type], unique: true + end + + def down + remove_index :ai_summaries, column: %i[target_id target_type summary_type] + end +end diff --git a/lib/summarization/entry_point.rb b/lib/summarization/entry_point.rb index 3117bcc42..476432978 100644 --- a/lib/summarization/entry_point.rb +++ b/lib/summarization/entry_point.rb @@ -20,7 +20,7 @@ def inject_into(plugin) plugin.register_modifier(:topic_query_create_list_topics) do |topics, options| if Discourse.filters.include?(options[:filter]) && SiteSetting.ai_summarization_enabled && SiteSetting.ai_summarize_max_hot_topics_gists_per_batch > 0 - topics.includes(:ai_summaries) + topics.includes(:ai_gist_summary) else topics end @@ -32,11 +32,7 @@ def inject_into(plugin) include_condition: -> { scope.can_see_gists? }, ) do return if !Discourse.filters.include?(options[:filter]) - summaries = object.ai_summaries.to_a - - # Summaries should always have one or zero elements here. - # This is an extra safeguard to avoid including regular summaries. - summaries.find { |s| s.summary_type == "gist" }&.summarized_text + object.ai_gist_summary&.summarized_text end # To make sure hot topic gists are inmediately up to date, we rely on this event diff --git a/lib/topic_extensions.rb b/lib/topic_extensions.rb index 49539ec2f..7ab36493d 100644 --- a/lib/topic_extensions.rb +++ b/lib/topic_extensions.rb @@ -4,6 +4,13 @@ module DiscourseAi module TopicExtensions extend ActiveSupport::Concern - prepended { has_many :ai_summaries, as: :target } + prepended do + has_many :ai_summaries, as: :target + + has_one :ai_gist_summary, + -> { where(summary_type: AiSummary.summary_types[:gist]) }, + class_name: "AiSummary", + as: :target + end end end