From 554c0cebdf8736828006ccb603462eb68df217ff Mon Sep 17 00:00:00 2001 From: Nat Date: Mon, 31 Mar 2025 16:43:26 +0800 Subject: [PATCH 1/4] DEV: Preload locales and translations for topic list --- plugin.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugin.rb b/plugin.rb index 12157bf6..54498bb9 100644 --- a/plugin.rb +++ b/plugin.rb @@ -32,6 +32,11 @@ module ::DiscourseTranslator TopicViewSerializer.prepend(DiscourseTranslator::Extensions::TopicViewSerializerExtension) end + if SiteSetting.translator_enabled && SiteSetting.experimental_inline_translation + register_topic_preloader_associations(:content_locale) + register_topic_preloader_associations(:translations) + end + add_to_serializer :post, :can_translate do scope.can_translate?(object) end From caac6d6ffe97cc804b3c66c8ee8fa360ceec4437 Mon Sep 17 00:00:00 2001 From: Nat Date: Mon, 31 Mar 2025 20:50:39 +0800 Subject: [PATCH 2/4] Use updated api from core --- .../inline_translation.rb | 17 +++++++ plugin.rb | 5 -- .../serializers/topic_list_serializer_spec.rb | 50 +++++++++++++++++++ 3 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 spec/serializers/topic_list_serializer_spec.rb diff --git a/lib/discourse_translator/inline_translation.rb b/lib/discourse_translator/inline_translation.rb index 6aec3998..dc3ad15d 100644 --- a/lib/discourse_translator/inline_translation.rb +++ b/lib/discourse_translator/inline_translation.rb @@ -65,6 +65,23 @@ def inject(plugin) !object.topic.locale_matches?(InlineTranslation.effective_locale) && object.topic.translation_for(InlineTranslation.effective_locale).present? end + + plugin.register_topic_preloader_associations( + { + association: :content_locale, + condition: -> do + SiteSetting.translator_enabled && SiteSetting.experimental_inline_translation + end, + }, + ) + plugin.register_topic_preloader_associations( + { + association: :translations, + condition: -> do + SiteSetting.translator_enabled && SiteSetting.experimental_inline_translation + end, + }, + ) end end end diff --git a/plugin.rb b/plugin.rb index 54498bb9..12157bf6 100644 --- a/plugin.rb +++ b/plugin.rb @@ -32,11 +32,6 @@ module ::DiscourseTranslator TopicViewSerializer.prepend(DiscourseTranslator::Extensions::TopicViewSerializerExtension) end - if SiteSetting.translator_enabled && SiteSetting.experimental_inline_translation - register_topic_preloader_associations(:content_locale) - register_topic_preloader_associations(:translations) - end - add_to_serializer :post, :can_translate do scope.can_translate?(object) end diff --git a/spec/serializers/topic_list_serializer_spec.rb b/spec/serializers/topic_list_serializer_spec.rb new file mode 100644 index 00000000..990298f9 --- /dev/null +++ b/spec/serializers/topic_list_serializer_spec.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +require "rails_helper" + +describe TopicListSerializer do + fab!(:topic1) { Fabricate(:topic) } + fab!(:topic2) { Fabricate(:topic) } + fab!(:topic3) { Fabricate(:topic) } + fab!(:user) + + let(:topic_list) { TopicList.new(nil, user, [topic1, topic2, topic3]) } + + before do + SiteSetting.translator_enabled = true + SiteSetting.experimental_inline_translation = true + + # required for other core parts of topic_view + [topic1, topic2, topic3].each { |topic| topic.tap { |t| t.allowed_user_ids = [t.user_id] } } + end + + describe "preloading" do + it "preloads locale and translations without N+1 queries" do + serializer = described_class.new(topic_list, scope: Guardian.new(user)) + + queries = track_sql_queries { serializer.as_json } + + locale_queries = queries.count { |q| q.include?("discourse_translator_topic_locales") } + expect(locale_queries).to eq(1) # would be 3 if not preloaded + + translation_queries = queries.count { |q| q.include?("discourse_translator_topic_translations") } + expect(translation_queries).to eq(1) # would be 3 if not preloaded + + expect(topic_list.topics.first.association(:content_locale)).to be_loaded + end + + it "never preloads translations if SiteSetting.experimental_inline_translations is false" do + SiteSetting.experimental_inline_translation = false + + serializer = described_class.new(topic_list, scope: Guardian.new(user)) + queries = track_sql_queries { serializer.as_json } + + locale_queries = + queries.count { |q| q.include?("discourse_translator_topic_locales") } + expect(locale_queries).to eq(0) + translation_queries = + queries.count { |q| q.include?("discourse_translator_topic_translations") } + expect(translation_queries).to eq(0) + end + end +end From f03ae0ae7667ca861b2e2c120a3f4691b89fcb4c Mon Sep 17 00:00:00 2001 From: Nat Date: Mon, 31 Mar 2025 20:58:45 +0800 Subject: [PATCH 3/4] lint --- spec/serializers/topic_list_serializer_spec.rb | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/spec/serializers/topic_list_serializer_spec.rb b/spec/serializers/topic_list_serializer_spec.rb index 990298f9..8ae41144 100644 --- a/spec/serializers/topic_list_serializer_spec.rb +++ b/spec/serializers/topic_list_serializer_spec.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require "rails_helper" - describe TopicListSerializer do fab!(:topic1) { Fabricate(:topic) } fab!(:topic2) { Fabricate(:topic) } @@ -27,7 +25,8 @@ locale_queries = queries.count { |q| q.include?("discourse_translator_topic_locales") } expect(locale_queries).to eq(1) # would be 3 if not preloaded - translation_queries = queries.count { |q| q.include?("discourse_translator_topic_translations") } + translation_queries = + queries.count { |q| q.include?("discourse_translator_topic_translations") } expect(translation_queries).to eq(1) # would be 3 if not preloaded expect(topic_list.topics.first.association(:content_locale)).to be_loaded @@ -39,8 +38,7 @@ serializer = described_class.new(topic_list, scope: Guardian.new(user)) queries = track_sql_queries { serializer.as_json } - locale_queries = - queries.count { |q| q.include?("discourse_translator_topic_locales") } + locale_queries = queries.count { |q| q.include?("discourse_translator_topic_locales") } expect(locale_queries).to eq(0) translation_queries = queries.count { |q| q.include?("discourse_translator_topic_translations") } From 9c7ee30738339293d4a3bd0be524c1a6de792f04 Mon Sep 17 00:00:00 2001 From: Nat Date: Tue, 1 Apr 2025 16:47:09 +0800 Subject: [PATCH 4/4] DEV: Conditionally include an association on topic --- .../inline_translation.rb | 22 +++++-------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/lib/discourse_translator/inline_translation.rb b/lib/discourse_translator/inline_translation.rb index dc3ad15d..f7544d0e 100644 --- a/lib/discourse_translator/inline_translation.rb +++ b/lib/discourse_translator/inline_translation.rb @@ -66,22 +66,12 @@ def inject(plugin) object.topic.translation_for(InlineTranslation.effective_locale).present? end - plugin.register_topic_preloader_associations( - { - association: :content_locale, - condition: -> do - SiteSetting.translator_enabled && SiteSetting.experimental_inline_translation - end, - }, - ) - plugin.register_topic_preloader_associations( - { - association: :translations, - condition: -> do - SiteSetting.translator_enabled && SiteSetting.experimental_inline_translation - end, - }, - ) + plugin.register_topic_preloader_associations(:content_locale) do + SiteSetting.translator_enabled && SiteSetting.experimental_inline_translation + end + plugin.register_topic_preloader_associations(:translations) do + SiteSetting.translator_enabled && SiteSetting.experimental_inline_translation + end end end end