* Replace incorrect use of distinct with group
Some uses of ActiveRecord::QueryMethods#distinct pass field names but they
are incorrect for the current version of Rails.
ActiveRecord::QueryMethods#group provides the expected behavior and
benefits performance. See commit
6da24aad4cafdef8d8a2c92bac2002a5fc2fe9c8.
* Introduce ApplicationController#cache_collection_paginated_by_id
ApplicationController#cache_collection_paginated_by_id fuses
ApplicationController#cache_collection and Paginable.paginate_by_id.
An advantage of this method is that it prevents from modifying scope which
Paginable.paginate_by_id may provide.
ApplicationController#cache_collection always return an array and there
is no possibility of the scope modification. It is also clear for a
programmer, considering the implication of "cache".
This method can also emit more efficient queries by using
Cacheable.cache_ids before calling Paginable.paginate_by_id.
end
@pinned_statuses = cache_collection(@account.pinned_statuses, Status) if show_pinned_statuses?
- @statuses = filtered_status_page
- @statuses = cache_collection(@statuses, Status)
+ @statuses = cached_filtered_status_page
@rss_url = rss_url
unless @statuses.empty?
request.path.split('.').first.ends_with?(Addressable::URI.parse("/tagged/#{params[:tag]}").normalize)
end
- def filtered_status_page
- filtered_statuses.paginate_by_id(PAGE_SIZE, params_slice(:max_id, :min_id, :since_id))
+ def cached_filtered_status_page
+ cache_collection_paginated_by_id(
+ filtered_statuses,
+ Status,
+ PAGE_SIZE,
+ params_slice(:max_id, :min_id, :since_id)
+ )
end
def params_slice(*keys)
return unless page_requested?
@statuses = @account.statuses.permitted_for(@account, signed_request_account)
- @statuses = @statuses.paginate_by_id(LIMIT, params_slice(:max_id, :min_id, :since_id))
- @statuses = cache_collection(@statuses, Status)
+ @statuses = cache_collection_paginated_by_id(
+ @statuses,
+ Status,
+ LIMIT,
+ params_slice(:max_id, :min_id, :since_id)
+ )
end
def page_requested?
end
def cached_account_statuses
- cache_collection account_statuses, Status
- end
-
- def account_statuses
statuses = truthy_param?(:pinned) ? pinned_scope : permitted_account_statuses
statuses.merge!(only_media_scope) if truthy_param?(:only_media)
statuses.merge!(no_reblogs_scope) if truthy_param?(:exclude_reblogs)
statuses.merge!(hashtag_scope) if params[:tagged].present?
- statuses.paginate_by_id(limit_param(DEFAULT_STATUSES_LIMIT), params_slice(:max_id, :since_id, :min_id))
+ cache_collection_paginated_by_id(
+ statuses,
+ Status,
+ limit_param(DEFAULT_STATUSES_LIMIT),
+ params_slice(:max_id, :since_id, :min_id)
+ )
end
def permitted_account_statuses
private
def load_notifications
- cache_collection paginated_notifications, Notification
- end
-
- def paginated_notifications
- browserable_account_notifications.paginate_by_id(
+ cache_collection_paginated_by_id(
+ browserable_account_notifications,
+ Notification,
limit_param(DEFAULT_NOTIFICATIONS_LIMIT),
params_slice(:max_id, :since_id, :min_id)
)
end
def load_statuses
- cached_public_statuses
+ cached_public_statuses_page
end
- def cached_public_statuses
- cache_collection public_statuses, Status
- end
-
- def public_statuses
- statuses = public_timeline_statuses.paginate_by_id(
+ def cached_public_statuses_page
+ cache_collection_paginated_by_id(
+ public_statuses,
+ Status,
limit_param(DEFAULT_STATUSES_LIMIT),
params_slice(:max_id, :since_id, :min_id)
)
+ end
+
+ def public_statuses
+ statuses = public_timeline_statuses
if truthy_param?(:only_media)
statuses.joins(:media_attachments).group(:id)
end
def cached_tagged_statuses
- cache_collection tagged_statuses, Status
- end
-
- def tagged_statuses
if @tag.nil?
[]
else
- statuses = tag_timeline_statuses.paginate_by_id(
+ statuses = tag_timeline_statuses
+ statuses = statuses.joins(:media_attachments) if truthy_param?(:only_media)
+
+ cache_collection_paginated_by_id(
+ statuses,
+ Status,
limit_param(DEFAULT_STATUSES_LIMIT),
params_slice(:max_id, :since_id, :min_id)
)
-
- if truthy_param?(:only_media)
- statuses.joins(:media_attachments)
- else
- statuses
- end
end
end
raw.map { |item| cached_keys_with_value[item.id] || uncached[item.id] }.compact
end
+
+ def cache_collection_paginated_by_id(raw, klass, limit, options)
+ cache_collection raw.cache_ids.paginate_by_id(limit, options), klass
+ end
end