Skip to content

Conditional include of diff relations

Jan Provaznik requested to merge jp-inc-relation into master

What does this MR do and why?

When notes are loaded for an Issue/MR/epic..., we preload various note associations which are needed for displaying these notes. But not all associations are used for all types of resources.

Because only few resources can have diff-related relations, it's not necessary to always include additional query when loading notes e.g. for issues.

If there are many notes for the resource, these queries might make noticable difference - for example when loading this discussions on this epic loading each of both unnecessary associations take ~500ms.

Example of queries loaded for an issue (taken from !108893 (comment 1241761966)):

Issue Load (3.3ms)  SELECT "issues".* FROM "issues" ORDER BY "issues"."id" ASC LIMIT 1 /*application:console,db_config_name:main,console_hostname:eukos-MacBook-Pro.local,console_username:euko,line:(pry):3:in `__pry__'*/
  Note Load (0.5ms)  SELECT "notes".* FROM "notes" WHERE "notes"."noteable_id" = 1 AND "notes"."noteable_type" = 'Issue' /*application:console,db_config_name:main,console_hostname:eukos-MacBook-Pro.local,console_username:euko,line:bin/rails:4:in `<main>'*/
  Project Load (5.2ms)  SELECT "projects".* FROM "projects" WHERE "projects"."id" = 1 /*application:console,db_config_name:main,console_hostname:eukos-MacBook-Pro.local,console_username:euko,line:bin/rails:4:in `<main>'*/
  Group Load (3.2ms)  SELECT "namespaces".* FROM "namespaces" WHERE "namespaces"."type" = 'Group' AND "namespaces"."id" = 22 /*application:console,db_config_name:main,console_hostname:eukos-MacBook-Pro.local,console_username:euko,line:bin/rails:4:in `<main>'*/
  User Load (3.7ms)  SELECT "users"."id", "users"."email", "users"."encrypted_password", "users"."reset_password_token", "users"."reset_password_sent_at", "users"."remember_created_at", "users"."sign_in_count", "users"."current_sign_in_at", "users"."last_sign_in_at", "users"."current_sign_in_ip", "users"."last_sign_in_ip", "users"."created_at", "users"."updated_at", "users"."name", "users"."admin", "users"."projects_limit", "users"."failed_attempts", "users"."locked_at", "users"."username", "users"."can_create_group", "users"."can_create_team", "users"."state", "users"."color_scheme_id", "users"."password_expires_at", "users"."created_by_id", "users"."last_credential_check_at", "users"."avatar", "users"."confirmation_token", "users"."confirmed_at", "users"."confirmation_sent_at", "users"."unconfirmed_email", "users"."hide_no_ssh_key", "users"."admin_email_unsubscribed_at", "users"."notification_email", "users"."hide_no_password", "users"."password_automatically_set", "users"."encrypted_otp_secret", "users"."encrypted_otp_secret_iv", "users"."encrypted_otp_secret_salt", "users"."otp_required_for_login", "users"."otp_backup_codes", "users"."public_email", "users"."dashboard", "users"."project_view", "users"."consumed_timestep", "users"."layout", "users"."hide_project_limit", "users"."note", "users"."unlock_token", "users"."otp_grace_period_started_at", "users"."external", "users"."incoming_email_token", "users"."auditor", "users"."require_two_factor_authentication_from_group", "users"."two_factor_grace_period", "users"."last_activity_on", "users"."notified_of_own_activity", "users"."preferred_language", "users"."email_opted_in", "users"."email_opted_in_ip", "users"."email_opted_in_source_id", "users"."email_opted_in_at", "users"."theme_id", "users"."accepted_term_id", "users"."feed_token", "users"."private_profile", "users"."roadmap_layout", "users"."include_private_contributions", "users"."commit_email", "users"."group_view", "users"."managing_group_id", "users"."first_name", "users"."last_name", "users"."static_object_token", "users"."role", "users"."user_type", "users"."static_object_token_encrypted", "users"."otp_secret_expires_at", "users"."onboarding_in_progress" FROM "users" WHERE "users"."id" = 1 /*application:console,db_config_name:main,console_hostname:eukos-MacBook-Pro.local,console_username:euko,line:bin/rails:4:in `<main>'*/
  UserStatus Load (0.7ms)  SELECT "user_statuses".* FROM "user_statuses" WHERE "user_statuses"."user_id" = 1 /*application:console,db_config_name:main,console_hostname:eukos-MacBook-Pro.local,console_username:euko,line:bin/rails:4:in `<main>'*/
  AwardEmoji Load (0.9ms)  SELECT "award_emoji".* FROM "award_emoji" WHERE "award_emoji"."awardable_type" = 'Note' AND "award_emoji"."awardable_id" IN (76, 153, 1) ORDER BY "award_emoji"."id" ASC /*application:console,db_config_name:main,console_hostname:eukos-MacBook-Pro.local,console_username:euko,line:bin/rails:4:in `<main>'*/
  User Load (0.8ms)  SELECT "users"."id", "users"."email", "users"."encrypted_password", "users"."reset_password_token", "users"."reset_password_sent_at", "users"."remember_created_at", "users"."sign_in_count", "users"."current_sign_in_at", "users"."last_sign_in_at", "users"."current_sign_in_ip", "users"."last_sign_in_ip", "users"."created_at", "users"."updated_at", "users"."name", "users"."admin", "users"."projects_limit", "users"."failed_attempts", "users"."locked_at", "users"."username", "users"."can_create_group", "users"."can_create_team", "users"."state", "users"."color_scheme_id", "users"."password_expires_at", "users"."created_by_id", "users"."last_credential_check_at", "users"."avatar", "users"."confirmation_token", "users"."confirmed_at", "users"."confirmation_sent_at", "users"."unconfirmed_email", "users"."hide_no_ssh_key", "users"."admin_email_unsubscribed_at", "users"."notification_email", "users"."hide_no_password", "users"."password_automatically_set", "users"."encrypted_otp_secret", "users"."encrypted_otp_secret_iv", "users"."encrypted_otp_secret_salt", "users"."otp_required_for_login", "users"."otp_backup_codes", "users"."public_email", "users"."dashboard", "users"."project_view", "users"."consumed_timestep", "users"."layout", "users"."hide_project_limit", "users"."note", "users"."unlock_token", "users"."otp_grace_period_started_at", "users"."external", "users"."incoming_email_token", "users"."auditor", "users"."require_two_factor_authentication_from_group", "users"."two_factor_grace_period", "users"."last_activity_on", "users"."notified_of_own_activity", "users"."preferred_language", "users"."email_opted_in", "users"."email_opted_in_ip", "users"."email_opted_in_source_id", "users"."email_opted_in_at", "users"."theme_id", "users"."accepted_term_id", "users"."feed_token", "users"."private_profile", "users"."roadmap_layout", "users"."include_private_contributions", "users"."commit_email", "users"."group_view", "users"."managing_group_id", "users"."first_name", "users"."last_name", "users"."static_object_token", "users"."role", "users"."user_type", "users"."static_object_token_encrypted", "users"."otp_secret_expires_at", "users"."onboarding_in_progress" FROM "users" WHERE "users"."id" = 1 /*application:console,db_config_name:main,console_hostname:eukos-MacBook-Pro.local,console_username:euko,line:bin/rails:4:in `<main>'*/
  SystemNoteMetadata Load (2.5ms)  SELECT "system_note_metadata".* FROM "system_note_metadata" WHERE "system_note_metadata"."note_id" IN (76, 153, 1) /*application:console,db_config_name:main,console_hostname:eukos-MacBook-Pro.local,console_username:euko,line:bin/rails:4:in `<main>'*/
  Suggestion Load (1.3ms)  SELECT "suggestions".* FROM "suggestions" WHERE "suggestions"."note_id" IN (76, 153, 1) ORDER BY "suggestions"."relative_order" ASC /*application:console,db_config_name:main,console_hostname:eukos-MacBook-Pro.local,console_username:euko,line:bin/rails:4:in `<main>'*/
  NoteDiffFile Load (1.6ms)  SELECT "note_diff_files".* FROM "note_diff_files" WHERE "note_diff_files"."diff_note_id" IN (76, 153, 1) /*application:console,db_config_name:main,console_hostname:eukos-MacBook-Pro.local,console_username:euko,line:bin/rails:4:in `<main>'*/
  DiffNotePosition Load (2.4ms)  SELECT "diff_note_positions".* FROM "diff_note_positions" WHERE "diff_note_positions"."note_id" IN (76, 153, 1) /*application:console,db_config_name:main,console_hostname:eukos-MacBook-Pro.local,console_username:euko,line:bin/rails:4:in `<main>'*/

We can get rid of last two queries for issues.

Screenshots or screen recordings

Screenshots are required for UI changes, and strongly recommended for all other merge requests.

How to set up and validate locally

Numbered steps to set up and validate the change are strongly suggested.

MR acceptance checklist

This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.

Edited by Jan Provaznik

Merge request reports