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:
parent
31a701307e
commit
58e5f4ae2d
|
@ -29,7 +29,6 @@ module UserSearch
|
||||||
|
|
||||||
context.shard.activate do
|
context.shard.activate do
|
||||||
users_scope = context_scope(context, searcher, options.slice(:enrollment_state, :include_inactive_enrollments))
|
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 = 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))
|
users_scope = order_scope(users_scope, context, options.slice(:order, :sort))
|
||||||
roles_scope(users_scope, context, options.slice(:enrollment_type, :enrollment_role,
|
roles_scope(users_scope, context, options.slice(:enrollment_type, :enrollment_role,
|
||||||
|
@ -175,15 +174,21 @@ module UserSearch
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.login_sql(users_scope, params)
|
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(: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(pseudonyms: {account_id: params[:account], workflow_state: 'active'}).
|
||||||
where(like_condition('pseudonyms.unique_id'), pattern: params[:pattern])
|
where(like_condition('pseudonyms.unique_id'), pattern: params[:pattern])
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.sis_sql(users_scope, params)
|
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(: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(pseudonyms: {account_id: params[:account], workflow_state: 'active'}).
|
||||||
where(like_condition('pseudonyms.sis_user_id'), pattern: params[:pattern])
|
where(like_condition('pseudonyms.sis_user_id'), pattern: params[:pattern])
|
||||||
end
|
end
|
||||||
|
|
|
@ -214,6 +214,14 @@ describe UserSearch do
|
||||||
users = UserSearch.for_user_in_context('Tyler', course, user, nil, sort: 'sis_id')
|
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']
|
expect(users.map(&:name)).to eq ['Tyler Pickett', 'Rose Tyler', 'Tyler Teacher']
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
describe 'searching on emails' do
|
describe 'searching on emails' do
|
||||||
|
|
Loading…
Reference in New Issue