72f428c7d2
Performance is improved in two steps: 1. On PostgreSQL an expression index is used for checking lower(email) and lower(username). 2. The check to determine if we're searching for a username or Email is moved to Ruby. Thanks to @haynes for suggesting and writing the initial implementation of this. Moving the check to Ruby makes this method an additional 1.5 times faster compared to doing the check in the SQL query. With performance being improved I've now also tweaked the amount of iterations required by the User.by_login benchmark. This method now runs between 900 and 1000 iterations per second.
42 lines
1.1 KiB
Ruby
42 lines
1.1 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe User, benchmark: true do
|
|
describe '.by_login' do
|
|
before do
|
|
%w{Alice Bob Eve}.each do |name|
|
|
create(:user,
|
|
email: "#{name}@gitlab.com",
|
|
username: name,
|
|
name: name)
|
|
end
|
|
end
|
|
|
|
# The iteration count is based on the query taking little over 1 ms when
|
|
# using PostgreSQL.
|
|
let(:iterations) { 900 }
|
|
|
|
describe 'using a capitalized username' do
|
|
benchmark_subject { User.by_login('Alice') }
|
|
|
|
it { is_expected.to iterate_per_second(iterations) }
|
|
end
|
|
|
|
describe 'using a lowercase username' do
|
|
benchmark_subject { User.by_login('alice') }
|
|
|
|
it { is_expected.to iterate_per_second(iterations) }
|
|
end
|
|
|
|
describe 'using a capitalized Email address' do
|
|
benchmark_subject { User.by_login('Alice@gitlab.com') }
|
|
|
|
it { is_expected.to iterate_per_second(iterations) }
|
|
end
|
|
|
|
describe 'using a lowercase Email address' do
|
|
benchmark_subject { User.by_login('alice@gitlab.com') }
|
|
|
|
it { is_expected.to iterate_per_second(iterations) }
|
|
end
|
|
end
|
|
end
|