Skip to content

Commit 892cdb6

Browse files
authored
DEV: Preload translations when inline translation enabled (#266)
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 69c20ca commit 892cdb6

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

lib/discourse_translator/inline_translation.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,13 @@ 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(:content_locale) do
70+
SiteSetting.translator_enabled && SiteSetting.experimental_inline_translation
71+
end
72+
plugin.register_topic_preloader_associations(:translations) do
73+
SiteSetting.translator_enabled && SiteSetting.experimental_inline_translation
74+
end
6875
end
6976
end
7077
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)