Follow up - ed8a152f28 - Fixes #2911 - Performance: Improved touching assets of users, organizations and tickets. Rollback of indexed data behavior change (structure instead of name).

This commit is contained in:
Rolf Schmidt 2020-03-02 15:25:33 +01:00 committed by Thorsten Eckel
parent 5b262c75b0
commit eafb6dd236
6 changed files with 47 additions and 38 deletions

View file

@ -94,11 +94,11 @@ returns
# get name of ref object # get name of ref object
value = nil value = nil
if respond_to?('search_index_data') if respond_to?('name')
value = send('name')
elsif respond_to?('search_index_data')
value = send('search_index_data') value = send('search_index_data')
return if value == true return if value == true
elsif respond_to?('name')
value = send('name')
end end
value value

View file

@ -91,7 +91,9 @@ returns
# start background job to transfer data to search index # start background job to transfer data to search index
return true if !SearchIndexBackend.enabled? return true if !SearchIndexBackend.enabled?
return if search_index_value.blank?
new_search_index_value = search_index_value
return if new_search_index_value.blank?
Models.indexable.each do |local_object| Models.indexable.each do |local_object|
next if local_object == self.class next if local_object == self.class
@ -106,9 +108,9 @@ returns
next if local_object.to_s == 'Ticket' next if local_object.to_s == 'Ticket'
local_object.new.attributes.each do |key, _value| local_object.new.attributes.each do |key, _value|
attribute_name = key.to_s attribute_name = key.to_s
attribute_ref_name = local_object.search_index_attribute_ref_name(attribute_name) attribute_ref_name = local_object.search_index_attribute_ref_name(attribute_name)
attribute_class = local_object.reflect_on_association(attribute_ref_name)&.klass attribute_class = local_object.reflect_on_association(attribute_ref_name)&.klass
next if attribute_name.blank? next if attribute_name.blank?
next if attribute_ref_name.blank? next if attribute_ref_name.blank?
@ -116,7 +118,7 @@ returns
next if attribute_class != self.class next if attribute_class != self.class
data = { data = {
attribute_ref_name => search_index_value attribute_ref_name => new_search_index_value,
} }
where = { where = {
attribute_name => id attribute_name => id

View file

@ -1,13 +1,11 @@
RSpec.shared_examples 'CanLookupSearchIndexAttributes' do RSpec.shared_examples 'CanLookupSearchIndexAttributes' do
describe '.search_index_value_by_attribute' do describe '.search_index_value_by_attribute' do
it 'returns hash of data' do it 'returns search index value for attribute' do
organization = create(:organization, name: 'Tomato42', note: 'special recipe') organization = create(:organization, name: 'Tomato42', note: 'special recipe')
user = create(:agent_user, organization: organization) user = create(:agent_user, organization: organization)
value = user.search_index_value_by_attribute('organization_id') value = user.search_index_value_by_attribute('organization_id')
expect_value = { 'name' => 'Tomato42', 'note' => 'special recipe' } expect(value).to eq('Tomato42')
expect(value).to be_a_kind_of(Hash)
expect(value).to eq(expect_value)
end end
end end
@ -16,9 +14,7 @@ RSpec.shared_examples 'CanLookupSearchIndexAttributes' do
organization = create(:organization, name: 'Tomato42', note: 'special recipe') organization = create(:organization, name: 'Tomato42', note: 'special recipe')
value = organization.search_index_value value = organization.search_index_value
expect_value = { 'name' => 'Tomato42', 'note' => 'special recipe' } expect(value).to eq('Tomato42')
expect(value).to be_a_kind_of(Hash)
expect(value).to eq(expect_value)
end end
end end

View file

@ -8,6 +8,7 @@ require 'models/concerns/has_xss_sanitized_note_examples'
require 'models/concerns/can_be_imported_examples' require 'models/concerns/can_be_imported_examples'
require 'models/concerns/has_object_manager_attributes_validation_examples' require 'models/concerns/has_object_manager_attributes_validation_examples'
require 'models/user/has_ticket_create_screen_impact_examples' require 'models/user/has_ticket_create_screen_impact_examples'
require 'models/user/can_lookup_search_index_attributes_examples'
RSpec.describe User, type: :model do RSpec.describe User, type: :model do
subject(:user) { create(:user) } subject(:user) { create(:user) }
@ -25,6 +26,7 @@ RSpec.describe User, type: :model do
it_behaves_like 'CanBeImported' it_behaves_like 'CanBeImported'
it_behaves_like 'HasObjectManagerAttributesValidation' it_behaves_like 'HasObjectManagerAttributesValidation'
it_behaves_like 'HasTicketCreateScreenImpact' it_behaves_like 'HasTicketCreateScreenImpact'
it_behaves_like 'CanLookupSearchIndexAttributes'
describe 'Class methods:' do describe 'Class methods:' do
describe '.authenticate' do describe '.authenticate' do

View file

@ -352,15 +352,18 @@ RSpec.describe 'Search', type: :request, searchindex: true do
end end
it 'does find the user of the nested organization and also even if the organization name changes' do it 'does find the user of the nested organization and also even if the organization name changes' do
params = {
query: 'Tomato42',
limit: 10,
}
# because of the initial relation between user and organization # because of the initial relation between user and organization
# both user and organization will be found as result # both user and organization will be found as result
authenticated_as(agent_user) authenticated_as(agent_user)
post '/api/v1/search/User', params: params, as: :json post '/api/v1/search/User', params: { query: 'Tomato42' }, as: :json
expect(response).to have_http_status(:ok)
expect(json_response).to be_a_kind_of(Hash)
expect(json_response).to be_truthy
expect(json_response['assets']['Organization'][organization_nested.id.to_s]).to be_truthy
expect(json_response['assets']['User'][customer_user_nested.id.to_s]).to be_truthy
post '/api/v1/search/User', params: { query: 'organization:Tomato42' }, as: :json
expect(response).to have_http_status(:ok) expect(response).to have_http_status(:ok)
expect(json_response).to be_a_kind_of(Hash) expect(json_response).to be_a_kind_of(Hash)
expect(json_response).to be_truthy expect(json_response).to be_truthy
@ -371,14 +374,16 @@ RSpec.describe 'Search', type: :request, searchindex: true do
Scheduler.worker(true) Scheduler.worker(true)
SearchIndexBackend.refresh SearchIndexBackend.refresh
params = {
query: 'Cucumber43',
limit: 10,
}
# even after a change of the organization name we should find # even after a change of the organization name we should find
# the customer user because of the nested organization data # the customer user because of the nested organization data
post '/api/v1/search/User', params: params, as: :json post '/api/v1/search/User', params: { query: 'Cucumber43' }, as: :json
expect(response).to have_http_status(:ok)
expect(json_response).to be_a_kind_of(Hash)
expect(json_response).to be_truthy
expect(json_response['assets']['Organization'][organization_nested.id.to_s]).to be_truthy
expect(json_response['assets']['User'][customer_user_nested.id.to_s]).to be_truthy
post '/api/v1/search/User', params: { query: 'organization:Cucumber43' }, as: :json
expect(response).to have_http_status(:ok) expect(response).to have_http_status(:ok)
expect(json_response).to be_a_kind_of(Hash) expect(json_response).to be_a_kind_of(Hash)
expect(json_response).to be_truthy expect(json_response).to be_truthy
@ -387,13 +392,15 @@ RSpec.describe 'Search', type: :request, searchindex: true do
end end
it 'does find the ticket by organization name even if the organization name changes' do it 'does find the ticket by organization name even if the organization name changes' do
params = {
query: 'Tomato42',
limit: 10,
}
authenticated_as(agent_user) authenticated_as(agent_user)
post '/api/v1/search/Ticket', params: params, as: :json post '/api/v1/search/Ticket', params: { query: 'Tomato42' }, as: :json
expect(response).to have_http_status(:ok)
expect(json_response).to be_a_kind_of(Hash)
expect(json_response).to be_truthy
expect(json_response['assets']['Organization'][organization_nested.id.to_s]).to be_truthy
expect(json_response['assets']['Ticket'][ticket_nested.id.to_s]).to be_truthy
post '/api/v1/search/Ticket', params: { query: 'organization:Tomato42' }, as: :json
expect(response).to have_http_status(:ok) expect(response).to have_http_status(:ok)
expect(json_response).to be_a_kind_of(Hash) expect(json_response).to be_a_kind_of(Hash)
expect(json_response).to be_truthy expect(json_response).to be_truthy
@ -404,12 +411,14 @@ RSpec.describe 'Search', type: :request, searchindex: true do
Scheduler.worker(true) Scheduler.worker(true)
SearchIndexBackend.refresh SearchIndexBackend.refresh
params = { post '/api/v1/search/Ticket', params: { query: 'Cucumber43' }, as: :json
query: 'Cucumber43', expect(response).to have_http_status(:ok)
limit: 10, expect(json_response).to be_a_kind_of(Hash)
} expect(json_response).to be_truthy
expect(json_response['assets']['Organization'][organization_nested.id.to_s]).to be_truthy
expect(json_response['assets']['Ticket'][ticket_nested.id.to_s]).to be_truthy
post '/api/v1/search/Ticket', params: params, as: :json post '/api/v1/search/Ticket', params: { query: 'organization:Cucumber43' }, as: :json
expect(response).to have_http_status(:ok) expect(response).to have_http_status(:ok)
expect(json_response).to be_a_kind_of(Hash) expect(json_response).to be_a_kind_of(Hash)
expect(json_response).to be_truthy expect(json_response).to be_truthy

View file

@ -104,7 +104,7 @@ class ElasticsearchTest < ActiveSupport::TestCase
assert_equal('es-customer1@example.com', attributes['email']) assert_equal('es-customer1@example.com', attributes['email'])
assert(attributes['preferences']) assert(attributes['preferences'])
assert_not(attributes['password']) assert_not(attributes['password'])
assert_equal({ 'name' => 'Customer Organization Update', 'note' => 'some note' }, attributes['organization']) assert_equal('Customer Organization Update', attributes['organization'])
# organization # organization
attributes = @organization1.search_index_data attributes = @organization1.search_index_data