summaryrefslogtreecommitdiff
path: root/app/finders/user_recent_events_finder.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/finders/user_recent_events_finder.rb')
-rw-r--r--app/finders/user_recent_events_finder.rb24
1 files changed, 23 insertions, 1 deletions
diff --git a/app/finders/user_recent_events_finder.rb b/app/finders/user_recent_events_finder.rb
index 596a413782e..96120d9412f 100644
--- a/app/finders/user_recent_events_finder.rb
+++ b/app/finders/user_recent_events_finder.rb
@@ -47,6 +47,24 @@ class UserRecentEventsFinder
end
# rubocop: disable CodeReuse/ActiveRecord
+ def execute_optimized_multi(users)
+ Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder.new(
+ scope: Event.reorder(id: :desc),
+ array_scope: User.select(:id).where(id: users),
+ # Event model has a default scope { reorder(nil) }
+ # When a relation is rordered and used as a target when merging scope,
+ # its order takes a precedence and _overwrites_ the original scope's order.
+ # Thus we have to explicitly provide `reorder` for array_mapping_scope here.
+ array_mapping_scope: -> (author_id_expression) { Event.where(Event.arel_table[:author_id].eq(author_id_expression)).reorder(id: :desc) },
+ finder_query: -> (id_expression) { Event.where(Event.arel_table[:id].eq(id_expression)) }
+ )
+ .execute
+ .limit(limit)
+ .offset(params[:offset] || 0)
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ # rubocop: disable CodeReuse/ActiveRecord
def execute_multi
users = []
@target_user.each do |user|
@@ -55,7 +73,11 @@ class UserRecentEventsFinder
return Event.none if users.empty?
- event_filter.apply_filter(Event.where(author: users).limit_recent(limit, params[:offset] || 0))
+ if event_filter.filter == EventFilter::ALL
+ execute_optimized_multi(users)
+ else
+ event_filter.apply_filter(Event.where(author: users).limit_recent(limit, params[:offset] || 0))
+ end
end
# rubocop: enable CodeReuse/ActiveRecord