Remove duplicate user entries from user search

fixes ADMIN-2844
flag=none

Test plan
- Follow repro steps in ticket
  and ensure you only get the user
  returned once

Change-Id: I3807ab2bfa6793a6a9d81524a4b42a2910c32cb5
Reviewed-on: https://gerrit.instructure.com/208018
Tested-by: Jenkins
Reviewed-by: Jeremy Stanley <jeremy@instructure.com>
QA-Review: Jeremy Stanley <jeremy@instructure.com>
Product-Review: Mysti Lilla <mysti@instructure.com>
This commit is contained in:
Mysti Lilla 2019-09-03 17:50:10 -06:00
parent 31a701307e
commit 58e5f4ae2d
2 changed files with 16 additions and 3 deletions

View File

@ -29,7 +29,6 @@ module UserSearch
context.shard.activate do
users_scope = context_scope(context, searcher, options.slice(:enrollment_state, :include_inactive_enrollments))
users_scope = users_scope.from("(#{conditions_statement(search_term, context.root_account, users_scope)}) AS users")
users_scope = order_scope(users_scope, context, options.slice(:order, :sort))
roles_scope(users_scope, context, options.slice(:enrollment_type, :enrollment_role,
@ -175,15 +174,21 @@ module UserSearch
end
def self.login_sql(users_scope, params)
users_scope.select("users.*, MAX(current_login_at) as last_login").
users_scope.select("users.*, MAX(logins.current_login_at) as last_login").
joins(:pseudonyms).
joins("LEFT JOIN #{Pseudonym.quoted_table_name} AS logins ON logins.user_id = users.id
AND logins.account_id = #{User.connection.quote(params[:account])}
AND logins.workflow_state = 'active'").
where(pseudonyms: {account_id: params[:account], workflow_state: 'active'}).
where(like_condition('pseudonyms.unique_id'), pattern: params[:pattern])
end
def self.sis_sql(users_scope, params)
users_scope.select("users.*, MAX(current_login_at) as last_login").
users_scope.select("users.*, MAX(logins.current_login_at) as last_login").
joins(:pseudonyms).
joins("LEFT JOIN #{Pseudonym.quoted_table_name} AS logins ON logins.user_id = users.id
AND logins.account_id = #{User.connection.quote(params[:account])}
AND logins.workflow_state = 'active'").
where(pseudonyms: {account_id: params[:account], workflow_state: 'active'}).
where(like_condition('pseudonyms.sis_user_id'), pattern: params[:pattern])
end

View File

@ -214,6 +214,14 @@ describe UserSearch do
users = UserSearch.for_user_in_context('Tyler', course, user, nil, sort: 'sis_id')
expect(users.map(&:name)).to eq ['Tyler Pickett', 'Rose Tyler', 'Tyler Teacher']
end
it 'does not return users twice if it matches their name and an old login' do
tyler = User.find_by(name: 'Tyler Pickett')
tyler.pseudonyms.create!(unique_id: 'Yo', account_id: course.root_account_id, current_login_at: Time.zone.now)
tyler.pseudonyms.create!(unique_id: 'Pickett', account_id: course.root_account_id, current_login_at: 1.week.ago)
users = UserSearch.for_user_in_context('Pickett', course, user, nil, sort: 'username')
expect(users.map(&:name)).to eq ['Tyler Pickett']
end
end
describe 'searching on emails' do