Skip to content

Add support for searching users by confirmed e-mails

Stan Hu requested to merge sh-support-users-find-by-confirmed-emails into master

This is in preparation for modifying importers to assign e-mails for only confirmed emails.

EXPLAIN plan on GitLab.com doesn't seem like it has changed:

gitlabhq_production=# explain analyze SELECT  "users".* FROM (SELECT "users".* FROM "users" WHERE "users"."email" = 'me@gitlab.com' AND ("users"."confirmed_at" IS NOT NULL) 
UNION 
SELECT "users".* FROM "users" INNER JOIN "emails" ON "emails"."user_id" = "users"."id" WHERE "emails"."email" = 'me@gitlab.com' AND ("users"."confirmed_at" IS NOT NULL)) users LIMIT 1;

 Limit  (cost=10.37..10.57 rows=1 width=11793) (actual time=0.142..0.142 rows=1 loops=1)
   ->  Unique  (cost=10.37..10.74 rows=2 width=11793) (actual time=0.141..0.141 rows=1 loops=1)
         ->  Sort  (cost=10.37..10.38 rows=2 width=11793) (actual time=0.140..0.140 rows=1 loops=1)
               Sort Key: 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, us
ers.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.skype, users.linkedin, users.twitter, users.bio, 
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.avatar, users.c
onfirmation_token, users.confirmed_at, users.confirmation_sent_at, users.unconfirmed_email, users.hide_no_ssh_key, users.website_url, users.last_credential_check_at, users.admin_email_unsubscribed_at, users.n
otification_email, users.hide_no_password, users.password_automatically_set, users.location, users.public_email, users.encrypted_otp_secret, users.encrypted_otp_secret_iv, users.encrypted_otp_secret_salt, use
rs.otp_required_for_login, users.otp_backup_codes, users.dashboard, users.project_view, users.consumed_timestep, users.layout, users.hide_project_limit, users.unlock_token, users.note, users.otp_grace_period_
started_at, users.external, users.organization, users.incoming_email_token, users.auditor, users.ghost, users.require_two_factor_authentication_from_group, users.two_factor_grace_period, users.notified_of_own
_activity, users.support_bot, users.last_activity_on, 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.ac
cepted_term_id, users.feed_token
               Sort Method: quicksort  Memory: 27kB
               ->  Append  (cost=0.43..10.36 rows=2 width=11793) (actual time=0.051..0.052 rows=1 loops=1)
                     ->  Index Scan using users_email_key on users  (cost=0.43..3.45 rows=1 width=855) (actual time=0.021..0.021 rows=0 loops=1)
                           Index Cond: ((email)::text = 'me@gitlab.com'::text)
                           Filter: (confirmed_at IS NOT NULL)
                     ->  Nested Loop  (cost=0.85..6.89 rows=1 width=855) (actual time=0.029..0.030 rows=1 loops=1)
                           ->  Index Scan using emails_email_key on emails  (cost=0.42..3.44 rows=1 width=4) (actual time=0.015..0.015 rows=1 loops=1)
                                 Index Cond: ((email)::text = 'me@gitlab.com'::text)
                           ->  Index Scan using users_pkey on users users_1  (cost=0.43..3.45 rows=1 width=855) (actual time=0.013..0.013 rows=1 loops=1)
                                 Index Cond: (id = emails.user_id)
                                 Filter: (confirmed_at IS NOT NULL)
 Planning time: 1.411 ms
 Execution time: 0.330 ms
(17 rows)
Edited by Stan Hu

Merge request reports