mirror of
https://github.com/discourse/discourse.git
synced 2025-02-17 07:42:45 +08:00
PERF: exact email match bypass
instead of scanning full table when there is an exact email match ONLY return the actual user.
This commit is contained in:
parent
86e6732f78
commit
2d5bf0705a
|
@ -101,13 +101,26 @@ class AdminUserIndexQuery
|
|||
end
|
||||
end
|
||||
|
||||
def filter_by_user_with_bypass(filter)
|
||||
if filter =~ /.+@.+/
|
||||
# probably an email so try the bypass
|
||||
user_id = UserEmail.where(email: filter.downcase).pluck(:user_id).first
|
||||
if user_id
|
||||
return @query.where('users.id = ?', user_id)
|
||||
end
|
||||
end
|
||||
|
||||
@query.where('username_lower ILIKE :filter OR user_emails.email ILIKE :filter', filter: "%#{params[:filter]}%")
|
||||
end
|
||||
|
||||
def filter_by_search
|
||||
if params[:filter].present?
|
||||
params[:filter].strip!
|
||||
if ip = IPAddr.new(params[:filter]) rescue nil
|
||||
filter = params[:filter]
|
||||
if filter.present?
|
||||
filter.strip!
|
||||
if ip = IPAddr.new(filter) rescue nil
|
||||
@query.where('ip_address <<= :ip OR registration_ip_address <<= :ip', ip: ip.to_cidr_s)
|
||||
else
|
||||
@query.where('username_lower ILIKE :filter OR user_emails.email ILIKE :filter', filter: "%#{params[:filter]}%")
|
||||
filter_by_user_with_bypass(filter)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -178,6 +178,18 @@ describe AdminUserIndexQuery do
|
|||
|
||||
describe "filtering" do
|
||||
|
||||
context "exact email bypass" do
|
||||
it "can correctly bypass expensive ilike query" do
|
||||
user = Fabricate(:user, email: 'sam@Sam.com')
|
||||
|
||||
query = AdminUserIndexQuery.new(filter: 'Sam@sam.com').find_users_query
|
||||
expect(query.count).to eq(1)
|
||||
expect(query.first.id).to eq(user.id)
|
||||
|
||||
expect(query.to_sql.downcase).not_to include("ilike")
|
||||
end
|
||||
end
|
||||
|
||||
context "by email fragment" do
|
||||
|
||||
before(:each) { Fabricate(:user, email: "test1@example.com") }
|
||||
|
|
Loading…
Reference in New Issue
Block a user