discourse/lib
Alan Guo Xiang Tan 135e88cb12
PERF: Improve performance of queries when loading a topic list (#22949)
What is the context of this change?

Before 7c6a8f1c74, we were using
`preload(:tags)` on the topics relation but that was accidentally
removed in the refactor. This was discovered and fixed in
5bec894a8c but insteadl of using
`preload(:tags)` we ended up using `includes(:tags)`. The problem here
is that `includes(:tags)` can either result in `preload(:tags)` or
`eager_load(:tags)` but for some reason ActiveRecord is deciding to
`eager_load(:tags)` resulting in a joins to the `topic_tags` and `tags`
table which is not necessarily and leads to more inefficient queries.

When `includes(:tags)` is used, listing the latest topics ended up
generating the following sample queries to fetch the list of topics to display.

```
SELECT DISTINCT "topics"."pinned_at" AS alias_0, "topics"."id" FROM "topics" LEFT OUTER JOIN "categories" ON "categories"."id" = "topics"."category_id" LEFT OUTER JOIN "topic_tags" ON "topic_tags"."topic_id" = "topics"."id" LEFT OUTER JOIN "tags" ON "tags"."id" = "topic_tags"."tag_id" LEFT OUTER JOIN topic_users AS tu ON (topics.id = tu.topic_id AND tu.user_id = 29) LEFT JOIN category_users ON category_users.category_id = topics.category_id AND category_users.user_id = 29 WHERE "topics"."deleted_at" IS NULL AND (topics.archetype <> 'private_message') AND (COALESCE(categories.topic_id, 0) <> topics.id) AND (COALESCE(tu.notification_level,1) > 0) AND (topics.category_id = -1
                OR
                (COALESCE(category_users.notification_level, 1) <> 0 AND (topics.category_id IS NULL OR topics.category_id NOT IN(-1)))

                OR tu.notification_level > 1) AND (pinned_globally AND  pinned_at IS NOT NULL  AND (topics.pinned_at > tu.cleared_pinned_at OR tu.cleared_pinned_at IS NULL)) ORDER BY "topics"."pinned_at" DESC LIMIT 30

SELECT "topics"."id" AS t0_r0, "topics"."title" AS t0_r1, "topics"."last_posted_at" AS t0_r2, "topics"."created_at" AS t0_r3, "topics"."updated_at" AS t0_r4, "topics"."views" AS t0_r5, "topics"."posts_count" AS t0_r6, "topics"."user_id" AS t0_r7, "topics"."last_post_user_id" AS t0_r8, "topics"."reply_count" AS t0_r9, "topics"."featured_user1_id" AS t0_r10, "topics"."featured_user2_id" AS t0_r11, "topics"."featured_user3_id" AS t0_r12, "topics"."deleted_at" AS t0_r13, "topics"."highest_post_number" AS t0_r14, "topics"."like_count" AS t0_r15, "topics"."incoming_link_count" AS t0_r16, "topics"."category_id" AS t0_r17, "topics"."visible" AS t0_r18, "topics"."moderator_posts_count" AS t0_r19, "topics"."closed" AS t0_r20, "topics"."archived" AS t0_r21, "topics"."bumped_at" AS t0_r22, "topics"."has_summary" AS t0_r23, "topics"."archetype" AS t0_r24, "topics"."featured_user4_id" AS t0_r25, "topics"."notify_moderators_count" AS t0_r26, "topics"."spam_count" AS t0_r27, "topics"."pinned_at" AS t0_r28, "topics"."score" AS t0_r29, "topics"."percent_rank" AS t0_r30, "topics"."subtype" AS t0_r31, "topics"."slug" AS t0_r32, "topics"."deleted_by_id" AS t0_r33, "topics"."participant_count" AS t0_r34, "topics"."word_count" AS t0_r35, "topics"."excerpt" AS t0_r36, "topics"."pinned_globally" AS t0_r37, "topics"."pinned_until" AS t0_r38, "topics"."fancy_title" AS t0_r39, "topics"."highest_staff_post_number" AS t0_r40, "topics"."featured_link" AS t0_r41, "topics"."reviewable_score" AS t0_r42, "topics"."image_upload_id" AS t0_r43, "topics"."slow_mode_seconds" AS t0_r44, "topics"."bannered_until" AS t0_r45, "topics"."external_id" AS t0_r46, "categories"."id" AS t1_r0, "categories"."name" AS t1_r1, "categories"."color" AS t1_r2, "categories"."topic_id" AS t1_r3, "categories"."topic_count" AS t1_r4, "categories"."created_at" AS t1_r5, "categories"."updated_at" AS t1_r6, "categories"."user_id" AS t1_r7, "categories"."topics_year" AS t1_r8, "categories"."topics_month" AS t1_r9, "categories"."topics_week" AS t1_r10, "categories"."slug" AS t1_r11, "categories"."description" AS t1_r12, "categories"."text_color" AS t1_r13, "categories"."read_restricted" AS t1_r14, "categories"."auto_close_hours" AS t1_r15, "categories"."post_count" AS t1_r16, "categories"."latest_post_id" AS t1_r17, "categories"."latest_topic_id" AS t1_r18, "categories"."position" AS t1_r19, "categories"."parent_category_id" AS t1_r20, "categories"."posts_year" AS t1_r21, "categories"."posts_month" AS t1_r22, "categories"."posts_week" AS t1_r23, "categories"."email_in" AS t1_r24, "categories"."email_in_allow_strangers" AS t1_r25, "categories"."topics_day" AS t1_r26, "categories"."posts_day" AS t1_r27, "categories"."allow_badges" AS t1_r28, "categories"."name_lower" AS t1_r29, "categories"."auto_close_based_on_last_post" AS t1_r30, "categories"."topic_template" AS t1_r31, "categories"."contains_messages" AS t1_r32, "categories"."sort_order" AS t1_r33, "categories"."sort_ascending" AS t1_r34, "categories"."uploaded_logo_id" AS t1_r35, "categories"."uploaded_background_id" AS t1_r36, "categories"."topic_featured_link_allowed" AS t1_r37, "categories"."all_topics_wiki" AS t1_r38, "categories"."show_subcategory_list" AS t1_r39, "categories"."num_featured_topics" AS t1_r40, "categories"."default_view" AS t1_r41, "categories"."subcategory_list_style" AS t1_r42, "categories"."default_top_period" AS t1_r43, "categories"."mailinglist_mirror" AS t1_r44, "categories"."minimum_required_tags" AS t1_r45, "categories"."navigate_to_first_post_after_read" AS t1_r46, "categories"."search_priority" AS t1_r47, "categories"."allow_global_tags" AS t1_r48, "categories"."reviewable_by_group_id" AS t1_r49, "categories"."read_only_banner" AS t1_r50, "categories"."default_list_filter" AS t1_r51, "categories"."allow_unlimited_owner_edits_on_first_post" AS t1_r52, "categories"."default_slow_mode_seconds" AS t1_r53, "categories"."uploaded_logo_dark_id" AS t1_r54, "tags"."id" AS t2_r0, "tags"."name" AS t2_r1, "tags"."created_at" AS t2_r2, "tags"."updated_at" AS t2_r3, "tags"."pm_topic_count" AS t2_r4, "tags"."target_tag_id" AS t2_r5, "tags"."description" AS t2_r6, "tags"."public_topic_count" AS t2_r7, "tags"."staff_topic_count" AS t2_r8 FROM "topics" LEFT OUTER JOIN "categories" ON "categories"."id" = "topics"."category_id" LEFT OUTER JOIN "topic_tags" ON "topic_tags"."topic_id" = "topics"."id" LEFT OUTER JOIN "tags" ON "tags"."id" = "topic_tags"."tag_id" LEFT OUTER JOIN topic_users AS tu ON (topics.id = tu.topic_id AND tu.user_id = 29) LEFT JOIN category_users ON category_users.category_id = topics.category_id AND category_users.user_id = 29 WHERE "topics"."deleted_at" IS NULL AND (topics.archetype <> 'private_message') AND (COALESCE(categories.topic_id, 0) <> topics.id) AND (COALESCE(tu.notification_level,1) > 0) AND (topics.category_id = -1
                OR
                (COALESCE(category_users.notification_level, 1) <> 0 AND (topics.category_id IS NULL OR topics.category_id NOT IN(-1)))

                OR tu.notification_level > 1) AND (pinned_globally AND  pinned_at IS NOT NULL  AND (topics.pinned_at > tu.cleared_pinned_at OR tu.cleared_pinned_at IS NULL)) AND "topics"."id" = 7 ORDER BY "topics"."pinned_at" DESC

SELECT DISTINCT topics.bumped_at AS alias_0, "topics"."id" FROM "topics" LEFT OUTER JOIN "categories" ON "categories"."id" = "topics"."category_id" LEFT OUTER JOIN "topic_tags" ON "topic_tags"."topic_id" = "topics"."id" LEFT OUTER JOIN "tags" ON "tags"."id" = "topic_tags"."tag_id" LEFT OUTER JOIN topic_users AS tu ON (topics.id = tu.topic_id AND tu.user_id = 29) LEFT JOIN category_users ON category_users.category_id = topics.category_id AND category_users.user_id = 29 WHERE "topics"."deleted_at" IS NULL AND (topics.archetype <> 'private_message') AND (COALESCE(categories.topic_id, 0) <> topics.id) AND (COALESCE(tu.notification_level,1) > 0) AND (topics.category_id = -1
                OR
                (COALESCE(category_users.notification_level, 1) <> 0 AND (topics.category_id IS NULL OR topics.category_id NOT IN(-1)))

                OR tu.notification_level > 1) AND (NOT ( pinned_globally AND  pinned_at IS NOT NULL  AND (topics.pinned_at > tu.cleared_pinned_at OR tu.cleared_pinned_at IS NULL) )) ORDER BY topics.bumped_at DESC LIMIT 30

SELECT "topics"."id" AS t0_r0, "topics"."title" AS t0_r1, "topics"."last_posted_at" AS t0_r2, "topics"."created_at" AS t0_r3, "topics"."updated_at" AS t0_r4, "topics"."views" AS t0_r5, "topics"."posts_count" AS t0_r6, "topics"."user_id" AS t0_r7, "topics"."last_post_user_id" AS t0_r8, "topics"."reply_count" AS t0_r9, "topics"."featured_user1_id" AS t0_r10, "topics"."featured_user2_id" AS t0_r11, "topics"."featured_user3_id" AS t0_r12, "topics"."deleted_at" AS t0_r13, "topics"."highest_post_number" AS t0_r14, "topics"."like_count" AS t0_r15, "topics"."incoming_link_count" AS t0_r16, "topics"."category_id" AS t0_r17, "topics"."visible" AS t0_r18, "topics"."moderator_posts_count" AS t0_r19, "topics"."closed" AS t0_r20, "topics"."archived" AS t0_r21, "topics"."bumped_at" AS t0_r22, "topics"."has_summary" AS t0_r23, "topics"."archetype" AS t0_r24, "topics"."featured_user4_id" AS t0_r25, "topics"."notify_moderators_count" AS t0_r26, "topics"."spam_count" AS t0_r27, "topics"."pinned_at" AS t0_r28, "topics"."score" AS t0_r29, "topics"."percent_rank" AS t0_r30, "topics"."subtype" AS t0_r31, "topics"."slug" AS t0_r32, "topics"."deleted_by_id" AS t0_r33, "topics"."participant_count" AS t0_r34, "topics"."word_count" AS t0_r35, "topics"."excerpt" AS t0_r36, "topics"."pinned_globally" AS t0_r37, "topics"."pinned_until" AS t0_r38, "topics"."fancy_title" AS t0_r39, "topics"."highest_staff_post_number" AS t0_r40, "topics"."featured_link" AS t0_r41, "topics"."reviewable_score" AS t0_r42, "topics"."image_upload_id" AS t0_r43, "topics"."slow_mode_seconds" AS t0_r44, "topics"."bannered_until" AS t0_r45, "topics"."external_id" AS t0_r46, "categories"."id" AS t1_r0, "categories"."name" AS t1_r1, "categories"."color" AS t1_r2, "categories"."topic_id" AS t1_r3, "categories"."topic_count" AS t1_r4, "categories"."created_at" AS t1_r5, "categories"."updated_at" AS t1_r6, "categories"."user_id" AS t1_r7, "categories"."topics_year" AS t1_r8, "categories"."topics_month" AS t1_r9, "categories"."topics_week" AS t1_r10, "categories"."slug" AS t1_r11, "categories"."description" AS t1_r12, "categories"."text_color" AS t1_r13, "categories"."read_restricted" AS t1_r14, "categories"."auto_close_hours" AS t1_r15, "categories"."post_count" AS t1_r16, "categories"."latest_post_id" AS t1_r17, "categories"."latest_topic_id" AS t1_r18, "categories"."position" AS t1_r19, "categories"."parent_category_id" AS t1_r20, "categories"."posts_year" AS t1_r21, "categories"."posts_month" AS t1_r22, "categories"."posts_week" AS t1_r23, "categories"."email_in" AS t1_r24, "categories"."email_in_allow_strangers" AS t1_r25, "categories"."topics_day" AS t1_r26, "categories"."posts_day" AS t1_r27, "categories"."allow_badges" AS t1_r28, "categories"."name_lower" AS t1_r29, "categories"."auto_close_based_on_last_post" AS t1_r30, "categories"."topic_template" AS t1_r31, "categories"."contains_messages" AS t1_r32, "categories"."sort_order" AS t1_r33, "categories"."sort_ascending" AS t1_r34, "categories"."uploaded_logo_id" AS t1_r35, "categories"."uploaded_background_id" AS t1_r36, "categories"."topic_featured_link_allowed" AS t1_r37, "categories"."all_topics_wiki" AS t1_r38, "categories"."show_subcategory_list" AS t1_r39, "categories"."num_featured_topics" AS t1_r40, "categories"."default_view" AS t1_r41, "categories"."subcategory_list_style" AS t1_r42, "categories"."default_top_period" AS t1_r43, "categories"."mailinglist_mirror" AS t1_r44, "categories"."minimum_required_tags" AS t1_r45, "categories"."navigate_to_first_post_after_read" AS t1_r46, "categories"."search_priority" AS t1_r47, "categories"."allow_global_tags" AS t1_r48, "categories"."reviewable_by_group_id" AS t1_r49, "categories"."read_only_banner" AS t1_r50, "categories"."default_list_filter" AS t1_r51, "categories"."allow_unlimited_owner_edits_on_first_post" AS t1_r52, "categories"."default_slow_mode_seconds" AS t1_r53, "categories"."uploaded_logo_dark_id" AS t1_r54, "tags"."id" AS t2_r0, "tags"."name" AS t2_r1, "tags"."created_at" AS t2_r2, "tags"."updated_at" AS t2_r3, "tags"."pm_topic_count" AS t2_r4, "tags"."target_tag_id" AS t2_r5, "tags"."description" AS t2_r6, "tags"."public_topic_count" AS t2_r7, "tags"."staff_topic_count" AS t2_r8 FROM "topics" LEFT OUTER JOIN "categories" ON "categories"."id" = "topics"."category_id" LEFT OUTER JOIN "topic_tags" ON "topic_tags"."topic_id" = "topics"."id" LEFT OUTER JOIN "tags" ON "tags"."id" = "topic_tags"."tag_id" LEFT OUTER JOIN topic_users AS tu ON (topics.id = tu.topic_id AND tu.user_id = 29) LEFT JOIN category_users ON category_users.category_id = topics.category_id AND category_users.user_id = 29 WHERE "topics"."deleted_at" IS NULL AND (topics.archetype <> 'private_message') AND (COALESCE(categories.topic_id, 0) <> topics.id) AND (COALESCE(tu.notification_level,1) > 0) AND (topics.category_id = -1
                OR
                (COALESCE(category_users.notification_level, 1) <> 0 AND (topics.category_id IS NULL OR topics.category_id NOT IN(-1)))

                OR tu.notification_level > 1) AND (NOT ( pinned_globally AND  pinned_at IS NOT NULL  AND (topics.pinned_at > tu.cleared_pinned_at OR tu.cleared_pinned_at IS NULL) )) AND "topics"."id" IN (477, 481, 480, 479, 478, 467, 466, 230, 209, 183, 173, 179, 168, 139, 102, 144, 150, 118, 126, 88, 63, 46, 117, 171, 45, 77, 154, 158, 43, 79) ORDER BY topics.bumped_at DESC
```

Note how there are two extra queries which has to select `DISTINCT
topics.pinned_at` and `DISTINCT topics.bumped_at` because of the
unnecessary left joins to the `topic_tags` and `tags` table result in
duplicated rows in the topic tables. As a result, PG is not able to
use our indexes to effectively execute the query.

Comparing this to the queries being executed when `preload(:tags)` is
used.

```
SELECT "topics"."id" AS t0_r0, "topics"."title" AS t0_r1, "topics"."last_posted_at" AS t0_r2, "topics"."created_at" AS t0_r3, "topics"."updated_at" AS t0_r4, "topics"."views" AS t0_r5, "topics"."posts_count" AS t0_r6, "topics"."user_id" AS t0_r7, "topics"."last_post_user_id" AS t0_r8, "topics"."reply_count" AS t0_r9, "topics"."featured_user1_id" AS t0_r10, "topics"."featured_user2_id" AS t0_r11, "topics"."featured_user3_id" AS t0_r12, "topics"."deleted_at" AS t0_r13, "topics"."highest_post_number" AS t0_r14, "topics"."like_count" AS t0_r15, "topics"."incoming_link_count" AS t0_r16, "topics"."category_id" AS t0_r17, "topics"."visible" AS t0_r18, "topics"."moderator_posts_count" AS t0_r19, "topics"."closed" AS t0_r20, "topics"."archived" AS t0_r21, "topics"."bumped_at" AS t0_r22, "topics"."has_summary" AS t0_r23, "topics"."archetype" AS t0_r24, "topics"."featured_user4_id" AS t0_r25, "topics"."notify_moderators_count" AS t0_r26, "topics"."spam_count" AS t0_r27, "topics"."pinned_at" AS t0_r28, "topics"."score" AS t0_r29, "topics"."percent_rank" AS t0_r30, "topics"."subtype" AS t0_r31, "topics"."slug" AS t0_r32, "topics"."deleted_by_id" AS t0_r33, "topics"."participant_count" AS t0_r34, "topics"."word_count" AS t0_r35, "topics"."excerpt" AS t0_r36, "topics"."pinned_globally" AS t0_r37, "topics"."pinned_until" AS t0_r38, "topics"."fancy_title" AS t0_r39, "topics"."highest_staff_post_number" AS t0_r40, "topics"."featured_link" AS t0_r41, "topics"."reviewable_score" AS t0_r42, "topics"."image_upload_id" AS t0_r43, "topics"."slow_mode_seconds" AS t0_r44, "topics"."bannered_until" AS t0_r45, "topics"."external_id" AS t0_r46, "categories"."id" AS t1_r0, "categories"."name" AS t1_r1, "categories"."color" AS t1_r2, "categories"."topic_id" AS t1_r3, "categories"."topic_count" AS t1_r4, "categories"."created_at" AS t1_r5, "categories"."updated_at" AS t1_r6, "categories"."user_id" AS t1_r7, "categories"."topics_year" AS t1_r8, "categories"."topics_month" AS t1_r9, "categories"."topics_week" AS t1_r10, "categories"."slug" AS t1_r11, "categories"."description" AS t1_r12, "categories"."text_color" AS t1_r13, "categories"."read_restricted" AS t1_r14, "categories"."auto_close_hours" AS t1_r15, "categories"."post_count" AS t1_r16, "categories"."latest_post_id" AS t1_r17, "categories"."latest_topic_id" AS t1_r18, "categories"."position" AS t1_r19, "categories"."parent_category_id" AS t1_r20, "categories"."posts_year" AS t1_r21, "categories"."posts_month" AS t1_r22, "categories"."posts_week" AS t1_r23, "categories"."email_in" AS t1_r24, "categories"."email_in_allow_strangers" AS t1_r25, "categories"."topics_day" AS t1_r26, "categories"."posts_day" AS t1_r27, "categories"."allow_badges" AS t1_r28, "categories"."name_lower" AS t1_r29, "categories"."auto_close_based_on_last_post" AS t1_r30, "categories"."topic_template" AS t1_r31, "categories"."contains_messages" AS t1_r32, "categories"."sort_order" AS t1_r33, "categories"."sort_ascending" AS t1_r34, "categories"."uploaded_logo_id" AS t1_r35, "categories"."uploaded_background_id" AS t1_r36, "categories"."topic_featured_link_allowed" AS t1_r37, "categories"."all_topics_wiki" AS t1_r38, "categories"."show_subcategory_list" AS t1_r39, "categories"."num_featured_topics" AS t1_r40, "categories"."default_view" AS t1_r41, "categories"."subcategory_list_style" AS t1_r42, "categories"."default_top_period" AS t1_r43, "categories"."mailinglist_mirror" AS t1_r44, "categories"."minimum_required_tags" AS t1_r45, "categories"."navigate_to_first_post_after_read" AS t1_r46, "categories"."search_priority" AS t1_r47, "categories"."allow_global_tags" AS t1_r48, "categories"."reviewable_by_group_id" AS t1_r49, "categories"."read_only_banner" AS t1_r50, "categories"."default_list_filter" AS t1_r51, "categories"."allow_unlimited_owner_edits_on_first_post" AS t1_r52, "categories"."default_slow_mode_seconds" AS t1_r53, "categories"."uploaded_logo_dark_id" AS t1_r54 FROM "topics" LEFT OUTER JOIN "categories" ON "categories"."id" = "topics"."category_id" LEFT OUTER JOIN topic_users AS tu ON (topics.id = tu.topic_id AND tu.user_id = 29) LEFT JOIN category_users ON category_users.category_id = topics.category_id AND category_users.user_id = 29 WHERE "topics"."deleted_at" IS NULL AND (topics.archetype <> 'private_message') AND (COALESCE(categories.topic_id, 0) <> topics.id) AND (COALESCE(tu.notification_level,1) > 0) AND (topics.category_id = -1
                OR
                (COALESCE(category_users.notification_level, 1) <> 0 AND (topics.category_id IS NULL OR topics.category_id NOT IN(-1)))

                OR tu.notification_level > 1) AND (pinned_globally AND  pinned_at IS NOT NULL  AND (topics.pinned_at > tu.cleared_pinned_at OR tu.cleared_pinned_at IS NULL)) ORDER BY "topics"."pinned_at" DESC LIMIT 30

SELECT "topic_tags".* FROM "topic_tags" WHERE "topic_tags"."topic_id" = 7

SELECT "topics"."id" AS t0_r0, "topics"."title" AS t0_r1, "topics"."last_posted_at" AS t0_r2, "topics"."created_at" AS t0_r3, "topics"."updated_at" AS t0_r4, "topics"."views" AS t0_r5, "topics"."posts_count" AS t0_r6, "topics"."user_id" AS t0_r7, "topics"."last_post_user_id" AS t0_r8, "topics"."reply_count" AS t0_r9, "topics"."featured_user1_id" AS t0_r10, "topics"."featured_user2_id" AS t0_r11, "topics"."featured_user3_id" AS t0_r12, "topics"."deleted_at" AS t0_r13, "topics"."highest_post_number" AS t0_r14, "topics"."like_count" AS t0_r15, "topics"."incoming_link_count" AS t0_r16, "topics"."category_id" AS t0_r17, "topics"."visible" AS t0_r18, "topics"."moderator_posts_count" AS t0_r19, "topics"."closed" AS t0_r20, "topics"."archived" AS t0_r21, "topics"."bumped_at" AS t0_r22, "topics"."has_summary" AS t0_r23, "topics"."archetype" AS t0_r24, "topics"."featured_user4_id" AS t0_r25, "topics"."notify_moderators_count" AS t0_r26, "topics"."spam_count" AS t0_r27, "topics"."pinned_at" AS t0_r28, "topics"."score" AS t0_r29, "topics"."percent_rank" AS t0_r30, "topics"."subtype" AS t0_r31, "topics"."slug" AS t0_r32, "topics"."deleted_by_id" AS t0_r33, "topics"."participant_count" AS t0_r34, "topics"."word_count" AS t0_r35, "topics"."excerpt" AS t0_r36, "topics"."pinned_globally" AS t0_r37, "topics"."pinned_until" AS t0_r38, "topics"."fancy_title" AS t0_r39, "topics"."highest_staff_post_number" AS t0_r40, "topics"."featured_link" AS t0_r41, "topics"."reviewable_score" AS t0_r42, "topics"."image_upload_id" AS t0_r43, "topics"."slow_mode_seconds" AS t0_r44, "topics"."bannered_until" AS t0_r45, "topics"."external_id" AS t0_r46, "categories"."id" AS t1_r0, "categories"."name" AS t1_r1, "categories"."color" AS t1_r2, "categories"."topic_id" AS t1_r3, "categories"."topic_count" AS t1_r4, "categories"."created_at" AS t1_r5, "categories"."updated_at" AS t1_r6, "categories"."user_id" AS t1_r7, "categories"."topics_year" AS t1_r8, "categories"."topics_month" AS t1_r9, "categories"."topics_week" AS t1_r10, "categories"."slug" AS t1_r11, "categories"."description" AS t1_r12, "categories"."text_color" AS t1_r13, "categories"."read_restricted" AS t1_r14, "categories"."auto_close_hours" AS t1_r15, "categories"."post_count" AS t1_r16, "categories"."latest_post_id" AS t1_r17, "categories"."latest_topic_id" AS t1_r18, "categories"."position" AS t1_r19, "categories"."parent_category_id" AS t1_r20, "categories"."posts_year" AS t1_r21, "categories"."posts_month" AS t1_r22, "categories"."posts_week" AS t1_r23, "categories"."email_in" AS t1_r24, "categories"."email_in_allow_strangers" AS t1_r25, "categories"."topics_day" AS t1_r26, "categories"."posts_day" AS t1_r27, "categories"."allow_badges" AS t1_r28, "categories"."name_lower" AS t1_r29, "categories"."auto_close_based_on_last_post" AS t1_r30, "categories"."topic_template" AS t1_r31, "categories"."contains_messages" AS t1_r32, "categories"."sort_order" AS t1_r33, "categories"."sort_ascending" AS t1_r34, "categories"."uploaded_logo_id" AS t1_r35, "categories"."uploaded_background_id" AS t1_r36, "categories"."topic_featured_link_allowed" AS t1_r37, "categories"."all_topics_wiki" AS t1_r38, "categories"."show_subcategory_list" AS t1_r39, "categories"."num_featured_topics" AS t1_r40, "categories"."default_view" AS t1_r41, "categories"."subcategory_list_style" AS t1_r42, "categories"."default_top_period" AS t1_r43, "categories"."mailinglist_mirror" AS t1_r44, "categories"."minimum_required_tags" AS t1_r45, "categories"."navigate_to_first_post_after_read" AS t1_r46, "categories"."search_priority" AS t1_r47, "categories"."allow_global_tags" AS t1_r48, "categories"."reviewable_by_group_id" AS t1_r49, "categories"."read_only_banner" AS t1_r50, "categories"."default_list_filter" AS t1_r51, "categories"."allow_unlimited_owner_edits_on_first_post" AS t1_r52, "categories"."default_slow_mode_seconds" AS t1_r53, "categories"."uploaded_logo_dark_id" AS t1_r54 FROM "topics" LEFT OUTER JOIN "categories" ON "categories"."id" = "topics"."category_id" LEFT OUTER JOIN topic_users AS tu ON (topics.id = tu.topic_id AND tu.user_id = 29) LEFT JOIN category_users ON category_users.category_id = topics.category_id AND category_users.user_id = 29 WHERE "topics"."deleted_at" IS NULL AND (topics.archetype <> 'private_message') AND (COALESCE(categories.topic_id, 0) <> topics.id) AND (COALESCE(tu.notification_level,1) > 0) AND (topics.category_id = -1
                OR
                (COALESCE(category_users.notification_level, 1) <> 0 AND (topics.category_id IS NULL OR topics.category_id NOT IN(-1)))

                OR tu.notification_level > 1) AND (NOT ( pinned_globally AND  pinned_at IS NOT NULL  AND (topics.pinned_at > tu.cleared_pinned_at OR tu.cleared_pinned_at IS NULL) )) ORDER BY topics.bumped_at DESC LIMIT 30

SELECT "topic_tags".* FROM "topic_tags" WHERE "topic_tags"."topic_id" IN (477, 481, 480, 479, 478, 467, 466, 230, 209, 183, 173, 179, 168, 139, 102, 144, 150, 118, 126, 88, 63, 46, 117, 171, 45, 77, 154, 158, 43, 79)
SELECT "tags"."id", "tags"."name", "tags"."created_at", "tags"."updated_at", "tags"."pm_topic_count", "tags"."target_tag_id", "tags"."description", "tags"."public_topic_count", "tags"."staff_topic_count" FROM "tags" WHERE "tags"."id" IN (10, 20, 26, 7, 27, 28, 30, 19, 9, 4, 15, 29, 14, 18, 11, 25, 1, 21, 8, 22, 5, 32)
```

We end up with queries that are much more efficient as those queries can
effectively use the indexes.
2023-08-03 10:48:41 +08:00
..
action_dispatch/session DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
auth DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
autospec DEV: Prefer \A and \z over ^ and $ in regexes (#19936) 2023-01-20 12:52:49 -06:00
backup_restore FEATURE: allow S3 ACLs to be disabled (#21769) 2023-06-06 15:47:40 +10:00
common_passwords DEV: Upgrade to Rails 7 2022-04-28 11:51:03 +02:00
compression DEV: Prefer \A and \z over ^ and $ in regexes (#19936) 2023-01-20 12:52:49 -06:00
content_security_policy SECURITY: Don't reuse CSP nonce between anonymous requests 2023-07-28 12:53:44 +01:00
demon DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
discourse_dev DEV: Convert admin-incoming-email modal to component-based API (#22701) 2023-07-20 16:31:20 -05:00
email FEATURE: Add hooks for email poller plugins (#21384) 2023-06-26 13:16:03 +08:00
email_controller_helper FIX: Unsubscribing via key associated with deleted topic (#20275) 2023-02-16 10:47:01 +00:00
emoji DEV: Update javascript:update_constants rake task following template colocation (#20365) 2023-02-20 06:20:47 +03:00
faker DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
file_store DEV: allow using CDN URL for all s3 uploads (#20755) 2023-07-12 12:06:49 +08:00
final_destination DEV: Handle SSL errors in push notification pusher (#22771) 2023-07-25 15:01:02 +08:00
freedom_patches DEV: Update TranslateAccelerator missing translation string (#22158) 2023-06-16 15:28:03 +01:00
generators/rails
guardian FEATURE: Implement SiteSetting to Allow Anonymous Likes (#22131) 2023-07-21 21:21:07 +08:00
i18n DEV: i18n:check rake task was broken on Ruby 3.1 (#20103) 2023-01-31 16:53:24 +01:00
imap DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
import DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
import_export DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
javascripts DEV: Remove vendored copy of messageformat (#21658) 2023-05-19 10:59:04 +01:00
middleware DEV: Seperate concerns of tracking GC stat from MethodProfiler (#22921) 2023-08-02 10:46:37 +08:00
migration DEV: Correct ambiguous name (#21189) 2023-04-20 11:28:08 -05:00
onebox FIX: Update "Embed Motoko" Onebox URLs (#22198) 2023-07-26 09:41:01 +08:00
plugin Remove discourse-canned-replies from official list (#22932) 2023-08-02 12:48:20 +01:00
pretty_text FIX: Hashtag error in PrettyText when processing email (#22680) 2023-07-19 10:52:18 +10:00
rate_limiter DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
reviewable DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
scheduler SECURITY: Don't allow a particular site to monopolize the defer queue 2023-07-28 12:53:51 +01:00
search DEV: Make search results blurb non-pg headlines setting dependent (#20939) 2023-04-03 11:09:36 -03:00
second_factor DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
seed_data FIX: Use category hashtag instead of link in discourse_welcome_topic.body (#22875) 2023-08-01 13:53:23 +02:00
sidekiq DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
site_settings FEATURE: Add new site setting type for tag-group lists (#21993) 2023-06-09 11:02:55 -04:00
stylesheet FEATURE: Serve RTL versions of admin and plugins CSS bundles for RTL locales (#21876) 2023-06-01 05:27:11 +03:00
summarization FEATURE: Inline topic summary. Cached version accessible to everyone. (#22551) 2023-07-12 11:21:51 -03:00
tasks Remove discourse-canned-replies from official list (#22932) 2023-08-02 12:48:20 +01:00
theme_store DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
topic_query FEATURE: new watched_precedence_over_muted setting (#22252) 2023-06-27 14:49:34 +10:00
turbo_tests DEV: Add process pid to bin/turbo_tests --format documentation output (#22429) 2023-07-05 11:47:35 +08:00
validators FEATURE: Custom content summarization strategies. (#21813) 2023-06-13 14:21:46 -03:00
webauthn DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
wizard UX: update chat icon to d-chat (#20744) 2023-03-21 10:40:42 -04:00
admin_confirmation.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
admin_constraint.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
admin_user_index_query.rb DEV: Remove deprecated ascending param from AdminUserIndexQuery (#22741) 2023-07-24 09:37:18 +08:00
age_words.rb DEV: Move distance_of_time_in_words/time_ago_in_words (#21745) 2023-05-25 14:53:59 +02:00
archetype.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
auth.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
backup_restore.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
badge_posts_view_manager.rb
badge_queries.rb FIX: Fixed getting badges from inviting youself (#19778) 2023-01-27 12:28:47 +08:00
base62.rb
bookmark_manager.rb FIX: Bookmark auto delete preference usage and default value (#19707) 2023-01-05 08:43:58 +10:00
bookmark_query.rb SECURITY: Impose a upper bound on limit params in various controllers 2023-07-28 12:53:46 +01:00
bookmark_reminder_notification_handler.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
browser_detection.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
cache.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
canonical_url.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
category_badge.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
chrome_installed_checker.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
color_math.rb UX: Calculate missing hover/selected colors from existing colors (#20105) 2023-02-01 09:55:21 +00:00
comment_migration.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
common_passwords.rb DEV: Enable unless cops 2023-02-21 10:30:48 +01:00
composer_messages_finder.rb DEV: Ensure don't feed the trolls feature considers active flags only (#22774) 2023-07-25 15:12:22 +08:00
configurable_urls.rb PERF: Cache ToS and Privacy Policy paths (#21860) 2023-06-07 21:31:20 +03:00
content_buffer.rb DEV: Enable unless cops 2023-02-21 10:30:48 +01:00
content_security_policy.rb SECURITY: Don't reuse CSP nonce between anonymous requests 2023-07-28 12:53:44 +01:00
cooked_post_processor.rb DEV: Skip srcset for onebox thumbnails (#22621) 2023-07-19 12:21:34 -06:00
cooked_processor_mixin.rb SECURITY: Add FinalDestination::FastImage that's SSRF safe 2023-03-16 15:27:09 -06:00
crawler_detection.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
csrf_token_verifier.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
current_user.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
custom_renderer.rb
db_helper.rb FIX: Make DBHelper.find build valid query (#19408) 2023-01-10 22:38:52 +02:00
directory_helper.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
discourse_connect_base.rb DEV: Prefer \A and \z over ^ and $ in regexes (#19936) 2023-01-20 12:52:49 -06:00
discourse_connect_provider.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
discourse_dev.rb
discourse_diff.rb DEV: Prefer \A and \z over ^ and $ in regexes (#19936) 2023-01-20 12:52:49 -06:00
discourse_event.rb DEV: Add :push_notification event and deprecate :post_notification_alert (#22917) 2023-08-02 18:44:19 -03:00
discourse_hub.rb FEATURE: Detect current git "branch" even when a tag is checked out 2023-04-19 15:30:12 +02:00
discourse_ip_info.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
discourse_js_processor.rb FIX: Ensure skip-module JS is transpiled correctly (#21224) 2023-04-24 17:39:02 +01:00
discourse_logstash_logger.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
discourse_plugin_registry.rb FEATURE: Add hooks for email poller plugins (#21384) 2023-06-26 13:16:03 +08:00
discourse_redis.rb DEV: Remove Discourse.redis.delete_prefixed (#22103) 2023-06-16 12:44:35 +10:00
discourse_sourcemapping_url_processor.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
discourse_tagging.rb FIX: delete synonym tags if other synonyms are already exist. (#21885) 2023-06-02 19:47:29 +05:30
discourse_updates.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
discourse.rb FIX: Always clear caches after committing the current transaction (#22550) 2023-07-12 09:49:28 -05:00
disk_space.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
distributed_cache.rb FIX: Always clear caches after committing the current transaction (#22550) 2023-07-12 09:49:28 -05:00
distributed_memoizer.rb DEV: Make DistributedMemoizer use DistributedMutex (#16229) 2022-04-05 19:29:58 +02:00
distributed_mutex.rb DEV: reduce amount of errors logged when notifying on flags (#20472) 2023-03-01 08:58:32 +11:00
edit_rate_limiter.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
email_backup_token.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
email_cook.rb DEV: Prefer \A and \z over ^ and $ in regexes (#19936) 2023-01-20 12:52:49 -06:00
email_updater.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
email.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
ember_cli.rb PERF: Improve workbox loading strategy (#22019) 2023-06-09 11:14:11 +01:00
encodings.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
enum_site_setting.rb
enum.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
excerpt_parser.rb DEV: Update code comment wording (#22861) 2023-07-28 11:47:22 -06:00
external_upload_helpers.rb DEV: Change external upload rate limit maximums to settings (#20577) 2023-03-08 15:27:17 +10:00
feed_element_installer.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
feed_item_accessor.rb
file_helper.rb FEATURE: Add support for AVIF images (#21680) 2023-05-24 16:13:36 -03:00
filter_best_posts.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
final_destination.rb DEV: Gracefully handle user avatar download SSRF errors (#21523) 2023-05-12 15:32:02 +08:00
flag_query.rb
flag_settings.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
gaps.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
gc_stat_instrumenter.rb DEV: Seperate concerns of tracking GC stat from MethodProfiler (#22921) 2023-08-02 10:46:37 +08:00
git_repo.rb FEATURE: display commit hash for each plugin on /admin/plugins page. (#22176) 2023-06-26 10:09:57 +05:30
git_url.rb SECURITY: Prevent ReDOS by making the SSH url regex unambiguous (#20000) 2023-01-25 18:55:01 +02:00
global_path.rb DEV: Prefer \A and \z over ^ and $ in regexes (#19936) 2023-01-20 12:52:49 -06:00
group_email_credentials_check.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
group_lookup.rb FEATURE: display PM participant group names in the topics list. (#21677) 2023-05-31 19:32:06 +05:30
guardian.rb FEATURE: Implement SiteSetting to Allow Anonymous Likes (#22131) 2023-07-21 21:21:07 +08:00
has_errors.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
highlight_js.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
hijack.rb SECURITY: Don't allow a particular site to monopolize the defer queue 2023-07-28 12:53:51 +01:00
homepage_constraint.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
html_prettify.rb DEV: Prefer \A and \z over ^ and $ in regexes (#19936) 2023-01-20 12:52:49 -06:00
html_to_markdown.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
http_language_parser.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
image_sizer.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
import_export.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
inline_oneboxer.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
job_time_spacer.rb FEATURE: Auto-remove users without permission from channel (#20344) 2023-03-22 10:19:59 +10:00
js_locale_helper.rb DEV: Remove vendored copy of messageformat (#21658) 2023-05-19 10:59:04 +01:00
json_error.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
letter_avatar.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
markdown_linker.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
mem_info.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
message_bus_diags.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
method_profiler.rb DEV: Seperate concerns of tracking GC stat from MethodProfiler (#22921) 2023-08-02 10:46:37 +08:00
mini_sql_multisite_connection.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
mobile_detection.rb SECURITY: Prevent ReDoS in user agent parsing (#20002) 2023-01-25 18:55:33 +02:00
new_post_manager.rb FIX: Keep ReviewableQueuedPosts even with user delete reviewable actions (#22501) 2023-07-18 11:50:31 +00:00
new_post_result.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
notification_levels.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
onebox.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
oneboxer.rb FIX: Do not follow redirects for twitter oneboxes (#22362) 2023-06-30 11:30:03 +01:00
onpdiff.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
password_hasher.rb FEATURE: Persist password hashing algorithm/params in database (#20980) 2023-04-11 10:16:28 +01:00
pbkdf2.rb PERF: Use OpenSSL::KDF for Pbkdf2 implementation (#20982) 2023-04-05 17:00:05 +01:00
permalink_constraint.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
pinned_check.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
plain_text_to_markdown.rb DEV: Prefer \A and \z over ^ and $ in regexes (#19936) 2023-01-20 12:52:49 -06:00
plugin_gem.rb FEATURE: Try to load plugin gems platform variants (#21643) 2023-06-26 15:11:35 -03:00
plugin.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
post_action_creator.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
post_action_destroyer.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
post_action_result.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
post_creator.rb DEV: Enable unless cops 2023-02-21 10:30:48 +01:00
post_destroyer.rb DEV: Remove redundant line of code (#22734) 2023-07-21 11:50:07 +08:00
post_jobs_enqueuer.rb DEV: Enable unless cops 2023-02-21 10:30:48 +01:00
post_locker.rb
post_merger.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
post_revisor.rb DEV: PostRevisor helper methods to track topic title and raw revisions (#21918) 2023-06-05 18:02:46 +00:00
presence_channel.rb FIX: Ensure PresenceChannel does not raise error during readonly (#22899) 2023-08-01 09:34:57 +01:00
pretty_text.rb DEV: Move avatar-utils into dedicated discourse-common module (#22517) 2023-07-12 09:06:16 +01:00
promotion.rb FIX: Do not validate email in TL promotion (#20892) 2023-03-30 13:52:10 +10:00
quote_comparer.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
quote_rewriter.rb DEV: Update display name in new quote format - Part 2 (#22104) 2023-06-26 11:01:59 +08:00
rake_helpers.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
rate_limiter.rb DEV: Remove Discourse.redis.delete_prefixed (#22103) 2023-06-16 12:44:35 +10:00
read_only_mixin.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
redis_snapshot.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
require_dependency_backward_compatibility.rb DEV: Prefer \A and \z over ^ and $ in regexes (#19936) 2023-01-20 12:52:49 -06:00
retrieve_title.rb DEV: Gracefully handle user avatar download SSRF errors (#21523) 2023-05-12 15:32:02 +08:00
route_format.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
route_matcher.rb DEV: Prefer \A and \z over ^ and $ in regexes (#19936) 2023-01-20 12:52:49 -06:00
rtl.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
s3_cors_rulesets.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
s3_helper.rb FEATURE: allow S3 ACLs to be disabled (#21769) 2023-06-06 15:47:40 +10:00
s3_inventory.rb DEV: Prefer \A and \z over ^ and $ in regexes (#19936) 2023-01-20 12:52:49 -06:00
score_calculator.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
screening_model.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
search.rb FIX: created:@ search keyword for uppercase usernames (#22878) 2023-08-02 15:28:17 -04:00
secure_session.rb
shrink_uploaded_image.rb DEV: Prefer \A and \z over ^ and $ in regexes (#19936) 2023-01-20 12:52:49 -06:00
sidekiq_logster_reporter.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
site_icon_manager.rb DEV: Move Bookmark modal/component to use d-modal (#22532) 2023-07-17 10:14:17 +10:00
site_setting_extension.rb DEV: Avoid leaking new site setting states in test environment (#21713) 2023-05-25 07:53:57 +08:00
slug.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
socket_server.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
spam_handler.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
staff_constraint.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
staff_message_format.rb
suggested_topics_builder.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
svg_sprite.rb FEATURE: New Discourse Lightbox using Glimmer (#19798) 2023-07-13 15:06:17 +08:00
system_message.rb FIX: Send TL2 promotion message to correct user (#21978) 2023-06-07 22:51:24 +03:00
temporary_db.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
temporary_redis.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
text_cleaner.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
text_sentinel.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
theme_javascript_compiler.rb DEV: move raw handlebars to /raw-templates/ (#22574) 2023-07-13 12:57:45 -05:00
theme_modifier_helper.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
theme_settings_manager.rb FIX: Use the default value correctly for theme settings of type uploads (#20541) 2023-03-06 11:41:47 +03:00
theme_settings_parser.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
theme_translation_manager.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
theme_translation_parser.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
timeline_lookup.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
tiny_japanese_segmenter.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
topic_creator.rb FIX: Miscellaneous tagging errors (#21490) 2023-05-15 17:19:41 -03:00
topic_list_responder.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
topic_publisher.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
topic_query_params.rb UX: Various improvements to welcome topic CTA (#21010) 2023-05-12 17:09:40 +03:00
topic_query.rb PERF: Improve performance of queries when loading a topic list (#22949) 2023-08-03 10:48:41 +08:00
topic_retriever.rb FIX: #present -> #presence typo in TopicRetriever (#20509) 2023-03-02 13:05:45 -03:00
topic_subtype.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
topic_upload_security_manager.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
topic_view.rb FIX: Missing pending queued posts from topic view (#22838) 2023-07-28 16:16:23 +00:00
topics_bulk_action.rb FIX: Dismissing unread posts did not publish changes to other clients (#22584) 2023-07-13 18:05:56 +08:00
topics_filter.rb DEV: Add order:title filter to experimental /filter route (#22293) 2023-06-28 06:21:56 +08:00
trust_level.rb FIX: recalculating trust levels was not working (#20492) 2023-03-01 15:35:21 +11:00
turbo_tests.rb DEV: Restore the documentation format in system tests (#21471) 2023-05-12 11:13:52 +02:00
twitter_api.rb FIX: Minor Twitter onebox improvements (#22387) 2023-07-03 19:53:12 -03:00
unicorn_logstash_patch.rb
unread.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
upload_creator.rb DEV: Remove old deprecation warnings where constants already removed (#22140) 2023-06-16 11:26:26 +08:00
upload_fixer.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
upload_markdown.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
upload_recovery.rb FEATURE: allow S3 ACLs to be disabled (#21769) 2023-06-06 15:47:40 +10:00
upload_security.rb FIX: UploadReference order by tiebreaker for UploadSecurity (#20602) 2023-03-09 11:52:26 +10:00
url_helper.rb SECURITY: Limit URL length for theme remote (#20787) 2023-03-23 12:01:04 +00:00
user_comm_screener.rb DEV: Refactor DM channel creation into new service pattern (#22144) 2023-07-03 10:18:37 +10:00
user_lookup.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
user_name_suggester.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
vary_header.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
version.rb Bump version to v3.2.0.beta1-dev 2023-08-01 09:50:46 +01:00
webauthn.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
wizard.rb DEV: Apply syntax_tree formatting to lib/* 2023-01-09 12:10:19 +00:00
work_queue.rb SECURITY: Don't allow a particular site to monopolize the defer queue 2023-07-28 12:53:51 +01:00