Added model cache object (lookup method) to increase performance.

This commit is contained in:
Martin Edenhofer 2013-01-01 21:29:26 +01:00
parent 2b0b360ab1
commit 67db493699
24 changed files with 66 additions and 88 deletions

View file

@ -15,7 +15,7 @@ class LinksController < ApplicationController
links.each { |item|
link_list.push item
if item['link_object'] == 'Ticket'
data = Ticket.full_data( item['link_object_value'] )
data = Ticket.lookup( :id => item['link_object_value'] )
tickets.push data
if !users[ data['owner_id'] ]
users[ data['owner_id'] ] = User.user_data_full( data['owner_id'] )

View file

@ -50,7 +50,7 @@ class TicketOverviewsController < ApplicationController
users = {}
tickets = []
overview[:ticket_list].each {|ticket_id|
data = Ticket.full_data(ticket_id)
data = Ticket.lookup( :id => ticket_id )
tickets.push data
if !users[ data['owner_id'] ]
users[ data['owner_id'] ] = User.user_data_full( data['owner_id'] )

View file

@ -225,7 +225,7 @@ class TicketsController < ApplicationController
users = {}
tickets = []
ticket_list.each {|ticket|
data = Ticket.full_data(ticket.id)
data = Ticket.lookup( :id => ticket.id )
tickets.push data
if !users[ data['owner_id'] ]
users[ data['owner_id'] ] = User.user_data_full( data['owner_id'] )
@ -508,7 +508,7 @@ class TicketsController < ApplicationController
tickets = []
users = {}
tickets_all.each do |ticket|
ticket_tmp = Ticket.full_data(ticket.id)
ticket_tmp = Ticket.lookup( :id => ticket.id )
tickets.push ticket_tmp
users[ ticket['owner_id'] ] = User.user_data_full( ticket_tmp['owner_id'] )
users[ ticket['customer_id'] ] = User.user_data_full( ticket_tmp['customer_id'] )

View file

@ -3,6 +3,10 @@ require 'cache'
class ApplicationModel < ActiveRecord::Base
self.abstract_class = true
after_create :cache_delete
after_update :cache_delete
after_destroy :cache_delete
def self.param_cleanup(params)
data = {}
self.new.attributes.each {|item|
@ -40,6 +44,28 @@ class ApplicationModel < ActiveRecord::Base
Cache.get( key.to_s )
end
def self.lookup(data)
if data[:id]
# puts "GET- + #{self.to_s}.#{data[:id].to_s}"
cache = self.cache_get( data[:id] )
return cache if cache
# puts "Fillup- + #{self.to_s}.#{data[:id].to_s}"
record = self.where( :id => data[:id] ).first
self.cache_set( data[:id], record )
return record
elsif data[:name]
cache = self.cache_get( data[:name] )
return cache if cache
record = self.where( :name => data[:name] ).first
self.cache_set( data[:name], record )
return record
else
raise "Need name or id for lookup()"
end
end
def self.create_if_not_exists(data)
if data[:name]
record = self.where( :name => data[:name] ).first

View file

@ -3,10 +3,6 @@ class Authorization < ApplicationModel
validates_presence_of :user_id, :uid, :provider
validates_uniqueness_of :uid, :scope => :provider
after_create :cache_delete
after_update :cache_delete
after_destroy :cache_delete
def self.find_from_hash(hash)
auth = Authorization.where( :provider => hash['provider'], :uid => hash['uid'] ).first
if auth

View file

@ -1,8 +1,5 @@
class EmailAddress < ApplicationModel
has_many :groups, :after_add => :cache_update, :after_remove => :cache_update
after_create :cache_delete
after_update :cache_delete
after_destroy :cache_delete
has_many :groups, :after_add => :cache_update, :after_remove => :cache_update
validates :realname, :presence => true
validates :email, :presence => true
end

View file

@ -2,8 +2,5 @@ class Group < ApplicationModel
has_and_belongs_to_many :users, :after_add => :cache_update, :after_remove => :cache_update
belongs_to :email_address
belongs_to :signature
after_create :cache_delete
after_update :cache_delete
after_destroy :cache_delete
validates :name, :presence => true
end

View file

@ -1,4 +1,4 @@
class History < ActiveRecord::Base
class History < ApplicationModel
self.table_name = 'histories'
belongs_to :history_type, :class_name => 'History::Type'
belongs_to :history_object, :class_name => 'History::Object'
@ -349,13 +349,13 @@ class History < ActiveRecord::Base
return history_attribute
end
class Object < ActiveRecord::Base
class Object < ApplicationModel
end
class Type < ActiveRecord::Base
class Type < ApplicationModel
end
class Attribute < ActiveRecord::Base
class Attribute < ApplicationModel
end
end

View file

@ -7,16 +7,16 @@ class Observer::Ticket::Article::CommunicateEmail < ActiveRecord::Observer
return if Setting.get('import_mode')
# if sender is customer, do not communication
sender = Ticket::Article::Sender.where( :id => record.ticket_article_sender_id ).first
sender = Ticket::Article::Sender.lookup( :id => record.ticket_article_sender_id )
return 1 if sender == nil
return 1 if sender['name'] == 'Customer'
# only apply on emails
type = Ticket::Article::Type.where( :id => record.ticket_article_type_id ).first
type = Ticket::Article::Type.lookup( :id => record.ticket_article_type_id )
return if type['name'] != 'email'
# build subject
ticket = Ticket.find(record.ticket_id)
ticket = Ticket.lookup( record.ticket_id )
subject = ticket.subject_build( record.subject )
# send email

View file

@ -7,12 +7,12 @@ class Observer::Ticket::Article::CommunicateFacebook < ActiveRecord::Observer
return if Setting.get('import_mode')
# if sender is customer, do not communication
sender = Ticket::Article::Sender.where( :id => record.ticket_article_sender_id ).first
sender = Ticket::Article::Sender.lookup( :id => record.ticket_article_sender_id )
return 1 if sender == nil
return 1 if sender['name'] == 'Customer'
# only apply on emails
type = Ticket::Article::Type.where( :id => record.ticket_article_type_id ).first
type = Ticket::Article::Type.lookup( :id => record.ticket_article_type_id )
return if type['name'] != 'facebook'
a = Channel::Facebook.new

View file

@ -7,12 +7,12 @@ class Observer::Ticket::Article::CommunicateTwitter < ActiveRecord::Observer
return if Setting.get('import_mode')
# if sender is customer, do not communication
sender = Ticket::Article::Sender.where( :id => record.ticket_article_sender_id ).first
sender = Ticket::Article::Sender.lookup( :id => record.ticket_article_sender_id )
return 1 if sender == nil
return 1 if sender['name'] == 'Customer'
# only apply on tweets
type = Ticket::Article::Type.where( :id => record.ticket_article_type_id ).first
type = Ticket::Article::Type.lookup( :id => record.ticket_article_type_id )
return if type['name'] != 'twitter direct-message' && type['name'] != 'twitter status'
a = Channel::Twitter2.new

View file

@ -7,16 +7,16 @@ class Observer::Ticket::Article::FillupFromEmail < ActiveRecord::Observer
return if Setting.get('import_mode')
# if sender is customer, do not change anything
sender = Ticket::Article::Sender.where( :id => record.ticket_article_sender_id ).first
sender = Ticket::Article::Sender.lookup( :id => record.ticket_article_sender_id )
return if sender == nil
return if sender['name'] == 'Customer'
# set email attributes
type = Ticket::Article::Type.where( :id => record.ticket_article_type_id ).first
type = Ticket::Article::Type.lookup( :id => record.ticket_article_type_id )
return if type['name'] != 'email'
# set subject if empty
ticket = Ticket.find( record.ticket_id )
ticket = Ticket.lookup( :id => record.ticket_id )
if !record.subject || record.subject == ''
record.subject = ticket.title
end

View file

@ -7,7 +7,7 @@ class Observer::Ticket::Article::FillupFromGeneral < ActiveRecord::Observer
return if Setting.get('import_mode')
# if sender is customer, do not change anything
sender = Ticket::Article::Sender.where( :id => record.ticket_article_sender_id ).first
sender = Ticket::Article::Sender.lookup( :id => record.ticket_article_sender_id )
return if sender == nil
return if sender['name'] == 'Customer'

View file

@ -20,8 +20,8 @@ class Observer::Ticket::CloseTime < ActiveRecord::Observer
return true if record.close_time
# check if ticket is closed now
ticket_state = Ticket::State.find( record.ticket_state_id )
ticket_state_type = Ticket::StateType.find( ticket_state.ticket_state_type_id )
ticket_state = Ticket::State.lookup( :id => record.ticket_state_id )
ticket_state_type = Ticket::StateType.lookup( :id => ticket_state.ticket_state_type_id )
return true if ticket_state_type.name != 'closed'
# set close_time

View file

@ -11,10 +11,10 @@ class Observer::Ticket::FirstResponse < ActiveRecord::Observer
return true if record.internal
# if sender is not agent
return true if record.ticket_article_sender.name != 'Agent'
return true if Ticket::Article::Sender.lookup( :id => record.ticket_article_sender_id ).name != 'Agent'
# if article is a message to customer
return true if !record.ticket_article_type.communication
return true if !Ticket::Article::Type.lookup( :id => record.ticket_article_type_id ).communication
# check if first_response is already set
return true if record.ticket.first_response

View file

@ -8,10 +8,11 @@ class Observer::Ticket::LastContact < ActiveRecord::Observer
return true if record.internal
# if article is a message to customer
return true if !record.ticket_article_type.communication
return true if !Ticket::Article::Type.lookup( :id => record.ticket_article_type_id ).communication
# if sender is not customer
if record.ticket_article_sender.name == 'Customer'
sender = Ticket::Article::Sender.lookup( :id => record.ticket_article_sender_id )
if sender.name == 'Customer'
# check if last communication is done by agent, else do not set last_contact_customer
if record.ticket.last_contact_customer == nil ||
@ -28,7 +29,7 @@ class Observer::Ticket::LastContact < ActiveRecord::Observer
end
# if sender is not agent
if record.ticket_article_sender.name == 'Agent'
if sender.name == 'Agent'
# set last_contact_agent
record.ticket.last_contact_agent = Time.now

View file

@ -16,10 +16,10 @@ class Observer::Ticket::Notification < ActiveRecord::Observer
# get current state of objects
if event[:name] == 'Ticket::Article'
article = Ticket::Article.find( event[:id] )
article = Ticket::Article.lookup( :id => event[:id] )
ticket = article.ticket
else
ticket = Ticket.find( event[:id] )
ticket = Ticket.lookup( :id => event[:id] )
article = ticket.articles[-1]
end

View file

@ -1,7 +1,4 @@
class Role < ApplicationModel
has_and_belongs_to_many :users, :after_add => :cache_update, :after_remove => :cache_update
after_create :cache_delete
after_update :cache_delete
after_destroy :cache_delete
validates :name, :presence => true
end

View file

@ -3,9 +3,6 @@ class Setting < ApplicationModel
store :state
store :state_initial
before_create :set_initial
after_create :delete_cache
after_update :delete_cache
after_destroy :delete_cache
def self.load

View file

@ -1,7 +1,4 @@
class Signature < ApplicationModel
has_many :groups, :after_add => :cache_update, :after_remove => :cache_update
after_create :cache_delete
after_update :cache_delete
after_destroy :cache_delete
validates :name, :presence => true
has_many :groups, :after_add => :cache_update, :after_remove => :cache_update
validates :name, :presence => true
end

View file

@ -2,7 +2,7 @@ class Ticket < ApplicationModel
before_create :number_generate, :check_defaults
before_update :check_defaults
before_destroy :destroy_dependencies
belongs_to :group
has_many :articles, :class_name => 'Ticket::Article', :after_add => :cache_update, :after_remove => :cache_update
belongs_to :organization
@ -14,16 +14,12 @@ class Ticket < ApplicationModel
belongs_to :create_article_type, :class_name => 'Ticket::Article::Type'
belongs_to :create_article_sender, :class_name => 'Ticket::Article::Sender'
after_create :cache_delete
after_update :cache_delete
after_destroy :cache_delete
def self.number_check (string)
self.number_adapter.number_check_item(string)
end
def agent_of_group
Group.find(self.group_id).users.where( :active => true ).joins(:roles).where( 'roles.name' => 'Agent', 'roles.active' => true ).uniq()
Group.find( self.group_id ).users.where( :active => true ).joins(:roles).where( 'roles.name' => 'Agent', 'roles.active' => true ).uniq()
end
def self.agents
@ -41,8 +37,8 @@ class Ticket < ApplicationModel
Ticket::Article.create(
:created_by_id => data[:created_by_id],
:ticket_id => self.id,
:ticket_article_type_id => Ticket::Article::Type.where( :name => 'note' ).first.id,
:ticket_article_sender_id => Ticket::Article::Sender.where( :name => 'Agent' ).first.id,
:ticket_article_type_id => Ticket::Article::Type.lookup( :name => 'note' ).id,
:ticket_article_sender_id => Ticket::Article::Sender.lookup( :name => 'Agent' ).id,
:body => 'merged',
:internal => false
)
@ -59,7 +55,7 @@ class Ticket < ApplicationModel
)
# set state to 'merged'
self.ticket_state_id = Ticket::State.where( :name => 'merged' ).first.id
self.ticket_state_id = Ticket::State.lookup( :name => 'merged' ).id
# rest owner
self.owner_id = User.where( :login => '-' ).first.id
@ -304,16 +300,6 @@ class Ticket < ApplicationModel
end
# data = Ticket.full_data(123)
def self.full_data(ticket_id)
cache = self.cache_get(ticket_id)
return cache if cache
ticket = Ticket.find(ticket_id).attributes
self.cache_set( ticket_id, ticket )
return ticket
end
# Ticket.create_attributes(
# :current_user_id => 123,
# )
@ -428,24 +414,15 @@ class Ticket < ApplicationModel
class Priority < ApplicationModel
self.table_name = 'ticket_priorities'
after_create :cache_delete
after_update :cache_delete
after_destroy :cache_delete
validates :name, :presence => true
end
class StateType < ApplicationModel
after_create :cache_delete
after_update :cache_delete
after_destroy :cache_delete
validates :name, :presence => true
end
class State < ApplicationModel
belongs_to :ticket_state_type, :class_name => 'Ticket::StateType'
after_create :cache_delete
after_update :cache_delete
after_destroy :cache_delete
belongs_to :ticket_state_type, :class_name => 'Ticket::StateType'
validates :name, :presence => true
end
end

View file

@ -5,10 +5,6 @@ class Ticket::Article < ApplicationModel
belongs_to :ticket_article_sender, :class_name => 'Ticket::Article::Sender'
belongs_to :created_by, :class_name => 'User'
after_create :cache_delete
after_update :cache_delete
after_destroy :cache_delete
private
def attachment_check

View file

@ -3,9 +3,6 @@ class User < ApplicationModel
before_create :check_name, :check_email, :check_login, :check_image, :check_geo
before_update :check_password, :check_image, :check_geo, :check_email, :check_login
after_create :cache_delete
after_update :cache_delete
after_destroy :cache_delete
has_and_belongs_to_many :groups, :after_add => :cache_update, :after_remove => :cache_update
has_and_belongs_to_many :roles, :after_add => :cache_update, :after_remove => :cache_update

View file

@ -434,7 +434,7 @@ class ClientState
return if !session_data
return if !session_data[:user]
return if !session_data[:user][:id]
user = User.find( session_data[:user][:id] )
user = User.lookup( :id => session_data[:user][:id] )
return if !user
# set cache key
@ -691,7 +691,7 @@ class ClientState
if !@pushed[:tickets]
@pushed[:tickets] = {}
end
ticket = Ticket.full_data(ticket_id)
ticket = Ticket.lookup( :id => ticket_id )
if @pushed[:tickets][ticket_id] != ticket['updated_at']
@pushed[:tickets][ticket_id] = ticket['updated_at']
tickets.push ticket