Skip to content

Commit 60715c0

Browse files
authored
DEV: Preload translations when inline translation enabled (#264)
For sites with experimental_inline_translation enabled, we are seeing N+1 on topic list page (e.g. root / latest etc). This commit preloads locale and translations when the setting is enabled.
1 parent dbd9af6 commit 60715c0

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed

lib/discourse_translator/inline_translation.rb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,23 @@ def inject(plugin)
6565
!object.topic.locale_matches?(InlineTranslation.effective_locale) &&
6666
object.topic.translation_for(InlineTranslation.effective_locale).present?
6767
end
68+
69+
plugin.register_topic_preloader_associations(
70+
{
71+
association: :content_locale,
72+
condition: -> do
73+
SiteSetting.translator_enabled && SiteSetting.experimental_inline_translation
74+
end,
75+
},
76+
)
77+
plugin.register_topic_preloader_associations(
78+
{
79+
association: :translations,
80+
condition: -> do
81+
SiteSetting.translator_enabled && SiteSetting.experimental_inline_translation
82+
end,
83+
},
84+
)
6885
end
6986
end
7087
end
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# frozen_string_literal: true
2+
3+
describe TopicListSerializer do
4+
fab!(:topic1) { Fabricate(:topic) }
5+
fab!(:topic2) { Fabricate(:topic) }
6+
fab!(:topic3) { Fabricate(:topic) }
7+
fab!(:user)
8+
9+
let(:topic_list) { TopicList.new(nil, user, [topic1, topic2, topic3]) }
10+
11+
before do
12+
SiteSetting.translator_enabled = true
13+
SiteSetting.experimental_inline_translation = true
14+
15+
# required for other core parts of topic_view
16+
[topic1, topic2, topic3].each { |topic| topic.tap { |t| t.allowed_user_ids = [t.user_id] } }
17+
end
18+
19+
describe "preloading" do
20+
it "preloads locale and translations without N+1 queries" do
21+
serializer = described_class.new(topic_list, scope: Guardian.new(user))
22+
23+
queries = track_sql_queries { serializer.as_json }
24+
25+
locale_queries = queries.count { |q| q.include?("discourse_translator_topic_locales") }
26+
expect(locale_queries).to eq(1) # would be 3 if not preloaded
27+
28+
translation_queries =
29+
queries.count { |q| q.include?("discourse_translator_topic_translations") }
30+
expect(translation_queries).to eq(1) # would be 3 if not preloaded
31+
32+
expect(topic_list.topics.first.association(:content_locale)).to be_loaded
33+
end
34+
35+
it "never preloads translations if SiteSetting.experimental_inline_translations is false" do
36+
SiteSetting.experimental_inline_translation = false
37+
38+
serializer = described_class.new(topic_list, scope: Guardian.new(user))
39+
queries = track_sql_queries { serializer.as_json }
40+
41+
locale_queries = queries.count { |q| q.include?("discourse_translator_topic_locales") }
42+
expect(locale_queries).to eq(0)
43+
translation_queries =
44+
queries.count { |q| q.include?("discourse_translator_topic_translations") }
45+
expect(translation_queries).to eq(0)
46+
end
47+
end
48+
end

0 commit comments

Comments
 (0)