Skip to content
Snippets Groups Projects
Commit 5c785471 authored by Eugen Rochko's avatar Eugen Rochko
Browse files

More query optimizations

parent fc90d388
No related branches found
No related tags found
No related merge requests found
......@@ -10,6 +10,8 @@ class Api::V1::TimelinesController < ApiController
@statuses = Feed.new(:home, current_account).get(DEFAULT_STATUSES_LIMIT, params[:max_id], params[:since_id]).to_a
set_maps(@statuses)
set_counters_maps(@statuses)
set_account_counters_maps(@statuses.flat_map { |s| [s.account, s.reblog? ? s.reblog.account : nil] }.compact.uniq)
next_path = api_v1_home_timeline_url(max_id: @statuses.last.id) if @statuses.size == DEFAULT_STATUSES_LIMIT
prev_path = api_v1_home_timeline_url(since_id: @statuses.first.id) unless @statuses.empty?
......@@ -23,6 +25,8 @@ class Api::V1::TimelinesController < ApiController
@statuses = Feed.new(:mentions, current_account).get(DEFAULT_STATUSES_LIMIT, params[:max_id], params[:since_id]).to_a
set_maps(@statuses)
set_counters_maps(@statuses)
set_account_counters_maps(@statuses.flat_map { |s| [s.account, s.reblog? ? s.reblog.account : nil] }.compact.uniq)
next_path = api_v1_mentions_timeline_url(max_id: @statuses.last.id) if @statuses.size == DEFAULT_STATUSES_LIMIT
prev_path = api_v1_mentions_timeline_url(since_id: @statuses.first.id) unless @statuses.empty?
......@@ -36,6 +40,8 @@ class Api::V1::TimelinesController < ApiController
@statuses = Status.as_public_timeline(current_account).paginate_by_max_id(DEFAULT_STATUSES_LIMIT, params[:max_id], params[:since_id]).to_a
set_maps(@statuses)
set_counters_maps(@statuses)
set_account_counters_maps(@statuses.flat_map { |s| [s.account, s.reblog? ? s.reblog.account : nil] }.compact.uniq)
next_path = api_v1_public_timeline_url(max_id: @statuses.last.id) if @statuses.size == DEFAULT_STATUSES_LIMIT
prev_path = api_v1_public_timeline_url(since_id: @statuses.first.id) unless @statuses.empty?
......@@ -50,6 +56,8 @@ class Api::V1::TimelinesController < ApiController
@statuses = @tag.nil? ? [] : Status.as_tag_timeline(@tag, current_account).paginate_by_max_id(DEFAULT_STATUSES_LIMIT, params[:max_id], params[:since_id]).to_a
set_maps(@statuses)
set_counters_maps(@statuses)
set_account_counters_maps(@statuses.flat_map { |s| [s.account, s.reblog? ? s.reblog.account : nil] }.compact.uniq)
next_path = api_v1_hashtag_timeline_url(params[:id], max_id: @statuses.last.id) if @statuses.size == DEFAULT_STATUSES_LIMIT
prev_path = api_v1_hashtag_timeline_url(params[:id], since_id: @statuses.first.id) unless @statuses.empty?
......
......@@ -59,11 +59,11 @@ class ApiController < ApplicationController
end
def current_resource_owner
User.find(doorkeeper_token.resource_owner_id) if doorkeeper_token
@user ||= User.find(doorkeeper_token.resource_owner_id) if doorkeeper_token
end
def current_user
super || current_resource_owner
@user ||= super || current_resource_owner
rescue ActiveRecord::RecordNotFound
nil
end
......
......@@ -51,6 +51,6 @@ class ApplicationController < ActionController::Base
end
def current_account
current_user.try(:account)
@account ||= current_user.try(:account)
end
end
......@@ -16,7 +16,7 @@ class Feed
RegenerationWorker.perform_async(@account.id, @type)
@statuses = Status.send("as_#{@type}_timeline", @account).paginate_by_max_id(limit, nil, nil)
else
status_map = Status.where(id: unhydrated).with_includes.with_counters.map { |status| [status.id, status] }.to_h
status_map = Status.where(id: unhydrated).with_includes.map { |status| [status.id, status] }.to_h
@statuses = unhydrated.map { |id| status_map[id] }.compact
end
......
......@@ -4,7 +4,7 @@ class Status < ApplicationRecord
include Paginable
include Streamable
belongs_to :account, -> { with_counters }, inverse_of: :statuses
belongs_to :account, inverse_of: :statuses
belongs_to :thread, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :replies
belongs_to :reblog, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblogs, touch: true
......@@ -27,7 +27,7 @@ class Status < ApplicationRecord
default_scope { order('id desc') }
scope :with_counters, -> { select('statuses.*, (select count(r.id) from statuses as r where r.reblog_of_id = statuses.id) as reblogs_count, (select count(f.id) from favourites as f where f.status_id = statuses.id) as favourites_count') }
scope :with_includes, -> { includes(:account, :media_attachments, :tags, :stream_entry, mentions: :account, reblog: [:account, mentions: :account], thread: :account) }
scope :with_includes, -> { includes(:account, :media_attachments, :tags, :stream_entry, mentions: :account, reblog: [:account, :stream_entry, :tags, mentions: :account], thread: :account) }
def local?
uri.nil?
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment