N+1 calls on Code Suggestions authorisation check
Problems to solve
The following authorization check on Code Suggestions incurs N+1 queries (code).
Relevant snippets
accessible_root_groups = current_user.groups.by_parent(nil)
code_suggestions_disabled_by_group = accessible_root_groups.reject(&:code_suggestions_enabled?).any?
SQL logs
[15] pry(main)> current_user.groups.by_parent(nil).reject(&:code_suggestions_enabled?)
Group Load (2.0ms) SELECT "namespaces".* FROM "namespaces" INNER JOIN "members" ON "namespaces"."id" = "members"."source_id" WHERE "members"."type" = 'GroupMember' AND "members"."source_type" = 'Namespace' AND "namespaces"."type" = 'Group' AND "members"."user_id" = 1 AND "members"."requested_at" IS NULL AND (access_level >= 10) AND "namespaces"."parent_id" IS NULL /*application:console,db_config_name:main,console_hostname:joey,console_username:tanle,line:(pry):15:in `reject'*/
Feature::FlipperGate Load (0.7ms) SELECT "feature_gates".* FROM "feature_gates" WHERE "feature_gates"."feature_key" = 'ai_assist_flag' /*application:console,db_config_name:main,console_hostname:joey,console_username:tanle,line:/lib/feature.rb:237:in `block in current_feature_value'*/
Feature::FlipperGate Load (0.5ms) SELECT "feature_gates".* FROM "feature_gates" WHERE "feature_gates"."feature_key" = 'feature_flag_state_logs' /*application:console,db_config_name:main,console_hostname:joey,console_username:tanle,line:/lib/feature.rb:237:in `block in current_feature_value'*/
NamespaceSetting Load (0.5ms) SELECT "namespace_settings".* FROM "namespace_settings" WHERE "namespace_settings"."namespace_id" = 27 LIMIT 1 /*application:console,db_config_name:main,console_hostname:joey,console_username:tanle,line:/ee/app/models/ee/group.rb:80:in `code_suggestions'*/
NamespaceSetting Load (0.3ms) SELECT "namespace_settings".* FROM "namespace_settings" WHERE "namespace_settings"."namespace_id" = 168 LIMIT 1 /*application:console,db_config_name:main,console_hostname:joey,console_username:tanle,line:/ee/app/models/ee/group.rb:80:in `code_suggestions'*/
NamespaceSetting Load (0.3ms) SELECT "namespace_settings".* FROM "namespace_settings" WHERE "namespace_settings"."namespace_id" = 31 LIMIT 1 /*application:console,db_config_name:main,console_hostname:joey,console_username:tanle,line:/ee/app/models/ee/group.rb:80:in `code_suggestions'*/
NamespaceSetting Load (0.2ms) SELECT "namespace_settings".* FROM "namespace_settings" WHERE "namespace_settings"."namespace_id" = 70 LIMIT 1 /*application:console,db_config_name:main,console_hostname:joey,console_username:tanle,line:/ee/app/models/ee/group.rb:80:in `code_suggestions'*/
NamespaceSetting Load (0.4ms) SELECT "namespace_settings".* FROM "namespace_settings" WHERE "namespace_settings"."namespace_id" = 22 LIMIT 1 /*application:console,db_config_name:main,console_hostname:joey,console_username:tanle,line:/ee/app/models/ee/group.rb:80:in `code_suggestions'*/
NamespaceSetting Load (0.3ms) SELECT "namespace_settings".* FROM "namespace_settings" WHERE "namespace_settings"."namespace_id" = 25 LIMIT 1 /*application:console,db_config_name:main,console_hostname:joey,console_username:tanle,line:/ee/app/models/ee/group.rb:80:in `code_suggestions'*/
NamespaceSetting Load (0.3ms) SELECT "namespace_settings".* FROM "namespace_settings" WHERE "namespace_settings"."namespace_id" = 35 LIMIT 1 /*application:console,db_config_name:main,console_hostname:joey,console_username:tanle,line:/ee/app/models/ee/group.rb:80:in `code_suggestions'*/
NamespaceSetting Load (0.4ms) SELECT "namespace_settings".* FROM "namespace_settings" WHERE "namespace_settings"."namespace_id" = 29 LIMIT 1 /*application:console,db_config_name:main,console_hostname:joey,console_username:tanle,line:/ee/app/models/ee/group.rb:80:in `code_suggestions'*/
NamespaceSetting Load (0.4ms) SELECT "namespace_settings".* FROM "namespace_settings" WHERE "namespace_settings"."namespace_id" = 181 LIMIT 1 /*application:console,db_config_name:main,console_hostname:joey,console_username:tanle,line:/ee/app/models/ee/group.rb:80:in `code_suggestions'*/
NamespaceSetting Load (0.3ms) SELECT "namespace_settings".* FROM "namespace_settings" WHERE "namespace_settings"."namespace_id" = 186 LIMIT 1 /*application:console,db_config_name:main,console_hostname:joey,console_username:tanle,line:/ee/app/models/ee/group.rb:80:in `code_suggestions'*/
NamespaceSetting Load (0.3ms) SELECT "namespace_settings".* FROM "namespace_settings" WHERE "namespace_settings"."namespace_id" = 182 LIMIT 1 /*application:console,db_config_name:main,console_hostname:joey,console_username:tanle,line:/ee/app/models/ee/group.rb:80:in `code_suggestions'*/
NamespaceSetting Load (0.3ms) SELECT "namespace_settings".* FROM "namespace_settings" WHERE "namespace_settings"."namespace_id" = 33 LIMIT 1 /*application:console,db_config_name:main,console_hostname:joey,console_username:tanle,line:/ee/app/models/ee/group.rb:80:in `code_suggestions'*/
Proposal
Convert to SQL queries