From 734d6fcdf00846364fa39fc374753b7ea2cef603 Mon Sep 17 00:00:00 2001 From: Andrey Kumanyaev Date: Wed, 3 Apr 2013 06:05:00 +0400 Subject: [PATCH] Perfomance updating Project activity sort --- app/models/project.rb | 11 +++++------ app/observers/project_activity_cache_observer.rb | 8 ++++++++ config/application.rb | 1 + db/migrate/20130403003950_add_last_activity_column_into_project.rb | 15 +++++++++++++++ db/schema.rb | 4 +++- 5 files changed, 32 insertions(+), 7 deletions(-) create mode 100644 app/observers/project_activity_cache_observer.rb create mode 100644 db/migrate/20130403003950_add_last_activity_column_into_project.rb diff --git a/app/models/project.rb b/app/models/project.rb index 3b78f10..4638292 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -29,7 +29,7 @@ class Project < ActiveRecord::Base attr_accessible :name, :path, :description, :default_branch, :issues_tracker, :issues_enabled, :wall_enabled, :merge_requests_enabled, :snippets_enabled, :issues_tracker_id, - :wiki_enabled, :public, :import_url, as: [:default, :admin] + :wiki_enabled, :public, :import_url, :last_activity_at, as: [:default, :admin] attr_accessible :namespace_id, :creator_id, as: :admin @@ -92,12 +92,12 @@ class Project < ActiveRecord::Base scope :in_team, ->(team) { where("id IN (:ids)", ids: team.projects.map(&:id)) } scope :in_namespace, ->(namespace) { where(namespace_id: namespace.id) } scope :in_group_namespace, -> { joins(:group) } - scope :sorted_by_activity, -> { order("(SELECT max(events.created_at) FROM events WHERE events.project_id = projects.id) DESC") } + scope :sorted_by_activity, -> { order("last_activity_at DESC") } scope :personal, ->(user) { where(namespace_id: user.namespace_id) } scope :joined, ->(user) { where("namespace_id != ?", user.namespace_id) } scope :public_only, -> { where(public: true) } - enumerize :issues_tracker, :in => (Gitlab.config.issues_tracker.keys).append(:gitlab), :default => :gitlab + enumerize :issues_tracker, in: (Gitlab.config.issues_tracker.keys).append(:gitlab), default: :gitlab class << self def abandoned @@ -157,8 +157,7 @@ class Project < ActiveRecord::Base unless creator.can_create_project? errors[:limit_reached] << ("Your own projects limit is #{creator.projects_limit}! Please contact administrator to increase it") end - rescue => ex - errors[:base] << ex.message + rescue errors[:base] << ("Can't check your ability to create project") end @@ -191,7 +190,7 @@ class Project < ActiveRecord::Base end def last_activity_date - last_event.try(:created_at) || updated_at + last_activity_at end def project_id diff --git a/app/observers/project_activity_cache_observer.rb b/app/observers/project_activity_cache_observer.rb new file mode 100644 index 0000000..2aa5872 --- /dev/null +++ b/app/observers/project_activity_cache_observer.rb @@ -0,0 +1,8 @@ +class ProjectActivityCacheObserver < BaseObserver + observe :event + + def after_create(event) + event.project.update_attribute(:last_activity_at, event.created_at) if event.project + end +end + diff --git a/config/application.rb b/config/application.rb index d71de88..8f7d9c0 100644 --- a/config/application.rb +++ b/config/application.rb @@ -24,6 +24,7 @@ module Gitlab # Activate observers that should always be running. config.active_record.observers = :activity_observer, + :project_activity_cache_observer, :issue_observer, :key_observer, :merge_request_observer, diff --git a/db/migrate/20130403003950_add_last_activity_column_into_project.rb b/db/migrate/20130403003950_add_last_activity_column_into_project.rb new file mode 100644 index 0000000..ddb0484 --- /dev/null +++ b/db/migrate/20130403003950_add_last_activity_column_into_project.rb @@ -0,0 +1,15 @@ +class AddLastActivityColumnIntoProject < ActiveRecord::Migration + def up + add_column :projects, :last_activity_at, :datetime + add_index :projects, :last_activity_at + + Project.find_each do |project| + project.update_attribute(:last_activity_at, project.last_activity_date) + end + end + + def down + remove_index :projects, :last_activity_at + remove_column :projects, :last_activity_at + end +end diff --git a/db/schema.rb b/db/schema.rb index 3c8b9ea..da4942d 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20130325173941) do +ActiveRecord::Schema.define(:version => 20130403003950) do create_table "events", :force => true do |t| t.string "target_type" @@ -156,9 +156,11 @@ ActiveRecord::Schema.define(:version => 20130325173941) do t.string "issues_tracker", :default => "gitlab", :null => false t.string "issues_tracker_id" t.boolean "snippets_enabled", :default => true, :null => false + t.datetime "last_activity_at" end add_index "projects", ["creator_id"], :name => "index_projects_on_owner_id" + add_index "projects", ["last_activity_at"], :name => "index_projects_on_last_activity_at" add_index "projects", ["namespace_id"], :name => "index_projects_on_namespace_id" create_table "protected_branches", :force => true do |t| -- libgit2 0.21.2