diff options
| author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-02-07 15:15:53 +0000 |
|---|---|---|
| committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-02-07 15:15:53 +0000 |
| commit | 468bcfb9c6d04b0244c349eda62cd7ed1496cca3 (patch) | |
| tree | f8d645cbf62ccc9fcd94174390324e1ce934101b /app/models/user.rb | |
| parent | 072dbf4b87096eb0a4f82f9e0583527ed5d8f4d0 (diff) | |
| download | gitlab-ce-468bcfb9c6d04b0244c349eda62cd7ed1496cca3.tar.gz | |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/models/user.rb')
| -rw-r--r-- | app/models/user.rb | 47 |
1 files changed, 15 insertions, 32 deletions
diff --git a/app/models/user.rb b/app/models/user.rb index 65061305c02..313c1726429 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -668,7 +668,8 @@ class User < ApplicationRecord sanitized_order_sql = Arel.sql(sanitize_sql_array([order, query: query])) - scope = options[:with_private_emails] ? search_with_secondary_emails(query) : search_with_public_emails(query) + scope = options[:with_private_emails] ? with_primary_or_secondary_email(query) : with_public_email(query) + scope = scope.or(search_by_name_or_username(query, use_minimum_char_limit: options[:use_minimum_char_limit])) scope.reorder(sanitized_order_sql, :name) end @@ -685,50 +686,32 @@ class User < ApplicationRecord reorder(:name) end - def search_with_public_emails(query) - return none if query.blank? - - query = query.downcase + # searches user by given pattern + # it compares name and username fields with given pattern + # This method uses ILIKE on PostgreSQL. + def search_by_name_or_username(query, use_minimum_char_limit: nil) + use_minimum_char_limit = user_search_minimum_char_limit if use_minimum_char_limit.nil? where( - fuzzy_arel_match(:name, query, use_minimum_char_limit: user_search_minimum_char_limit) - .or(fuzzy_arel_match(:username, query, use_minimum_char_limit: user_search_minimum_char_limit)) - .or(arel_table[:public_email].eq(query)) + fuzzy_arel_match(:name, query, use_minimum_char_limit: use_minimum_char_limit) + .or(fuzzy_arel_match(:username, query, use_minimum_char_limit: use_minimum_char_limit)) ) end - def search_without_secondary_emails(query) - return none if query.blank? - - query = query.downcase - - where( - fuzzy_arel_match(:name, query, lower_exact_match: true) - .or(fuzzy_arel_match(:username, query, lower_exact_match: true)) - .or(arel_table[:email].eq(query)) - ) + def with_public_email(email_address) + where(public_email: email_address) end - # searches user by given pattern - # it compares name, email, username fields and user's secondary emails with given pattern - # This method uses ILIKE on PostgreSQL. - - def search_with_secondary_emails(query) - return none if query.blank? - - query = query.downcase - + def with_primary_or_secondary_email(email_address) email_table = Email.arel_table matched_by_email_user_id = email_table .project(email_table[:user_id]) - .where(email_table[:email].eq(query)) + .where(email_table[:email].eq(email_address)) .take(1) # at most 1 record as there is a unique constraint where( - fuzzy_arel_match(:name, query, use_minimum_char_limit: user_search_minimum_char_limit) - .or(fuzzy_arel_match(:username, query, use_minimum_char_limit: user_search_minimum_char_limit)) - .or(arel_table[:email].eq(query)) - .or(arel_table[:id].eq(matched_by_email_user_id)) + arel_table[:email].eq(email_address) + .or(arel_table[:id].eq(matched_by_email_user_id)) ) end |
