PERF: Avoid extra subquery when searching within PMs for normal user.
Note the following query being generated where the filter for a user's private messages is executed twice. ```sql SELECT "posts"."id", "posts"."user_id", "posts"."topic_id", "posts"."post_number", "posts"."raw", "posts"."cooked", "posts"."created_at", "posts"."updated_at", "posts"."reply_to_post_number", "posts"."reply_count", "posts"."quote_count", "posts"."deleted_at", "posts"."off_topic_count", "posts"."like_count", "posts"."incoming_link_count", "posts"."bookmark_count", "posts"."score", "posts"."reads", "posts"."post_type", "posts"."sort_order", "posts"."last_editor_id", "posts"."hidden", "posts"."hidden_reason_id", "posts"."notify_moderators_count", "posts"."spam_count", "posts"."illegal_count", "posts"."inappropriate_count", "posts"."last_version_at", "posts"."user_deleted", "posts"."reply_to_user_id", "posts"."percent_rank", "posts"."notify_user_count", "posts"."like_score", "posts"."deleted_by_id", "posts"."edit_reason", "posts"."word_count", "posts"."version", "posts"."cook_method", "posts"."wiki", "posts"."baked_at", "posts"."baked_version", "posts"."hidden_at", "posts"."self_edits", "posts"."reply_quoted", "posts"."via_email", "posts"."raw_email", "posts"."public_version", "posts"."action_code", "posts"."locked_by_id", "posts"."image_upload_id", (TS_RANK_CD( post_search_data.search_data, TO_TSQUERY('english', '''test'':*ABCD'), 0|32 ) * ( CASE categories.search_priority WHEN 2 THEN 0.6 WHEN 3 THEN 0.8 WHEN 4 THEN 1.2 WHEN 5 THEN 1.4 ELSE CASE WHEN topics.closed THEN 0.9 ELSE 1 END END ) ) rank, topics.bumped_at topic_bumped_at FROM "posts" INNER JOIN "post_search_data" ON "post_search_data"."post_id" = "posts"."id" INNER JOIN "topics" ON "topics"."id" = "posts"."topic_id" AND ("topics"."deleted_at" IS NULL) LEFT JOIN categories ON categories.id = topics.category_id WHERE ("posts"."deleted_at" IS NULL) AND "posts"."post_type" IN (1, 2, 3) AND (topics.visible) AND (topics.archetype = 'private_message' AND post_search_data.private_message) AND (posts.topic_id IN (SELECT topic_id FROM topic_allowed_users WHERE user_id = 99999 UNION ALL SELECT tg.topic_id FROM topic_allowed_groups tg JOIN group_users gu ON gu.user_id = 99999 AND gu.group_id = tg.group_id )) AND (post_search_data.search_data @@ TO_TSQUERY('english', '''test'':*ABCD')) AND (posts.topic_id IN (SELECT topic_id FROM topic_allowed_users WHERE user_id = 99999 UNION ALL SELECT tg.topic_id FROM topic_allowed_groups tg JOIN group_users gu ON gu.user_id = 99999 AND gu.group_id = tg.group_id )) AND ((categories.id IS NULL) OR (NOT categories.read_restricted) OR (categories.id IN (999999))) ORDER BY rank DESC, topic_bumped_at DESC ```
This commit is contained in:
parent
2f043dc89a
commit
c6ceda8c4e
|
@ -689,12 +689,9 @@ class Search
|
|||
nil
|
||||
elsif word == 'in:personal'
|
||||
@search_pms = true
|
||||
@search_context = @guardian.user
|
||||
nil
|
||||
elsif word == "in:personal-direct"
|
||||
@search_pms = true
|
||||
@direct_pms_only = true
|
||||
@search_context = @guardian.user
|
||||
nil
|
||||
elsif word =~ /^personal_messages:(.+)$/
|
||||
@search_pms = true
|
||||
|
@ -900,7 +897,7 @@ class Search
|
|||
if @search_context.present?
|
||||
if @search_context.is_a?(User)
|
||||
if type_filter === "private_messages"
|
||||
@direct_pms_only ? posts : posts.private_posts_for_user(@search_context)
|
||||
posts.private_posts_for_user(@search_context)
|
||||
else
|
||||
posts.where("posts.user_id = #{@search_context.id}")
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue