2023-08-08 14:44:10 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
class DiscourseAi::Embeddings::SemanticTopicQuery < TopicQuery
|
|
|
|
def list_semantic_related_topics(topic)
|
|
|
|
query_opts = {
|
|
|
|
skip_ordering: true,
|
|
|
|
per_page: SiteSetting.ai_embeddings_semantic_related_topics,
|
|
|
|
unordered: true,
|
|
|
|
}
|
|
|
|
|
|
|
|
if !SiteSetting.ai_embeddings_semantic_related_include_closed_topics
|
|
|
|
query_opts[:status] = "open"
|
|
|
|
end
|
|
|
|
|
|
|
|
list =
|
|
|
|
create_list(:semantic_related, query_opts) do |topics|
|
2023-09-05 10:08:23 -04:00
|
|
|
candidate_ids = DiscourseAi::Embeddings::SemanticRelated.new.related_topic_ids_for(topic)
|
2023-08-08 14:44:10 -04:00
|
|
|
|
2024-10-10 13:13:16 -04:00
|
|
|
list = topics.where.not(id: topic.id).where(id: candidate_ids)
|
2023-08-08 14:44:10 -04:00
|
|
|
|
2024-10-10 13:13:16 -04:00
|
|
|
list = DiscoursePluginRegistry.apply_modifier(:semantic_related_topics_query, list)
|
|
|
|
|
|
|
|
# array_position forces the order of the topics to be preserved
|
|
|
|
list = list.order("array_position(ARRAY#{candidate_ids}, topics.id)")
|
2023-08-08 14:44:10 -04:00
|
|
|
list = remove_muted(list, @user, query_opts)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|