feat: Use resolved contacts as base relation for filtering (#12520)
This PR has two changes to speed up contact filtering ### Updated Base Relation Update the `base_relation` to use resolved contacts scope to improve perf when filtering conversations. This narrows the search space drastically, and what is usually a sequential scan becomes a index scan for that `account_id` ref: https://github.com/chatwoot/chatwoot/pull/9347 ref: https://github.com/chatwoot/chatwoot/pull/7175/ Result: https://explain.dalibo.com/plan/c8a8gb17f0275fgf#plan ## Selective filtering in Compose New Conversation We also cost of filtering in compose new conversation dialog by reducing the search space based on the search candidate. For instance, a search term that obviously can’t be a phone, we exclude that from the filter. Similarly we skip name lookups for email-shaped queries. Removing the phone number took the query times from 50 seconds to under 1 seconds ### Comparison 1. Only Email: https://explain.dalibo.com/plan/h91a6844a4438a6a 2. Email + Name: https://explain.dalibo.com/plan/beg3aah05ch9ade0 3. Email + Name + Phone: https://explain.dalibo.com/plan/c8a8gb17f0275fgf
This commit is contained in:
@@ -103,13 +103,11 @@ RSpec.describe Account::ContactsExportJob do
|
||||
expect(csv_data.length).to eq(1)
|
||||
end
|
||||
|
||||
# TODO: This returns unresolved contacts as well since filter service returns the same
|
||||
# Change this when we make changes to filter service and ensure only resolved contacts are returned
|
||||
it 'returns filtered data which inclues unresolved contacts when filter is provided' do
|
||||
it 'returns filtered data limited to resolved contacts when filter is provided' do
|
||||
create(:contact, account: account, email: nil, phone_number: nil, additional_attributes: { :country_code => 'India' })
|
||||
described_class.perform_now(account.id, user.id, [], { :payload => [city_filter.merge(:query_operator => nil)] }.with_indifferent_access)
|
||||
csv_data = CSV.parse(account.contacts_export.download, headers: true)
|
||||
expect(csv_data.length).to eq(5)
|
||||
expect(csv_data.length).to eq(4)
|
||||
end
|
||||
|
||||
it 'returns filtered data when multiple filters are provided' do
|
||||
|
||||
Reference in New Issue
Block a user