2021-06-01 12:20:20 +00:00
|
|
|
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
|
|
|
|
2017-01-31 17:13:45 +00:00
|
|
|
module ApplicationModel::CanLookupSearchIndexAttributes
|
|
|
|
extend ActiveSupport::Concern
|
|
|
|
|
2021-07-12 08:18:46 +00:00
|
|
|
class RequestCache < ActiveSupport::CurrentAttributes
|
|
|
|
attribute :integer_attribute_names
|
|
|
|
|
|
|
|
def integer_fields(class_name)
|
|
|
|
self.integer_attribute_names ||= {}
|
|
|
|
|
|
|
|
updated_at = ObjectManager::Attribute.maximum('updated_at')
|
|
|
|
return self.integer_attribute_names[class_name][:data] if self.integer_attribute_names[class_name].present? && self.integer_attribute_names[class_name][:updated_at] == updated_at
|
|
|
|
|
|
|
|
self.integer_attribute_names[class_name] = {
|
|
|
|
updated_at: updated_at,
|
|
|
|
data: ObjectManager::Attribute.where(object_lookup: ObjectLookup.find_by(name: class_name), data_type: 'integer', editable: true).pluck(:name),
|
|
|
|
}
|
|
|
|
self.integer_attribute_names[class_name][:data]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-01-31 17:13:45 +00:00
|
|
|
=begin
|
|
|
|
|
2021-01-27 09:58:35 +00:00
|
|
|
This function return the attributes for the elastic search with relation hash values.
|
|
|
|
|
|
|
|
It can be run with parameter include_references: false to skip the relational hashes to prevent endless loops.
|
2017-01-31 17:13:45 +00:00
|
|
|
|
|
|
|
ticket = Ticket.find(3)
|
|
|
|
attributes = ticket.search_index_attribute_lookup
|
2021-01-27 09:58:35 +00:00
|
|
|
attributes = ticket.search_index_attribute_lookup(include_references: false)
|
2017-01-31 17:13:45 +00:00
|
|
|
|
|
|
|
returns
|
|
|
|
|
|
|
|
attributes # object with lookup data
|
|
|
|
|
|
|
|
=end
|
|
|
|
|
2021-01-27 09:58:35 +00:00
|
|
|
def search_index_attribute_lookup(include_references: true)
|
2017-01-31 17:13:45 +00:00
|
|
|
attributes = self.attributes
|
2017-10-01 12:25:52 +00:00
|
|
|
self.attributes.each do |key, value|
|
2021-01-27 09:58:35 +00:00
|
|
|
break if !include_references
|
|
|
|
|
2019-06-28 11:38:49 +00:00
|
|
|
attribute_name = key.to_s
|
2018-10-09 06:17:41 +00:00
|
|
|
|
2020-02-18 14:49:52 +00:00
|
|
|
# ignore standard attribute if needed
|
|
|
|
if self.class.search_index_attribute_ignored?(attribute_name)
|
|
|
|
attributes.delete(attribute_name)
|
|
|
|
next
|
|
|
|
end
|
2017-01-31 17:13:45 +00:00
|
|
|
|
2020-02-18 14:49:52 +00:00
|
|
|
# need value for reference data
|
|
|
|
next if !value
|
2017-01-31 17:13:45 +00:00
|
|
|
|
2020-02-18 14:49:52 +00:00
|
|
|
# check if we have a referenced object which we could include here
|
|
|
|
next if !search_index_attribute_method(attribute_name)
|
2017-01-31 17:13:45 +00:00
|
|
|
|
2020-02-18 14:49:52 +00:00
|
|
|
# get referenced attribute name
|
|
|
|
attribute_ref_name = self.class.search_index_attribute_ref_name(attribute_name)
|
|
|
|
next if !attribute_ref_name
|
2017-01-31 17:13:45 +00:00
|
|
|
|
2020-02-18 14:49:52 +00:00
|
|
|
# ignore referenced attributes if needed
|
|
|
|
next if self.class.search_index_attribute_ignored?(attribute_ref_name)
|
2017-01-31 17:13:45 +00:00
|
|
|
|
2020-02-18 14:49:52 +00:00
|
|
|
# get referenced attribute value
|
|
|
|
value = search_index_value_by_attribute(attribute_name)
|
2017-01-31 17:13:45 +00:00
|
|
|
next if !value
|
|
|
|
|
|
|
|
# save name of ref object
|
2020-02-18 14:49:52 +00:00
|
|
|
attributes[ attribute_ref_name ] = value
|
2017-10-01 12:25:52 +00:00
|
|
|
end
|
2017-01-31 17:13:45 +00:00
|
|
|
|
2021-07-12 08:18:46 +00:00
|
|
|
if self.class.include?(HasObjectManagerAttributesValidation)
|
|
|
|
RequestCache.integer_fields(self.class.to_s).each do |field|
|
|
|
|
next if attributes[field].blank?
|
|
|
|
|
|
|
|
attributes["#{field}_text"] = attributes[field].to_s
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-02-18 14:49:52 +00:00
|
|
|
attributes
|
|
|
|
end
|
|
|
|
|
|
|
|
=begin
|
|
|
|
|
|
|
|
This function returns the relational search index value based on the attribute name.
|
|
|
|
|
|
|
|
organization = Organization.find(1)
|
|
|
|
value = organization.search_index_value_by_attribute('organization_id')
|
|
|
|
|
|
|
|
returns
|
|
|
|
|
|
|
|
value = {"name"=>"Zammad Foundation"}
|
|
|
|
|
|
|
|
=end
|
|
|
|
|
|
|
|
def search_index_value_by_attribute(attribute_name = '')
|
|
|
|
|
|
|
|
# get attribute name
|
|
|
|
relation_class = search_index_attribute_method(attribute_name)
|
|
|
|
return if !relation_class
|
|
|
|
|
|
|
|
# lookup ref object
|
|
|
|
relation_model = relation_class.lookup(id: attributes[attribute_name])
|
|
|
|
return if !relation_model
|
|
|
|
|
2021-01-27 09:58:35 +00:00
|
|
|
relation_model.search_index_attribute_lookup(include_references: false)
|
2020-02-18 14:49:52 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
=begin
|
|
|
|
|
|
|
|
This function returns the method for the relational search index attribute.
|
|
|
|
|
|
|
|
method = Ticket.new.search_index_attribute_method('organization_id')
|
|
|
|
|
|
|
|
returns
|
|
|
|
|
|
|
|
method = Organization (class)
|
|
|
|
|
|
|
|
=end
|
|
|
|
|
|
|
|
def search_index_attribute_method(attribute_name = '')
|
|
|
|
return if attribute_name[-3, 3] != '_id'
|
|
|
|
|
|
|
|
attribute_name = attribute_name[ 0, attribute_name.length - 3 ]
|
|
|
|
return if !respond_to?(attribute_name)
|
|
|
|
|
|
|
|
send(attribute_name).class
|
|
|
|
end
|
|
|
|
|
|
|
|
class_methods do
|
|
|
|
|
|
|
|
=begin
|
|
|
|
|
|
|
|
This function returns the relational search index attribute name for the given class.
|
|
|
|
|
|
|
|
attribute_ref_name = Organization.search_index_attribute_ref_name('user_id')
|
|
|
|
|
|
|
|
returns
|
|
|
|
|
|
|
|
attribute_ref_name = 'user'
|
|
|
|
|
|
|
|
=end
|
|
|
|
|
|
|
|
def search_index_attribute_ref_name(attribute_name)
|
|
|
|
attribute_name[ 0, attribute_name.length - 3 ]
|
|
|
|
end
|
|
|
|
|
|
|
|
=begin
|
|
|
|
|
|
|
|
This function returns if a search index attribute should be ignored.
|
|
|
|
|
|
|
|
ignored = Ticket.search_index_attribute_ignored?('organization_id')
|
|
|
|
|
|
|
|
returns
|
|
|
|
|
|
|
|
ignored = false
|
|
|
|
|
|
|
|
=end
|
|
|
|
|
|
|
|
def search_index_attribute_ignored?(attribute_name = '')
|
|
|
|
ignored_attributes = instance_variable_get(:@search_index_attributes_ignored) || []
|
|
|
|
return if ignored_attributes.blank?
|
|
|
|
|
|
|
|
ignored_attributes.include?(attribute_name.to_sym)
|
|
|
|
end
|
2017-01-31 17:13:45 +00:00
|
|
|
end
|
|
|
|
end
|